From: Zitagcc Date: Thu, 23 Nov 2017 09:23:55 +0000 (+0100) Subject: Merge branch 'master' into actor-yield X-Git-Tag: v3.18~227^2^2~1 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/2807fde4fd1f59c230d69a934634c5dfb77905f2?hp=cb384017166c74fdfd75b07c8a80b1af46c9447d Merge branch 'master' into actor-yield --- diff --git a/.gitignore b/.gitignore index 9b8a4bb637..e0eb0b8fa8 100644 --- a/.gitignore +++ b/.gitignore @@ -192,8 +192,11 @@ examples/s4u/actions-comm/s4u-actions-comm examples/s4u/actions-storage/s4u-actions-storage examples/s4u/actor-create/s4u-actor-create examples/s4u/actor-daemon/s4u-actor-daemon +examples/s4u/actor-execute/s4u-actor-execute examples/s4u/actor-kill/s4u-actor-kill +examples/s4u/actor-lifetime/s4u-actor-lifetime examples/s4u/actor-migration/s4u-actor-migration +examples/s4u/actor-priority/s4u-actor-priority examples/s4u/actor-suspend/s4u-actor-suspend examples/s4u/app-bittorrent/s4u-bittorrent examples/s4u/app-masterworker/s4u-app-masterworker @@ -206,6 +209,7 @@ examples/s4u/basic/s4u-basic examples/s4u/basic/s4u-basic_deployment examples/s4u/basic/s4u-basic_function examples/s4u/dht-chord/s4u-dht-chord +examples/s4u/energy-link/s4u-energy-link examples/s4u/io/s4u-io examples/s4u/mutex/s4u-mutex examples/s4u/plugin-hostload/s4u-plugin-hostload @@ -1074,7 +1078,6 @@ teshsuite/surf/lmm_usage/lmm_usage teshsuite/surf/maxmin_bench/maxmin_bench teshsuite/surf/surf_usage/surf_usage teshsuite/surf/surf_usage2/surf_usage2 -teshsuite/xbt/heap_bench/heap_bench teshsuite/xbt/log_large/log_large teshsuite/xbt/log_usage/log_usage teshsuite/xbt/mallocator/mallocator diff --git a/CMakeLists.txt b/CMakeLists.txt index e2bb276f16..58b548b592 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ if(COMPILER_SUPPORTS_CXX11) else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} (v${CMAKE_CXX_COMPILER_VERSION}) has no C++11 support. " - "Please use a decent C++ compiler.") + "Please install a decent C++ compiler (remove CMakeCache.txt once it's installed).") endif() ### And we need C11 standard, too @@ -105,7 +105,7 @@ endif() #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# set(SIMGRID_VERSION_MAJOR "3") -set(SIMGRID_VERSION_MINOR "17") +set(SIMGRID_VERSION_MINOR "18") set(SIMGRID_VERSION_PATCH "0") set(SIMGRID_VERSION_EXTRA "-DEVEL") # Extra words to add to version string (e.g. -rc1) @@ -242,6 +242,7 @@ endif() if(WIN32) set(Boost_USE_STATIC_LIBS 1) endif() + set(HAVE_PAPI 0) if(enable_smpi_papi) include(FindPAPI) diff --git a/ChangeLog b/ChangeLog index c693d0503a..eb74d9a9a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,44 @@ -SimGrid (3.17) UNRELEASED (release target: September 22 2017) +SimGrid (3.18) NOT RELEASED YET (target: December 24 2017) + + S4U + - Link::name() is deprecated and will be removed in v3.21, use instead + Link::getCname(). + - Mailbox::getName() changed to return a std::string, use instead + Mailbox::getCname() to get a char*. + - Storage::getName() changed to return a std::string, use intead + Storage::getCname() to get a char*. + + MSG + - Deprecate MSG_task_get_flops_amount(). Its semantic was weird: + before the start it returned the total amount of flops; + after it returned the ratio of remaining work. Split it: + MSG_task_get_initial_flops_amount() for first behavior + MSG_task_get_remaining_work_ratio() for the second one. + This fixes GitHub's #223 using PR #237. Thanks Michael Mercier. + + XBT + - Define class simgrid::xbt::Path to manage file names. + - Removed unused functions: + - xbt/file.h: xbt_basename(), xbt_dirname(), xbt_getline() + - xbt/str.h: xbt_str_join() + - xbt/heap.h: use std::priority_queue or boost::heap instead + + PLUGINS: + - New link_energy plugin for the consumption of the links. + + XML + - Remove the undocumented/untested tag + + TRACE + - Remove viva specific tracing as the tool is no longer maintained + +SimGrid (3.17) Released October 8 2017 The Drained Leaks release: (almost) no known leaks despite the tests. Even very long simulations will preserve your memory: our testsuite stresses SimGrid for over 45mn on fast machines for a coverage of - over 80% of our codebase, and there is only one single known leak, of - about 4kb. + over 80%, and there is only one single known leak, of about 4kb. S4U @@ -52,6 +85,8 @@ SimGrid (3.17) UNRELEASED (release target: September 22 2017) - #222: Actor::kill() doesn't really kill and segfaults - #225: Actor::kill() doesn't really kill when victims are doing a join() +---------------------------------------------------------------------------- + SimGrid (3.16) Released June 22. 2017. The Blooming Spring Release: developments are budding. diff --git a/NEWS b/NEWS index c5b3c32341..acbd344e5d 100644 --- a/NEWS +++ b/NEWS @@ -1,9 +1,16 @@ + _ _____ _ ___ +__ _____ _ __ ___(_) ___ _ __ |___ / / |( _ ) +\ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ | |/ _ \ + \ V / __/ | \__ \ | (_) | | | | ___) || | (_) | + \_/ \___|_| |___/_|\___/|_| |_| |____(_)_|\___/ + (not released yet) + _ _____ _ _____ __ _____ _ __ ___(_) ___ _ __ |___ / / |___ | \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ | | / / \ V / __/ | \__ \ | (_) | | | | ___) || | / / \_/ \___|_| |___/_|\___/|_| |_| |____(_)_|/_/ - (unreleased yet) + October 8 2017 The Drained Leaks release: (almost) no known leaks despite the tests. diff --git a/doc/doxygen/getting_started.doc b/doc/doxygen/getting_started.doc index 0852c346c4..f7a049a532 100644 --- a/doc/doxygen/getting_started.doc +++ b/doc/doxygen/getting_started.doc @@ -26,7 +26,7 @@ your version (as long as your version is as free as ours). It also means that SimGrid is developed by a vivid community of users and developers. We hope that you will come and join us! -SimGrid is the result of over 15 years of research from several +SimGrid is the result of almost 20 years of research from several groups, both in France and in the USA. It benefited of many funding from various research instances, including the ANR, Inria, CNRS, University of Lorraine, University of Hawai'i at Manoa, ENS Rennes and diff --git a/doc/doxygen/inside_extending.doc b/doc/doxygen/inside_extending.doc index a0a8a97856..9593489d61 100644 --- a/doc/doxygen/inside_extending.doc +++ b/doc/doxygen/inside_extending.doc @@ -160,13 +160,13 @@ the simcall definitions from src/simix/simcalls.in, checks that both `simcall_()` and `simcall_HANDLER()` are defined somewhere, and generates the following files: -- smx_popping_accessors.h: +- popping_accessors.hpp: Helper functions to get and set simcall arguments and results -- smx_popping_bodies.cpp: +- popping_bodies.cpp: The BODY function of each simcall -- smx_popping_enum.c: +- popping_enum.h: Definition of type `enum e_smx_simcall_t` (one value per existing simcall) -- smx_popping_generated.cpp: +- popping_generated.cpp: Definitions of `simcall_names[]` (debug name of each simcall), and SIMIX_simcall_enter() that deals with the simcall from within the kernel diff --git a/doc/doxygen/inside_release.doc b/doc/doxygen/inside_release.doc index 57075d123b..5fbed80d8c 100644 --- a/doc/doxygen/inside_release.doc +++ b/doc/doxygen/inside_release.doc @@ -8,6 +8,8 @@ Please apply the following checklist before releasing. - Sources + - The external patches (Debian, etc) are integrated. + The COPYING file is aligned with Debian's copyright file. - The version number is correctly marked in CMakeLists.txt, in macros SIMGRID_VERSION_MAJOR and friends. - The "make distcheck" target works (testing that every files needed @@ -33,7 +35,7 @@ This should be done from a clean git repository because some files are included through globbing. The best is to use a clean checkout: \verbatim cd /tmp -git clone ~/Code/simgrid +git clone --depth=1 ~/Code/simgrid cd simgrid cmake . && make dist \endverbatim @@ -90,8 +92,9 @@ the settings icon of the release you want to change. - emacs org/site/download.org and C-c C-c the first source block to refresh the download. - emacs org/site/documentation.org and edit the version links. - make -C org all sync - - git commit && git push + - git commit -a && git push - Announce the release + - Document the tag on https://github.com/simgrid/simgrid/releases - Mail the simgrid-user mailing list - the NEWS chunk in the mail; - the ChangeLog chunk as attachment diff --git a/doc/doxygen/inside_tests.doc b/doc/doxygen/inside_tests.doc index a31e13fa80..38732f60b2 100644 --- a/doc/doxygen/inside_tests.doc +++ b/doc/doxygen/inside_tests.doc @@ -261,8 +261,10 @@ We have 2 interesting projects on Jenkins: is the main project, running the tests that we spoke about.\n It is configured (on Jenkins) to run the script tools/jenkins/build.sh \li SimGrid-DynamicAnalysis - runs the tests both under valgrind to find the memory errors and - under gcovr to report the achieved test coverage.\n It is configured + should be called "nightly" because it does not only run dynamic + tests, but a whole bunch of long lasting tests: valgrind (memory + errors), gcovr (coverage), Sanitizers (bad pointer usage, threading + errors, use of unspecified C constructs) and the clang static analyzer.\n It is configured (on Jenkins) to run the script tools/jenkins/DynamicAnalysis.sh In each case, SimGrid gets built in @@ -282,6 +284,31 @@ order to disable the "ModelChecker" build on host (label=="small-netbsd-64-clang").implies(build_mode!="ModelChecker") \endverbatim +Just for the record, the slaves were created from the available +template with the following commands: +\verbatim +#debian/ubuntu +apt-get install gcc g++ gfortran automake cmake libboost-dev openjdk-8-jdk openjdk-8-jre libxslt-dev libxml2-dev libevent-dev libunwind-dev libdw-dev htop git python3 xsltproc libboost-context-dev +#for dynamicanalysis: +apt-get install jacoco libjacoco-java libns3-dev pcregrep gcovr ant lua5.3-dev sloccount + +#fedora +dnf install libboost-devel openjdk-8-jdk openjdk-8-jre libxslt-devel libxml2-devel xsltproc git python3 libdw-devel libevent-devel libunwind-devel htop lua5.3-devel + +#netbsd +pkg_add cmake gcc7 boost boost-headers automake openjdk8 libxslt libxml2 libunwind git htop python36 + +#opensuse +zypper install cmake automake clang boost-devel java-1_8_0-openjdk-devel libxslt-devel libxml2-devel xsltproc git python3 libdw-devel libevent-devel libunwind-devel htop binutils ggc7-fortran + +#freebsd +pkg install boost-libs cmake openjdk8 automake libxslt libxml2 libunwind git htop python3 automake gcc6 flang elfutils libevent +#+ clang-devel from ports + +#osx +brew install cmake boost libunwind-headers libxslt git python3 +\endverbatim + \subsection inside_tests_travis Travis Travis is a free (as in free beer) Continuous Integration system that diff --git a/doc/doxygen/install_yours.doc b/doc/doxygen/install_yours.doc index 4d4383bb8f..da754cda74 100644 --- a/doc/doxygen/install_yours.doc +++ b/doc/doxygen/install_yours.doc @@ -22,18 +22,25 @@ documentation. Here is a `CMakeLists.txt` that you can use as a starting point for your project. It builds two simulators from a given set of source files. +You first need to copy the `FindSimGrid.cmake` (at the root of the +SimGrid tree) into the `cmake/Modules` directory of your project. + @verbatim project(MyFirstScheduler) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") +find_package(SimGrid REQUIRED) +include_directories(${SimGrid_INCLUDE_DIR}) + set(SIMULATOR_SOURCES main.c other.c util.c) add_executable(my_simulator ${SIMULATOR_SOURCES}) -target_link_libraries(my_simulator simgrid) +target_link_libraries(my_simulator ${SimGrid_LIBRARY}) set(OTHER_SOURCES blah.c bar.c foo.h) add_executable(other_xp ${OTHER_SOURCES}) -target_link_libraries(other_xp simgrid) +target_link_libraries(other_xp ${SimGrid_LIBRARY}) @endverbatim @section install_yours_makefile Building your project with Makefile diff --git a/doc/doxygen/module-smpi.doc b/doc/doxygen/module-smpi.doc index ae3d11554e..238ba47b1e 100644 --- a/doc/doxygen/module-smpi.doc +++ b/doc/doxygen/module-smpi.doc @@ -412,7 +412,7 @@ changed to use smpi version of the calls instead (MPI_Send will become smpi_mpi_ Example: adding a "pair" version of the Alltoall collective. - - Implement it in a file called alltoall-pair.c in the src/smpi/colls folder. This file should include colls_private.h. + - Implement it in a file called alltoall-pair.c in the src/smpi/colls folder. This file should include colls_private.hpp. - The name of the new algorithm function should be smpi_coll_tuned_alltoall_pair, with the same signature as MPI_Alltoall. diff --git a/doc/doxygen/module-xbt.doc b/doc/doxygen/module-xbt.doc index 395f744cd4..d2ce9de344 100644 --- a/doc/doxygen/module-xbt.doc +++ b/doc/doxygen/module-xbt.doc @@ -17,7 +17,6 @@ - \ref XBT_dynar - \ref XBT_dict - \ref XBT_swag - - \ref XBT_heap - \ref XBT_misc - \ref XBT_graph @@ -66,7 +65,6 @@ /** @defgroup XBT_dynar Dynar: generic dynamic array */ /** @defgroup XBT_dict Dict: generic dictionnary */ /** @defgroup XBT_swag Swag: O(1) set datatype */ - /** @defgroup XBT_heap Heap: generic heap data structure */ /** @} */ diff --git a/doc/doxygen/options.doc b/doc/doxygen/options.doc index 64ce0db6f5..17acadde2d 100644 --- a/doc/doxygen/options.doc +++ b/doc/doxygen/options.doc @@ -1272,10 +1272,10 @@ is registered and will clean up some variables and terminate/cleanup the tracing TODO: Add when this should be used. -\subsection options_generic_path XML file inclusion path +\subsection options_generic_path Profile files' search path It is possible to specify a list of directories to search into for the -\ tag in XML files by using the \b path configuration +trace files (see @ref pf_trace) by using the \b path configuration item. To add several directory to the path, set the configuration item several times, as in \verbatim --cfg=path:toto --cfg=path:tutu diff --git a/doc/doxygen/outcomes_vizu.doc b/doc/doxygen/outcomes_vizu.doc index d8a7ad3267..59f5958187 100644 --- a/doc/doxygen/outcomes_vizu.doc +++ b/doc/doxygen/outcomes_vizu.doc @@ -121,9 +121,8 @@ tracing/uncategorized tracing/filename : A file with this name will be created to register the simulation. The file - is in the Paje format and can be analyzed using Viva or Paje visualization + is in the Paje format and can be analyzed using Paje visualization tools. More information can be found in these webpages: - http://github.com/schnorr/viva/ http://github.com/schnorr/pajeng/ \verbatim --cfg=tracing/filename:mytracefile.trace @@ -326,24 +325,6 @@ TODO TODO \endverbatim -\li \c -viva/categorized -: - This option generates a graph configuration file for Viva considering - categorized resource utilization. -\verbatim ---cfg=viva/categorized:graph_categorized.plist -\endverbatim - -\li \c -viva/uncategorized -: - This option generates a graph configuration file for Viva considering - uncategorized resource utilization. -\verbatim ---cfg=viva/uncategorized:graph_uncategorized.plist -\endverbatim - Please pass \verbatim --help-tracing \endverbatim to your simulator for the updated list of tracing options. @@ -362,7 +343,6 @@ simulator): --cfg=tracing:yes \ --cfg=tracing/uncategorized:yes \ --cfg=tracing/filename:mytracefile.trace \ - --cfg=viva/uncategorized:uncat.plist \endverbatim \li I want to trace only a subset of my MSG (or SimDAG) tasks. @@ -377,7 +357,6 @@ recompiling, run your simulator with the following parameters: --cfg=tracing:yes \ --cfg=tracing/categorized:yes \ --cfg=tracing/filename:mytracefile.trace \ - --cfg=viva/categorized:cat.plist \endverbatim @@ -453,23 +432,6 @@ several options to analyze this trace file: file format. Consider this option if you need to understand the causality of your distributed simulation. -- Visualize the behavior of your simulation with treemaps (specially - if your simulation has a platform with several thousand resources), - provided by the Viva - visualization tool. See Viva's wiki for - further details on what is a treemap and how to use it. - -- Correlate the behavior of your simulator with the platform topology - with an interactive, force-directed, and hierarchical graph - visualization, provided by Viva. Check Viva's wiki for - further details. This research report, - published at ISPASS 2013, has a detailed description of this - visualization technique. - - You can also check our online tutorial section that contains a dedicated tutorial with several @@ -484,123 +446,4 @@ several options to analyze this trace file: href="http://lists.gforge.inria.fr/pipermail/simgrid-user/">mailing list archive for old messages regarding tracing and analysis. -\subsection tracing_viva_analysis Viva Visualization Tool - -This subsection describe some of the concepts regarding the Viva Visualization Tool and -its relation with SimGrid traces. You should refer to Viva's website -for further details on all its visualization techniques. - -\subsubsection tracing_viva_time_slice Time Slice - -The analysis of a trace file using the tool always takes into account -the concept of the time-slice. This concept means that what -is being visualized in the screen is always calculated considering a -specific time frame, with its beggining and end timestamp. The -time-slice is configured by the user and can be changed dynamically -through the window called Time Interval that is opened -whenever a trace file is being analyzed. Users are capable to select -the beggining and size of the time slice. - -\subsubsection tracing_viva_graph Hierarchical Graph View - -As stated above (see section \ref tracing_tracing_analyzing), one -possibility to analyze SimGrid traces is to use Viva's graph view with -a graph configuration to customize the graph according to the -traces. A valid graph configuration (we are using the non-XML Property List -Format to describe the configuration) can be created for any -SimGrid-based simulator using the ---cfg=viva/uncategorized:graph_uncategorized.plist or ---cfg=viva/categorized:graph_categorized.plist (if the -simulator defines resource utilization categories) when executing the -simulation. - -\subsubsection basic_conf Basic Graph Configuration - -The basic description of the configuration is as follows: -\verbatim -{ - node = (LINK, HOST, ); - edge = (HOST-LINK, LINK-HOST, LINK-LINK, ); -\endverbatim - -The nodes of the graph will be created based on the node -parameter, which in this case is the different "HOST"s and -"LINK"s of the platform used to simulate. The edge -parameter indicates that the edges of the graph will be created based -on the "HOST-LINK"s, "LINK-HOST"s, and -"LINK-LINK"s of the platform. After the definition of these -two parameters, the configuration must detail how the nodes -(HOSTs and LINKs) should be drawn. - -For that, the configuration must have an entry for each of -the types used. For HOST, as basic configuration, we have: - -\verbatim - HOST = { - type = square; - size = power; - values = (power_used); - }; -\endverbatim - -The parameter size indicates which variable from the trace -file will be used to define the size of the node HOST in the -visualization. If the simulation was executed with availability -traces, the size of the nodes will be changed according to these -traces. The parameter type indicates which geometrical shape -will be used to represent HOST, and the values parameter -indicates which values from the trace will be used to fill the shape. - -For LINK we have: - -\verbatim - LINK = { - type = rhombus; - size = bandwidth; - values = (bandwidth_used); - }; -} -\endverbatim - -The same configuration parameters are used here: type (with a -rhombus), the size (whose value is from trace's bandwidth -variable) and the values. - -\subsubsection custom_graph Customizing the Graph Representation - -Viva is capable to handle a customized graph representation based on -the variables present in the trace file. In the case of SimGrid, every -time a category is created for tasks, two variables in the trace file -are defined: one to indicate node utilization (how much power was used -by that task category), and another to indicate link utilization (how -much bandwidth was used by that category). For instance, if the user -declares a category named request, there will be variables -named prequest and a brequest (p -for power and b for bandwidth). It is important to notice that -the variable prequest in this case is only available for HOST, -and brequest is only available for LINK. Example: -suppose there are two categories for tasks: request and compute. To -create a customized graph representation with a proportional -separation of host and link utilization, use as configuration for HOST -and LINK this: - -\verbatim - HOST = { - type = square; - size = power; - values = (prequest, pcomputation); - }; - LINK = { - type = rhombus; - size = bandwidth; - values = (brequest, bcomputation); - }; -\endverbatim - -This configuration enables the analysis of resource utilization by MSG -tasks through the identification of load-balancing issues and network -bottlenecks, for instance. - */ diff --git a/doc/doxygen/tutorial_msg.doc b/doc/doxygen/tutorial_msg.doc index 6adb7d3fa1..3149ffc262 100644 --- a/doc/doxygen/tutorial_msg.doc +++ b/doc/doxygen/tutorial_msg.doc @@ -113,7 +113,6 @@ provided by the [online documentation][fn:4] and by several tutorials: Several tools can be used to visualize the result of SimGrid simulations and get a better understanding of simulations. -- [viva][fn:1] will be useful to make fancy graph or treemap visualizations. - [pajeng][fn:5] provides a Gantt-chart visualization. - [Vite][fn:6] also provides a Gantt-chart visualization. @@ -122,7 +121,7 @@ may have to install from the source on other systems. Check the documentation of each software for more details. ~~~~{.sh} -sudo apt-get install viva pajeng vite +sudo apt-get install pajeng vite ~~~~ \section intro_start Let's get started @@ -158,16 +157,7 @@ specify the full path to simgrid-colorizer on the above line, such as \c /opt/simgrid/bin/simgrid-colorizer. If you did not install it at all, you can find it in /bin/colorize. -For a really fancy output, you should use [viva/triva][fn:1]: - -~~~~{.sh} -./masterworker0 platforms/platform.xml deployment0.xml --cfg=tracing:yes \ - --cfg=tracing/uncategorized:yes --cfg=viva/uncategorized:uncat.plist -LANG=C ; viva simgrid.trace uncat.plist -~~~~ - -For a more classical Gantt-Chart visualization, you can produce a -[Paje][fn:5] trace: +For a classical Gantt-Chart visualization, you can produce a [Paje][fn:5] trace: ~~~~{.sh} ./masterworker0 platforms/platform.xml deployment0.xml --cfg=tracing:yes \ @@ -317,7 +307,7 @@ tasks processed). These debug messages can be activated as follows: ## Using the Tracing Mechanism SimGrid can trace all resource consumption and the outcome can be -displayed with viva as illustrated in the section \ref intro_setup. However, when several +displayed as illustrated in the section \ref intro_setup. However, when several masters are deployed, it is hard to understand what happens. ~~~~{.xml} @@ -349,18 +339,7 @@ void TRACE_category(const char *category); void MSG_task_set_category (msg_task_t task, const char *category); ~~~~ -The outcome can then be visualized as follows: - -~~~~{.sh} -./masterworker3 platforms/platform.xml deployment3.xml --cfg=tracing:yes\ - --cfg=tracing/categorized:yes --cfg=viva/categorized:viva_cat.plist -LANG=C; viva simgrid.trace viva_cat.plist -~~~~ - -Right now, you should realize that nothing is behaving like you -expect. Most workers are idle even though input data are ridiculous -and there are several masters deployed on the platform. Using a -Gantt-chart visualization may help: +The outcome can then be visualized as a Gantt-chart as follows: ~~~~{.sh} ./masterworker3 platforms/platform.xml deployment3.xml --cfg=tracing:yes \ @@ -368,8 +347,10 @@ Gantt-chart visualization may help: pajeng simgrid.trace ~~~~ -OK, so it should now be obvious that round robin is actually -very bad. +Right now, you should realize that nothing is behaving like you expect. Most +workers are idle even though input data are ridiculous and there are several +masters deployed on the platform. So it should now be obvious that round robin +is actually very bad. ## Improving the Scheduling @@ -436,8 +417,8 @@ bytes that you manage to distribute and process in one hour on \section intro_todo TODO: Points to improve for the next time - Propose equivalent exercises and skeleton in java. -- Propose a virtualbox image with everything (simgrid, pajeng, viva, - ...) already set up. +- Propose a virtualbox image with everything (simgrid, pajeng, ...) already set + up. - Ease the installation on mac OS X (binary installer) and windows. - Explain that programming in C or java and having a working diff --git a/doc/doxygen/uhood_arch.doc b/doc/doxygen/uhood_arch.doc index 9c0e26582e..e75eb7815a 100644 --- a/doc/doxygen/uhood_arch.doc +++ b/doc/doxygen/uhood_arch.doc @@ -75,7 +75,7 @@ It is a portable library providing some grounding features such as \ref XBT_log, \ref XBT_ex and \ref XBT_config. XBT also encompass the following convenient C data structures: -\ref XBT_dynar, \ref XBT_dict, \ref XBT_heap, and +\ref XBT_dynar, \ref XBT_dict, and \ref XBT_swag. The code is being migrated in C++ so you should probably want to use standard C++ containers instead of them if possible. diff --git a/doc/doxygen/uhood_switch.doc b/doc/doxygen/uhood_switch.doc index 3515d8c23c..684eacbb20 100644 --- a/doc/doxygen/uhood_switch.doc +++ b/doc/doxygen/uhood_switch.doc @@ -371,7 +371,7 @@ this generates a bunch of C++ files: responsible for wrapping the parameters in the `struct s_smx_simcall`; and wrapping out the result; -* [accessors](https://github.com/simgrid/simgrid/blob/4ae2fd01d8cc55bf83654e29f294335e3cb1f022/src/simix/popping_accessors.h) +* [accessors](https://github.com/simgrid/simgrid/blob/4ae2fd01d8cc55bf83654e29f294335e3cb1f022/src/simix/popping_accessors.hpp) to get/set values of of `struct s_smx_simcall`; * a simulation-kernel-side [big switch](https://github.com/simgrid/simgrid/blob/4ae2fd01d8cc55bf83654e29f294335e3cb1f022/src/simix/popping_generated.cpp#L106) @@ -629,7 +629,7 @@ which can be exposed using the same API as `std::condition_variable`: @code{cpp} class ConditionVariable { private: - friend s_smx_cond; + friend s_smx_cond_t; smx_cond_t cond_; ConditionVariable(smx_cond_t cond) : cond_(cond) {} public: diff --git a/doc/manpage/smpirun.1 b/doc/manpage/smpirun.1 index 89783e11a9..abdf45c99d 100644 --- a/doc/manpage/smpirun.1 +++ b/doc/manpage/smpirun.1 @@ -64,9 +64,6 @@ Group MPI processes by location. \fB\-trace-resource\fR Trace resource utilization. .TP -\fB\-trace-viva\fR -Generate configuration for Viva's GraphView. -.TP \fB\-trace-file\fR Name of the tracefile diff --git a/examples/java/app/bittorrent/Peer.java b/examples/java/app/bittorrent/Peer.java index 43be4d4bda..8c07d84d42 100644 --- a/examples/java/app/bittorrent/Peer.java +++ b/examples/java/app/bittorrent/Peer.java @@ -325,6 +325,9 @@ public class Peer extends Process { } } break; + default: + Msg.error("Unexpected message type: " + message.type); + break; } if (remotePeer != null) { remotePeer.addSpeedValue(1 / (Msg.getClock() - beginReceiveTime)); diff --git a/examples/java/app/masterworker/Main.java b/examples/java/app/masterworker/Main.java index d252ee4b30..4c051d6f14 100644 --- a/examples/java/app/masterworker/Main.java +++ b/examples/java/app/masterworker/Main.java @@ -21,8 +21,8 @@ class Main { /* initialize the MSG simulation. Must be done before anything else (even logging). */ Msg.init(args); - String platf = args.length > 1 ? args[0] : "examples/java/platform.xml"; - String deploy = args.length > 1 ? args[1] : "examples/java/masterworker/masterworkerDeployment.xml"; + String platf = args.length > 1 ? args[0] : "../platforms/small_platform.xml"; + String deploy = args.length > 1 ? args[1] : "app/masterworker/masterworker.xml"; Msg.verb("Platform: "+platf+"; Deployment:"+deploy+"; Current directory: "+new File(".").getAbsolutePath()); diff --git a/examples/java/app/pingpong/Main.java b/examples/java/app/pingpong/Main.java index 8e56aed06d..2030da984b 100644 --- a/examples/java/app/pingpong/Main.java +++ b/examples/java/app/pingpong/Main.java @@ -25,8 +25,8 @@ class Main { File f = new File(platfFile); if (!f.exists()) { - System.err.println("File "+platfFile+" does not exist in "+System.getProperty("user.dir")); - System.err.println("Usage : Main ../platforms/platform.xml"); + Msg.error("File " + platfFile + " does not exist in " + System.getProperty("user.dir")); + Msg.error("Usage : Main ../platforms/platform.xml"); } Msg.createEnvironment(platfFile); diff --git a/examples/java/async/dsend/async-dsend.tesh b/examples/java/async/dsend/async-dsend.tesh index c886a6488a..94b00158ca 100644 --- a/examples/java/async/dsend/async-dsend.tesh +++ b/examples/java/async/dsend/async-dsend.tesh @@ -17,9 +17,9 @@ $ java -classpath ${classpath:=.} async/dsend/Main ${srcdir:=.}/../platforms/sma > [ 0.000000] (1:Sender@Boivin) Sending "Task_5" to "Jupiter" > [ 0.000000] (1:Sender@Boivin) Sending "Task_6" to "Tremblay" > [ 0.000000] (1:Sender@Boivin) All tasks have been (asynchronously) dispatched. Let's sleep for 20s so that nobody gets a message from a terminated process. -> [ 1.933362] (2:Receiver@Bourassa) Received a task. I'm done. See you! -> [ 1.933362] (4:Receiver@Ginette) Received a task. I'm done. See you! > [ 1.933362] (6:Receiver@Jupiter) Received a task. I'm done. See you! +> [ 1.933362] (4:Receiver@Ginette) Received a task. I'm done. See you! +> [ 1.933362] (2:Receiver@Bourassa) Received a task. I'm done. See you! > [ 2.449247] (7:Receiver@Tremblay) Received a task. I'm done. See you! > [ 2.964768] (3:Receiver@Fafard) Received a task. I'm done. See you! > [ 4.162002] (5:Receiver@Jacquelin) Received a task. I'm done. See you! diff --git a/examples/java/async/waitall/async-waitall.tesh b/examples/java/async/waitall/async-waitall.tesh index d518e7d940..9f7ccea295 100644 --- a/examples/java/async/waitall/async-waitall.tesh +++ b/examples/java/async/waitall/async-waitall.tesh @@ -16,9 +16,9 @@ $ java -classpath ${classpath:=.} async/waitall/Main ${srcdir:=.}/../platforms/s > [ 0.000000] (1:Sender@Boivin) Start the Sending 'Task_5' to 'Jupiter' > [ 0.000000] (1:Sender@Boivin) Start the Sending 'Task_6' to 'Tremblay' > [ 0.000000] (1:Sender@Boivin) All tasks have been (asynchronously) dispatched. Let's wait for their completion. -> [ 1.933362] (2:Receiver@Bourassa) I got my task, good bye. -> [ 1.933362] (4:Receiver@Ginette) I got my task, good bye. > [ 1.933362] (6:Receiver@Jupiter) I got my task, good bye. +> [ 1.933362] (4:Receiver@Ginette) I got my task, good bye. +> [ 1.933362] (2:Receiver@Bourassa) I got my task, good bye. > [ 2.449247] (7:Receiver@Tremblay) I got my task, good bye. > [ 2.964768] (3:Receiver@Fafard) I got my task, good bye. > [ 4.162002] (5:Receiver@Jacquelin) I got my task, good bye. diff --git a/examples/java/cloud/masterworker/Main.java b/examples/java/cloud/masterworker/Main.java index a99dc21ab7..5623ffa5e2 100644 --- a/examples/java/cloud/masterworker/Main.java +++ b/examples/java/cloud/masterworker/Main.java @@ -29,8 +29,8 @@ class Main { File f = new File(platfFile); if (!f.exists()) { - System.err.println("File "+platfFile+" does not exist in "+System.getProperty("user.dir")); - System.err.println("Usage : Main ../platforms/platform.xml"); + Msg.error("File " + platfFile + " does not exist in " + System.getProperty("user.dir")); + Msg.error("Usage : Main ../platforms/platform.xml"); } Msg.createEnvironment(platfFile); diff --git a/examples/java/cloud/migration/Daemon.java b/examples/java/cloud/migration/Daemon.java index d3c2af2001..6e1bae981b 100644 --- a/examples/java/cloud/migration/Daemon.java +++ b/examples/java/cloud/migration/Daemon.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2014. The SimGrid Team. +/* Copyright (c) 2014-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ public class Daemon extends Process { } catch (HostFailureException e) { e.printStackTrace(); } catch (TaskCancelledException e) { - System.out.println("task cancelled"); + Msg.info("task cancelled"); suspend(); // Suspend the process } currentTask = new Task(this.getHost().getName()+"-daemon-"+(i++), this.getHost().getSpeed()*100, 0); diff --git a/examples/java/cloud/migration/XVM.java b/examples/java/cloud/migration/XVM.java index 414c98096e..10407a6f36 100644 --- a/examples/java/cloud/migration/XVM.java +++ b/examples/java/cloud/migration/XVM.java @@ -47,7 +47,7 @@ public class XVM extends VM { } public int getLoad(){ - System.out.println("Remaining comp:" + this.daemon.getRemaining()); + Msg.info("Remaining comp:" + this.daemon.getRemaining()); return this.currentLoad; } diff --git a/examples/java/dht/chord/dht-chord.tesh b/examples/java/dht/chord/dht-chord.tesh index 85328dc67a..4ab498e6f7 100644 --- a/examples/java/dht/chord/dht-chord.tesh +++ b/examples/java/dht/chord/dht-chord.tesh @@ -4,7 +4,7 @@ $ java -classpath ${classpath:=.} dht/chord/Main ${srcdir:=.}/../platforms/cluster.xml ${srcdir:=.}/dht/chord/chord.xml > [0.000000] [java/INFO] Using regular java threads. -> [1046.787586] [java/INFO] MSG_main finished; Cleaning up the simulation... +> [1046.732943] [java/INFO] MSG_main finished; Cleaning up the simulation... > [node-1.acme.org:dht.chord.Node:(2) 0.000000] [java/INFO] Joining the ring with id 366680 knowing node 42 > [node-2.acme.org:dht.chord.Node:(3) 0.000000] [java/INFO] Joining the ring with id 533744 knowing node 366680 > [node-3.acme.org:dht.chord.Node:(4) 0.000000] [java/INFO] Joining the ring with id 1319738 knowing node 42 diff --git a/examples/java/dht/kademlia/Node.java b/examples/java/dht/kademlia/Node.java index 841e9d1be8..a690a0177d 100644 --- a/examples/java/dht/kademlia/Node.java +++ b/examples/java/dht/kademlia/Node.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, 2016. The SimGrid Team. +/* Copyright (c) 2012-2014, 2016-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -77,6 +77,7 @@ public class Node extends Process { } } catch (Exception e) { + Msg.debug("Caught exception: " + e); } } Msg.info(findNodeSuccedded + "/" + (findNodeSuccedded + findNodeFailed) + " FIND_NODE have succedded."); @@ -256,6 +257,7 @@ public class Node extends Process { waitFor(1); } catch (Exception ex) { + Msg.debug("Caught exception: " + ex); } } while (Msg.getClock() < timeout && !destinationFound); } diff --git a/examples/java/dht/kademlia/RoutingTable.java b/examples/java/dht/kademlia/RoutingTable.java index c5f88b2438..ed1552e706 100644 --- a/examples/java/dht/kademlia/RoutingTable.java +++ b/examples/java/dht/kademlia/RoutingTable.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, 2016. The SimGrid Team. +/* Copyright (c) 2012-2014, 2016-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -67,7 +67,8 @@ public class RoutingTable { Msg.debug("Adding " + id + " to my routing table"); bucket.add(id); if (bucket.size() > Common.BUCKET_SIZE) { - //TODO: Ping the least seen guy and remove him if he is offline. + // TODO + Msg.debug("Should ping the least seen guy and remove him if he is offline."); } } } diff --git a/examples/java/energy/vm/energy-vm.tesh b/examples/java/energy/vm/energy-vm.tesh index 3afdf2d021..7bae428688 100644 --- a/examples/java/energy/vm/energy-vm.tesh +++ b/examples/java/energy/vm/energy-vm.tesh @@ -8,12 +8,12 @@ $ java -classpath ${classpath:=.} energy/vm/Main ${srcdir:=.}/../platforms/energ > [MyHost1:energy VM runner:(1) 0.000000] [java/INFO] Create two tasks on Host3: both inside a VM > [MyHost1:energy VM runner:(1) 0.000000] [java/INFO] Wait 5 seconds. The tasks are still running (they run for 3 seconds, but 2 tasks are co-located, so they run for 6 seconds) > [MyHost1:energy VM runner:(1) 5.000000] [java/INFO] Wait another 5 seconds. The tasks stop at some point in between -> [MyHost3:p31:(6) 6.000000] [java/INFO] This worker is done. -> [MyHost3:p312:(7) 6.000000] [java/INFO] This worker is done. > [MyHost2:p22:(5) 6.000000] [java/INFO] This worker is done. +> [MyHost3:p312:(7) 6.000000] [java/INFO] This worker is done. +> [MyHost3:p31:(6) 6.000000] [java/INFO] This worker is done. > [vmHost1:p12:(3) 6.000000] [java/INFO] This worker is done. -> [vmHost3:p21:(4) 6.000000] [java/INFO] This worker is done. > [vmHost1:p11:(2) 6.000000] [java/INFO] This worker is done. +> [vmHost3:p21:(4) 6.000000] [java/INFO] This worker is done. > [10.000000] [surf_energy/INFO] Total energy consumption: 4320.000000 Joules (used hosts: 4320.000000 Joules; unused/idle hosts: 0.000000) > [10.000000] [java/INFO] MSG_main finished; Cleaning up the simulation... > [10.000000] [surf_energy/INFO] Energy consumption of host MyHost1: 1120.000000 Joules diff --git a/examples/java/process/kill/Main.java b/examples/java/process/kill/Main.java index 71d281baf3..96cf864d3f 100644 --- a/examples/java/process/kill/Main.java +++ b/examples/java/process/kill/Main.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2014. The SimGrid Team. +/* Copyright (c) 2006-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ public class Main { Killer killer = new Killer("Jacquelin","killer"); killer.start(); } catch (MsgException e){ - System.out.println("Create processes failed!"); + Msg.error("Create processes failed!"); } /* execute the simulation. */ diff --git a/examples/java/process/suspend/Main.java b/examples/java/process/suspend/Main.java index 04510e852d..3eb40645c7 100644 --- a/examples/java/process/suspend/Main.java +++ b/examples/java/process/suspend/Main.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2014, 2016. The SimGrid Team. +/* Copyright (c) 2006-2014, 2016-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -25,9 +25,9 @@ public class Main { try { DreamMaster process1 = new DreamMaster("Jacquelin","DreamMaster"); process1.start(); - } catch (MsgException e){ - System.out.println("Create processes failed!"); - } + } catch (MsgException e){ + Msg.error("Create processes failed!"); + } /* execute the simulation. */ Msg.run(); diff --git a/examples/java/task/priority/Main.java b/examples/java/task/priority/Main.java index fd301f3de2..272898fa40 100644 --- a/examples/java/task/priority/Main.java +++ b/examples/java/task/priority/Main.java @@ -17,7 +17,7 @@ public class Main { Msg.init(args); if(args.length < 2) { Msg.info("Usage : Priority platform_file deployment_file"); - Msg.info("example : Priority ../platforms/platform.xml priorityDeployment.xml"); + Msg.info("example : Priority ../platforms/small_platform.xml priority.xml"); System.exit(1); } diff --git a/examples/java/trace/pingpong/Main.java b/examples/java/trace/pingpong/Main.java index 782f68f633..37f866fbec 100644 --- a/examples/java/trace/pingpong/Main.java +++ b/examples/java/trace/pingpong/Main.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2007, 2012-2014, 2016. The SimGrid Team. +/* Copyright (c) 2006-2007, 2012-2014, 2016-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -10,6 +10,8 @@ import org.simgrid.msg.MsgException; import org.simgrid.trace.Trace; public class Main { + public static final String PM_STATE = "PM_STATE"; + private Main() { throw new IllegalAccessError("Utility class"); } @@ -29,11 +31,11 @@ public class Main { new Receiver ("Tremblay", "Receiver", null).start(); /* Initialize some state for the hosts */ - Trace.hostStateDeclare ("PM_STATE"); - Trace.hostStateDeclareValue ("PM_STATE", "waitingPing", "0 0 1"); - Trace.hostStateDeclareValue ("PM_STATE", "sendingPong", "0 1 0"); - Trace.hostStateDeclareValue ("PM_STATE", "sendingPing", "0 1 1"); - Trace.hostStateDeclareValue ("PM_STATE", "waitingPong", "1 0 0"); + Trace.hostStateDeclare (PM_STATE); + Trace.hostStateDeclareValue (PM_STATE, "waitingPing", "0 0 1"); + Trace.hostStateDeclareValue (PM_STATE, "sendingPong", "0 1 0"); + Trace.hostStateDeclareValue (PM_STATE, "sendingPing", "0 1 1"); + Trace.hostStateDeclareValue (PM_STATE, "waitingPong", "1 0 0"); /* execute the simulation. */ Msg.run(); diff --git a/examples/java/trace/pingpong/Receiver.java b/examples/java/trace/pingpong/Receiver.java index 4a1f26e55e..58e82b9b8a 100644 --- a/examples/java/trace/pingpong/Receiver.java +++ b/examples/java/trace/pingpong/Receiver.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2007, 2012-2014, 2016. The SimGrid Team. +/* Copyright (c) 2006-2007, 2012-2014, 2016-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -15,6 +15,7 @@ import org.simgrid.trace.Trace; public class Receiver extends Process { private static final double COMM_SIZE_LAT = 1; private static final double COMM_SIZE_BW = 100000000; + private static final String PM_STATE = Main.PM_STATE; public Receiver(String hostname, String name, String[]args) throws HostNotFoundException { super(hostname,name,args); @@ -22,7 +23,7 @@ public class Receiver extends Process { public void main(String[] args) throws MsgException { Msg.info("hello!"); - Trace.hostPushState (getHost().getName(), "PM_STATE", "waitingPing"); + Trace.hostPushState (getHost().getName(), PM_STATE, "waitingPing"); /* Wait for the ping */ Msg.info("try to get a task"); @@ -41,15 +42,15 @@ public class Receiver extends Process { Msg.info(" --- bw "+ COMM_SIZE_BW/communicationTime + " ----"); /* Send the pong */ - Trace.hostPushState (getHost().getName(), "PM_STATE", "sendingPong"); + Trace.hostPushState (getHost().getName(), PM_STATE, "sendingPong"); double computeDuration = 0; PingPongTask pong = new PingPongTask("no name",computeDuration,COMM_SIZE_LAT); pong.setTime(time); pong.send(ping.getSource().getName()); /* Pop the two states */ - Trace.hostPopState (getHost().getName(), "PM_STATE"); - Trace.hostPopState (getHost().getName(), "PM_STATE"); + Trace.hostPopState (getHost().getName(), PM_STATE); + Trace.hostPopState (getHost().getName(), PM_STATE); Msg.info("goodbye!"); } diff --git a/examples/java/trace/pingpong/Sender.java b/examples/java/trace/pingpong/Sender.java index 6af47fac5a..c97be48029 100644 --- a/examples/java/trace/pingpong/Sender.java +++ b/examples/java/trace/pingpong/Sender.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2014, 2016. The SimGrid Team. +/* Copyright (c) 2006-2014, 2016-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -16,7 +16,7 @@ import org.simgrid.trace.Trace; public class Sender extends Process { private static final double COMM_SIZE_LAT = 1; private static final double COMM_SIZE_BW = 100000000; - private static final String PM_STATE = "PM_STATE"; + private static final String PM_STATE = Main.PM_STATE; public Sender(String hostname, String name, String[] args) throws HostNotFoundException { super(hostname,name,args); diff --git a/examples/msg/README.doc b/examples/msg/README.doc index 0e5654a04c..63afa511bc 100644 --- a/examples/msg/README.doc +++ b/examples/msg/README.doc @@ -117,7 +117,7 @@ options to see the task executions: to that are used to classify its tasks. When the program is executed, the tracing mechanism registers the resource utilization of hosts and links according to these categories. Recommanded options: - @verbatim --cfg=tracing:yes --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes --cfg=viva/categorized:viva_cat.plist --cfg=viva/uncategorized:viva_uncat.plist + @verbatim --cfg=tracing:yes --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes @endverbatim - Master Workers tracing. @@ -126,7 +126,7 @@ options to see the task executions: using several tracing features. It traces resource usage, sorted out in several categories; Trace marks and user variables are also used. Recommanded options: - @verbatim --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes --cfg=viva/categorized:viva_cat.plist --cfg=viva/uncategorized:viva_uncat.plist + @verbatim --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes @endverbatim - Process migration tracing. @@ -139,7 +139,7 @@ options to see the task executions: TODO: These tracing examples should be integrated in the examples to not duplicate the C files. A full command line to see the result in -the right tool (viva/vite/FrameSoc) should be given along with some +the right tool (vite/FrameSoc) should be given along with some screenshots. @subsection msg_ex_tracing_user_variables Tracing user variables diff --git a/examples/msg/app-chainsend/broadcaster.c b/examples/msg/app-chainsend/broadcaster.c index 79612fcce3..23c4484797 100644 --- a/examples/msg/app-chainsend/broadcaster.c +++ b/examples/msg/app-chainsend/broadcaster.c @@ -79,6 +79,7 @@ broadcaster_t broadcaster_init(xbt_dynar_t host_list, unsigned int piece_count) int status; broadcaster_t bc = xbt_new(s_broadcaster_t, 1); + bc->first = NULL; bc->piece_count = piece_count; bc->current_piece = 0; bc->host_list = host_list; diff --git a/examples/msg/async-waitany/async-waitany.tesh b/examples/msg/async-waitany/async-waitany.tesh index 6637734a1a..97c19dd08d 100644 --- a/examples/msg/async-waitany/async-waitany.tesh +++ b/examples/msg/async-waitany/async-waitany.tesh @@ -17,18 +17,18 @@ $ $SG_TEST_EXENV ${bindir:=.}/async-waitany ${srcdir:=.}/small_platform.xml ${sr > [ 10.000000] (3:receiver@Jupiter) Wait to receive task 1 > [ 10.000000] (3:receiver@Jupiter) Wait to receive task 2 > [ 10.423774] (2:receiver@Fafard) Processing "Task_4" -> [ 10.469435] (3:receiver@Jupiter) Processing "Task_3" +> [ 10.469435] (3:receiver@Jupiter) Processing "Task_5" > [ 11.079116] (2:receiver@Fafard) "Task_4" done > [ 11.079116] (2:receiver@Fafard) Processing "Task_0" -> [ 11.124778] (3:receiver@Jupiter) "Task_3" done +> [ 11.124778] (3:receiver@Jupiter) "Task_5" done > [ 11.124778] (3:receiver@Jupiter) Processing "Task_1" > [ 11.734459] (2:receiver@Fafard) "Task_0" done > [ 11.734459] (2:receiver@Fafard) Processing "Task_2" > [ 11.780120] (3:receiver@Jupiter) "Task_1" done -> [ 11.780120] (3:receiver@Jupiter) Processing "Task_5" +> [ 11.780120] (3:receiver@Jupiter) Processing "Task_3" > [ 12.389801] (2:receiver@Fafard) "Task_2" done > [ 12.415509] (2:receiver@Fafard) I'm done. See you! -> [ 12.435462] (3:receiver@Jupiter) "Task_5" done +> [ 12.435462] (3:receiver@Jupiter) "Task_3" done > [ 12.454477] (0:maestro@) Simulation time 12.4545 > [ 12.454477] (1:sender@Tremblay) Goodbye now! > [ 12.454477] (3:receiver@Jupiter) I'm done. See you! diff --git a/examples/msg/cloud-capping/cloud-capping.c b/examples/msg/cloud-capping/cloud-capping.c index 73b3edaf1e..e84ac2c258 100644 --- a/examples/msg/cloud-capping/cloud-capping.c +++ b/examples/msg/cloud-capping/cloud-capping.c @@ -76,8 +76,8 @@ static void test_dynamic_change(void) MSG_process_create("worker0", worker_busy_loop_main, &task0, (msg_host_t)vm0); MSG_process_create("worker1", worker_busy_loop_main, &task1, (msg_host_t)vm1); - double task0_remain_prev = MSG_task_get_flops_amount(task0); - double task1_remain_prev = MSG_task_get_flops_amount(task1); + double task0_remain_prev = MSG_task_get_remaining_work_ratio(task0); + double task1_remain_prev = MSG_task_get_remaining_work_ratio(task1); const double cpu_speed = MSG_host_get_speed(pm0); for (int i = 0; i < 10; i++) { @@ -86,8 +86,8 @@ static void test_dynamic_change(void) MSG_vm_set_bound(vm1, new_bound); MSG_process_sleep(100); - double task0_remain_now = MSG_task_get_flops_amount(task0); - double task1_remain_now = MSG_task_get_flops_amount(task1); + double task0_remain_now = MSG_task_get_remaining_work_ratio(task0); + double task1_remain_now = MSG_task_get_remaining_work_ratio(task1); double task0_flops_per_sec = task0_remain_prev - task0_remain_now; double task1_flops_per_sec = task1_remain_prev - task1_remain_now; diff --git a/examples/msg/cloud-two-tasks/cloud-two-tasks.c b/examples/msg/cloud-two-tasks/cloud-two-tasks.c index e8b2d0bb50..1b0f499d98 100644 --- a/examples/msg/cloud-two-tasks/cloud-two-tasks.c +++ b/examples/msg/cloud-two-tasks/cloud-two-tasks.c @@ -63,7 +63,7 @@ static int master_main(int argc, char *argv[]) while(MSG_get_clock()<100) { if (atask != NULL) - XBT_INFO("aTask remaining duration: %g", MSG_task_get_flops_amount(atask)); + XBT_INFO("aTask remaining duration: %g", MSG_task_get_remaining_work_ratio(atask)); MSG_process_sleep(1); } diff --git a/examples/msg/dht-kademlia/dht-kademlia.tesh b/examples/msg/dht-kademlia/dht-kademlia.tesh index 17c786bec1..cecf9b67dc 100644 --- a/examples/msg/dht-kademlia/dht-kademlia.tesh +++ b/examples/msg/dht-kademlia/dht-kademlia.tesh @@ -18,10 +18,10 @@ $ $SG_TEST_EXENV ${bindir:=.}/dht-kademlia ${srcdir:=.}/cluster.xml ${srcdir:=.} > [ 0.000000] (12:node@node-11.acme.org) Hi, I'm going to join the network with id 2047 > [ 0.000000] (13:node@node-12.acme.org) Hi, I'm going to join the network with id 4095 > [780.000000] ( 7:node@node-6.acme.org) 5/5 FIND_NODE have succeeded -> [780.000000] ( 9:node@node-8.acme.org) 5/5 FIND_NODE have succeeded -> [780.000000] ( 3:node@node-2.acme.org) 6/6 FIND_NODE have succeeded +> [780.000000] ( 9:node@node-8.acme.org) 6/6 FIND_NODE have succeeded +> [780.000000] ( 3:node@node-2.acme.org) 5/5 FIND_NODE have succeeded > [780.000000] ( 2:node@node-1.acme.org) 6/6 FIND_NODE have succeeded -> [780.000000] (11:node@node-10.acme.org) 5/5 FIND_NODE have succeeded +> [780.000000] (11:node@node-10.acme.org) 6/6 FIND_NODE have succeeded > [780.000000] ( 1:node@node-0.acme.org) 7/7 FIND_NODE have succeeded > [780.000000] ( 5:node@node-4.acme.org) 6/6 FIND_NODE have succeeded > [780.000000] (13:node@node-12.acme.org) 6/6 FIND_NODE have succeeded diff --git a/examples/msg/energy-consumption/energy-consumption.c b/examples/msg/energy-consumption/energy-consumption.c index cf5c6384e6..19b93a6ca2 100644 --- a/examples/msg/energy-consumption/energy-consumption.c +++ b/examples/msg/energy-consumption/energy-consumption.c @@ -26,7 +26,7 @@ static int dvfs(int argc, char *argv[]) // Run a task start = MSG_get_clock(); msg_task_t task1 = MSG_task_create ("t1", 100E6, 0, NULL); - XBT_INFO("Run a task of %.0E flops",MSG_task_get_flops_amount(task1)); + XBT_INFO("Run a task of %.0E flops", MSG_task_get_initial_flops_amount(task1)); MSG_task_execute (task1); MSG_task_destroy(task1); XBT_INFO("Task done (duration: %.2f s). Current peak speed=%.0E flop/s; Current consumption: from %.0fW to %.0fW" @@ -43,7 +43,7 @@ static int dvfs(int argc, char *argv[]) // Run a second task start = MSG_get_clock(); task1 = MSG_task_create ("t2", 100E6, 0, NULL); - XBT_INFO("Run a task of %.0E flops",MSG_task_get_flops_amount(task1)); + XBT_INFO("Run a task of %.0E flops", MSG_task_get_initial_flops_amount(task1)); MSG_task_execute (task1); MSG_task_destroy(task1); XBT_INFO("Task done (duration: %.2f s). Current peak speed=%.0E flop/s; Energy dissipated=%.0f J", diff --git a/examples/msg/energy-ptask/energy-ptask.c b/examples/msg/energy-ptask/energy-ptask.c index 2764151643..d368bb1378 100644 --- a/examples/msg/energy-ptask/energy-ptask.c +++ b/examples/msg/energy-ptask/energy-ptask.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2017. 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. */ @@ -38,7 +38,8 @@ static int runner(int argc, char *argv[]) MSG_parallel_task_create("parallel task", hosts_count, hosts, computation_amounts, communication_amounts, NULL); MSG_parallel_task_execute(ptask); MSG_task_destroy(ptask); - /* The arrays communication_amounts and computation_amounts are not to be freed manually */ + xbt_free(communication_amounts); + xbt_free(computation_amounts); XBT_INFO("We can do the same with a timeout of one second enabled."); computation_amounts = xbt_new0(double, hosts_count); @@ -53,6 +54,8 @@ static int runner(int argc, char *argv[]) msg_error_t errcode = MSG_parallel_task_execute_with_timeout(ptask, 1 /* timeout (in seconds)*/); xbt_assert(errcode == MSG_TIMEOUT, "Woops, this did not timeout as expected... Please report that bug."); MSG_task_destroy(ptask); + xbt_free(communication_amounts); + xbt_free(computation_amounts); XBT_INFO("Then, build a parallel task involving only computations and no communication (1 Gflop per node)"); computation_amounts = xbt_new0(double, hosts_count); @@ -61,6 +64,7 @@ static int runner(int argc, char *argv[]) ptask = MSG_parallel_task_create("parallel exec", hosts_count, hosts, computation_amounts, NULL/* no comm */, NULL); MSG_parallel_task_execute(ptask); MSG_task_destroy(ptask); + xbt_free(computation_amounts); XBT_INFO("Then, build a parallel task with no computation nor communication (synchro only)"); computation_amounts = xbt_new0(double, hosts_count); @@ -68,8 +72,10 @@ static int runner(int argc, char *argv[]) ptask = MSG_parallel_task_create("parallel sync", hosts_count, hosts, computation_amounts, communication_amounts, NULL); MSG_parallel_task_execute(ptask); MSG_task_destroy(ptask); + xbt_free(communication_amounts); + xbt_free(computation_amounts); - XBT_INFO("Finally, trick the ptask to do a 'remote execution', on host %s", MSG_host_get_name(hosts[1])); + XBT_INFO("Finally, trick the ptask to do a 'remote execution', on host %s", MSG_host_get_name(hosts[1])); computation_amounts = xbt_new0(double, 1); computation_amounts[0] = 1e9; // 1 Gflop msg_host_t *remote = xbt_new(msg_host_t,1); @@ -77,10 +83,11 @@ static int runner(int argc, char *argv[]) ptask = MSG_parallel_task_create("remote exec", 1, remote, computation_amounts, NULL/* no comm */, NULL); MSG_parallel_task_execute(ptask); MSG_task_destroy(ptask); - free(remote); + xbt_free(remote); + xbt_free(computation_amounts); XBT_INFO("Goodbye now!"); - free(hosts); + xbt_free(hosts); return 0; } diff --git a/examples/msg/energy-vm/energy-vm.tesh b/examples/msg/energy-vm/energy-vm.tesh index 965e8ac013..2735dac214 100644 --- a/examples/msg/energy-vm/energy-vm.tesh +++ b/examples/msg/energy-vm/energy-vm.tesh @@ -9,12 +9,12 @@ $ ${bindir:=.}/energy-vm/energy-vm$EXEEXT ${srcdir:=.}/../platforms/energy_platf > [ 0.000000] (1:dvfs@MyHost1) Create two tasks on Host3: both inside a VM > [ 0.000000] (1:dvfs@MyHost1) Wait 5 seconds. The tasks are still running (they run for 3 seconds, but 2 tasks are co-located, so they run for 6 seconds) > [ 5.000000] (1:dvfs@MyHost1) Wait another 5 seconds. The tasks stop at some point in between -> [ 6.000000] (6:p31@MyHost3) This worker is done. -> [ 6.000000] (7:p32@MyHost3) This worker is done. > [ 6.000000] (5:p22@MyHost2) This worker is done. +> [ 6.000000] (7:p32@MyHost3) This worker is done. +> [ 6.000000] (6:p31@MyHost3) This worker is done. > [ 6.000000] (3:p12@vm_host1) This worker is done. -> [ 6.000000] (4:p21@vm_host3) This worker is done. > [ 6.000000] (2:p11@vm_host1) This worker is done. +> [ 6.000000] (4:p21@vm_host3) This worker is done. > [ 10.000000] (0:maestro@) Total energy consumption: 4320.000000 Joules (used hosts: 4320.000000 Joules; unused/idle hosts: 0.000000) > [ 10.000000] (0:maestro@) Total simulation time: 10.00; Host2 and Host3 must have the exact same energy consumption; Host1 is multi-core and will differ. > [ 10.000000] (0:maestro@) Energy consumption of host MyHost1: 1120.000000 Joules diff --git a/examples/msg/io-file/io-file.tesh b/examples/msg/io-file/io-file.tesh index e0483eb297..d3700afca5 100644 --- a/examples/msg/io-file/io-file.tesh +++ b/examples/msg/io-file/io-file.tesh @@ -5,9 +5,6 @@ $ ${bindir:=.}/io-file ${srcdir:=.}/storage/storage.xml "--log=root.fmt:[%10.6r] > [ 0.000000] (1:host@alice) Open file 'c:\Windows\setupact.log' > [ 0.000000] (2:host@bob) Open file '/home/doc/simgrid/examples/platforms/nancy.xml' > [ 0.000000] (3:host@carl) Open file '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml' -> [ 0.000000] (1:host@alice) Capacity of the storage element 'c:\Windows\setupact.log' is stored on: 2391537133 / 536870912000 -> [ 0.000000] (2:host@bob) Capacity of the storage element '/home/doc/simgrid/examples/platforms/nancy.xml' is stored on: 36933331 / 536870912000 -> [ 0.000000] (3:host@carl) Capacity of the storage element '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml' is stored on: 36933331 / 536870912000 > [ 0.000000] (4:host@denise) File Descriptor information: > Full path: '/home/doc/simgrid/examples/platforms/g5k.xml' > Size: 17028 @@ -16,6 +13,9 @@ $ ${bindir:=.}/io-file ${srcdir:=.}/storage/storage.xml "--log=root.fmt:[%10.6r] > Storage Type: 'single_SSD' > File Descriptor Id: 0 > [ 0.000000] (4:host@denise) Open file '/home/doc/simgrid/examples/platforms/g5k.xml' +> [ 0.000000] (1:host@alice) Capacity of the storage element 'c:\Windows\setupact.log' is stored on: 2391537133 / 536870912000 +> [ 0.000000] (2:host@bob) Capacity of the storage element '/home/doc/simgrid/examples/platforms/nancy.xml' is stored on: 36933331 / 536870912000 +> [ 0.000000] (3:host@carl) Capacity of the storage element '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml' is stored on: 36933331 / 536870912000 > [ 0.000000] (4:host@denise) Capacity of the storage element '/home/doc/simgrid/examples/platforms/g5k.xml' is stored on: 13221994 / 536870912000 > [ 0.000040] (2:host@bob) Have read 4028 from '/home/doc/simgrid/examples/platforms/nancy.xml' > [ 0.000085] (4:host@denise) Have read 17028 from '/home/doc/simgrid/examples/platforms/g5k.xml' diff --git a/examples/msg/io-remote/io-remote.tesh b/examples/msg/io-remote/io-remote.tesh index 46b251e2e5..390369c62f 100644 --- a/examples/msg/io-remote/io-remote.tesh +++ b/examples/msg/io-remote/io-remote.tesh @@ -4,9 +4,6 @@ $ ${bindir:=.}/io-remote$EXEEXT ${srcdir:=.}/storage/remote_io.xml ${srcdir:=.}/ > [ 0.000000] (0@ ) Init: 12 MiB used on 'Disk1' > [ 0.000000] (0@ ) Init: 2280 MiB used on 'Disk2' > [ 0.000000] (1@alice) Opened file 'c:\Windows\setupact.log' -> [ 0.000000] (2@ bob) Opened file '/scratch/lib/libsimgrid.so.3.6.2' -> [ 0.000000] (3@ carl) Opened file '/scratch/lib/libsimgrid.so.3.6.2' -> [ 0.000000] (4@ dave) Opened file 'c:\Windows\bootstat.dat' > [ 0.000000] (1@alice) File Descriptor information: > Full path: 'c:\Windows\setupact.log' > Size: 101663 @@ -14,6 +11,8 @@ $ ${bindir:=.}/io-remote$EXEEXT ${srcdir:=.}/storage/remote_io.xml ${srcdir:=.}/ > Storage Id: 'Disk2' > Storage Type: 'SATA-II_HDD' > File Descriptor Id: 0 +> [ 0.000000] (1@alice) Try to read 101663 from 'c:\Windows\setupact.log' +> [ 0.000000] (2@ bob) Opened file '/scratch/lib/libsimgrid.so.3.6.2' > [ 0.000000] (2@ bob) File Descriptor information: > Full path: '/scratch/lib/libsimgrid.so.3.6.2' > Size: 12710497 @@ -21,6 +20,8 @@ $ ${bindir:=.}/io-remote$EXEEXT ${srcdir:=.}/storage/remote_io.xml ${srcdir:=.}/ > Storage Id: 'Disk1' > Storage Type: 'SATA-II_HDD' > File Descriptor Id: 0 +> [ 0.000000] (2@ bob) Try to read 12710497 from '/scratch/lib/libsimgrid.so.3.6.2' +> [ 0.000000] (3@ carl) Opened file '/scratch/lib/libsimgrid.so.3.6.2' > [ 0.000000] (3@ carl) File Descriptor information: > Full path: '/scratch/lib/libsimgrid.so.3.6.2' > Size: 12710497 @@ -28,6 +29,8 @@ $ ${bindir:=.}/io-remote$EXEEXT ${srcdir:=.}/storage/remote_io.xml ${srcdir:=.}/ > Storage Id: 'Disk1' > Storage Type: 'SATA-II_HDD' > File Descriptor Id: 0 +> [ 0.000000] (3@ carl) Try to read 12710497 from '/scratch/lib/libsimgrid.so.3.6.2' +> [ 0.000000] (4@ dave) Opened file 'c:\Windows\bootstat.dat' > [ 0.000000] (4@ dave) File Descriptor information: > Full path: 'c:\Windows\bootstat.dat' > Size: 67584 @@ -35,9 +38,6 @@ $ ${bindir:=.}/io-remote$EXEEXT ${srcdir:=.}/storage/remote_io.xml ${srcdir:=.}/ > Storage Id: 'Disk2' > Storage Type: 'SATA-II_HDD' > File Descriptor Id: 0 -> [ 0.000000] (1@alice) Try to read 101663 from 'c:\Windows\setupact.log' -> [ 0.000000] (2@ bob) Try to read 12710497 from '/scratch/lib/libsimgrid.so.3.6.2' -> [ 0.000000] (3@ carl) Try to read 12710497 from '/scratch/lib/libsimgrid.so.3.6.2' > [ 0.000000] (4@ dave) Try to read 67584 from 'c:\Windows\bootstat.dat' > [ 0.001469] (4@ dave) Have read 67584 from 'c:\Windows\bootstat.dat'. Offset is now at: 67584 > [ 0.001469] (4@ dave) Seek back to the begining of the stream... diff --git a/examples/msg/plugin-hostload/plugin-hostload.c b/examples/msg/plugin-hostload/plugin-hostload.c index 717c54bca2..e458d27d11 100644 --- a/examples/msg/plugin-hostload/plugin-hostload.c +++ b/examples/msg/plugin-hostload/plugin-hostload.c @@ -27,7 +27,7 @@ static int execute_load_test(int argc, char* argv[]) // Run a task start = MSG_get_clock(); msg_task_t task1 = MSG_task_create("t1", 100E6, 0, NULL); - XBT_INFO("Run a task of %.0E flops", MSG_task_get_flops_amount(task1)); + XBT_INFO("Run a task of %.0E flops", MSG_task_get_initial_flops_amount(task1)); MSG_task_execute(task1); MSG_task_destroy(task1); @@ -44,7 +44,7 @@ static int execute_load_test(int argc, char* argv[]) // Run a second task start = MSG_get_clock(); task1 = MSG_task_create("t2", 100E6, 0, NULL); - XBT_INFO("Run a task of %.0E flops", MSG_task_get_flops_amount(task1)); + XBT_INFO("Run a task of %.0E flops", MSG_task_get_initial_flops_amount(task1)); MSG_task_execute(task1); MSG_task_destroy(task1); XBT_INFO("Done working on my task; this took %.2fs; current peak speed: %.0E flop/s; number of flops computed so " diff --git a/examples/msg/process-startkilltime/process-startkilltime.c b/examples/msg/process-startkilltime/process-startkilltime.c index 6e12c39670..cb11383d88 100644 --- a/examples/msg/process-startkilltime/process-startkilltime.c +++ b/examples/msg/process-startkilltime/process-startkilltime.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2017. 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. */ @@ -8,7 +8,8 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example"); /* Executed on process termination*/ -static int my_onexit(void* ignored1, void *ignored2) { +static int my_onexit(XBT_ATTRIB_UNUSED void* ignored1, XBT_ATTRIB_UNUSED void* ignored2) +{ XBT_INFO("Exiting now (done sleeping or got killed)."); /* - Just display an informative message (see tesh file) */ return 0; } diff --git a/examples/msg/process-startkilltime/process-startkilltime.tesh b/examples/msg/process-startkilltime/process-startkilltime.tesh index b7c58aed60..220fffcb20 100644 --- a/examples/msg/process-startkilltime/process-startkilltime.tesh +++ b/examples/msg/process-startkilltime/process-startkilltime.tesh @@ -33,6 +33,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/process-startkilltime ${srcdir:=.}/cluster.xml ${s p Test1 Process with kill time +! output sort $ $SG_TEST_EXENV ${bindir:=.}/process-startkilltime ${srcdir:=.}/cluster.xml ${srcdir:=.}/../msg/process-startkilltime/kill_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (1:sleeper@node-1.acme.org) Hello! I go to sleep. > [ 0.000000] (2:sleeper@node-2.acme.org) Hello! I go to sleep. @@ -45,6 +46,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/process-startkilltime ${srcdir:=.}/cluster.xml ${s p Test2 Process with start and kill times +! output sort $ $SG_TEST_EXENV ${bindir:=.}/process-startkilltime ${srcdir:=.}/cluster.xml ${srcdir:=.}/../msg/process-startkilltime/start_kill_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (1:sleeper@node-0.acme.org) Hello! I go to sleep. > [ 1.000000] (2:sleeper@node-1.acme.org) Hello! I go to sleep. diff --git a/examples/msg/trace-categories/trace-categories.tesh b/examples/msg/trace-categories/trace-categories.tesh index f2836b61a3..ebe181cddd 100644 --- a/examples/msg/trace-categories/trace-categories.tesh +++ b/examples/msg/trace-categories/trace-categories.tesh @@ -2,43 +2,9 @@ p Tracing multiple categories master/worker application -$ $SG_TEST_EXENV ${bindir:=.}/trace-categories$EXEEXT --cfg=tracing:yes --cfg=tracing/buffer:yes --cfg=tracing/filename:categories.trace --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes --cfg=viva/categorized:categories.cat.plist --cfg=viva/uncategorized:categories.uncat.plist ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml +$ $SG_TEST_EXENV ${bindir:=.}/trace-categories$EXEEXT --cfg=tracing:yes --cfg=tracing/buffer:yes --cfg=tracing/filename:categories.trace --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'categories.trace' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to 'yes' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'categories.cat.plist' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'categories.uncat.plist' - -$ $SG_TEST_EXENV cat categories.cat.plist -> node = ("LINK","HOST"); -> edge = ("0-LINK4-LINK4","0-LINK4-HOST1","0-HOST1-LINK4"); -> -> host = { -> type = "square"; -> size = "power"; -> values = ("pcompute","pdata","pfinalize","prequest"); -> }; -> link = { -> type = "rhombus"; -> size = "bandwidth"; -> values = ("bcompute","bdata","bfinalize","brequest"); -> }; - -$ $SG_TEST_EXENV cat categories.uncat.plist -> node = ("LINK","HOST"); -> edge = ("0-LINK4-LINK4","0-LINK4-HOST1","0-HOST1-LINK4"); -> -> host = { -> type = "square"; -> size = "power"; -> values = ("power_used"); -> }; -> link = { -> type = "rhombus"; -> size = "bandwidth"; -> values = ("bandwidth_used"); -> }; - -$ rm -rf categories.trace categories.cat.plist categories.uncat.plist diff --git a/examples/msg/trace-host-user-variables/trace-host-user-variables.c b/examples/msg/trace-host-user-variables/trace-host-user-variables.c index 89ec48da99..49177174e6 100644 --- a/examples/msg/trace-host-user-variables/trace-host-user-variables.c +++ b/examples/msg/trace-host-user-variables/trace-host-user-variables.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010, 2012-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010, 2012-2017. 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. */ @@ -77,38 +77,24 @@ int main(int argc, char *argv[]) xbt_dynar_free (&link_variables); } - //create a customized viva graph configuration file - FILE *fp = fopen ("viva_graph.plist", "w"); - if (fp == NULL){ - return 1; - } - fprintf (fp, "{\n node = ("); xbt_dynar_t nodes_type = TRACE_get_node_types (); if (nodes_type){ XBT_INFO ("Node types in the trace:"); char *node_type; xbt_dynar_foreach (nodes_type, cursor, node_type){ XBT_INFO ("%s", node_type); - fprintf (fp, "%s, ", node_type); } xbt_dynar_free (&nodes_type); } - fprintf (fp, ");\n edge = ("); xbt_dynar_t edges_type = TRACE_get_edge_types (); if (edges_type){ XBT_INFO ("Node types in the trace:"); char *edge_type; xbt_dynar_foreach (edges_type, cursor, edge_type){ XBT_INFO ("%s", edge_type); - fprintf (fp, "%s, ", edge_type); } xbt_dynar_free (&edges_type); } - fprintf (fp, ");\n"); - fprintf (fp, " host = {\n type = square;\n size = HDD_capacity; \n values = (HDD_utilization);\n };\n"); - fprintf (fp, " link = {\n type = rhombus;\n size = bandwidth;\n };\n"); - fprintf (fp, "}\n"); - fclose (fp); return 0; } diff --git a/examples/msg/trace-host-user-variables/trace-host-user-variables.tesh b/examples/msg/trace-host-user-variables/trace-host-user-variables.tesh index 431b774ee5..4331c820b1 100644 --- a/examples/msg/trace-host-user-variables/trace-host-user-variables.tesh +++ b/examples/msg/trace-host-user-variables/trace-host-user-variables.tesh @@ -16,9 +16,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/trace-host-user-variables$EXEEXT --cfg=tracing:yes > [0.004078] [msg_test/INFO] 0-LINK3-HOST1 > [0.004078] [msg_test/INFO] 0-LINK3-LINK3 -$ rm -f viva_graph.plist +$ rm -f simgrid.trace p Not tracing user variables $ $SG_TEST_EXENV ${bindir:=.}/trace-host-user-variables$EXEEXT ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml - -$ rm -f simgrid.trace viva_graph.plist diff --git a/examples/msg/trace-link-user-variables/trace-link-user-variables.tesh b/examples/msg/trace-link-user-variables/trace-link-user-variables.tesh index 130aff3705..9cf74355ca 100644 --- a/examples/msg/trace-link-user-variables/trace-link-user-variables.tesh +++ b/examples/msg/trace-link-user-variables/trace-link-user-variables.tesh @@ -208,98 +208,98 @@ $ tail -n +3 simgrid.trace > 8 0 5 30 0.035083 > 8 0 4 31 498000000.000000 > 8 0 5 31 0.000015 -> 15 0 6 0 topology 19 0 -> 16 0 6 0 topology 20 0 -> 15 0 6 0 topology 15 1 -> 16 0 6 0 topology 9 1 -> 15 0 6 0 topology 27 2 -> 16 0 6 0 topology 18 2 -> 15 0 7 0 topology 5 3 -> 16 0 7 0 topology 24 3 +> 15 0 6 0 topology 12 0 +> 16 0 6 0 topology 16 0 +> 15 0 6 0 topology 9 1 +> 16 0 6 0 topology 16 1 +> 15 0 6 0 topology 16 2 +> 16 0 6 0 topology 14 2 +> 15 0 6 0 topology 21 3 +> 16 0 6 0 topology 19 3 > 15 0 6 0 topology 8 4 -> 16 0 6 0 topology 10 4 -> 15 0 6 0 topology 21 5 -> 16 0 6 0 topology 22 5 -> 15 0 7 0 topology 1 6 -> 16 0 7 0 topology 9 6 -> 15 0 6 0 topology 23 7 -> 16 0 6 0 topology 24 7 -> 15 0 7 0 topology 1 8 -> 16 0 7 0 topology 15 8 -> 15 0 7 0 topology 1 9 -> 16 0 7 0 topology 11 9 -> 15 0 6 0 topology 26 10 -> 16 0 6 0 topology 27 10 -> 15 0 7 0 topology 5 11 -> 16 0 7 0 topology 18 11 -> 15 0 8 0 topology 11 12 -> 16 0 8 0 topology 2 12 -> 15 0 6 0 topology 28 13 -> 16 0 6 0 topology 29 13 -> 15 0 6 0 topology 12 14 -> 16 0 6 0 topology 16 14 -> 15 0 6 0 topology 9 15 -> 16 0 6 0 topology 16 15 -> 15 0 6 0 topology 14 16 -> 16 0 6 0 topology 13 16 -> 15 0 6 0 topology 29 17 -> 16 0 6 0 topology 11 17 -> 15 0 7 0 topology 3 18 -> 16 0 7 0 topology 30 18 -> 15 0 6 0 topology 11 19 -> 16 0 6 0 topology 15 19 +> 16 0 6 0 topology 19 4 +> 15 0 6 0 topology 19 5 +> 16 0 6 0 topology 20 5 +> 15 0 6 0 topology 8 6 +> 16 0 6 0 topology 20 6 +> 15 0 6 0 topology 27 7 +> 16 0 6 0 topology 18 7 +> 15 0 7 0 topology 5 8 +> 16 0 7 0 topology 18 8 +> 15 0 7 0 topology 4 9 +> 16 0 7 0 topology 18 9 +> 15 0 7 0 topology 2 10 +> 16 0 7 0 topology 18 10 +> 15 0 6 0 topology 16 11 +> 16 0 6 0 topology 21 11 +> 15 0 6 0 topology 21 12 +> 16 0 6 0 topology 22 12 +> 15 0 6 0 topology 9 13 +> 16 0 6 0 topology 12 13 +> 15 0 6 0 topology 15 14 +> 16 0 6 0 topology 9 14 +> 15 0 7 0 topology 1 15 +> 16 0 7 0 topology 9 15 +> 15 0 6 0 topology 20 16 +> 16 0 6 0 topology 23 16 +> 15 0 6 0 topology 23 17 +> 16 0 6 0 topology 24 17 +> 15 0 7 0 topology 5 18 +> 16 0 7 0 topology 24 18 +> 15 0 7 0 topology 4 19 +> 16 0 7 0 topology 24 19 > 15 0 7 0 topology 2 20 > 16 0 7 0 topology 24 20 -> 15 0 8 0 topology 18 21 -> 16 0 8 0 topology 6 21 -> 15 0 8 0 topology 10 22 -> 16 0 8 0 topology 5 22 -> 15 0 6 0 topology 8 23 -> 16 0 6 0 topology 19 23 -> 15 0 6 0 topology 12 24 -> 16 0 6 0 topology 25 24 -> 15 0 7 0 topology 4 25 -> 16 0 7 0 topology 24 25 -> 15 0 6 0 topology 16 26 -> 16 0 6 0 topology 14 26 -> 15 0 8 0 topology 17 27 -> 16 0 8 0 topology 4 27 -> 15 0 6 0 topology 12 28 -> 16 0 6 0 topology 17 28 -> 15 0 6 0 topology 9 29 -> 16 0 6 0 topology 17 29 -> 15 0 6 0 topology 21 30 -> 16 0 6 0 topology 19 30 -> 15 0 6 0 topology 22 31 -> 16 0 6 0 topology 25 31 -> 15 0 8 0 topology 24 32 -> 16 0 8 0 topology 7 32 -> 15 0 7 0 topology 3 33 -> 16 0 7 0 topology 28 33 -> 15 0 6 0 topology 25 34 -> 16 0 6 0 topology 26 34 -> 15 0 6 0 topology 8 35 -> 16 0 6 0 topology 20 35 -> 15 0 8 0 topology 13 36 -> 16 0 8 0 topology 3 36 -> 15 0 7 0 topology 2 37 -> 16 0 7 0 topology 18 37 -> 15 0 6 0 topology 9 38 -> 16 0 6 0 topology 12 38 -> 15 0 6 0 topology 14 39 -> 16 0 6 0 topology 8 39 -> 15 0 6 0 topology 20 40 -> 16 0 6 0 topology 23 40 -> 15 0 7 0 topology 4 41 -> 16 0 7 0 topology 18 41 -> 15 0 6 0 topology 13 42 -> 16 0 6 0 topology 8 42 -> 15 0 6 0 topology 11 43 -> 16 0 6 0 topology 8 43 -> 15 0 6 0 topology 16 44 -> 16 0 6 0 topology 21 44 -> 15 0 6 0 topology 30 45 -> 16 0 6 0 topology 28 45 +> 15 0 6 0 topology 11 21 +> 16 0 6 0 topology 15 21 +> 15 0 7 0 topology 1 22 +> 16 0 7 0 topology 15 22 +> 15 0 6 0 topology 12 23 +> 16 0 6 0 topology 17 23 +> 15 0 6 0 topology 9 24 +> 16 0 6 0 topology 17 24 +> 15 0 6 0 topology 22 25 +> 16 0 6 0 topology 25 25 +> 15 0 6 0 topology 12 26 +> 16 0 6 0 topology 25 26 +> 15 0 6 0 topology 25 27 +> 16 0 6 0 topology 26 27 +> 15 0 6 0 topology 26 28 +> 16 0 6 0 topology 27 28 +> 15 0 6 0 topology 14 29 +> 16 0 6 0 topology 8 29 +> 15 0 6 0 topology 13 30 +> 16 0 6 0 topology 8 30 +> 15 0 6 0 topology 11 31 +> 16 0 6 0 topology 8 31 +> 15 0 6 0 topology 8 32 +> 16 0 6 0 topology 10 32 +> 15 0 6 0 topology 30 33 +> 16 0 6 0 topology 28 33 +> 15 0 7 0 topology 3 34 +> 16 0 7 0 topology 28 34 +> 15 0 6 0 topology 28 35 +> 16 0 6 0 topology 29 35 +> 15 0 7 0 topology 3 36 +> 16 0 7 0 topology 30 36 +> 15 0 6 0 topology 14 37 +> 16 0 6 0 topology 13 37 +> 15 0 6 0 topology 29 38 +> 16 0 6 0 topology 11 38 +> 15 0 7 0 topology 1 39 +> 16 0 7 0 topology 11 39 +> 15 0 8 0 topology 24 40 +> 16 0 8 0 topology 7 40 +> 15 0 8 0 topology 10 41 +> 16 0 8 0 topology 5 41 +> 15 0 8 0 topology 13 42 +> 16 0 8 0 topology 3 42 +> 15 0 8 0 topology 17 43 +> 16 0 8 0 topology 4 43 +> 15 0 8 0 topology 18 44 +> 16 0 8 0 topology 6 44 +> 15 0 8 0 topology 11 45 +> 16 0 8 0 topology 2 45 > 1 9 3 Link_Capacity "1 1 1" > 1 10 3 Link_Utilization "0.9 0.1 0.1" > 8 0 9 8 12.340000 @@ -566,36 +566,36 @@ $ tail -n +3 simgrid.trace > 10 0.412439 10 8 5.600000 > 10 0.412439 10 9 3.400000 > 10 0.412439 10 8 5.600000 -> 7 0.412439 1 6 -> 7 0.412439 1 3 -> 7 0.412439 3 28 -> 7 0.412439 3 29 -> 7 0.412439 3 23 -> 7 0.412439 3 30 -> 7 0.412439 3 24 -> 7 0.412439 3 18 -> 7 0.412439 1 1 +> 7 0.412439 3 16 +> 7 0.412439 3 14 > 7 0.412439 3 19 > 7 0.412439 3 20 +> 7 0.412439 3 18 > 7 0.412439 3 21 > 7 0.412439 3 22 -> 7 0.412439 3 25 -> 7 0.412439 3 26 -> 7 0.412439 3 31 -> 7 0.412439 3 27 -> 7 0.412439 3 16 -> 7 0.412439 3 14 > 7 0.412439 3 12 > 7 0.412439 3 9 > 7 0.412439 3 15 +> 7 0.412439 3 23 +> 7 0.412439 3 24 > 7 0.412439 3 17 +> 7 0.412439 3 25 +> 7 0.412439 3 26 +> 7 0.412439 3 27 > 7 0.412439 3 8 > 7 0.412439 3 10 +> 7 0.412439 3 28 +> 7 0.412439 3 29 > 7 0.412439 3 13 +> 7 0.412439 3 30 > 7 0.412439 3 11 -> 7 0.412439 1 5 -> 7 0.412439 1 2 > 7 0.412439 1 7 +> 7 0.412439 1 5 +> 7 0.412439 1 3 > 7 0.412439 1 4 +> 7 0.412439 1 6 +> 7 0.412439 1 2 +> 7 0.412439 1 1 +> 7 0.412439 3 31 $ rm -f simgrid.trace diff --git a/examples/msg/trace-masterworker/trace-masterworker.c b/examples/msg/trace-masterworker/trace-masterworker.c index 2ebf78d686..56cb7a3051 100644 --- a/examples/msg/trace-masterworker/trace-masterworker.c +++ b/examples/msg/trace-masterworker/trace-masterworker.c @@ -53,9 +53,9 @@ static int worker(int argc, char *argv[]) MSG_task_destroy(task); break; } - //adding the value returned by MSG_task_get_compute_duration(task) - //to the variable "task_computation" - TRACE_host_variable_add(MSG_host_get_name(MSG_host_self()), "task_computation", MSG_task_get_flops_amount(task)); + // adding the value returned by MSG_task_get_compute_duration(task) to the variable "task_computation" + TRACE_host_variable_add(MSG_host_get_name(MSG_host_self()), "task_computation", + MSG_task_get_initial_flops_amount(task)); MSG_task_execute(task); MSG_task_destroy(task); task = NULL; diff --git a/examples/msg/trace-masterworker/trace-masterworker.tesh b/examples/msg/trace-masterworker/trace-masterworker.tesh index d17cce3d64..0ce739d1de 100644 --- a/examples/msg/trace-masterworker/trace-masterworker.tesh +++ b/examples/msg/trace-masterworker/trace-masterworker.tesh @@ -1,14 +1,12 @@ #! ./tesh p Tracing master/worker application -$ $SG_TEST_EXENV ${bindir:=.}/trace-masterworker$EXEEXT --cfg=tracing:yes --cfg=tracing/buffer:yes --cfg=tracing/filename:trace-masterworker.trace --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes --cfg=viva/categorized:trace-masterworker.cat.plist --cfg=viva/uncategorized:trace-masterworker.uncat.plist ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml +$ $SG_TEST_EXENV ${bindir:=.}/trace-masterworker$EXEEXT --cfg=tracing:yes --cfg=tracing/buffer:yes --cfg=tracing/filename:trace-masterworker.trace --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'trace-masterworker.trace' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to 'yes' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'trace-masterworker.cat.plist' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'trace-masterworker.uncat.plist' > [4.214821] [msg_trace_masterworker/INFO] Declared tracing categories: > [4.214821] [msg_trace_masterworker/INFO] compute > [4.214821] [msg_trace_masterworker/INFO] finalize @@ -24,8 +22,6 @@ $ $SG_TEST_EXENV ${bindir:=.}/trace-masterworker$EXEEXT ${srcdir:=.}/config_trac > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'trace-masterworker.trace' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to 'yes' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'trace-masterworker.cat.plist' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'trace-masterworker.uncat.plist' > [4.214821] [msg_trace_masterworker/INFO] Declared tracing categories: > [4.214821] [msg_trace_masterworker/INFO] compute > [4.214821] [msg_trace_masterworker/INFO] finalize @@ -38,15 +34,13 @@ p Not tracing master/worker application $ $SG_TEST_EXENV ${bindir:=.}/trace-masterworker$EXEEXT ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml p Testing tracing by process -$ $SG_TEST_EXENV ${bindir:=.}/trace-masterworker$EXEEXT --cfg=tracing:yes --cfg=tracing/msg/process:yes --cfg=tracing/buffer:yes --cfg=tracing/filename:trace-masterworker.trace --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes --cfg=viva/categorized:trace-masterworker.cat.plist --cfg=viva/uncategorized:trace-masterworker.uncat.plist ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml +$ $SG_TEST_EXENV ${bindir:=.}/trace-masterworker$EXEEXT --cfg=tracing:yes --cfg=tracing/msg/process:yes --cfg=tracing/buffer:yes --cfg=tracing/filename:trace-masterworker.trace --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../msg/app-masterworker/app-masterworker_d.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/msg/process' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'trace-masterworker.trace' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to 'yes' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to 'yes' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'trace-masterworker.cat.plist' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'trace-masterworker.uncat.plist' > [4.214821] [msg_trace_masterworker/INFO] Declared tracing categories: > [4.214821] [msg_trace_masterworker/INFO] compute > [4.214821] [msg_trace_masterworker/INFO] finalize @@ -55,34 +49,5 @@ $ $SG_TEST_EXENV ${bindir:=.}/trace-masterworker$EXEEXT --cfg=tracing:yes --cfg= > [4.214821] [msg_trace_masterworker/INFO] Declared marks: > [4.214821] [msg_trace_masterworker/INFO] msmark -$ $SG_TEST_EXENV cat trace-masterworker.uncat.plist -> node = ("LINK","HOST"); -> edge = ("0-LINK13-LINK13","0-LINK13-HOST1","0-HOST1-LINK13"); -> -> host = { -> type = "square"; -> size = "power"; -> values = ("power_used"); -> }; -> link = { -> type = "rhombus"; -> size = "bandwidth"; -> values = ("bandwidth_used"); -> }; -$ $SG_TEST_EXENV cat trace-masterworker.cat.plist -> node = ("LINK","HOST"); -> edge = ("0-LINK13-LINK13","0-LINK13-HOST1","0-HOST1-LINK13"); -> -> host = { -> type = "square"; -> size = "power"; -> values = ("pcompute","pfinalize","preport","prequest"); -> }; -> link = { -> type = "rhombus"; -> size = "bandwidth"; -> values = ("bcompute","bfinalize","breport","brequest"); -> }; - -$ rm -rf trace-masterworker.trace trace-masterworker.cat.plist trace-masterworker.uncat.plist +$ rm -rf trace-masterworker.trace diff --git a/examples/msg/trace-platform/trace-platform.tesh b/examples/msg/trace-platform/trace-platform.tesh index 1be528aae7..92cd632918 100644 --- a/examples/msg/trace-platform/trace-platform.tesh +++ b/examples/msg/trace-platform/trace-platform.tesh @@ -209,129 +209,129 @@ $ tail -n +3 trace_platform.trace > 8 0 5 30 0.035083 > 8 0 4 31 498000000.000000 > 8 0 5 31 0.000015 -> 15 0 6 0 topology 19 0 -> 16 0 6 0 topology 20 0 -> 15 0 6 0 topology 15 1 -> 16 0 6 0 topology 9 1 -> 15 0 6 0 topology 27 2 -> 16 0 6 0 topology 18 2 -> 15 0 7 0 topology 5 3 -> 16 0 7 0 topology 24 3 +> 15 0 6 0 topology 12 0 +> 16 0 6 0 topology 16 0 +> 15 0 6 0 topology 9 1 +> 16 0 6 0 topology 16 1 +> 15 0 6 0 topology 16 2 +> 16 0 6 0 topology 14 2 +> 15 0 6 0 topology 21 3 +> 16 0 6 0 topology 19 3 > 15 0 6 0 topology 8 4 -> 16 0 6 0 topology 10 4 -> 15 0 6 0 topology 21 5 -> 16 0 6 0 topology 22 5 -> 15 0 7 0 topology 1 6 -> 16 0 7 0 topology 9 6 -> 15 0 6 0 topology 23 7 -> 16 0 6 0 topology 24 7 -> 15 0 7 0 topology 1 8 -> 16 0 7 0 topology 15 8 -> 15 0 7 0 topology 1 9 -> 16 0 7 0 topology 11 9 -> 15 0 6 0 topology 26 10 -> 16 0 6 0 topology 27 10 -> 15 0 7 0 topology 5 11 -> 16 0 7 0 topology 18 11 -> 15 0 8 0 topology 11 12 -> 16 0 8 0 topology 2 12 -> 15 0 6 0 topology 28 13 -> 16 0 6 0 topology 29 13 -> 15 0 6 0 topology 12 14 -> 16 0 6 0 topology 16 14 -> 15 0 6 0 topology 9 15 -> 16 0 6 0 topology 16 15 -> 15 0 6 0 topology 14 16 -> 16 0 6 0 topology 13 16 -> 15 0 6 0 topology 29 17 -> 16 0 6 0 topology 11 17 -> 15 0 7 0 topology 3 18 -> 16 0 7 0 topology 30 18 -> 15 0 6 0 topology 11 19 -> 16 0 6 0 topology 15 19 +> 16 0 6 0 topology 19 4 +> 15 0 6 0 topology 19 5 +> 16 0 6 0 topology 20 5 +> 15 0 6 0 topology 8 6 +> 16 0 6 0 topology 20 6 +> 15 0 6 0 topology 27 7 +> 16 0 6 0 topology 18 7 +> 15 0 7 0 topology 5 8 +> 16 0 7 0 topology 18 8 +> 15 0 7 0 topology 4 9 +> 16 0 7 0 topology 18 9 +> 15 0 7 0 topology 2 10 +> 16 0 7 0 topology 18 10 +> 15 0 6 0 topology 16 11 +> 16 0 6 0 topology 21 11 +> 15 0 6 0 topology 21 12 +> 16 0 6 0 topology 22 12 +> 15 0 6 0 topology 9 13 +> 16 0 6 0 topology 12 13 +> 15 0 6 0 topology 15 14 +> 16 0 6 0 topology 9 14 +> 15 0 7 0 topology 1 15 +> 16 0 7 0 topology 9 15 +> 15 0 6 0 topology 20 16 +> 16 0 6 0 topology 23 16 +> 15 0 6 0 topology 23 17 +> 16 0 6 0 topology 24 17 +> 15 0 7 0 topology 5 18 +> 16 0 7 0 topology 24 18 +> 15 0 7 0 topology 4 19 +> 16 0 7 0 topology 24 19 > 15 0 7 0 topology 2 20 > 16 0 7 0 topology 24 20 -> 15 0 8 0 topology 18 21 -> 16 0 8 0 topology 6 21 -> 15 0 8 0 topology 10 22 -> 16 0 8 0 topology 5 22 -> 15 0 6 0 topology 8 23 -> 16 0 6 0 topology 19 23 -> 15 0 6 0 topology 12 24 -> 16 0 6 0 topology 25 24 -> 15 0 7 0 topology 4 25 -> 16 0 7 0 topology 24 25 -> 15 0 6 0 topology 16 26 -> 16 0 6 0 topology 14 26 -> 15 0 8 0 topology 17 27 -> 16 0 8 0 topology 4 27 -> 15 0 6 0 topology 12 28 -> 16 0 6 0 topology 17 28 -> 15 0 6 0 topology 9 29 -> 16 0 6 0 topology 17 29 -> 15 0 6 0 topology 21 30 -> 16 0 6 0 topology 19 30 -> 15 0 6 0 topology 22 31 -> 16 0 6 0 topology 25 31 -> 15 0 8 0 topology 24 32 -> 16 0 8 0 topology 7 32 -> 15 0 7 0 topology 3 33 -> 16 0 7 0 topology 28 33 -> 15 0 6 0 topology 25 34 -> 16 0 6 0 topology 26 34 -> 15 0 6 0 topology 8 35 -> 16 0 6 0 topology 20 35 -> 15 0 8 0 topology 13 36 -> 16 0 8 0 topology 3 36 -> 15 0 7 0 topology 2 37 -> 16 0 7 0 topology 18 37 -> 15 0 6 0 topology 9 38 -> 16 0 6 0 topology 12 38 -> 15 0 6 0 topology 14 39 -> 16 0 6 0 topology 8 39 -> 15 0 6 0 topology 20 40 -> 16 0 6 0 topology 23 40 -> 15 0 7 0 topology 4 41 -> 16 0 7 0 topology 18 41 -> 15 0 6 0 topology 13 42 -> 16 0 6 0 topology 8 42 -> 15 0 6 0 topology 11 43 -> 16 0 6 0 topology 8 43 -> 15 0 6 0 topology 16 44 -> 16 0 6 0 topology 21 44 -> 15 0 6 0 topology 30 45 -> 16 0 6 0 topology 28 45 -> 7 0 1 6 -> 7 0 1 3 -> 7 0 3 28 -> 7 0 3 29 -> 7 0 3 23 -> 7 0 3 30 -> 7 0 3 24 -> 7 0 3 18 -> 7 0 1 1 +> 15 0 6 0 topology 11 21 +> 16 0 6 0 topology 15 21 +> 15 0 7 0 topology 1 22 +> 16 0 7 0 topology 15 22 +> 15 0 6 0 topology 12 23 +> 16 0 6 0 topology 17 23 +> 15 0 6 0 topology 9 24 +> 16 0 6 0 topology 17 24 +> 15 0 6 0 topology 22 25 +> 16 0 6 0 topology 25 25 +> 15 0 6 0 topology 12 26 +> 16 0 6 0 topology 25 26 +> 15 0 6 0 topology 25 27 +> 16 0 6 0 topology 26 27 +> 15 0 6 0 topology 26 28 +> 16 0 6 0 topology 27 28 +> 15 0 6 0 topology 14 29 +> 16 0 6 0 topology 8 29 +> 15 0 6 0 topology 13 30 +> 16 0 6 0 topology 8 30 +> 15 0 6 0 topology 11 31 +> 16 0 6 0 topology 8 31 +> 15 0 6 0 topology 8 32 +> 16 0 6 0 topology 10 32 +> 15 0 6 0 topology 30 33 +> 16 0 6 0 topology 28 33 +> 15 0 7 0 topology 3 34 +> 16 0 7 0 topology 28 34 +> 15 0 6 0 topology 28 35 +> 16 0 6 0 topology 29 35 +> 15 0 7 0 topology 3 36 +> 16 0 7 0 topology 30 36 +> 15 0 6 0 topology 14 37 +> 16 0 6 0 topology 13 37 +> 15 0 6 0 topology 29 38 +> 16 0 6 0 topology 11 38 +> 15 0 7 0 topology 1 39 +> 16 0 7 0 topology 11 39 +> 15 0 8 0 topology 24 40 +> 16 0 8 0 topology 7 40 +> 15 0 8 0 topology 10 41 +> 16 0 8 0 topology 5 41 +> 15 0 8 0 topology 13 42 +> 16 0 8 0 topology 3 42 +> 15 0 8 0 topology 17 43 +> 16 0 8 0 topology 4 43 +> 15 0 8 0 topology 18 44 +> 16 0 8 0 topology 6 44 +> 15 0 8 0 topology 11 45 +> 16 0 8 0 topology 2 45 +> 7 0 3 16 +> 7 0 3 14 > 7 0 3 19 > 7 0 3 20 +> 7 0 3 18 > 7 0 3 21 > 7 0 3 22 -> 7 0 3 25 -> 7 0 3 26 -> 7 0 3 31 -> 7 0 3 27 -> 7 0 3 16 -> 7 0 3 14 > 7 0 3 12 > 7 0 3 9 > 7 0 3 15 +> 7 0 3 23 +> 7 0 3 24 > 7 0 3 17 +> 7 0 3 25 +> 7 0 3 26 +> 7 0 3 27 > 7 0 3 8 > 7 0 3 10 +> 7 0 3 28 +> 7 0 3 29 > 7 0 3 13 +> 7 0 3 30 > 7 0 3 11 -> 7 0 1 5 -> 7 0 1 2 > 7 0 1 7 +> 7 0 1 5 +> 7 0 1 3 > 7 0 1 4 +> 7 0 1 6 +> 7 0 1 2 +> 7 0 1 1 +> 7 0 3 31 $ rm -f trace_platform.trace @@ -5265,21 +5265,21 @@ $ tail -n +3 trace_platform.trace > 6 0 4795 6 4390 "gw_AS_toulouse" > 6 0 4796 12 4795 "gw_toulouse" > 6 0 4797 3 4390 "link_gw_toulouse" -> 4 20 1 3 2 L1-LINK3-ROUTER2 -> 4 21 1 3 3 L1-LINK3-LINK3 -> 4 22 1 2 3 L1-ROUTER2-LINK3 +> 4 20 1 3 3 L1-LINK3-LINK3 +> 4 21 1 2 3 L1-ROUTER2-LINK3 +> 4 22 1 3 2 L1-LINK3-ROUTER2 > 4 23 6 9 9 L2-LINK9-LINK9 -> 4 24 6 7 9 L2-HOST7-LINK9 -> 4 25 6 12 9 L2-ROUTER12-LINK9 +> 4 24 6 12 9 L2-ROUTER12-LINK9 +> 4 25 6 7 9 L2-HOST7-LINK9 > 4 26 1 3 12 L1-LINK3-ROUTER12 > 4 27 1 12 3 L1-ROUTER12-LINK3 > 4 28 13 16 16 L3-LINK16-LINK16 -> 4 29 13 14 16 L3-HOST14-LINK16 -> 4 30 13 19 16 L3-ROUTER19-LINK16 +> 4 29 13 19 16 L3-ROUTER19-LINK16 +> 4 30 13 14 16 L3-HOST14-LINK16 > 4 31 6 9 19 L2-LINK9-ROUTER19 > 4 32 6 19 9 L2-ROUTER19-LINK9 -> 4 33 1 19 3 L1-ROUTER19-LINK3 -> 4 34 1 3 19 L1-LINK3-ROUTER19 +> 4 33 1 3 19 L1-LINK3-ROUTER19 +> 4 34 1 19 3 L1-ROUTER19-LINK3 > 4 35 0 3 3 0-LINK3-LINK3 > 4 36 0 2 3 0-ROUTER2-LINK3 > 8 0 4 12 1250000000.000000 @@ -13094,5386 +13094,5386 @@ $ tail -n +3 trace_platform.trace > 8 0 5 4794 0.000100 > 8 0 4 4797 1250000000.000000 > 8 0 5 4797 0.000100 -> 15 0 20 1 topology 17 0 -> 16 0 20 1 topology 8 0 -> 15 0 20 1 topology 18 1 -> 16 0 20 1 topology 9 1 -> 15 0 21 1 topology 15 2 -> 16 0 21 1 topology 18 2 -> 15 0 22 1 topology 3 3 -> 16 0 22 1 topology 15 3 -> 15 0 22 1 topology 2 4 -> 16 0 22 1 topology 12 4 -> 15 0 21 1 topology 14 5 -> 16 0 21 1 topology 15 5 -> 15 0 21 1 topology 15 6 -> 16 0 21 1 topology 17 6 -> 15 0 21 1 topology 12 7 -> 16 0 21 1 topology 14 7 -> 15 0 21 1 topology 16 8 -> 16 0 21 1 topology 18 8 -> 15 0 22 1 topology 6 9 -> 16 0 22 1 topology 16 9 -> 15 0 22 1 topology 9 10 -> 16 0 22 1 topology 19 10 -> 15 0 20 1 topology 15 11 -> 16 0 20 1 topology 6 11 -> 15 0 21 1 topology 12 12 -> 16 0 21 1 topology 13 12 -> 15 0 22 1 topology 3 13 -> 16 0 22 1 topology 14 13 -> 15 0 21 1 topology 16 14 -> 16 0 21 1 topology 17 14 -> 15 0 21 1 topology 12 15 -> 16 0 21 1 topology 15 15 -> 15 0 20 1 topology 14 16 -> 16 0 20 1 topology 5 16 -> 15 0 22 1 topology 3 17 -> 16 0 22 1 topology 13 17 -> 15 0 21 1 topology 15 18 -> 16 0 21 1 topology 16 18 -> 15 0 22 1 topology 9 19 -> 16 0 22 1 topology 20 19 -> 15 0 20 1 topology 20 20 -> 16 0 20 1 topology 10 20 -> 15 0 21 1 topology 18 21 -> 16 0 21 1 topology 19 21 -> 15 0 21 1 topology 13 22 -> 16 0 21 1 topology 14 22 -> 15 0 20 1 topology 19 23 -> 16 0 20 1 topology 11 23 -> 15 0 20 1 topology 12 24 -> 16 0 20 1 topology 3 24 -> 15 0 20 1 topology 16 25 -> 16 0 20 1 topology 7 25 -> 15 0 21 1 topology 13 26 -> 16 0 21 1 topology 15 26 -> 15 0 21 1 topology 18 27 -> 16 0 21 1 topology 20 27 -> 15 0 21 1 topology 20 28 -> 16 0 21 1 topology 19 28 -> 15 0 22 1 topology 6 29 -> 16 0 22 1 topology 18 29 -> 15 0 21 1 topology 17 30 -> 16 0 21 1 topology 18 30 -> 15 0 20 1 topology 13 31 -> 16 0 20 1 topology 4 31 -> 15 0 22 1 topology 6 32 -> 16 0 22 1 topology 17 32 -> 15 0 23 22 topology 96 33 +> 15 0 20 1 topology 15 0 +> 16 0 20 1 topology 16 0 +> 15 0 21 1 topology 6 1 +> 16 0 21 1 topology 16 1 +> 15 0 21 1 topology 2 2 +> 16 0 21 1 topology 12 2 +> 15 0 20 1 topology 16 3 +> 16 0 20 1 topology 17 3 +> 15 0 20 1 topology 15 4 +> 16 0 20 1 topology 17 4 +> 15 0 21 1 topology 6 5 +> 16 0 21 1 topology 17 5 +> 15 0 20 1 topology 16 6 +> 16 0 20 1 topology 18 6 +> 15 0 20 1 topology 17 7 +> 16 0 20 1 topology 18 7 +> 15 0 20 1 topology 15 8 +> 16 0 20 1 topology 18 8 +> 15 0 21 1 topology 6 9 +> 16 0 21 1 topology 18 9 +> 15 0 20 1 topology 18 10 +> 16 0 20 1 topology 19 10 +> 15 0 20 1 topology 20 11 +> 16 0 20 1 topology 19 11 +> 15 0 21 1 topology 9 12 +> 16 0 21 1 topology 19 12 +> 15 0 20 1 topology 18 13 +> 16 0 20 1 topology 20 13 +> 15 0 21 1 topology 9 14 +> 16 0 21 1 topology 20 14 +> 15 0 20 1 topology 12 15 +> 16 0 20 1 topology 15 15 +> 15 0 20 1 topology 13 16 +> 16 0 20 1 topology 15 16 +> 15 0 20 1 topology 14 17 +> 16 0 20 1 topology 15 17 +> 15 0 21 1 topology 3 18 +> 16 0 21 1 topology 15 18 +> 15 0 20 1 topology 12 19 +> 16 0 20 1 topology 13 19 +> 15 0 21 1 topology 3 20 +> 16 0 21 1 topology 13 20 +> 15 0 20 1 topology 12 21 +> 16 0 20 1 topology 14 21 +> 15 0 20 1 topology 13 22 +> 16 0 20 1 topology 14 22 +> 15 0 21 1 topology 3 23 +> 16 0 21 1 topology 14 23 +> 15 0 22 1 topology 16 24 +> 16 0 22 1 topology 7 24 +> 15 0 22 1 topology 17 25 +> 16 0 22 1 topology 8 25 +> 15 0 22 1 topology 15 26 +> 16 0 22 1 topology 6 26 +> 15 0 22 1 topology 18 27 +> 16 0 22 1 topology 9 27 +> 15 0 22 1 topology 13 28 +> 16 0 22 1 topology 4 28 +> 15 0 22 1 topology 12 29 +> 16 0 22 1 topology 3 29 +> 15 0 22 1 topology 14 30 +> 16 0 22 1 topology 5 30 +> 15 0 22 1 topology 19 31 +> 16 0 22 1 topology 11 31 +> 15 0 22 1 topology 20 32 +> 16 0 22 1 topology 10 32 +> 15 0 23 22 topology 52 33 > 16 0 23 22 topology 177 33 -> 15 0 24 22 topology 32 34 -> 16 0 24 22 topology 34 34 -> 15 0 24 22 topology 113 35 -> 16 0 24 22 topology 115 35 -> 15 0 23 22 topology 156 36 +> 15 0 23 22 topology 51 34 +> 16 0 23 22 topology 177 34 +> 15 0 23 22 topology 55 35 +> 16 0 23 22 topology 177 35 +> 15 0 23 22 topology 54 36 > 16 0 23 22 topology 177 36 -> 15 0 24 22 topology 62 37 -> 16 0 24 22 topology 64 37 -> 15 0 23 22 topology 78 38 +> 15 0 23 22 topology 58 37 +> 16 0 23 22 topology 177 37 +> 15 0 23 22 topology 57 38 > 16 0 23 22 topology 177 38 -> 15 0 24 22 topology 170 39 -> 16 0 24 22 topology 172 39 -> 15 0 23 22 topology 49 40 +> 15 0 23 22 topology 61 39 +> 16 0 23 22 topology 177 39 +> 15 0 23 22 topology 60 40 > 16 0 23 22 topology 177 40 -> 15 0 24 22 topology 119 41 -> 16 0 24 22 topology 121 41 -> 15 0 23 22 topology 138 42 +> 15 0 23 22 topology 64 41 +> 16 0 23 22 topology 177 41 +> 15 0 23 22 topology 63 42 > 16 0 23 22 topology 177 42 -> 15 0 24 22 topology 68 43 -> 16 0 24 22 topology 70 43 -> 15 0 24 22 topology 125 44 -> 16 0 24 22 topology 127 44 -> 15 0 23 22 topology 27 45 +> 15 0 23 22 topology 67 43 +> 16 0 23 22 topology 177 43 +> 15 0 23 22 topology 66 44 +> 16 0 23 22 topology 177 44 +> 15 0 23 22 topology 70 45 > 16 0 23 22 topology 177 45 -> 15 0 24 22 topology 74 46 -> 16 0 24 22 topology 76 46 -> 15 0 24 22 topology 131 47 -> 16 0 24 22 topology 133 47 -> 15 0 23 22 topology 115 48 +> 15 0 23 22 topology 69 46 +> 16 0 23 22 topology 177 46 +> 15 0 23 22 topology 73 47 +> 16 0 23 22 topology 177 47 +> 15 0 23 22 topology 72 48 > 16 0 23 22 topology 177 48 -> 15 0 24 22 topology 137 49 -> 16 0 24 22 topology 139 49 -> 15 0 23 22 topology 67 50 +> 15 0 23 22 topology 76 49 +> 16 0 23 22 topology 177 49 +> 15 0 23 22 topology 75 50 > 16 0 23 22 topology 177 50 -> 15 0 23 22 topology 151 51 +> 15 0 23 22 topology 79 51 > 16 0 23 22 topology 177 51 -> 15 0 23 22 topology 103 52 +> 15 0 23 22 topology 78 52 > 16 0 23 22 topology 177 52 -> 15 0 24 22 topology 44 53 -> 16 0 24 22 topology 45 53 -> 15 0 23 22 topology 139 54 +> 15 0 23 22 topology 25 53 +> 16 0 23 22 topology 177 53 +> 15 0 23 22 topology 24 54 > 16 0 23 22 topology 177 54 -> 15 0 23 22 topology 81 55 +> 15 0 23 22 topology 82 55 > 16 0 23 22 topology 177 55 -> 15 0 23 22 topology 141 56 +> 15 0 23 22 topology 81 56 > 16 0 23 22 topology 177 56 -> 15 0 23 22 topology 63 57 +> 15 0 23 22 topology 85 57 > 16 0 23 22 topology 177 57 -> 15 0 23 22 topology 123 58 +> 15 0 23 22 topology 84 58 > 16 0 23 22 topology 177 58 -> 15 0 23 22 topology 40 59 +> 15 0 23 22 topology 88 59 > 16 0 23 22 topology 177 59 -> 15 0 23 22 topology 105 60 +> 15 0 23 22 topology 87 60 > 16 0 23 22 topology 177 60 -> 15 0 23 22 topology 165 61 +> 15 0 23 22 topology 91 61 > 16 0 23 22 topology 177 61 -> 15 0 24 22 topology 41 62 -> 16 0 24 22 topology 43 62 -> 15 0 24 22 topology 23 63 -> 16 0 24 22 topology 24 63 -> 15 0 24 22 topology 53 64 -> 16 0 24 22 topology 54 64 -> 15 0 23 22 topology 36 65 +> 15 0 23 22 topology 90 62 +> 16 0 23 22 topology 177 62 +> 15 0 23 22 topology 94 63 +> 16 0 23 22 topology 177 63 +> 15 0 23 22 topology 93 64 +> 16 0 23 22 topology 177 64 +> 15 0 23 22 topology 97 65 > 16 0 23 22 topology 177 65 -> 15 0 24 22 topology 113 66 -> 16 0 24 22 topology 114 66 -> 15 0 23 22 topology 58 67 +> 15 0 23 22 topology 96 66 +> 16 0 23 22 topology 177 66 +> 15 0 23 22 topology 100 67 > 16 0 23 22 topology 177 67 -> 15 0 24 22 topology 89 68 -> 16 0 24 22 topology 90 68 -> 15 0 23 22 topology 142 69 +> 15 0 23 22 topology 99 68 +> 16 0 23 22 topology 177 68 +> 15 0 23 22 topology 103 69 > 16 0 23 22 topology 177 69 -> 15 0 24 22 topology 65 70 -> 16 0 24 22 topology 66 70 -> 15 0 23 22 topology 94 71 +> 15 0 23 22 topology 102 70 +> 16 0 23 22 topology 177 70 +> 15 0 23 22 topology 106 71 > 16 0 23 22 topology 177 71 -> 15 0 24 22 topology 173 72 -> 16 0 24 22 topology 174 72 -> 15 0 24 22 topology 149 73 -> 16 0 24 22 topology 150 73 -> 15 0 23 22 topology 130 74 +> 15 0 23 22 topology 105 72 +> 16 0 23 22 topology 177 72 +> 15 0 23 22 topology 109 73 +> 16 0 23 22 topology 177 73 +> 15 0 23 22 topology 108 74 > 16 0 23 22 topology 177 74 -> 15 0 24 22 topology 125 75 -> 16 0 24 22 topology 126 75 -> 15 0 24 22 topology 47 76 -> 16 0 24 22 topology 48 76 -> 15 0 24 22 topology 101 77 -> 16 0 24 22 topology 102 77 -> 15 0 23 22 topology 166 78 +> 15 0 23 22 topology 28 75 +> 16 0 23 22 topology 177 75 +> 15 0 23 22 topology 27 76 +> 16 0 23 22 topology 177 76 +> 15 0 23 22 topology 112 77 +> 16 0 23 22 topology 177 77 +> 15 0 23 22 topology 111 78 > 16 0 23 22 topology 177 78 -> 15 0 24 22 topology 77 79 -> 16 0 24 22 topology 78 79 -> 15 0 24 22 topology 161 80 -> 16 0 24 22 topology 162 80 -> 15 0 24 22 topology 26 81 -> 16 0 24 22 topology 28 81 -> 15 0 23 22 topology 90 82 +> 15 0 23 22 topology 115 79 +> 16 0 23 22 topology 177 79 +> 15 0 23 22 topology 114 80 +> 16 0 23 22 topology 177 80 +> 15 0 23 22 topology 118 81 +> 16 0 23 22 topology 177 81 +> 15 0 23 22 topology 117 82 > 16 0 23 22 topology 177 82 -> 15 0 24 22 topology 137 83 -> 16 0 24 22 topology 138 83 -> 15 0 23 22 topology 31 84 +> 15 0 23 22 topology 121 83 +> 16 0 23 22 topology 177 83 +> 15 0 23 22 topology 120 84 > 16 0 23 22 topology 177 84 -> 15 0 24 22 topology 83 85 -> 16 0 24 22 topology 85 85 -> 15 0 23 22 topology 150 86 +> 15 0 23 22 topology 124 85 +> 16 0 23 22 topology 177 85 +> 15 0 23 22 topology 123 86 > 16 0 23 22 topology 177 86 -> 15 0 23 22 topology 72 87 +> 15 0 23 22 topology 127 87 > 16 0 23 22 topology 177 87 -> 15 0 24 22 topology 140 88 -> 16 0 24 22 topology 142 88 -> 15 0 24 22 topology 89 89 -> 16 0 24 22 topology 91 89 -> 15 0 23 22 topology 132 90 +> 15 0 23 22 topology 126 88 +> 16 0 23 22 topology 177 88 +> 15 0 23 22 topology 130 89 +> 16 0 23 22 topology 177 89 +> 15 0 23 22 topology 129 90 > 16 0 23 22 topology 177 90 -> 15 0 24 22 topology 146 91 -> 16 0 24 22 topology 148 91 -> 15 0 24 22 topology 95 92 -> 16 0 24 22 topology 97 92 -> 15 0 24 22 topology 152 93 -> 16 0 24 22 topology 154 93 -> 15 0 24 22 topology 26 94 -> 16 0 24 22 topology 27 94 -> 15 0 24 22 topology 101 95 -> 16 0 24 22 topology 103 95 -> 15 0 24 22 topology 158 96 -> 16 0 24 22 topology 160 96 -> 15 0 23 22 topology 85 97 +> 15 0 23 22 topology 133 91 +> 16 0 23 22 topology 177 91 +> 15 0 23 22 topology 132 92 +> 16 0 23 22 topology 177 92 +> 15 0 23 22 topology 136 93 +> 16 0 23 22 topology 177 93 +> 15 0 23 22 topology 135 94 +> 16 0 23 22 topology 177 94 +> 15 0 23 22 topology 139 95 +> 16 0 23 22 topology 177 95 +> 15 0 23 22 topology 138 96 +> 16 0 23 22 topology 177 96 +> 15 0 23 22 topology 31 97 > 16 0 23 22 topology 177 97 -> 15 0 24 22 topology 107 98 -> 16 0 24 22 topology 109 98 -> 15 0 23 22 topology 45 99 +> 15 0 23 22 topology 30 98 +> 16 0 23 22 topology 177 98 +> 15 0 23 22 topology 142 99 > 16 0 23 22 topology 177 99 -> 15 0 24 22 topology 164 100 -> 16 0 24 22 topology 166 100 -> 15 0 23 22 topology 121 101 +> 15 0 23 22 topology 141 100 +> 16 0 23 22 topology 177 100 +> 15 0 23 22 topology 145 101 > 16 0 23 22 topology 177 101 -> 15 0 23 22 topology 73 102 +> 15 0 23 22 topology 144 102 > 16 0 23 22 topology 177 102 -> 15 0 23 22 topology 157 103 +> 15 0 23 22 topology 148 103 > 16 0 23 22 topology 177 103 -> 15 0 23 22 topology 109 104 +> 15 0 23 22 topology 147 104 > 16 0 23 22 topology 177 104 -> 15 0 23 22 topology 57 105 +> 15 0 23 22 topology 151 105 > 16 0 23 22 topology 177 105 -> 15 0 23 22 topology 117 106 +> 15 0 23 22 topology 150 106 > 16 0 23 22 topology 177 106 -> 15 0 23 22 topology 99 107 +> 15 0 23 22 topology 154 107 > 16 0 23 22 topology 177 107 -> 15 0 24 22 topology 35 108 -> 16 0 24 22 topology 37 108 -> 15 0 23 22 topology 159 109 +> 15 0 23 22 topology 153 108 +> 16 0 23 22 topology 177 108 +> 15 0 23 22 topology 157 109 > 16 0 23 22 topology 177 109 -> 15 0 23 22 topology 46 110 +> 15 0 23 22 topology 156 110 > 16 0 23 22 topology 177 110 -> 15 0 24 22 topology 80 111 -> 16 0 24 22 topology 81 111 -> 15 0 24 22 topology 29 112 -> 16 0 24 22 topology 30 112 -> 15 0 23 22 topology 30 113 +> 15 0 23 22 topology 160 111 +> 16 0 23 22 topology 177 111 +> 15 0 23 22 topology 159 112 +> 16 0 23 22 topology 177 112 +> 15 0 23 22 topology 163 113 > 16 0 23 22 topology 177 113 -> 15 0 24 22 topology 56 114 -> 16 0 24 22 topology 57 114 -> 15 0 24 22 topology 140 115 -> 16 0 24 22 topology 141 115 -> 15 0 23 22 topology 112 116 +> 15 0 23 22 topology 162 114 +> 16 0 23 22 topology 177 114 +> 15 0 23 22 topology 166 115 +> 16 0 23 22 topology 177 115 +> 15 0 23 22 topology 165 116 > 16 0 23 22 topology 177 116 -> 15 0 24 22 topology 116 117 -> 16 0 24 22 topology 117 117 -> 15 0 23 22 topology 64 118 +> 15 0 23 22 topology 169 117 +> 16 0 23 22 topology 177 117 +> 15 0 23 22 topology 168 118 > 16 0 23 22 topology 177 118 -> 15 0 24 22 topology 92 119 -> 16 0 24 22 topology 93 119 -> 15 0 23 22 topology 148 120 +> 15 0 23 22 topology 34 119 +> 16 0 23 22 topology 177 119 +> 15 0 23 22 topology 33 120 > 16 0 23 22 topology 177 120 -> 15 0 24 22 topology 68 121 -> 16 0 24 22 topology 69 121 -> 15 0 23 22 topology 100 122 +> 15 0 23 22 topology 172 121 +> 16 0 23 22 topology 177 121 +> 15 0 23 22 topology 171 122 > 16 0 23 22 topology 177 122 -> 15 0 24 22 topology 152 123 -> 16 0 24 22 topology 153 123 -> 15 0 23 22 topology 136 124 +> 15 0 23 22 topology 175 123 +> 16 0 23 22 topology 177 123 +> 15 0 23 22 topology 174 124 > 16 0 23 22 topology 177 124 -> 15 0 24 22 topology 128 125 -> 16 0 24 22 topology 129 125 -> 15 0 24 22 topology 104 126 -> 16 0 24 22 topology 105 126 -> 15 0 23 22 topology 84 127 +> 15 0 23 22 topology 37 125 +> 16 0 23 22 topology 177 125 +> 15 0 23 22 topology 36 126 +> 16 0 23 22 topology 177 126 +> 15 0 23 22 topology 40 127 > 16 0 23 22 topology 177 127 -> 15 0 24 22 topology 53 128 -> 16 0 24 22 topology 55 128 -> 15 0 23 22 topology 144 129 +> 15 0 23 22 topology 39 128 +> 16 0 23 22 topology 177 128 +> 15 0 23 22 topology 43 129 > 16 0 23 22 topology 177 129 -> 15 0 24 22 topology 164 130 -> 16 0 24 22 topology 165 130 -> 15 0 23 22 topology 66 131 +> 15 0 23 22 topology 42 130 +> 16 0 23 22 topology 177 130 +> 15 0 23 22 topology 46 131 > 16 0 23 22 topology 177 131 -> 15 0 24 22 topology 110 132 -> 16 0 24 22 topology 112 132 -> 15 0 23 22 topology 126 133 +> 15 0 23 22 topology 45 132 +> 16 0 23 22 topology 177 132 +> 15 0 23 22 topology 49 133 > 16 0 23 22 topology 177 133 -> 15 0 24 22 topology 59 134 -> 16 0 24 22 topology 61 134 -> 15 0 23 22 topology 37 135 -> 16 0 23 22 topology 177 135 -> 15 0 24 22 topology 116 136 -> 16 0 24 22 topology 118 136 -> 15 0 23 22 topology 108 137 -> 16 0 23 22 topology 177 137 -> 15 0 24 22 topology 65 138 -> 16 0 24 22 topology 67 138 -> 15 0 24 22 topology 173 139 -> 16 0 24 22 topology 175 139 -> 15 0 23 22 topology 168 140 -> 16 0 23 22 topology 177 140 -> 15 0 24 22 topology 122 141 -> 16 0 24 22 topology 124 141 -> 15 0 24 22 topology 71 142 -> 16 0 24 22 topology 73 142 -> 15 0 24 22 topology 44 143 -> 16 0 24 22 topology 46 143 -> 15 0 24 22 topology 128 144 -> 16 0 24 22 topology 130 144 -> 15 0 24 22 topology 77 145 -> 16 0 24 22 topology 79 145 -> 15 0 23 22 topology 55 146 -> 16 0 23 22 topology 177 146 -> 15 0 24 22 topology 32 147 -> 16 0 24 22 topology 33 147 -> 15 0 24 22 topology 134 148 -> 16 0 24 22 topology 136 148 -> 15 0 23 22 topology 39 149 -> 16 0 23 22 topology 177 149 -> 15 0 23 22 topology 91 150 -> 16 0 23 22 topology 177 150 -> 15 0 25 22 topology 176 151 -> 16 0 25 22 topology 177 151 -> 15 0 23 22 topology 175 152 -> 16 0 23 22 topology 177 152 -> 15 0 23 22 topology 127 153 -> 16 0 23 22 topology 177 153 -> 15 0 23 22 topology 79 154 -> 16 0 23 22 topology 177 154 -> 15 0 23 22 topology 163 155 -> 16 0 23 22 topology 177 155 -> 15 0 23 22 topology 51 156 -> 16 0 23 22 topology 177 156 -> 15 0 23 22 topology 111 157 -> 16 0 23 22 topology 177 157 -> 15 0 23 22 topology 28 158 -> 16 0 23 22 topology 177 158 -> 15 0 23 22 topology 171 159 -> 16 0 23 22 topology 177 159 -> 15 0 23 22 topology 93 160 -> 16 0 23 22 topology 177 160 -> 15 0 24 22 topology 29 161 -> 16 0 24 22 topology 31 161 -> 15 0 23 22 topology 153 162 -> 16 0 23 22 topology 177 162 -> 15 0 23 22 topology 75 163 -> 16 0 23 22 topology 177 163 -> 15 0 23 22 topology 135 164 -> 16 0 23 22 topology 177 164 -> 15 0 23 22 topology 24 165 -> 16 0 23 22 topology 177 165 -> 15 0 24 22 topology 83 166 -> 16 0 24 22 topology 84 166 -> 15 0 23 22 topology 82 167 -> 16 0 23 22 topology 177 167 -> 15 0 24 22 topology 59 168 -> 16 0 24 22 topology 60 168 -> 15 0 24 22 topology 143 169 -> 16 0 24 22 topology 144 169 -> 15 0 24 22 topology 35 170 -> 16 0 24 22 topology 36 170 -> 15 0 23 22 topology 118 171 -> 16 0 23 22 topology 177 171 -> 15 0 24 22 topology 119 172 -> 16 0 24 22 topology 120 172 -> 15 0 23 22 topology 48 173 -> 16 0 23 22 topology 177 173 -> 15 0 23 22 topology 70 174 -> 16 0 23 22 topology 177 174 -> 15 0 23 22 topology 154 175 -> 16 0 23 22 topology 177 175 -> 15 0 24 22 topology 95 176 -> 16 0 24 22 topology 96 176 -> 15 0 23 22 topology 106 177 -> 16 0 23 22 topology 177 177 -> 15 0 24 22 topology 71 178 -> 16 0 24 22 topology 72 178 -> 15 0 24 22 topology 155 179 -> 16 0 24 22 topology 156 179 -> 15 0 24 22 topology 131 180 -> 16 0 24 22 topology 132 180 -> 15 0 24 22 topology 107 181 -> 16 0 24 22 topology 108 181 -> 15 0 24 22 topology 80 182 -> 16 0 24 22 topology 82 182 -> 15 0 23 22 topology 60 183 -> 16 0 23 22 topology 177 183 -> 15 0 23 22 topology 120 184 -> 16 0 23 22 topology 177 184 -> 15 0 24 22 topology 167 185 -> 16 0 24 22 topology 168 185 -> 15 0 24 22 topology 86 186 -> 16 0 24 22 topology 88 186 -> 15 0 23 22 topology 102 187 -> 16 0 23 22 topology 177 187 -> 15 0 24 22 topology 143 188 -> 16 0 24 22 topology 145 188 -> 15 0 23 22 topology 43 189 -> 16 0 23 22 topology 177 189 -> 15 0 23 22 topology 162 190 -> 16 0 23 22 topology 177 190 -> 15 0 24 22 topology 92 191 -> 16 0 24 22 topology 94 191 -> 15 0 24 22 topology 38 192 -> 16 0 24 22 topology 40 192 -> 15 0 24 22 topology 149 193 -> 16 0 24 22 topology 151 193 -> 15 0 24 22 topology 98 194 -> 16 0 24 22 topology 100 194 -> 15 0 24 22 topology 155 195 -> 16 0 24 22 topology 157 195 -> 15 0 24 22 topology 104 196 -> 16 0 24 22 topology 106 196 -> 15 0 23 22 topology 33 197 -> 16 0 23 22 topology 177 197 -> 15 0 24 22 topology 161 198 -> 16 0 24 22 topology 163 198 -> 15 0 23 22 topology 61 199 -> 16 0 23 22 topology 177 199 -> 15 0 23 22 topology 145 200 -> 16 0 23 22 topology 177 200 -> 15 0 24 22 topology 38 201 -> 16 0 24 22 topology 39 201 -> 15 0 23 22 topology 97 202 -> 16 0 23 22 topology 177 202 -> 15 0 24 22 topology 167 203 -> 16 0 24 22 topology 169 203 -> 15 0 23 22 topology 133 204 -> 16 0 23 22 topology 177 204 -> 15 0 23 22 topology 169 205 -> 16 0 23 22 topology 177 205 -> 15 0 24 22 topology 23 206 -> 16 0 24 22 topology 25 206 -> 15 0 23 22 topology 87 207 -> 16 0 23 22 topology 177 207 -> 15 0 23 22 topology 147 208 -> 16 0 23 22 topology 177 208 -> 15 0 23 22 topology 69 209 -> 16 0 23 22 topology 177 209 -> 15 0 23 22 topology 34 210 -> 16 0 23 22 topology 177 210 -> 15 0 23 22 topology 129 211 -> 16 0 23 22 topology 177 211 -> 15 0 24 22 topology 50 212 -> 16 0 24 22 topology 51 212 -> 15 0 24 22 topology 47 213 -> 16 0 24 22 topology 49 213 -> 15 0 24 22 topology 110 214 -> 16 0 24 22 topology 111 214 -> 15 0 23 22 topology 52 215 -> 16 0 23 22 topology 177 215 -> 15 0 24 22 topology 86 216 -> 16 0 24 22 topology 87 216 -> 15 0 23 22 topology 88 217 -> 16 0 23 22 topology 177 217 -> 15 0 24 22 topology 62 218 -> 16 0 24 22 topology 63 218 -> 15 0 23 22 topology 42 219 -> 16 0 23 22 topology 177 219 -> 15 0 24 22 topology 170 220 -> 16 0 24 22 topology 171 220 -> 15 0 23 22 topology 172 221 -> 16 0 23 22 topology 177 221 -> 15 0 24 22 topology 146 222 -> 16 0 24 22 topology 147 222 -> 15 0 23 22 topology 124 223 -> 16 0 23 22 topology 177 223 -> 15 0 24 22 topology 122 224 -> 16 0 24 22 topology 123 224 -> 15 0 24 22 topology 41 225 -> 16 0 24 22 topology 42 225 -> 15 0 23 22 topology 76 226 -> 16 0 23 22 topology 177 226 -> 15 0 23 22 topology 160 227 -> 16 0 23 22 topology 177 227 -> 15 0 24 22 topology 98 228 -> 16 0 24 22 topology 99 228 -> 15 0 24 22 topology 74 229 -> 16 0 24 22 topology 75 229 -> 15 0 24 22 topology 158 230 -> 16 0 24 22 topology 159 230 -> 15 0 23 22 topology 54 231 -> 16 0 23 22 topology 177 231 -> 15 0 24 22 topology 50 232 -> 16 0 24 22 topology 52 232 -> 15 0 24 22 topology 134 233 -> 16 0 24 22 topology 135 233 -> 15 0 23 22 topology 114 234 -> 16 0 23 22 topology 177 234 -> 15 0 23 22 topology 25 235 -> 16 0 23 22 topology 177 235 -> 15 0 24 22 topology 56 236 -> 16 0 24 22 topology 58 236 -> 15 0 23 22 topology 174 237 -> 16 0 23 22 topology 177 237 -> 15 0 24 179 topology 285 238 -> 16 0 24 179 topology 286 238 -> 15 0 23 179 topology 383 239 +> 15 0 23 22 topology 48 134 +> 16 0 23 22 topology 177 134 +> 15 0 24 22 topology 176 135 +> 16 0 24 22 topology 177 135 +> 15 0 25 22 topology 50 136 +> 16 0 25 22 topology 52 136 +> 15 0 25 22 topology 50 137 +> 16 0 25 22 topology 51 137 +> 15 0 25 22 topology 53 138 +> 16 0 25 22 topology 55 138 +> 15 0 25 22 topology 53 139 +> 16 0 25 22 topology 54 139 +> 15 0 25 22 topology 56 140 +> 16 0 25 22 topology 58 140 +> 15 0 25 22 topology 56 141 +> 16 0 25 22 topology 57 141 +> 15 0 25 22 topology 59 142 +> 16 0 25 22 topology 61 142 +> 15 0 25 22 topology 59 143 +> 16 0 25 22 topology 60 143 +> 15 0 25 22 topology 62 144 +> 16 0 25 22 topology 64 144 +> 15 0 25 22 topology 62 145 +> 16 0 25 22 topology 63 145 +> 15 0 25 22 topology 65 146 +> 16 0 25 22 topology 67 146 +> 15 0 25 22 topology 65 147 +> 16 0 25 22 topology 66 147 +> 15 0 25 22 topology 68 148 +> 16 0 25 22 topology 70 148 +> 15 0 25 22 topology 68 149 +> 16 0 25 22 topology 69 149 +> 15 0 25 22 topology 71 150 +> 16 0 25 22 topology 73 150 +> 15 0 25 22 topology 71 151 +> 16 0 25 22 topology 72 151 +> 15 0 25 22 topology 74 152 +> 16 0 25 22 topology 76 152 +> 15 0 25 22 topology 74 153 +> 16 0 25 22 topology 75 153 +> 15 0 25 22 topology 77 154 +> 16 0 25 22 topology 79 154 +> 15 0 25 22 topology 77 155 +> 16 0 25 22 topology 78 155 +> 15 0 25 22 topology 23 156 +> 16 0 25 22 topology 25 156 +> 15 0 25 22 topology 23 157 +> 16 0 25 22 topology 24 157 +> 15 0 25 22 topology 80 158 +> 16 0 25 22 topology 82 158 +> 15 0 25 22 topology 80 159 +> 16 0 25 22 topology 81 159 +> 15 0 25 22 topology 83 160 +> 16 0 25 22 topology 85 160 +> 15 0 25 22 topology 83 161 +> 16 0 25 22 topology 84 161 +> 15 0 25 22 topology 86 162 +> 16 0 25 22 topology 88 162 +> 15 0 25 22 topology 86 163 +> 16 0 25 22 topology 87 163 +> 15 0 25 22 topology 89 164 +> 16 0 25 22 topology 91 164 +> 15 0 25 22 topology 89 165 +> 16 0 25 22 topology 90 165 +> 15 0 25 22 topology 92 166 +> 16 0 25 22 topology 94 166 +> 15 0 25 22 topology 92 167 +> 16 0 25 22 topology 93 167 +> 15 0 25 22 topology 95 168 +> 16 0 25 22 topology 97 168 +> 15 0 25 22 topology 95 169 +> 16 0 25 22 topology 96 169 +> 15 0 25 22 topology 98 170 +> 16 0 25 22 topology 100 170 +> 15 0 25 22 topology 98 171 +> 16 0 25 22 topology 99 171 +> 15 0 25 22 topology 101 172 +> 16 0 25 22 topology 103 172 +> 15 0 25 22 topology 101 173 +> 16 0 25 22 topology 102 173 +> 15 0 25 22 topology 104 174 +> 16 0 25 22 topology 106 174 +> 15 0 25 22 topology 104 175 +> 16 0 25 22 topology 105 175 +> 15 0 25 22 topology 107 176 +> 16 0 25 22 topology 109 176 +> 15 0 25 22 topology 107 177 +> 16 0 25 22 topology 108 177 +> 15 0 25 22 topology 26 178 +> 16 0 25 22 topology 28 178 +> 15 0 25 22 topology 26 179 +> 16 0 25 22 topology 27 179 +> 15 0 25 22 topology 110 180 +> 16 0 25 22 topology 112 180 +> 15 0 25 22 topology 110 181 +> 16 0 25 22 topology 111 181 +> 15 0 25 22 topology 113 182 +> 16 0 25 22 topology 115 182 +> 15 0 25 22 topology 113 183 +> 16 0 25 22 topology 114 183 +> 15 0 25 22 topology 116 184 +> 16 0 25 22 topology 118 184 +> 15 0 25 22 topology 116 185 +> 16 0 25 22 topology 117 185 +> 15 0 25 22 topology 119 186 +> 16 0 25 22 topology 121 186 +> 15 0 25 22 topology 119 187 +> 16 0 25 22 topology 120 187 +> 15 0 25 22 topology 122 188 +> 16 0 25 22 topology 124 188 +> 15 0 25 22 topology 122 189 +> 16 0 25 22 topology 123 189 +> 15 0 25 22 topology 125 190 +> 16 0 25 22 topology 127 190 +> 15 0 25 22 topology 125 191 +> 16 0 25 22 topology 126 191 +> 15 0 25 22 topology 128 192 +> 16 0 25 22 topology 130 192 +> 15 0 25 22 topology 128 193 +> 16 0 25 22 topology 129 193 +> 15 0 25 22 topology 131 194 +> 16 0 25 22 topology 133 194 +> 15 0 25 22 topology 131 195 +> 16 0 25 22 topology 132 195 +> 15 0 25 22 topology 134 196 +> 16 0 25 22 topology 136 196 +> 15 0 25 22 topology 134 197 +> 16 0 25 22 topology 135 197 +> 15 0 25 22 topology 137 198 +> 16 0 25 22 topology 139 198 +> 15 0 25 22 topology 137 199 +> 16 0 25 22 topology 138 199 +> 15 0 25 22 topology 29 200 +> 16 0 25 22 topology 31 200 +> 15 0 25 22 topology 29 201 +> 16 0 25 22 topology 30 201 +> 15 0 25 22 topology 140 202 +> 16 0 25 22 topology 142 202 +> 15 0 25 22 topology 140 203 +> 16 0 25 22 topology 141 203 +> 15 0 25 22 topology 143 204 +> 16 0 25 22 topology 145 204 +> 15 0 25 22 topology 143 205 +> 16 0 25 22 topology 144 205 +> 15 0 25 22 topology 146 206 +> 16 0 25 22 topology 148 206 +> 15 0 25 22 topology 146 207 +> 16 0 25 22 topology 147 207 +> 15 0 25 22 topology 149 208 +> 16 0 25 22 topology 151 208 +> 15 0 25 22 topology 149 209 +> 16 0 25 22 topology 150 209 +> 15 0 25 22 topology 152 210 +> 16 0 25 22 topology 154 210 +> 15 0 25 22 topology 152 211 +> 16 0 25 22 topology 153 211 +> 15 0 25 22 topology 155 212 +> 16 0 25 22 topology 157 212 +> 15 0 25 22 topology 155 213 +> 16 0 25 22 topology 156 213 +> 15 0 25 22 topology 158 214 +> 16 0 25 22 topology 160 214 +> 15 0 25 22 topology 158 215 +> 16 0 25 22 topology 159 215 +> 15 0 25 22 topology 161 216 +> 16 0 25 22 topology 163 216 +> 15 0 25 22 topology 161 217 +> 16 0 25 22 topology 162 217 +> 15 0 25 22 topology 164 218 +> 16 0 25 22 topology 166 218 +> 15 0 25 22 topology 164 219 +> 16 0 25 22 topology 165 219 +> 15 0 25 22 topology 167 220 +> 16 0 25 22 topology 169 220 +> 15 0 25 22 topology 167 221 +> 16 0 25 22 topology 168 221 +> 15 0 25 22 topology 32 222 +> 16 0 25 22 topology 34 222 +> 15 0 25 22 topology 32 223 +> 16 0 25 22 topology 33 223 +> 15 0 25 22 topology 170 224 +> 16 0 25 22 topology 172 224 +> 15 0 25 22 topology 170 225 +> 16 0 25 22 topology 171 225 +> 15 0 25 22 topology 173 226 +> 16 0 25 22 topology 175 226 +> 15 0 25 22 topology 173 227 +> 16 0 25 22 topology 174 227 +> 15 0 25 22 topology 35 228 +> 16 0 25 22 topology 37 228 +> 15 0 25 22 topology 35 229 +> 16 0 25 22 topology 36 229 +> 15 0 25 22 topology 38 230 +> 16 0 25 22 topology 40 230 +> 15 0 25 22 topology 38 231 +> 16 0 25 22 topology 39 231 +> 15 0 25 22 topology 41 232 +> 16 0 25 22 topology 43 232 +> 15 0 25 22 topology 41 233 +> 16 0 25 22 topology 42 233 +> 15 0 25 22 topology 44 234 +> 16 0 25 22 topology 46 234 +> 15 0 25 22 topology 44 235 +> 16 0 25 22 topology 45 235 +> 15 0 25 22 topology 47 236 +> 16 0 25 22 topology 49 236 +> 15 0 25 22 topology 47 237 +> 16 0 25 22 topology 48 237 +> 15 0 23 179 topology 209 238 +> 16 0 23 179 topology 460 238 +> 15 0 23 179 topology 208 239 > 16 0 23 179 topology 460 239 -> 15 0 24 179 topology 444 240 -> 16 0 24 179 topology 446 240 -> 15 0 24 179 topology 264 241 -> 16 0 24 179 topology 265 241 -> 15 0 23 179 topology 277 242 +> 15 0 23 179 topology 212 240 +> 16 0 23 179 topology 460 240 +> 15 0 23 179 topology 211 241 +> 16 0 23 179 topology 460 241 +> 15 0 23 179 topology 215 242 > 16 0 23 179 topology 460 242 -> 15 0 23 179 topology 397 243 +> 15 0 23 179 topology 214 243 > 16 0 23 179 topology 460 243 -> 15 0 23 179 topology 319 244 +> 15 0 23 179 topology 218 244 > 16 0 23 179 topology 460 244 -> 15 0 24 179 topology 438 245 -> 16 0 24 179 topology 439 245 -> 15 0 24 179 topology 330 246 -> 16 0 24 179 topology 332 246 -> 15 0 24 179 topology 198 247 -> 16 0 24 179 topology 200 247 -> 15 0 23 179 topology 439 248 +> 15 0 23 179 topology 217 245 +> 16 0 23 179 topology 460 245 +> 15 0 23 179 topology 221 246 +> 16 0 23 179 topology 460 246 +> 15 0 23 179 topology 220 247 +> 16 0 23 179 topology 460 247 +> 15 0 23 179 topology 224 248 > 16 0 23 179 topology 460 248 -> 15 0 24 179 topology 255 249 -> 16 0 24 179 topology 257 249 -> 15 0 24 179 topology 396 250 -> 16 0 24 179 topology 398 250 -> 15 0 24 179 topology 243 251 -> 16 0 24 179 topology 244 251 -> 15 0 23 179 topology 302 252 +> 15 0 23 179 topology 223 249 +> 16 0 23 179 topology 460 249 +> 15 0 23 179 topology 227 250 +> 16 0 23 179 topology 460 250 +> 15 0 23 179 topology 226 251 +> 16 0 23 179 topology 460 251 +> 15 0 23 179 topology 230 252 > 16 0 23 179 topology 460 252 -> 15 0 24 179 topology 321 253 -> 16 0 24 179 topology 323 253 -> 15 0 24 179 topology 222 254 -> 16 0 24 179 topology 223 254 -> 15 0 23 179 topology 338 255 +> 15 0 23 179 topology 229 253 +> 16 0 23 179 topology 460 253 +> 15 0 23 179 topology 233 254 +> 16 0 23 179 topology 460 254 +> 15 0 23 179 topology 232 255 > 16 0 23 179 topology 460 255 -> 15 0 24 179 topology 417 256 -> 16 0 24 179 topology 418 256 -> 15 0 23 179 topology 374 257 +> 15 0 23 179 topology 236 256 +> 16 0 23 179 topology 460 256 +> 15 0 23 179 topology 235 257 > 16 0 23 179 topology 460 257 -> 15 0 24 179 topology 396 258 -> 16 0 24 179 topology 397 258 -> 15 0 23 179 topology 410 259 +> 15 0 23 179 topology 182 258 +> 16 0 23 179 topology 460 258 +> 15 0 23 179 topology 181 259 > 16 0 23 179 topology 460 259 -> 15 0 24 179 topology 207 260 -> 16 0 24 179 topology 209 260 -> 15 0 23 179 topology 446 261 +> 15 0 23 179 topology 239 260 +> 16 0 23 179 topology 460 260 +> 15 0 23 179 topology 238 261 > 16 0 23 179 topology 460 261 -> 15 0 24 179 topology 375 262 -> 16 0 24 179 topology 376 262 -> 15 0 23 179 topology 304 263 +> 15 0 23 179 topology 242 262 +> 16 0 23 179 topology 460 262 +> 15 0 23 179 topology 241 263 > 16 0 23 179 topology 460 263 -> 15 0 23 179 topology 226 264 +> 15 0 23 179 topology 245 264 > 16 0 23 179 topology 460 264 -> 15 0 24 179 topology 354 265 -> 16 0 24 179 topology 355 265 -> 15 0 24 179 topology 273 266 -> 16 0 24 179 topology 275 266 -> 15 0 23 179 topology 424 267 +> 15 0 23 179 topology 244 265 +> 16 0 23 179 topology 460 265 +> 15 0 23 179 topology 248 266 +> 16 0 23 179 topology 460 266 +> 15 0 23 179 topology 247 267 > 16 0 23 179 topology 460 267 -> 15 0 23 179 topology 346 268 +> 15 0 23 179 topology 251 268 > 16 0 23 179 topology 460 268 -> 15 0 24 179 topology 183 269 -> 16 0 24 179 topology 184 269 -> 15 0 24 179 topology 339 270 -> 16 0 24 179 topology 341 270 -> 15 0 24 179 topology 189 271 -> 16 0 24 179 topology 190 271 -> 15 0 24 179 topology 264 272 -> 16 0 24 179 topology 266 272 -> 15 0 23 179 topology 199 273 +> 15 0 23 179 topology 250 269 +> 16 0 23 179 topology 460 269 +> 15 0 23 179 topology 254 270 +> 16 0 23 179 topology 460 270 +> 15 0 23 179 topology 253 271 +> 16 0 23 179 topology 460 271 +> 15 0 23 179 topology 257 272 +> 16 0 23 179 topology 460 272 +> 15 0 23 179 topology 256 273 > 16 0 23 179 topology 460 273 -> 15 0 23 179 topology 329 274 +> 15 0 23 179 topology 260 274 > 16 0 23 179 topology 460 274 -> 15 0 24 179 topology 195 275 -> 16 0 24 179 topology 196 275 -> 15 0 24 179 topology 405 276 -> 16 0 24 179 topology 407 276 -> 15 0 24 179 topology 333 277 -> 16 0 24 179 topology 334 277 -> 15 0 23 179 topology 365 278 +> 15 0 23 179 topology 259 275 +> 16 0 23 179 topology 460 275 +> 15 0 23 179 topology 263 276 +> 16 0 23 179 topology 460 276 +> 15 0 23 179 topology 262 277 +> 16 0 23 179 topology 460 277 +> 15 0 23 179 topology 266 278 > 16 0 23 179 topology 460 278 -> 15 0 23 179 topology 233 279 +> 15 0 23 179 topology 265 279 > 16 0 23 179 topology 460 279 -> 15 0 24 179 topology 201 280 -> 16 0 24 179 topology 202 280 -> 15 0 23 179 topology 401 281 +> 15 0 23 179 topology 185 280 +> 16 0 23 179 topology 460 280 +> 15 0 23 179 topology 184 281 > 16 0 23 179 topology 460 281 -> 15 0 24 179 topology 312 282 -> 16 0 24 179 topology 313 282 -> 15 0 23 179 topology 437 283 +> 15 0 23 179 topology 269 282 +> 16 0 23 179 topology 460 282 +> 15 0 23 179 topology 268 283 > 16 0 23 179 topology 460 283 -> 15 0 23 179 topology 211 284 +> 15 0 23 179 topology 272 284 > 16 0 23 179 topology 460 284 -> 15 0 24 179 topology 291 285 -> 16 0 24 179 topology 292 285 -> 15 0 23 179 topology 331 286 +> 15 0 23 179 topology 271 285 +> 16 0 23 179 topology 460 285 +> 15 0 23 179 topology 275 286 > 16 0 23 179 topology 460 286 -> 15 0 23 179 topology 253 287 +> 15 0 23 179 topology 274 287 > 16 0 23 179 topology 460 287 -> 15 0 24 179 topology 189 288 -> 16 0 24 179 topology 191 288 -> 15 0 24 179 topology 216 289 -> 16 0 24 179 topology 218 289 -> 15 0 23 179 topology 451 290 +> 15 0 23 179 topology 278 288 +> 16 0 23 179 topology 460 288 +> 15 0 23 179 topology 277 289 +> 16 0 23 179 topology 460 289 +> 15 0 23 179 topology 281 290 > 16 0 23 179 topology 460 290 -> 15 0 23 179 topology 373 291 +> 15 0 23 179 topology 280 291 > 16 0 23 179 topology 460 291 -> 15 0 23 179 topology 206 292 +> 15 0 23 179 topology 284 292 > 16 0 23 179 topology 460 292 -> 15 0 23 179 topology 295 293 +> 15 0 23 179 topology 283 293 > 16 0 23 179 topology 460 293 -> 15 0 24 179 topology 357 294 -> 16 0 24 179 topology 359 294 -> 15 0 24 179 topology 444 295 -> 16 0 24 179 topology 445 295 -> 15 0 24 179 topology 282 296 -> 16 0 24 179 topology 284 296 -> 15 0 23 179 topology 415 297 +> 15 0 23 179 topology 287 294 +> 16 0 23 179 topology 460 294 +> 15 0 23 179 topology 286 295 +> 16 0 23 179 topology 460 295 +> 15 0 23 179 topology 290 296 +> 16 0 23 179 topology 460 296 +> 15 0 23 179 topology 289 297 > 16 0 23 179 topology 460 297 -> 15 0 23 179 topology 184 298 +> 15 0 23 179 topology 293 298 > 16 0 23 179 topology 460 298 -> 15 0 24 179 topology 423 299 -> 16 0 24 179 topology 425 299 -> 15 0 24 179 topology 270 300 -> 16 0 24 179 topology 271 300 -> 15 0 24 179 topology 348 301 -> 16 0 24 179 topology 350 301 -> 15 0 23 179 topology 224 302 +> 15 0 23 179 topology 292 299 +> 16 0 23 179 topology 460 299 +> 15 0 23 179 topology 296 300 +> 16 0 23 179 topology 460 300 +> 15 0 23 179 topology 295 301 +> 16 0 23 179 topology 460 301 +> 15 0 23 179 topology 188 302 > 16 0 23 179 topology 460 302 -> 15 0 24 179 topology 249 303 -> 16 0 24 179 topology 250 303 -> 15 0 23 179 topology 392 304 +> 15 0 23 179 topology 187 303 +> 16 0 23 179 topology 460 303 +> 15 0 23 179 topology 299 304 > 16 0 23 179 topology 460 304 -> 15 0 23 179 topology 260 305 +> 15 0 23 179 topology 298 305 > 16 0 23 179 topology 460 305 -> 15 0 24 179 topology 228 306 -> 16 0 24 179 topology 229 306 -> 15 0 23 179 topology 428 307 +> 15 0 23 179 topology 302 306 +> 16 0 23 179 topology 460 306 +> 15 0 23 179 topology 301 307 > 16 0 23 179 topology 460 307 -> 15 0 23 179 topology 296 308 +> 15 0 23 179 topology 305 308 > 16 0 23 179 topology 460 308 -> 15 0 24 179 topology 414 309 -> 16 0 24 179 topology 416 309 -> 15 0 24 179 topology 423 310 -> 16 0 24 179 topology 424 310 -> 15 0 23 179 topology 238 311 +> 15 0 23 179 topology 304 309 +> 16 0 23 179 topology 460 309 +> 15 0 23 179 topology 308 310 +> 16 0 23 179 topology 460 310 +> 15 0 23 179 topology 307 311 > 16 0 23 179 topology 460 311 -> 15 0 24 179 topology 402 312 -> 16 0 24 179 topology 403 312 -> 15 0 23 179 topology 358 313 +> 15 0 23 179 topology 311 312 +> 16 0 23 179 topology 460 312 +> 15 0 23 179 topology 310 313 > 16 0 23 179 topology 460 313 -> 15 0 23 179 topology 280 314 +> 15 0 23 179 topology 314 314 > 16 0 23 179 topology 460 314 -> 15 0 23 179 topology 197 315 +> 15 0 23 179 topology 313 315 > 16 0 23 179 topology 460 315 -> 15 0 24 179 topology 381 316 -> 16 0 24 179 topology 382 316 -> 15 0 24 179 topology 300 317 -> 16 0 24 179 topology 302 317 -> 15 0 23 179 topology 400 318 +> 15 0 23 179 topology 317 316 +> 16 0 23 179 topology 460 316 +> 15 0 23 179 topology 316 317 +> 16 0 23 179 topology 460 317 +> 15 0 23 179 topology 320 318 > 16 0 23 179 topology 460 318 -> 15 0 23 179 topology 322 319 +> 15 0 23 179 topology 319 319 > 16 0 23 179 topology 460 319 -> 15 0 24 179 topology 225 320 -> 16 0 24 179 topology 227 320 -> 15 0 24 179 topology 207 321 -> 16 0 24 179 topology 208 321 -> 15 0 23 179 topology 442 322 +> 15 0 23 179 topology 323 320 +> 16 0 23 179 topology 460 320 +> 15 0 23 179 topology 322 321 +> 16 0 23 179 topology 460 321 +> 15 0 23 179 topology 326 322 > 16 0 23 179 topology 460 322 -> 15 0 24 179 topology 366 323 -> 16 0 24 179 topology 368 323 -> 15 0 23 179 topology 215 324 +> 15 0 23 179 topology 325 323 +> 16 0 23 179 topology 460 323 +> 15 0 23 179 topology 191 324 > 16 0 23 179 topology 460 324 -> 15 0 24 179 topology 291 325 -> 16 0 24 179 topology 293 325 -> 15 0 23 179 topology 251 326 +> 15 0 23 179 topology 190 325 +> 16 0 23 179 topology 460 325 +> 15 0 23 179 topology 329 326 > 16 0 23 179 topology 460 326 -> 15 0 24 179 topology 432 327 -> 16 0 24 179 topology 434 327 -> 15 0 24 179 topology 360 328 -> 16 0 24 179 topology 361 328 -> 15 0 23 179 topology 419 329 +> 15 0 23 179 topology 328 327 +> 16 0 23 179 topology 460 327 +> 15 0 23 179 topology 332 328 +> 16 0 23 179 topology 460 328 +> 15 0 23 179 topology 331 329 > 16 0 23 179 topology 460 329 -> 15 0 23 179 topology 287 330 +> 15 0 23 179 topology 335 330 > 16 0 23 179 topology 460 330 -> 15 0 23 179 topology 455 331 +> 15 0 23 179 topology 334 331 > 16 0 23 179 topology 460 331 -> 15 0 23 179 topology 323 332 +> 15 0 23 179 topology 338 332 > 16 0 23 179 topology 460 332 -> 15 0 24 179 topology 339 333 -> 16 0 24 179 topology 340 333 -> 15 0 24 179 topology 180 334 -> 16 0 24 179 topology 182 334 -> 15 0 24 179 topology 318 335 -> 16 0 24 179 topology 319 335 -> 15 0 23 179 topology 188 336 +> 15 0 23 179 topology 337 333 +> 16 0 23 179 topology 460 333 +> 15 0 23 179 topology 341 334 +> 16 0 23 179 topology 460 334 +> 15 0 23 179 topology 340 335 +> 16 0 23 179 topology 460 335 +> 15 0 23 179 topology 344 336 > 16 0 23 179 topology 460 336 -> 15 0 23 179 topology 307 337 +> 15 0 23 179 topology 343 337 > 16 0 23 179 topology 460 337 -> 15 0 24 179 topology 243 338 -> 16 0 24 179 topology 245 338 -> 15 0 23 179 topology 229 339 +> 15 0 23 179 topology 347 338 +> 16 0 23 179 topology 460 338 +> 15 0 23 179 topology 346 339 > 16 0 23 179 topology 460 339 -> 15 0 23 179 topology 427 340 +> 15 0 23 179 topology 350 340 > 16 0 23 179 topology 460 340 > 15 0 23 179 topology 349 341 > 16 0 23 179 topology 460 341 -> 15 0 24 179 topology 309 342 -> 16 0 24 179 topology 311 342 -> 15 0 24 179 topology 204 343 -> 16 0 24 179 topology 206 343 -> 15 0 24 179 topology 234 344 -> 16 0 24 179 topology 236 344 -> 15 0 24 179 topology 450 345 -> 16 0 24 179 topology 452 345 -> 15 0 24 179 topology 297 346 -> 16 0 24 179 topology 298 346 -> 15 0 23 179 topology 242 347 +> 15 0 23 179 topology 353 342 +> 16 0 23 179 topology 460 342 +> 15 0 23 179 topology 352 343 +> 16 0 23 179 topology 460 343 +> 15 0 23 179 topology 356 344 +> 16 0 23 179 topology 460 344 +> 15 0 23 179 topology 355 345 +> 16 0 23 179 topology 460 345 +> 15 0 23 179 topology 194 346 +> 16 0 23 179 topology 460 346 +> 15 0 23 179 topology 193 347 > 16 0 23 179 topology 460 347 -> 15 0 23 179 topology 202 348 +> 15 0 23 179 topology 359 348 > 16 0 23 179 topology 460 348 -> 15 0 24 179 topology 375 349 -> 16 0 24 179 topology 377 349 -> 15 0 23 179 topology 278 350 +> 15 0 23 179 topology 358 349 +> 16 0 23 179 topology 460 349 +> 15 0 23 179 topology 362 350 > 16 0 23 179 topology 460 350 -> 15 0 24 179 topology 276 351 -> 16 0 24 179 topology 277 351 -> 15 0 23 179 topology 314 352 +> 15 0 23 179 topology 361 351 +> 16 0 23 179 topology 460 351 +> 15 0 23 179 topology 365 352 > 16 0 23 179 topology 460 352 -> 15 0 24 179 topology 255 353 -> 16 0 24 179 topology 256 353 -> 15 0 25 179 topology 459 354 -> 16 0 25 179 topology 460 354 -> 15 0 23 179 topology 350 355 +> 15 0 23 179 topology 364 353 +> 16 0 23 179 topology 460 353 +> 15 0 23 179 topology 368 354 +> 16 0 23 179 topology 460 354 +> 15 0 23 179 topology 367 355 > 16 0 23 179 topology 460 355 -> 15 0 24 179 topology 441 356 -> 16 0 24 179 topology 443 356 -> 15 0 24 179 topology 234 357 -> 16 0 24 179 topology 235 357 -> 15 0 24 179 topology 450 358 -> 16 0 24 179 topology 451 358 -> 15 0 23 179 topology 386 359 +> 15 0 23 179 topology 371 356 +> 16 0 23 179 topology 460 356 +> 15 0 23 179 topology 370 357 +> 16 0 23 179 topology 460 357 +> 15 0 23 179 topology 374 358 +> 16 0 23 179 topology 460 358 +> 15 0 23 179 topology 373 359 > 16 0 23 179 topology 460 359 -> 15 0 23 179 topology 214 360 +> 15 0 23 179 topology 377 360 > 16 0 23 179 topology 460 360 -> 15 0 24 179 topology 429 361 -> 16 0 24 179 topology 430 361 -> 15 0 23 179 topology 334 362 +> 15 0 23 179 topology 376 361 +> 16 0 23 179 topology 460 361 +> 15 0 23 179 topology 380 362 > 16 0 23 179 topology 460 362 -> 15 0 23 179 topology 256 363 +> 15 0 23 179 topology 379 363 > 16 0 23 179 topology 460 363 -> 15 0 24 179 topology 408 364 -> 16 0 24 179 topology 409 364 -> 15 0 24 179 topology 327 365 -> 16 0 24 179 topology 329 365 -> 15 0 23 179 topology 454 366 +> 15 0 23 179 topology 383 364 +> 16 0 23 179 topology 460 364 +> 15 0 23 179 topology 382 365 +> 16 0 23 179 topology 460 365 +> 15 0 23 179 topology 386 366 > 16 0 23 179 topology 460 366 -> 15 0 23 179 topology 376 367 +> 15 0 23 179 topology 385 367 > 16 0 23 179 topology 460 367 -> 15 0 24 179 topology 252 368 -> 16 0 24 179 topology 254 368 -> 15 0 24 179 topology 393 369 -> 16 0 24 179 topology 395 369 -> 15 0 24 179 topology 213 370 -> 16 0 24 179 topology 214 370 -> 15 0 23 179 topology 187 371 +> 15 0 23 179 topology 197 368 +> 16 0 23 179 topology 460 368 +> 15 0 23 179 topology 196 369 +> 16 0 23 179 topology 460 369 +> 15 0 23 179 topology 389 370 +> 16 0 23 179 topology 460 370 +> 15 0 23 179 topology 388 371 > 16 0 23 179 topology 460 371 -> 15 0 23 179 topology 269 372 +> 15 0 23 179 topology 392 372 > 16 0 23 179 topology 460 372 -> 15 0 24 179 topology 318 373 -> 16 0 24 179 topology 320 373 -> 15 0 23 179 topology 305 374 +> 15 0 23 179 topology 391 373 +> 16 0 23 179 topology 460 373 +> 15 0 23 179 topology 395 374 > 16 0 23 179 topology 460 374 -> 15 0 24 179 topology 387 375 -> 16 0 24 179 topology 388 375 -> 15 0 23 179 topology 341 376 +> 15 0 23 179 topology 394 375 +> 16 0 23 179 topology 460 375 +> 15 0 23 179 topology 398 376 > 16 0 23 179 topology 460 376 -> 15 0 24 179 topology 384 377 -> 16 0 24 179 topology 386 377 -> 15 0 24 179 topology 366 378 -> 16 0 24 179 topology 367 378 -> 15 0 23 179 topology 377 379 +> 15 0 23 179 topology 397 377 +> 16 0 23 179 topology 460 377 +> 15 0 23 179 topology 401 378 +> 16 0 23 179 topology 460 378 +> 15 0 23 179 topology 400 379 > 16 0 23 179 topology 460 379 -> 15 0 23 179 topology 413 380 +> 15 0 23 179 topology 404 380 > 16 0 23 179 topology 460 380 -> 15 0 23 179 topology 241 381 +> 15 0 23 179 topology 403 381 > 16 0 23 179 topology 460 381 -> 15 0 24 179 topology 345 382 -> 16 0 24 179 topology 346 382 -> 15 0 24 179 topology 324 383 -> 16 0 24 179 topology 325 383 -> 15 0 23 179 topology 361 384 +> 15 0 23 179 topology 407 382 +> 16 0 23 179 topology 460 382 +> 15 0 23 179 topology 406 383 +> 16 0 23 179 topology 460 383 +> 15 0 23 179 topology 410 384 > 16 0 23 179 topology 460 384 -> 15 0 23 179 topology 283 385 +> 15 0 23 179 topology 409 385 > 16 0 23 179 topology 460 385 -> 15 0 24 179 topology 270 386 -> 16 0 24 179 topology 272 386 -> 15 0 24 179 topology 195 387 -> 16 0 24 179 topology 197 387 -> 15 0 23 179 topology 403 388 +> 15 0 23 179 topology 413 386 +> 16 0 23 179 topology 460 386 +> 15 0 23 179 topology 412 387 +> 16 0 23 179 topology 460 387 +> 15 0 23 179 topology 416 388 > 16 0 23 179 topology 460 388 -> 15 0 23 179 topology 325 389 +> 15 0 23 179 topology 415 389 > 16 0 23 179 topology 460 389 -> 15 0 24 179 topology 336 390 -> 16 0 24 179 topology 338 390 -> 15 0 23 179 topology 445 391 +> 15 0 23 179 topology 200 390 +> 16 0 23 179 topology 460 390 +> 15 0 23 179 topology 199 391 > 16 0 23 179 topology 460 391 -> 15 0 24 179 topology 261 392 -> 16 0 24 179 topology 263 392 -> 15 0 24 179 topology 402 393 -> 16 0 24 179 topology 404 393 -> 15 0 24 179 topology 303 394 -> 16 0 24 179 topology 304 394 -> 15 0 23 179 topology 332 395 +> 15 0 23 179 topology 419 392 +> 16 0 23 179 topology 460 392 +> 15 0 23 179 topology 418 393 +> 16 0 23 179 topology 460 393 +> 15 0 23 179 topology 422 394 +> 16 0 23 179 topology 460 394 +> 15 0 23 179 topology 421 395 > 16 0 23 179 topology 460 395 -> 15 0 23 179 topology 368 396 +> 15 0 23 179 topology 425 396 > 16 0 23 179 topology 460 396 -> 15 0 24 179 topology 282 397 -> 16 0 24 179 topology 283 397 -> 15 0 23 179 topology 236 398 +> 15 0 23 179 topology 424 397 +> 16 0 23 179 topology 460 397 +> 15 0 23 179 topology 428 398 > 16 0 23 179 topology 460 398 -> 15 0 23 179 topology 404 399 +> 15 0 23 179 topology 427 399 > 16 0 23 179 topology 460 399 -> 15 0 24 179 topology 261 400 -> 16 0 24 179 topology 262 400 -> 15 0 23 179 topology 440 401 +> 15 0 23 179 topology 431 400 +> 16 0 23 179 topology 460 400 +> 15 0 23 179 topology 430 401 > 16 0 23 179 topology 460 401 -> 15 0 23 179 topology 268 402 +> 15 0 23 179 topology 434 402 > 16 0 23 179 topology 460 402 -> 15 0 24 179 topology 456 403 -> 16 0 24 179 topology 457 403 -> 15 0 24 179 topology 213 404 -> 16 0 24 179 topology 215 404 -> 15 0 23 179 topology 388 405 +> 15 0 23 179 topology 433 403 +> 16 0 23 179 topology 460 403 +> 15 0 23 179 topology 437 404 +> 16 0 23 179 topology 460 404 +> 15 0 23 179 topology 436 405 > 16 0 23 179 topology 460 405 -> 15 0 23 179 topology 310 406 +> 15 0 23 179 topology 440 406 > 16 0 23 179 topology 460 406 -> 15 0 23 179 topology 232 407 +> 15 0 23 179 topology 439 407 > 16 0 23 179 topology 460 407 -> 15 0 24 179 topology 435 408 -> 16 0 24 179 topology 436 408 -> 15 0 23 179 topology 430 409 +> 15 0 23 179 topology 443 408 +> 16 0 23 179 topology 460 408 +> 15 0 23 179 topology 442 409 > 16 0 23 179 topology 460 409 -> 15 0 23 179 topology 352 410 +> 15 0 23 179 topology 446 410 > 16 0 23 179 topology 460 410 -> 15 0 24 179 topology 414 411 -> 16 0 24 179 topology 415 411 -> 15 0 24 179 topology 279 412 -> 16 0 24 179 topology 281 412 -> 15 0 24 179 topology 420 413 -> 16 0 24 179 topology 422 413 -> 15 0 24 179 topology 240 414 -> 16 0 24 179 topology 241 414 -> 15 0 24 179 topology 345 415 -> 16 0 24 179 topology 347 415 -> 15 0 24 179 topology 219 416 -> 16 0 24 179 topology 220 416 -> 15 0 23 179 topology 205 417 +> 15 0 23 179 topology 445 411 +> 16 0 23 179 topology 460 411 +> 15 0 23 179 topology 203 412 +> 16 0 23 179 topology 460 412 +> 15 0 23 179 topology 202 413 +> 16 0 23 179 topology 460 413 +> 15 0 23 179 topology 449 414 +> 16 0 23 179 topology 460 414 +> 15 0 23 179 topology 448 415 +> 16 0 23 179 topology 460 415 +> 15 0 23 179 topology 452 416 +> 16 0 23 179 topology 460 416 +> 15 0 23 179 topology 451 417 > 16 0 23 179 topology 460 417 -> 15 0 23 179 topology 359 418 +> 15 0 23 179 topology 455 418 > 16 0 23 179 topology 460 418 -> 15 0 23 179 topology 227 419 +> 15 0 23 179 topology 454 419 > 16 0 23 179 topology 460 419 -> 15 0 23 179 topology 395 420 +> 15 0 23 179 topology 458 420 > 16 0 23 179 topology 460 420 -> 15 0 23 179 topology 263 421 +> 15 0 23 179 topology 457 421 > 16 0 23 179 topology 460 421 -> 15 0 24 179 topology 411 422 -> 16 0 24 179 topology 413 422 -> 15 0 23 179 topology 431 423 +> 15 0 23 179 topology 206 422 +> 16 0 23 179 topology 460 422 +> 15 0 23 179 topology 205 423 > 16 0 23 179 topology 460 423 -> 15 0 24 179 topology 393 424 -> 16 0 24 179 topology 394 424 -> 15 0 24 179 topology 372 425 -> 16 0 24 179 topology 373 425 -> 15 0 23 179 topology 217 426 -> 16 0 23 179 topology 460 426 -> 15 0 24 179 topology 186 427 -> 16 0 24 179 topology 188 427 -> 15 0 24 179 topology 351 428 -> 16 0 24 179 topology 352 428 -> 15 0 23 179 topology 337 429 -> 16 0 23 179 topology 460 429 -> 15 0 24 179 topology 297 430 -> 16 0 24 179 topology 299 430 -> 15 0 23 179 topology 259 431 -> 16 0 23 179 topology 460 431 -> 15 0 23 179 topology 200 432 -> 16 0 23 179 topology 460 432 -> 15 0 24 179 topology 222 433 -> 16 0 24 179 topology 224 433 -> 15 0 23 179 topology 457 434 -> 16 0 23 179 topology 460 434 -> 15 0 23 179 topology 379 435 -> 16 0 23 179 topology 460 435 -> 15 0 24 179 topology 363 436 -> 16 0 24 179 topology 365 436 -> 15 0 24 179 topology 288 437 -> 16 0 24 179 topology 290 437 -> 15 0 23 179 topology 190 438 -> 16 0 23 179 topology 460 438 -> 15 0 23 179 topology 218 439 -> 16 0 23 179 topology 460 439 -> 15 0 24 179 topology 429 440 -> 16 0 24 179 topology 431 440 -> 15 0 24 179 topology 330 441 -> 16 0 24 179 topology 331 441 -> 15 0 23 179 topology 254 442 -> 16 0 23 179 topology 460 442 -> 15 0 23 179 topology 422 443 -> 16 0 23 179 topology 460 443 -> 15 0 24 179 topology 354 444 -> 16 0 24 179 topology 356 444 -> 15 0 24 179 topology 309 445 -> 16 0 24 179 topology 310 445 -> 15 0 23 179 topology 290 446 -> 16 0 23 179 topology 460 446 -> 15 0 23 179 topology 458 447 -> 16 0 23 179 topology 460 447 -> 15 0 23 179 topology 326 448 -> 16 0 23 179 topology 460 448 -> 15 0 24 179 topology 288 449 -> 16 0 24 179 topology 289 449 -> 15 0 23 179 topology 244 450 -> 16 0 23 179 topology 460 450 -> 15 0 24 179 topology 240 451 -> 16 0 24 179 topology 242 451 -> 15 0 23 179 topology 191 452 -> 16 0 23 179 topology 460 452 -> 15 0 23 179 topology 364 453 -> 16 0 23 179 topology 460 453 -> 15 0 23 179 topology 286 454 -> 16 0 23 179 topology 460 454 -> 15 0 23 179 topology 406 455 -> 16 0 23 179 topology 460 455 -> 15 0 24 179 topology 441 456 -> 16 0 24 179 topology 442 456 -> 15 0 24 179 topology 306 457 -> 16 0 24 179 topology 308 457 -> 15 0 24 179 topology 180 458 -> 16 0 24 179 topology 181 458 -> 15 0 24 179 topology 231 459 -> 16 0 24 179 topology 233 459 -> 15 0 24 179 topology 447 460 -> 16 0 24 179 topology 449 460 -> 15 0 24 179 topology 267 461 -> 16 0 24 179 topology 268 461 -> 15 0 24 179 topology 186 462 -> 16 0 24 179 topology 187 462 -> 15 0 23 179 topology 209 463 -> 16 0 23 179 topology 460 463 -> 15 0 24 179 topology 372 464 -> 16 0 24 179 topology 374 464 -> 15 0 24 179 topology 246 465 -> 16 0 24 179 topology 247 465 -> 15 0 23 179 topology 245 466 -> 16 0 23 179 topology 460 466 -> 15 0 24 179 topology 192 467 -> 16 0 24 179 topology 193 467 -> 15 0 23 179 topology 281 468 -> 16 0 23 179 topology 460 468 -> 15 0 24 179 topology 225 469 -> 16 0 24 179 topology 226 469 -> 15 0 24 179 topology 198 470 -> 16 0 24 179 topology 199 470 -> 15 0 23 179 topology 449 471 -> 16 0 23 179 topology 460 471 -> 15 0 23 179 topology 317 472 -> 16 0 23 179 topology 460 472 -> 15 0 24 179 topology 438 473 -> 16 0 24 179 topology 440 473 -> 15 0 24 179 topology 420 474 -> 16 0 24 179 topology 421 474 -> 15 0 24 179 topology 204 475 -> 16 0 24 179 topology 205 475 -> 15 0 23 179 topology 353 476 -> 16 0 23 179 topology 460 476 -> 15 0 24 179 topology 399 477 -> 16 0 24 179 topology 400 477 -> 15 0 23 179 topology 271 478 -> 16 0 23 179 topology 460 478 -> 15 0 23 179 topology 182 479 -> 16 0 23 179 topology 460 479 -> 15 0 24 179 topology 378 480 -> 16 0 24 179 topology 379 480 -> 15 0 23 179 topology 391 481 -> 16 0 23 179 topology 460 481 -> 15 0 23 179 topology 313 482 -> 16 0 23 179 topology 460 482 -> 15 0 23 179 topology 235 483 -> 16 0 23 179 topology 460 483 -> 15 0 24 179 topology 249 484 -> 16 0 24 179 topology 251 484 -> 15 0 23 179 topology 433 485 -> 16 0 23 179 topology 460 485 -> 15 0 23 179 topology 355 486 -> 16 0 23 179 topology 460 486 -> 15 0 24 179 topology 390 487 -> 16 0 24 179 topology 392 487 -> 15 0 24 179 topology 201 488 -> 16 0 24 179 topology 203 488 -> 15 0 24 179 topology 315 489 -> 16 0 24 179 topology 317 489 -> 15 0 23 179 topology 272 490 -> 16 0 23 179 topology 460 490 -> 15 0 24 179 topology 456 491 -> 16 0 24 179 topology 458 491 -> 15 0 24 179 topology 357 492 -> 16 0 24 179 topology 358 492 -> 15 0 23 179 topology 308 493 -> 16 0 23 179 topology 460 493 -> 15 0 24 179 topology 381 494 -> 16 0 24 179 topology 383 494 -> 15 0 23 179 topology 344 495 -> 16 0 23 179 topology 460 495 -> 15 0 24 179 topology 336 496 -> 16 0 24 179 topology 337 496 -> 15 0 23 179 topology 380 497 -> 16 0 23 179 topology 460 497 -> 15 0 24 179 topology 315 498 -> 16 0 24 179 topology 316 498 -> 15 0 23 179 topology 416 499 -> 16 0 23 179 topology 460 499 -> 15 0 23 179 topology 298 500 -> 16 0 23 179 topology 460 500 -> 15 0 24 179 topology 294 501 -> 16 0 24 179 topology 295 501 -> 15 0 23 179 topology 220 502 -> 16 0 23 179 topology 460 502 -> 15 0 24 179 topology 267 503 -> 16 0 24 179 topology 269 503 -> 15 0 23 179 topology 418 504 -> 16 0 23 179 topology 460 504 -> 15 0 23 179 topology 340 505 -> 16 0 23 179 topology 460 505 -> 15 0 23 179 topology 262 506 -> 16 0 23 179 topology 460 506 -> 15 0 23 179 topology 382 507 -> 16 0 23 179 topology 460 507 -> 15 0 24 179 topology 333 508 -> 16 0 24 179 topology 335 508 -> 15 0 24 179 topology 258 509 -> 16 0 24 179 topology 260 509 -> 15 0 23 179 topology 193 510 -> 16 0 23 179 topology 460 510 -> 15 0 24 179 topology 399 511 -> 16 0 24 179 topology 401 511 -> 15 0 23 179 topology 299 512 -> 16 0 23 179 topology 460 512 -> 15 0 24 179 topology 273 513 -> 16 0 24 179 topology 274 513 -> 15 0 23 179 topology 335 514 -> 16 0 23 179 topology 460 514 -> 15 0 24 179 topology 324 515 -> 16 0 24 179 topology 326 515 -> 15 0 24 179 topology 252 516 -> 16 0 24 179 topology 253 516 -> 15 0 23 179 topology 371 517 -> 16 0 23 179 topology 460 517 -> 15 0 24 179 topology 231 518 -> 16 0 24 179 topology 232 518 -> 15 0 24 179 topology 447 519 -> 16 0 24 179 topology 448 519 -> 15 0 23 179 topology 407 520 -> 16 0 23 179 topology 460 520 -> 15 0 24 179 topology 426 521 -> 16 0 24 179 topology 427 521 -> 15 0 23 179 topology 443 522 -> 16 0 23 179 topology 460 522 -> 15 0 24 179 topology 210 523 -> 16 0 24 179 topology 212 523 -> 15 0 23 179 topology 247 524 -> 16 0 23 179 topology 460 524 -> 15 0 24 179 topology 405 525 -> 16 0 24 179 topology 406 525 -> 15 0 23 179 topology 367 526 -> 16 0 23 179 topology 460 526 -> 15 0 24 179 topology 192 527 -> 16 0 24 179 topology 194 527 -> 15 0 23 179 topology 289 528 -> 16 0 23 179 topology 460 528 -> 15 0 24 179 topology 384 529 -> 16 0 24 179 topology 385 529 -> 15 0 24 179 topology 276 530 -> 16 0 24 179 topology 278 530 -> 15 0 23 179 topology 409 531 -> 16 0 23 179 topology 460 531 -> 15 0 24 179 topology 417 532 -> 16 0 24 179 topology 419 532 -> 15 0 24 179 topology 210 533 -> 16 0 24 179 topology 211 533 -> 15 0 24 179 topology 342 534 -> 16 0 24 179 topology 344 534 -> 15 0 23 179 topology 362 535 -> 16 0 23 179 topology 460 535 -> 15 0 23 179 topology 230 536 -> 16 0 23 179 topology 460 536 -> 15 0 24 179 topology 408 537 -> 16 0 24 179 topology 410 537 -> 15 0 23 179 topology 398 538 -> 16 0 23 179 topology 460 538 -> 15 0 24 179 topology 363 539 -> 16 0 24 179 topology 364 539 -> 15 0 23 179 topology 266 540 -> 16 0 23 179 topology 460 540 -> 15 0 23 179 topology 434 541 -> 16 0 23 179 topology 460 541 -> 15 0 24 179 topology 342 542 -> 16 0 24 179 topology 343 542 -> 15 0 24 179 topology 321 543 -> 16 0 24 179 topology 322 543 -> 15 0 23 179 topology 274 544 -> 16 0 23 179 topology 460 544 -> 15 0 23 179 topology 394 545 -> 16 0 23 179 topology 460 545 -> 15 0 23 179 topology 316 546 -> 16 0 23 179 topology 460 546 -> 15 0 24 179 topology 219 547 -> 16 0 24 179 topology 221 547 -> 15 0 23 179 topology 203 548 -> 16 0 23 179 topology 460 548 -> 15 0 23 179 topology 436 549 -> 16 0 23 179 topology 460 549 -> 15 0 24 179 topology 360 550 -> 16 0 24 179 topology 362 550 -> 15 0 24 179 topology 285 551 -> 16 0 24 179 topology 287 551 -> 15 0 24 179 topology 426 552 -> 16 0 24 179 topology 428 552 -> 15 0 24 179 topology 300 553 -> 16 0 24 179 topology 301 553 -> 15 0 23 179 topology 221 554 -> 16 0 23 179 topology 460 554 -> 15 0 23 179 topology 389 555 -> 16 0 23 179 topology 460 555 -> 15 0 24 179 topology 351 556 -> 16 0 24 179 topology 353 556 -> 15 0 23 179 topology 257 557 -> 16 0 23 179 topology 460 557 -> 15 0 24 179 topology 279 558 -> 16 0 24 179 topology 280 558 -> 15 0 23 179 topology 425 559 -> 16 0 23 179 topology 460 559 -> 15 0 23 179 topology 293 560 -> 16 0 23 179 topology 460 560 -> 15 0 24 179 topology 258 561 -> 16 0 24 179 topology 259 561 -> 15 0 24 179 topology 453 562 -> 16 0 24 179 topology 454 562 -> 15 0 24 179 topology 183 563 -> 16 0 24 179 topology 185 563 -> 15 0 24 179 topology 237 564 -> 16 0 24 179 topology 239 564 -> 15 0 23 179 topology 301 565 -> 16 0 23 179 topology 460 565 -> 15 0 23 179 topology 223 566 -> 16 0 23 179 topology 460 566 -> 15 0 24 179 topology 432 567 -> 16 0 24 179 topology 433 567 -> 15 0 23 179 topology 194 568 -> 16 0 23 179 topology 460 568 -> 15 0 23 179 topology 421 569 -> 16 0 23 179 topology 460 569 -> 15 0 23 179 topology 343 570 -> 16 0 23 179 topology 460 570 -> 15 0 24 179 topology 411 571 -> 16 0 24 179 topology 412 571 -> 15 0 23 179 topology 265 572 -> 16 0 23 179 topology 460 572 -> 15 0 24 179 topology 303 573 -> 16 0 24 179 topology 305 573 -> 15 0 23 179 topology 385 574 -> 16 0 23 179 topology 460 574 -> 15 0 24 179 topology 228 575 -> 16 0 24 179 topology 230 575 -> 15 0 24 179 topology 237 576 -> 16 0 24 179 topology 238 576 -> 15 0 24 179 topology 369 577 -> 16 0 24 179 topology 371 577 -> 15 0 23 179 topology 212 578 -> 16 0 23 179 topology 460 578 -> 15 0 24 179 topology 216 579 -> 16 0 24 179 topology 217 579 -> 15 0 23 179 topology 196 580 -> 16 0 23 179 topology 460 580 -> 15 0 23 179 topology 248 581 -> 16 0 23 179 topology 460 581 -> 15 0 24 179 topology 294 582 -> 16 0 24 179 topology 296 582 -> 15 0 23 179 topology 284 583 -> 16 0 23 179 topology 460 583 -> 15 0 24 179 topology 435 584 -> 16 0 24 179 topology 437 584 -> 15 0 24 179 topology 390 585 -> 16 0 24 179 topology 391 585 -> 15 0 23 179 topology 452 586 -> 16 0 23 179 topology 460 586 -> 15 0 23 179 topology 320 587 -> 16 0 23 179 topology 460 587 -> 15 0 24 179 topology 369 588 -> 16 0 24 179 topology 370 588 -> 15 0 23 179 topology 356 589 -> 16 0 23 179 topology 460 589 -> 15 0 23 179 topology 208 590 -> 16 0 23 179 topology 460 590 -> 15 0 24 179 topology 348 591 -> 16 0 24 179 topology 349 591 -> 15 0 23 179 topology 328 592 -> 16 0 23 179 topology 460 592 -> 15 0 23 179 topology 185 593 -> 16 0 23 179 topology 460 593 -> 15 0 23 179 topology 250 594 -> 16 0 23 179 topology 460 594 -> 15 0 23 179 topology 448 595 -> 16 0 23 179 topology 460 595 -> 15 0 23 179 topology 370 596 -> 16 0 23 179 topology 460 596 -> 15 0 24 179 topology 246 597 -> 16 0 24 179 topology 248 597 -> 15 0 23 179 topology 292 598 -> 16 0 23 179 topology 460 598 -> 15 0 24 179 topology 387 599 -> 16 0 24 179 topology 389 599 -> 15 0 23 179 topology 412 600 -> 16 0 23 179 topology 460 600 -> 15 0 23 179 topology 181 601 -> 16 0 23 179 topology 460 601 -> 15 0 24 179 topology 312 602 -> 16 0 24 179 topology 314 602 -> 15 0 23 179 topology 239 603 -> 16 0 23 179 topology 460 603 -> 15 0 24 179 topology 453 604 -> 16 0 24 179 topology 455 604 -> 15 0 24 179 topology 327 605 -> 16 0 24 179 topology 328 605 -> 15 0 23 179 topology 275 606 -> 16 0 23 179 topology 460 606 -> 15 0 24 179 topology 378 607 -> 16 0 24 179 topology 380 607 -> 15 0 24 179 topology 306 608 -> 16 0 24 179 topology 307 608 -> 15 0 23 179 topology 311 609 -> 16 0 23 179 topology 460 609 -> 15 0 23 179 topology 347 610 -> 16 0 23 179 topology 460 610 -> 15 0 24 462 topology 469 611 -> 16 0 24 462 topology 471 611 -> 15 0 23 462 topology 474 612 +> 15 0 24 179 topology 459 424 +> 16 0 24 179 topology 460 424 +> 15 0 25 179 topology 207 425 +> 16 0 25 179 topology 209 425 +> 15 0 25 179 topology 207 426 +> 16 0 25 179 topology 208 426 +> 15 0 25 179 topology 210 427 +> 16 0 25 179 topology 212 427 +> 15 0 25 179 topology 210 428 +> 16 0 25 179 topology 211 428 +> 15 0 25 179 topology 213 429 +> 16 0 25 179 topology 215 429 +> 15 0 25 179 topology 213 430 +> 16 0 25 179 topology 214 430 +> 15 0 25 179 topology 216 431 +> 16 0 25 179 topology 218 431 +> 15 0 25 179 topology 216 432 +> 16 0 25 179 topology 217 432 +> 15 0 25 179 topology 219 433 +> 16 0 25 179 topology 221 433 +> 15 0 25 179 topology 219 434 +> 16 0 25 179 topology 220 434 +> 15 0 25 179 topology 222 435 +> 16 0 25 179 topology 224 435 +> 15 0 25 179 topology 222 436 +> 16 0 25 179 topology 223 436 +> 15 0 25 179 topology 225 437 +> 16 0 25 179 topology 227 437 +> 15 0 25 179 topology 225 438 +> 16 0 25 179 topology 226 438 +> 15 0 25 179 topology 228 439 +> 16 0 25 179 topology 230 439 +> 15 0 25 179 topology 228 440 +> 16 0 25 179 topology 229 440 +> 15 0 25 179 topology 231 441 +> 16 0 25 179 topology 233 441 +> 15 0 25 179 topology 231 442 +> 16 0 25 179 topology 232 442 +> 15 0 25 179 topology 234 443 +> 16 0 25 179 topology 236 443 +> 15 0 25 179 topology 234 444 +> 16 0 25 179 topology 235 444 +> 15 0 25 179 topology 180 445 +> 16 0 25 179 topology 182 445 +> 15 0 25 179 topology 180 446 +> 16 0 25 179 topology 181 446 +> 15 0 25 179 topology 237 447 +> 16 0 25 179 topology 239 447 +> 15 0 25 179 topology 237 448 +> 16 0 25 179 topology 238 448 +> 15 0 25 179 topology 240 449 +> 16 0 25 179 topology 242 449 +> 15 0 25 179 topology 240 450 +> 16 0 25 179 topology 241 450 +> 15 0 25 179 topology 243 451 +> 16 0 25 179 topology 245 451 +> 15 0 25 179 topology 243 452 +> 16 0 25 179 topology 244 452 +> 15 0 25 179 topology 246 453 +> 16 0 25 179 topology 248 453 +> 15 0 25 179 topology 246 454 +> 16 0 25 179 topology 247 454 +> 15 0 25 179 topology 249 455 +> 16 0 25 179 topology 251 455 +> 15 0 25 179 topology 249 456 +> 16 0 25 179 topology 250 456 +> 15 0 25 179 topology 252 457 +> 16 0 25 179 topology 254 457 +> 15 0 25 179 topology 252 458 +> 16 0 25 179 topology 253 458 +> 15 0 25 179 topology 255 459 +> 16 0 25 179 topology 257 459 +> 15 0 25 179 topology 255 460 +> 16 0 25 179 topology 256 460 +> 15 0 25 179 topology 258 461 +> 16 0 25 179 topology 260 461 +> 15 0 25 179 topology 258 462 +> 16 0 25 179 topology 259 462 +> 15 0 25 179 topology 261 463 +> 16 0 25 179 topology 263 463 +> 15 0 25 179 topology 261 464 +> 16 0 25 179 topology 262 464 +> 15 0 25 179 topology 264 465 +> 16 0 25 179 topology 266 465 +> 15 0 25 179 topology 264 466 +> 16 0 25 179 topology 265 466 +> 15 0 25 179 topology 183 467 +> 16 0 25 179 topology 185 467 +> 15 0 25 179 topology 183 468 +> 16 0 25 179 topology 184 468 +> 15 0 25 179 topology 267 469 +> 16 0 25 179 topology 269 469 +> 15 0 25 179 topology 267 470 +> 16 0 25 179 topology 268 470 +> 15 0 25 179 topology 270 471 +> 16 0 25 179 topology 272 471 +> 15 0 25 179 topology 270 472 +> 16 0 25 179 topology 271 472 +> 15 0 25 179 topology 273 473 +> 16 0 25 179 topology 275 473 +> 15 0 25 179 topology 273 474 +> 16 0 25 179 topology 274 474 +> 15 0 25 179 topology 276 475 +> 16 0 25 179 topology 278 475 +> 15 0 25 179 topology 276 476 +> 16 0 25 179 topology 277 476 +> 15 0 25 179 topology 279 477 +> 16 0 25 179 topology 281 477 +> 15 0 25 179 topology 279 478 +> 16 0 25 179 topology 280 478 +> 15 0 25 179 topology 282 479 +> 16 0 25 179 topology 284 479 +> 15 0 25 179 topology 282 480 +> 16 0 25 179 topology 283 480 +> 15 0 25 179 topology 285 481 +> 16 0 25 179 topology 287 481 +> 15 0 25 179 topology 285 482 +> 16 0 25 179 topology 286 482 +> 15 0 25 179 topology 288 483 +> 16 0 25 179 topology 290 483 +> 15 0 25 179 topology 288 484 +> 16 0 25 179 topology 289 484 +> 15 0 25 179 topology 291 485 +> 16 0 25 179 topology 293 485 +> 15 0 25 179 topology 291 486 +> 16 0 25 179 topology 292 486 +> 15 0 25 179 topology 294 487 +> 16 0 25 179 topology 296 487 +> 15 0 25 179 topology 294 488 +> 16 0 25 179 topology 295 488 +> 15 0 25 179 topology 186 489 +> 16 0 25 179 topology 188 489 +> 15 0 25 179 topology 186 490 +> 16 0 25 179 topology 187 490 +> 15 0 25 179 topology 297 491 +> 16 0 25 179 topology 299 491 +> 15 0 25 179 topology 297 492 +> 16 0 25 179 topology 298 492 +> 15 0 25 179 topology 300 493 +> 16 0 25 179 topology 302 493 +> 15 0 25 179 topology 300 494 +> 16 0 25 179 topology 301 494 +> 15 0 25 179 topology 303 495 +> 16 0 25 179 topology 305 495 +> 15 0 25 179 topology 303 496 +> 16 0 25 179 topology 304 496 +> 15 0 25 179 topology 306 497 +> 16 0 25 179 topology 308 497 +> 15 0 25 179 topology 306 498 +> 16 0 25 179 topology 307 498 +> 15 0 25 179 topology 309 499 +> 16 0 25 179 topology 311 499 +> 15 0 25 179 topology 309 500 +> 16 0 25 179 topology 310 500 +> 15 0 25 179 topology 312 501 +> 16 0 25 179 topology 314 501 +> 15 0 25 179 topology 312 502 +> 16 0 25 179 topology 313 502 +> 15 0 25 179 topology 315 503 +> 16 0 25 179 topology 317 503 +> 15 0 25 179 topology 315 504 +> 16 0 25 179 topology 316 504 +> 15 0 25 179 topology 318 505 +> 16 0 25 179 topology 320 505 +> 15 0 25 179 topology 318 506 +> 16 0 25 179 topology 319 506 +> 15 0 25 179 topology 321 507 +> 16 0 25 179 topology 323 507 +> 15 0 25 179 topology 321 508 +> 16 0 25 179 topology 322 508 +> 15 0 25 179 topology 324 509 +> 16 0 25 179 topology 326 509 +> 15 0 25 179 topology 324 510 +> 16 0 25 179 topology 325 510 +> 15 0 25 179 topology 189 511 +> 16 0 25 179 topology 191 511 +> 15 0 25 179 topology 189 512 +> 16 0 25 179 topology 190 512 +> 15 0 25 179 topology 327 513 +> 16 0 25 179 topology 329 513 +> 15 0 25 179 topology 327 514 +> 16 0 25 179 topology 328 514 +> 15 0 25 179 topology 330 515 +> 16 0 25 179 topology 332 515 +> 15 0 25 179 topology 330 516 +> 16 0 25 179 topology 331 516 +> 15 0 25 179 topology 333 517 +> 16 0 25 179 topology 335 517 +> 15 0 25 179 topology 333 518 +> 16 0 25 179 topology 334 518 +> 15 0 25 179 topology 336 519 +> 16 0 25 179 topology 338 519 +> 15 0 25 179 topology 336 520 +> 16 0 25 179 topology 337 520 +> 15 0 25 179 topology 339 521 +> 16 0 25 179 topology 341 521 +> 15 0 25 179 topology 339 522 +> 16 0 25 179 topology 340 522 +> 15 0 25 179 topology 342 523 +> 16 0 25 179 topology 344 523 +> 15 0 25 179 topology 342 524 +> 16 0 25 179 topology 343 524 +> 15 0 25 179 topology 345 525 +> 16 0 25 179 topology 347 525 +> 15 0 25 179 topology 345 526 +> 16 0 25 179 topology 346 526 +> 15 0 25 179 topology 348 527 +> 16 0 25 179 topology 350 527 +> 15 0 25 179 topology 348 528 +> 16 0 25 179 topology 349 528 +> 15 0 25 179 topology 351 529 +> 16 0 25 179 topology 353 529 +> 15 0 25 179 topology 351 530 +> 16 0 25 179 topology 352 530 +> 15 0 25 179 topology 354 531 +> 16 0 25 179 topology 356 531 +> 15 0 25 179 topology 354 532 +> 16 0 25 179 topology 355 532 +> 15 0 25 179 topology 192 533 +> 16 0 25 179 topology 194 533 +> 15 0 25 179 topology 192 534 +> 16 0 25 179 topology 193 534 +> 15 0 25 179 topology 357 535 +> 16 0 25 179 topology 359 535 +> 15 0 25 179 topology 357 536 +> 16 0 25 179 topology 358 536 +> 15 0 25 179 topology 360 537 +> 16 0 25 179 topology 362 537 +> 15 0 25 179 topology 360 538 +> 16 0 25 179 topology 361 538 +> 15 0 25 179 topology 363 539 +> 16 0 25 179 topology 365 539 +> 15 0 25 179 topology 363 540 +> 16 0 25 179 topology 364 540 +> 15 0 25 179 topology 366 541 +> 16 0 25 179 topology 368 541 +> 15 0 25 179 topology 366 542 +> 16 0 25 179 topology 367 542 +> 15 0 25 179 topology 369 543 +> 16 0 25 179 topology 371 543 +> 15 0 25 179 topology 369 544 +> 16 0 25 179 topology 370 544 +> 15 0 25 179 topology 372 545 +> 16 0 25 179 topology 374 545 +> 15 0 25 179 topology 372 546 +> 16 0 25 179 topology 373 546 +> 15 0 25 179 topology 375 547 +> 16 0 25 179 topology 377 547 +> 15 0 25 179 topology 375 548 +> 16 0 25 179 topology 376 548 +> 15 0 25 179 topology 378 549 +> 16 0 25 179 topology 380 549 +> 15 0 25 179 topology 378 550 +> 16 0 25 179 topology 379 550 +> 15 0 25 179 topology 381 551 +> 16 0 25 179 topology 383 551 +> 15 0 25 179 topology 381 552 +> 16 0 25 179 topology 382 552 +> 15 0 25 179 topology 384 553 +> 16 0 25 179 topology 386 553 +> 15 0 25 179 topology 384 554 +> 16 0 25 179 topology 385 554 +> 15 0 25 179 topology 195 555 +> 16 0 25 179 topology 197 555 +> 15 0 25 179 topology 195 556 +> 16 0 25 179 topology 196 556 +> 15 0 25 179 topology 387 557 +> 16 0 25 179 topology 389 557 +> 15 0 25 179 topology 387 558 +> 16 0 25 179 topology 388 558 +> 15 0 25 179 topology 390 559 +> 16 0 25 179 topology 392 559 +> 15 0 25 179 topology 390 560 +> 16 0 25 179 topology 391 560 +> 15 0 25 179 topology 393 561 +> 16 0 25 179 topology 395 561 +> 15 0 25 179 topology 393 562 +> 16 0 25 179 topology 394 562 +> 15 0 25 179 topology 396 563 +> 16 0 25 179 topology 398 563 +> 15 0 25 179 topology 396 564 +> 16 0 25 179 topology 397 564 +> 15 0 25 179 topology 399 565 +> 16 0 25 179 topology 401 565 +> 15 0 25 179 topology 399 566 +> 16 0 25 179 topology 400 566 +> 15 0 25 179 topology 402 567 +> 16 0 25 179 topology 404 567 +> 15 0 25 179 topology 402 568 +> 16 0 25 179 topology 403 568 +> 15 0 25 179 topology 405 569 +> 16 0 25 179 topology 407 569 +> 15 0 25 179 topology 405 570 +> 16 0 25 179 topology 406 570 +> 15 0 25 179 topology 408 571 +> 16 0 25 179 topology 410 571 +> 15 0 25 179 topology 408 572 +> 16 0 25 179 topology 409 572 +> 15 0 25 179 topology 411 573 +> 16 0 25 179 topology 413 573 +> 15 0 25 179 topology 411 574 +> 16 0 25 179 topology 412 574 +> 15 0 25 179 topology 414 575 +> 16 0 25 179 topology 416 575 +> 15 0 25 179 topology 414 576 +> 16 0 25 179 topology 415 576 +> 15 0 25 179 topology 198 577 +> 16 0 25 179 topology 200 577 +> 15 0 25 179 topology 198 578 +> 16 0 25 179 topology 199 578 +> 15 0 25 179 topology 417 579 +> 16 0 25 179 topology 419 579 +> 15 0 25 179 topology 417 580 +> 16 0 25 179 topology 418 580 +> 15 0 25 179 topology 420 581 +> 16 0 25 179 topology 422 581 +> 15 0 25 179 topology 420 582 +> 16 0 25 179 topology 421 582 +> 15 0 25 179 topology 423 583 +> 16 0 25 179 topology 425 583 +> 15 0 25 179 topology 423 584 +> 16 0 25 179 topology 424 584 +> 15 0 25 179 topology 426 585 +> 16 0 25 179 topology 428 585 +> 15 0 25 179 topology 426 586 +> 16 0 25 179 topology 427 586 +> 15 0 25 179 topology 429 587 +> 16 0 25 179 topology 431 587 +> 15 0 25 179 topology 429 588 +> 16 0 25 179 topology 430 588 +> 15 0 25 179 topology 432 589 +> 16 0 25 179 topology 434 589 +> 15 0 25 179 topology 432 590 +> 16 0 25 179 topology 433 590 +> 15 0 25 179 topology 435 591 +> 16 0 25 179 topology 437 591 +> 15 0 25 179 topology 435 592 +> 16 0 25 179 topology 436 592 +> 15 0 25 179 topology 438 593 +> 16 0 25 179 topology 440 593 +> 15 0 25 179 topology 438 594 +> 16 0 25 179 topology 439 594 +> 15 0 25 179 topology 441 595 +> 16 0 25 179 topology 443 595 +> 15 0 25 179 topology 441 596 +> 16 0 25 179 topology 442 596 +> 15 0 25 179 topology 444 597 +> 16 0 25 179 topology 446 597 +> 15 0 25 179 topology 444 598 +> 16 0 25 179 topology 445 598 +> 15 0 25 179 topology 201 599 +> 16 0 25 179 topology 203 599 +> 15 0 25 179 topology 201 600 +> 16 0 25 179 topology 202 600 +> 15 0 25 179 topology 447 601 +> 16 0 25 179 topology 449 601 +> 15 0 25 179 topology 447 602 +> 16 0 25 179 topology 448 602 +> 15 0 25 179 topology 450 603 +> 16 0 25 179 topology 452 603 +> 15 0 25 179 topology 450 604 +> 16 0 25 179 topology 451 604 +> 15 0 25 179 topology 453 605 +> 16 0 25 179 topology 455 605 +> 15 0 25 179 topology 453 606 +> 16 0 25 179 topology 454 606 +> 15 0 25 179 topology 456 607 +> 16 0 25 179 topology 458 607 +> 15 0 25 179 topology 456 608 +> 16 0 25 179 topology 457 608 +> 15 0 25 179 topology 204 609 +> 16 0 25 179 topology 206 609 +> 15 0 25 179 topology 204 610 +> 16 0 25 179 topology 205 610 +> 15 0 23 462 topology 492 611 +> 16 0 23 462 topology 494 611 +> 15 0 23 462 topology 491 612 > 16 0 23 462 topology 494 612 -> 15 0 23 462 topology 486 613 +> 15 0 23 462 topology 465 613 > 16 0 23 462 topology 494 613 -> 15 0 24 462 topology 481 614 -> 16 0 24 462 topology 483 614 -> 15 0 24 462 topology 469 615 -> 16 0 24 462 topology 470 615 -> 15 0 23 462 topology 470 616 +> 15 0 23 462 topology 464 614 +> 16 0 23 462 topology 494 614 +> 15 0 23 462 topology 468 615 +> 16 0 23 462 topology 494 615 +> 15 0 23 462 topology 467 616 > 16 0 23 462 topology 494 616 -> 15 0 23 462 topology 482 617 +> 15 0 23 462 topology 471 617 > 16 0 23 462 topology 494 617 -> 15 0 24 462 topology 481 618 -> 16 0 24 462 topology 482 618 -> 15 0 23 462 topology 465 619 +> 15 0 23 462 topology 470 618 +> 16 0 23 462 topology 494 618 +> 15 0 23 462 topology 474 619 > 16 0 23 462 topology 494 619 -> 15 0 24 462 topology 466 620 -> 16 0 24 462 topology 468 620 +> 15 0 23 462 topology 473 620 +> 16 0 23 462 topology 494 620 > 15 0 23 462 topology 477 621 > 16 0 23 462 topology 494 621 -> 15 0 24 462 topology 478 622 -> 16 0 24 462 topology 480 622 -> 15 0 23 462 topology 489 623 +> 15 0 23 462 topology 476 622 +> 16 0 23 462 topology 494 622 +> 15 0 23 462 topology 480 623 > 16 0 23 462 topology 494 623 -> 15 0 23 462 topology 467 624 +> 15 0 23 462 topology 479 624 > 16 0 23 462 topology 494 624 -> 15 0 24 462 topology 472 625 -> 16 0 24 462 topology 473 625 -> 15 0 23 462 topology 479 626 +> 15 0 23 462 topology 483 625 +> 16 0 23 462 topology 494 625 +> 15 0 23 462 topology 482 626 > 16 0 23 462 topology 494 626 -> 15 0 24 462 topology 484 627 -> 16 0 24 462 topology 485 627 -> 15 0 24 462 topology 463 628 -> 16 0 24 462 topology 465 628 -> 15 0 24 462 topology 490 629 -> 16 0 24 462 topology 492 629 -> 15 0 23 462 topology 468 630 +> 15 0 23 462 topology 486 627 +> 16 0 23 462 topology 494 627 +> 15 0 23 462 topology 485 628 +> 16 0 23 462 topology 494 628 +> 15 0 23 462 topology 489 629 +> 16 0 23 462 topology 494 629 +> 15 0 23 462 topology 488 630 > 16 0 23 462 topology 494 630 -> 15 0 23 462 topology 480 631 -> 16 0 23 462 topology 494 631 -> 15 0 25 462 topology 493 632 -> 16 0 25 462 topology 494 632 -> 15 0 24 462 topology 475 633 -> 16 0 24 462 topology 477 633 -> 15 0 24 462 topology 463 634 -> 16 0 24 462 topology 464 634 -> 15 0 23 462 topology 464 635 -> 16 0 23 462 topology 494 635 -> 15 0 24 462 topology 487 636 -> 16 0 24 462 topology 489 636 -> 15 0 23 462 topology 492 637 -> 16 0 23 462 topology 494 637 -> 15 0 23 462 topology 476 638 -> 16 0 23 462 topology 494 638 -> 15 0 24 462 topology 475 639 -> 16 0 24 462 topology 476 639 -> 15 0 23 462 topology 488 640 -> 16 0 23 462 topology 494 640 -> 15 0 24 462 topology 487 641 -> 16 0 24 462 topology 488 641 -> 15 0 23 462 topology 471 642 -> 16 0 23 462 topology 494 642 -> 15 0 24 462 topology 472 643 -> 16 0 24 462 topology 474 643 -> 15 0 23 462 topology 483 644 -> 16 0 23 462 topology 494 644 -> 15 0 24 462 topology 490 645 -> 16 0 24 462 topology 491 645 -> 15 0 24 462 topology 484 646 -> 16 0 24 462 topology 486 646 -> 15 0 24 462 topology 466 647 -> 16 0 24 462 topology 467 647 -> 15 0 23 462 topology 473 648 -> 16 0 23 462 topology 494 648 -> 15 0 23 462 topology 485 649 -> 16 0 23 462 topology 494 649 -> 15 0 24 462 topology 478 650 -> 16 0 24 462 topology 479 650 -> 15 0 23 462 topology 491 651 -> 16 0 23 462 topology 494 651 +> 15 0 24 462 topology 493 631 +> 16 0 24 462 topology 494 631 +> 15 0 25 462 topology 490 632 +> 16 0 25 462 topology 492 632 +> 15 0 25 462 topology 490 633 +> 16 0 25 462 topology 491 633 +> 15 0 25 462 topology 463 634 +> 16 0 25 462 topology 465 634 +> 15 0 25 462 topology 463 635 +> 16 0 25 462 topology 464 635 +> 15 0 25 462 topology 466 636 +> 16 0 25 462 topology 468 636 +> 15 0 25 462 topology 466 637 +> 16 0 25 462 topology 467 637 +> 15 0 25 462 topology 469 638 +> 16 0 25 462 topology 471 638 +> 15 0 25 462 topology 469 639 +> 16 0 25 462 topology 470 639 +> 15 0 25 462 topology 472 640 +> 16 0 25 462 topology 474 640 +> 15 0 25 462 topology 472 641 +> 16 0 25 462 topology 473 641 +> 15 0 25 462 topology 475 642 +> 16 0 25 462 topology 477 642 +> 15 0 25 462 topology 475 643 +> 16 0 25 462 topology 476 643 +> 15 0 25 462 topology 478 644 +> 16 0 25 462 topology 480 644 +> 15 0 25 462 topology 478 645 +> 16 0 25 462 topology 479 645 +> 15 0 25 462 topology 481 646 +> 16 0 25 462 topology 483 646 +> 15 0 25 462 topology 481 647 +> 16 0 25 462 topology 482 647 +> 15 0 25 462 topology 484 648 +> 16 0 25 462 topology 486 648 +> 15 0 25 462 topology 484 649 +> 16 0 25 462 topology 485 649 +> 15 0 25 462 topology 487 650 +> 16 0 25 462 topology 489 650 +> 15 0 25 462 topology 487 651 +> 16 0 25 462 topology 488 651 > 15 0 26 21 topology 461 652 -> 16 0 26 21 topology 497 652 -> 15 0 21 21 topology 178 653 -> 16 0 21 21 topology 495 653 -> 15 0 21 21 topology 461 654 -> 16 0 21 21 topology 495 654 -> 15 0 21 21 topology 178 655 -> 16 0 21 21 topology 461 655 -> 15 0 27 21 topology 176 656 -> 16 0 27 21 topology 178 656 -> 15 0 26 21 topology 461 657 -> 16 0 26 21 topology 459 657 -> 15 0 26 21 topology 495 658 -> 16 0 26 21 topology 493 658 -> 15 0 26 21 topology 495 659 -> 16 0 26 21 topology 497 659 -> 15 0 26 21 topology 178 660 -> 16 0 26 21 topology 497 660 -> 15 0 23 500 topology 514 661 +> 16 0 26 21 topology 459 652 +> 15 0 26 21 topology 495 653 +> 16 0 26 21 topology 493 653 +> 15 0 26 21 topology 178 654 +> 16 0 26 21 topology 497 654 +> 15 0 26 21 topology 461 655 +> 16 0 26 21 topology 497 655 +> 15 0 26 21 topology 495 656 +> 16 0 26 21 topology 497 656 +> 15 0 27 21 topology 176 657 +> 16 0 27 21 topology 178 657 +> 15 0 20 21 topology 178 658 +> 16 0 20 21 topology 461 658 +> 15 0 20 21 topology 178 659 +> 16 0 20 21 topology 495 659 +> 15 0 20 21 topology 461 660 +> 16 0 20 21 topology 495 660 +> 15 0 23 500 topology 530 661 > 16 0 23 500 topology 538 661 -> 15 0 23 500 topology 526 662 +> 15 0 23 500 topology 529 662 > 16 0 23 500 topology 538 662 -> 15 0 24 500 topology 507 663 -> 16 0 24 500 topology 509 663 -> 15 0 24 500 topology 519 664 -> 16 0 24 500 topology 521 664 -> 15 0 23 500 topology 532 665 +> 15 0 23 500 topology 533 663 +> 16 0 23 500 topology 538 663 +> 15 0 23 500 topology 532 664 +> 16 0 23 500 topology 538 664 +> 15 0 23 500 topology 536 665 > 16 0 23 500 topology 538 665 -> 15 0 23 500 topology 509 666 +> 15 0 23 500 topology 535 666 > 16 0 23 500 topology 538 666 -> 15 0 24 500 topology 507 667 -> 16 0 24 500 topology 508 667 -> 15 0 23 500 topology 521 668 +> 15 0 23 500 topology 503 667 +> 16 0 23 500 topology 538 667 +> 15 0 23 500 topology 502 668 > 16 0 23 500 topology 538 668 -> 15 0 24 500 topology 519 669 -> 16 0 24 500 topology 520 669 -> 15 0 23 500 topology 511 670 +> 15 0 23 500 topology 506 669 +> 16 0 23 500 topology 538 669 +> 15 0 23 500 topology 505 670 > 16 0 23 500 topology 538 670 -> 15 0 23 500 topology 533 671 +> 15 0 23 500 topology 509 671 > 16 0 23 500 topology 538 671 -> 15 0 24 500 topology 504 672 -> 16 0 24 500 topology 506 672 -> 15 0 23 500 topology 523 673 +> 15 0 23 500 topology 508 672 +> 16 0 23 500 topology 538 672 +> 15 0 23 500 topology 512 673 > 16 0 23 500 topology 538 673 -> 15 0 24 500 topology 516 674 -> 16 0 24 500 topology 518 674 -> 15 0 23 500 topology 529 675 +> 15 0 23 500 topology 511 674 +> 16 0 23 500 topology 538 674 +> 15 0 23 500 topology 515 675 > 16 0 23 500 topology 538 675 -> 15 0 24 500 topology 531 676 -> 16 0 24 500 topology 532 676 -> 15 0 23 500 topology 512 677 +> 15 0 23 500 topology 514 676 +> 16 0 23 500 topology 538 676 +> 15 0 23 500 topology 518 677 > 16 0 23 500 topology 538 677 -> 15 0 24 500 topology 510 678 -> 16 0 24 500 topology 511 678 -> 15 0 23 500 topology 524 679 +> 15 0 23 500 topology 517 678 +> 16 0 23 500 topology 538 678 +> 15 0 23 500 topology 521 679 > 16 0 23 500 topology 538 679 -> 15 0 24 500 topology 522 680 -> 16 0 24 500 topology 523 680 -> 15 0 23 500 topology 508 681 +> 15 0 23 500 topology 520 680 +> 16 0 23 500 topology 538 680 +> 15 0 23 500 topology 524 681 > 16 0 23 500 topology 538 681 -> 15 0 24 500 topology 501 682 -> 16 0 24 500 topology 503 682 -> 15 0 24 500 topology 528 683 -> 16 0 24 500 topology 530 683 -> 15 0 23 500 topology 536 684 +> 15 0 23 500 topology 523 682 +> 16 0 23 500 topology 538 682 +> 15 0 23 500 topology 527 683 +> 16 0 23 500 topology 538 683 +> 15 0 23 500 topology 526 684 > 16 0 23 500 topology 538 684 -> 15 0 23 500 topology 520 685 -> 16 0 23 500 topology 538 685 -> 15 0 24 500 topology 531 686 -> 16 0 24 500 topology 533 686 -> 15 0 24 500 topology 534 687 -> 16 0 24 500 topology 536 687 -> 15 0 24 500 topology 513 688 -> 16 0 24 500 topology 515 688 -> 15 0 24 500 topology 501 689 -> 16 0 24 500 topology 502 689 -> 15 0 23 500 topology 503 690 -> 16 0 23 500 topology 538 690 -> 15 0 24 500 topology 525 691 -> 16 0 24 500 topology 527 691 -> 15 0 23 500 topology 515 692 -> 16 0 23 500 topology 538 692 -> 15 0 24 500 topology 513 693 -> 16 0 24 500 topology 514 693 -> 15 0 23 500 topology 527 694 -> 16 0 23 500 topology 538 694 -> 15 0 23 500 topology 505 695 -> 16 0 23 500 topology 538 695 -> 15 0 24 500 topology 525 696 -> 16 0 24 500 topology 526 696 -> 15 0 25 500 topology 537 697 -> 16 0 25 500 topology 538 697 -> 15 0 23 500 topology 517 698 -> 16 0 23 500 topology 538 698 -> 15 0 24 500 topology 510 699 -> 16 0 24 500 topology 512 699 -> 15 0 24 500 topology 528 700 -> 16 0 24 500 topology 529 700 -> 15 0 23 500 topology 535 701 -> 16 0 23 500 topology 538 701 -> 15 0 24 500 topology 522 702 -> 16 0 24 500 topology 524 702 -> 15 0 24 500 topology 504 703 -> 16 0 24 500 topology 505 703 -> 15 0 23 500 topology 506 704 -> 16 0 23 500 topology 538 704 -> 15 0 24 500 topology 534 705 -> 16 0 24 500 topology 535 705 -> 15 0 23 500 topology 518 706 -> 16 0 23 500 topology 538 706 -> 15 0 24 500 topology 516 707 -> 16 0 24 500 topology 517 707 -> 15 0 23 500 topology 502 708 -> 16 0 23 500 topology 538 708 -> 15 0 23 500 topology 530 709 -> 16 0 23 500 topology 538 709 -> 15 0 23 540 topology 732 710 +> 15 0 24 500 topology 537 685 +> 16 0 24 500 topology 538 685 +> 15 0 25 500 topology 528 686 +> 16 0 25 500 topology 530 686 +> 15 0 25 500 topology 528 687 +> 16 0 25 500 topology 529 687 +> 15 0 25 500 topology 531 688 +> 16 0 25 500 topology 533 688 +> 15 0 25 500 topology 531 689 +> 16 0 25 500 topology 532 689 +> 15 0 25 500 topology 534 690 +> 16 0 25 500 topology 536 690 +> 15 0 25 500 topology 534 691 +> 16 0 25 500 topology 535 691 +> 15 0 25 500 topology 501 692 +> 16 0 25 500 topology 503 692 +> 15 0 25 500 topology 501 693 +> 16 0 25 500 topology 502 693 +> 15 0 25 500 topology 504 694 +> 16 0 25 500 topology 506 694 +> 15 0 25 500 topology 504 695 +> 16 0 25 500 topology 505 695 +> 15 0 25 500 topology 507 696 +> 16 0 25 500 topology 509 696 +> 15 0 25 500 topology 507 697 +> 16 0 25 500 topology 508 697 +> 15 0 25 500 topology 510 698 +> 16 0 25 500 topology 512 698 +> 15 0 25 500 topology 510 699 +> 16 0 25 500 topology 511 699 +> 15 0 25 500 topology 513 700 +> 16 0 25 500 topology 515 700 +> 15 0 25 500 topology 513 701 +> 16 0 25 500 topology 514 701 +> 15 0 25 500 topology 516 702 +> 16 0 25 500 topology 518 702 +> 15 0 25 500 topology 516 703 +> 16 0 25 500 topology 517 703 +> 15 0 25 500 topology 519 704 +> 16 0 25 500 topology 521 704 +> 15 0 25 500 topology 519 705 +> 16 0 25 500 topology 520 705 +> 15 0 25 500 topology 522 706 +> 16 0 25 500 topology 524 706 +> 15 0 25 500 topology 522 707 +> 16 0 25 500 topology 523 707 +> 15 0 25 500 topology 525 708 +> 16 0 25 500 topology 527 708 +> 15 0 25 500 topology 525 709 +> 16 0 25 500 topology 526 709 +> 15 0 23 540 topology 570 710 > 16 0 23 540 topology 758 710 -> 15 0 24 540 topology 607 711 -> 16 0 24 540 topology 609 711 -> 15 0 23 540 topology 684 712 +> 15 0 23 540 topology 569 711 +> 16 0 23 540 topology 758 711 +> 15 0 23 540 topology 573 712 > 16 0 23 540 topology 758 712 -> 15 0 24 540 topology 745 713 -> 16 0 24 540 topology 746 713 -> 15 0 24 540 topology 637 714 -> 16 0 24 540 topology 639 714 -> 15 0 24 540 topology 667 715 -> 16 0 24 540 topology 669 715 -> 15 0 24 540 topology 541 716 -> 16 0 24 540 topology 542 716 +> 15 0 23 540 topology 572 713 +> 16 0 23 540 topology 758 713 +> 15 0 23 540 topology 576 714 +> 16 0 23 540 topology 758 714 +> 15 0 23 540 topology 575 715 +> 16 0 23 540 topology 758 715 +> 15 0 23 540 topology 579 716 +> 16 0 23 540 topology 758 716 > 15 0 23 540 topology 578 717 > 16 0 23 540 topology 758 717 -> 15 0 24 540 topology 589 718 -> 16 0 24 540 topology 591 718 -> 15 0 24 540 topology 697 719 -> 16 0 24 540 topology 699 719 -> 15 0 24 540 topology 619 720 -> 16 0 24 540 topology 621 720 -> 15 0 23 540 topology 638 721 +> 15 0 23 540 topology 582 718 +> 16 0 23 540 topology 758 718 +> 15 0 23 540 topology 581 719 +> 16 0 23 540 topology 758 719 +> 15 0 23 540 topology 585 720 +> 16 0 23 540 topology 758 720 +> 15 0 23 540 topology 584 721 > 16 0 23 540 topology 758 721 -> 15 0 24 540 topology 727 722 -> 16 0 24 540 topology 729 722 -> 15 0 23 540 topology 555 723 +> 15 0 23 540 topology 588 722 +> 16 0 23 540 topology 758 722 +> 15 0 23 540 topology 587 723 > 16 0 23 540 topology 758 723 -> 15 0 24 540 topology 649 724 -> 16 0 24 540 topology 651 724 -> 15 0 23 540 topology 698 725 +> 15 0 23 540 topology 591 724 +> 16 0 23 540 topology 758 724 +> 15 0 23 540 topology 590 725 > 16 0 23 540 topology 758 725 -> 15 0 23 540 topology 620 726 +> 15 0 23 540 topology 594 726 > 16 0 23 540 topology 758 726 -> 15 0 24 540 topology 679 727 -> 16 0 24 540 topology 681 727 -> 15 0 23 540 topology 680 728 +> 15 0 23 540 topology 593 727 +> 16 0 23 540 topology 758 727 +> 15 0 23 540 topology 597 728 > 16 0 23 540 topology 758 728 -> 15 0 24 540 topology 709 729 -> 16 0 24 540 topology 711 729 -> 15 0 23 540 topology 740 730 +> 15 0 23 540 topology 596 729 +> 16 0 23 540 topology 758 729 +> 15 0 23 540 topology 543 730 > 16 0 23 540 topology 758 730 -> 15 0 24 540 topology 739 731 -> 16 0 24 540 topology 741 731 -> 15 0 25 540 topology 757 732 -> 16 0 25 540 topology 758 732 -> 15 0 23 540 topology 545 733 +> 15 0 23 540 topology 542 731 +> 16 0 23 540 topology 758 731 +> 15 0 23 540 topology 600 732 +> 16 0 23 540 topology 758 732 +> 15 0 23 540 topology 599 733 > 16 0 23 540 topology 758 733 -> 15 0 24 540 topology 565 734 -> 16 0 24 540 topology 566 734 -> 15 0 23 540 topology 603 735 +> 15 0 23 540 topology 603 734 +> 16 0 23 540 topology 758 734 +> 15 0 23 540 topology 602 735 > 16 0 23 540 topology 758 735 -> 15 0 23 540 topology 639 736 +> 15 0 23 540 topology 606 736 > 16 0 23 540 topology 758 736 -> 15 0 23 540 topology 723 737 +> 15 0 23 540 topology 605 737 > 16 0 23 540 topology 758 737 -> 15 0 23 540 topology 591 738 +> 15 0 23 540 topology 609 738 > 16 0 23 540 topology 758 738 -> 15 0 23 540 topology 675 739 +> 15 0 23 540 topology 608 739 > 16 0 23 540 topology 758 739 -> 15 0 23 540 topology 627 740 +> 15 0 23 540 topology 612 740 > 16 0 23 540 topology 758 740 -> 15 0 23 540 topology 711 741 +> 15 0 23 540 topology 611 741 > 16 0 23 540 topology 758 741 -> 15 0 23 540 topology 747 742 +> 15 0 23 540 topology 615 742 > 16 0 23 540 topology 758 742 -> 15 0 24 540 topology 562 743 -> 16 0 24 540 topology 564 743 -> 15 0 23 540 topology 605 744 +> 15 0 23 540 topology 614 743 +> 16 0 23 540 topology 758 743 +> 15 0 23 540 topology 618 744 > 16 0 23 540 topology 758 744 -> 15 0 23 540 topology 546 745 +> 15 0 23 540 topology 617 745 > 16 0 23 540 topology 758 745 -> 15 0 24 540 topology 571 746 -> 16 0 24 540 topology 572 746 -> 15 0 23 540 topology 665 747 +> 15 0 23 540 topology 621 746 +> 16 0 23 540 topology 758 746 +> 15 0 23 540 topology 620 747 > 16 0 23 540 topology 758 747 -> 15 0 23 540 topology 587 748 +> 15 0 23 540 topology 624 748 > 16 0 23 540 topology 758 748 -> 15 0 24 540 topology 628 749 -> 16 0 24 540 topology 629 749 -> 15 0 23 540 topology 725 750 +> 15 0 23 540 topology 623 749 +> 16 0 23 540 topology 758 749 +> 15 0 23 540 topology 627 750 > 16 0 23 540 topology 758 750 -> 15 0 24 540 topology 550 751 -> 16 0 24 540 topology 551 751 -> 15 0 24 540 topology 577 752 -> 16 0 24 540 topology 578 752 -> 15 0 23 540 topology 647 753 +> 15 0 23 540 topology 626 751 +> 16 0 23 540 topology 758 751 +> 15 0 23 540 topology 546 752 +> 16 0 23 540 topology 758 752 +> 15 0 23 540 topology 545 753 > 16 0 23 540 topology 758 753 -> 15 0 24 540 topology 634 754 -> 16 0 24 540 topology 635 754 -> 15 0 23 540 topology 707 755 +> 15 0 23 540 topology 630 754 +> 16 0 23 540 topology 758 754 +> 15 0 23 540 topology 629 755 > 16 0 23 540 topology 758 755 -> 15 0 24 540 topology 583 756 -> 16 0 24 540 topology 584 756 -> 15 0 24 540 topology 691 757 -> 16 0 24 540 topology 692 757 -> 15 0 24 540 topology 640 758 -> 16 0 24 540 topology 641 758 -> 15 0 24 540 topology 748 759 -> 16 0 24 540 topology 749 759 -> 15 0 24 540 topology 589 760 -> 16 0 24 540 topology 590 760 -> 15 0 24 540 topology 697 761 -> 16 0 24 540 topology 698 761 -> 15 0 24 540 topology 646 762 -> 16 0 24 540 topology 647 762 -> 15 0 24 540 topology 754 763 -> 16 0 24 540 topology 755 763 -> 15 0 23 540 topology 554 764 +> 15 0 23 540 topology 633 756 +> 16 0 23 540 topology 758 756 +> 15 0 23 540 topology 632 757 +> 16 0 23 540 topology 758 757 +> 15 0 23 540 topology 636 758 +> 16 0 23 540 topology 758 758 +> 15 0 23 540 topology 635 759 +> 16 0 23 540 topology 758 759 +> 15 0 23 540 topology 639 760 +> 16 0 23 540 topology 758 760 +> 15 0 23 540 topology 638 761 +> 16 0 23 540 topology 758 761 +> 15 0 23 540 topology 642 762 +> 16 0 23 540 topology 758 762 +> 15 0 23 540 topology 641 763 +> 16 0 23 540 topology 758 763 +> 15 0 23 540 topology 645 764 > 16 0 23 540 topology 758 764 -> 15 0 24 540 topology 595 765 -> 16 0 24 540 topology 596 765 -> 15 0 24 540 topology 703 766 -> 16 0 24 540 topology 704 766 -> 15 0 23 540 topology 630 767 +> 15 0 23 540 topology 644 765 +> 16 0 23 540 topology 758 765 +> 15 0 23 540 topology 648 766 +> 16 0 23 540 topology 758 766 +> 15 0 23 540 topology 647 767 > 16 0 23 540 topology 758 767 -> 15 0 24 540 topology 652 768 -> 16 0 24 540 topology 653 768 -> 15 0 23 540 topology 582 769 +> 15 0 23 540 topology 651 768 +> 16 0 23 540 topology 758 768 +> 15 0 23 540 topology 650 769 > 16 0 23 540 topology 758 769 -> 15 0 23 540 topology 666 770 +> 15 0 23 540 topology 654 770 > 16 0 23 540 topology 758 770 -> 15 0 24 540 topology 709 771 -> 16 0 24 540 topology 710 771 -> 15 0 24 540 topology 574 772 -> 16 0 24 540 topology 576 772 -> 15 0 23 540 topology 750 773 +> 15 0 23 540 topology 653 771 +> 16 0 23 540 topology 758 771 +> 15 0 23 540 topology 657 772 +> 16 0 23 540 topology 758 772 +> 15 0 23 540 topology 656 773 > 16 0 23 540 topology 758 773 -> 15 0 23 540 topology 618 774 +> 15 0 23 540 topology 549 774 > 16 0 23 540 topology 758 774 -> 15 0 24 540 topology 604 775 -> 16 0 24 540 topology 606 775 -> 15 0 23 540 topology 702 776 +> 15 0 23 540 topology 548 775 +> 16 0 23 540 topology 758 775 +> 15 0 23 540 topology 660 776 > 16 0 23 540 topology 758 776 -> 15 0 24 540 topology 715 777 -> 16 0 24 540 topology 716 777 -> 15 0 24 540 topology 553 778 -> 16 0 24 540 topology 555 778 -> 15 0 24 540 topology 634 779 -> 16 0 24 540 topology 636 779 -> 15 0 23 540 topology 654 780 +> 15 0 23 540 topology 659 777 +> 16 0 23 540 topology 758 777 +> 15 0 23 540 topology 663 778 +> 16 0 23 540 topology 758 778 +> 15 0 23 540 topology 662 779 +> 16 0 23 540 topology 758 779 +> 15 0 23 540 topology 666 780 > 16 0 23 540 topology 758 780 -> 15 0 23 540 topology 738 781 +> 15 0 23 540 topology 665 781 > 16 0 23 540 topology 758 781 -> 15 0 24 540 topology 664 782 -> 16 0 24 540 topology 666 782 -> 15 0 23 540 topology 572 783 +> 15 0 23 540 topology 669 782 +> 16 0 23 540 topology 758 782 +> 15 0 23 540 topology 668 783 > 16 0 23 540 topology 758 783 -> 15 0 24 540 topology 586 784 -> 16 0 24 540 topology 588 784 -> 15 0 24 540 topology 694 785 -> 16 0 24 540 topology 696 785 -> 15 0 24 540 topology 616 786 -> 16 0 24 540 topology 618 786 -> 15 0 23 540 topology 632 787 +> 15 0 23 540 topology 672 784 +> 16 0 23 540 topology 758 784 +> 15 0 23 540 topology 671 785 +> 16 0 23 540 topology 758 785 +> 15 0 23 540 topology 675 786 +> 16 0 23 540 topology 758 786 +> 15 0 23 540 topology 674 787 > 16 0 23 540 topology 758 787 -> 15 0 24 540 topology 724 788 -> 16 0 24 540 topology 726 788 -> 15 0 24 540 topology 646 789 -> 16 0 24 540 topology 648 789 -> 15 0 23 540 topology 692 790 +> 15 0 23 540 topology 678 788 +> 16 0 23 540 topology 758 788 +> 15 0 23 540 topology 677 789 +> 16 0 23 540 topology 758 789 +> 15 0 23 540 topology 681 790 > 16 0 23 540 topology 758 790 -> 15 0 24 540 topology 754 791 -> 16 0 24 540 topology 756 791 -> 15 0 23 540 topology 614 792 +> 15 0 23 540 topology 680 791 +> 16 0 23 540 topology 758 791 +> 15 0 23 540 topology 684 792 > 16 0 23 540 topology 758 792 -> 15 0 24 540 topology 676 793 -> 16 0 24 540 topology 678 793 -> 15 0 23 540 topology 752 794 +> 15 0 23 540 topology 683 793 +> 16 0 23 540 topology 758 793 +> 15 0 23 540 topology 687 794 > 16 0 23 540 topology 758 794 -> 15 0 23 540 topology 674 795 +> 15 0 23 540 topology 686 795 > 16 0 23 540 topology 758 795 -> 15 0 23 540 topology 561 796 +> 15 0 23 540 topology 552 796 > 16 0 23 540 topology 758 796 -> 15 0 23 540 topology 596 797 +> 15 0 23 540 topology 551 797 > 16 0 23 540 topology 758 797 -> 15 0 24 540 topology 706 798 -> 16 0 24 540 topology 708 798 -> 15 0 23 540 topology 734 799 +> 15 0 23 540 topology 690 798 +> 16 0 23 540 topology 758 798 +> 15 0 23 540 topology 689 799 > 16 0 23 540 topology 758 799 -> 15 0 23 540 topology 656 800 +> 15 0 23 540 topology 693 800 > 16 0 23 540 topology 758 800 -> 15 0 24 540 topology 736 801 -> 16 0 24 540 topology 738 801 -> 15 0 23 540 topology 716 802 +> 15 0 23 540 topology 692 801 +> 16 0 23 540 topology 758 801 +> 15 0 23 540 topology 696 802 > 16 0 23 540 topology 758 802 -> 15 0 24 540 topology 559 803 -> 16 0 24 540 topology 560 803 -> 15 0 23 540 topology 573 804 +> 15 0 23 540 topology 695 803 +> 16 0 23 540 topology 758 803 +> 15 0 23 540 topology 699 804 > 16 0 23 540 topology 758 804 -> 15 0 24 540 topology 544 805 -> 16 0 24 540 topology 546 805 -> 15 0 23 540 topology 563 806 +> 15 0 23 540 topology 698 805 +> 16 0 23 540 topology 758 805 +> 15 0 23 540 topology 702 806 > 16 0 23 540 topology 758 806 -> 15 0 23 540 topology 609 807 +> 15 0 23 540 topology 701 807 > 16 0 23 540 topology 758 807 -> 15 0 23 540 topology 693 808 +> 15 0 23 540 topology 705 808 > 16 0 23 540 topology 758 808 -> 15 0 23 540 topology 645 809 +> 15 0 23 540 topology 704 809 > 16 0 23 540 topology 758 809 -> 15 0 23 540 topology 729 810 +> 15 0 23 540 topology 708 810 > 16 0 23 540 topology 758 810 -> 15 0 23 540 topology 597 811 +> 15 0 23 540 topology 707 811 > 16 0 23 540 topology 758 811 -> 15 0 23 540 topology 681 812 +> 15 0 23 540 topology 711 812 > 16 0 23 540 topology 758 812 -> 15 0 23 540 topology 717 813 +> 15 0 23 540 topology 710 813 > 16 0 23 540 topology 758 813 -> 15 0 23 540 topology 599 814 +> 15 0 23 540 topology 714 814 > 16 0 23 540 topology 758 814 -> 15 0 23 540 topology 659 815 +> 15 0 23 540 topology 713 815 > 16 0 23 540 topology 758 815 -> 15 0 24 540 topology 544 816 -> 16 0 24 540 topology 545 816 -> 15 0 23 540 topology 581 817 +> 15 0 23 540 topology 717 816 +> 16 0 23 540 topology 758 816 +> 15 0 23 540 topology 716 817 > 16 0 23 540 topology 758 817 -> 15 0 24 540 topology 598 818 -> 16 0 24 540 topology 599 818 -> 15 0 23 540 topology 719 819 +> 15 0 23 540 topology 555 818 +> 16 0 23 540 topology 758 818 +> 15 0 23 540 topology 554 819 > 16 0 23 540 topology 758 819 -> 15 0 23 540 topology 552 820 +> 15 0 23 540 topology 720 820 > 16 0 23 540 topology 758 820 -> 15 0 23 540 topology 641 821 +> 15 0 23 540 topology 719 821 > 16 0 23 540 topology 758 821 -> 15 0 24 540 topology 604 822 -> 16 0 24 540 topology 605 822 -> 15 0 23 540 topology 701 823 +> 15 0 23 540 topology 723 822 +> 16 0 23 540 topology 758 822 +> 15 0 23 540 topology 722 823 > 16 0 23 540 topology 758 823 -> 15 0 23 540 topology 623 824 +> 15 0 23 540 topology 726 824 > 16 0 23 540 topology 758 824 -> 15 0 24 540 topology 661 825 -> 16 0 24 540 topology 662 825 -> 15 0 23 540 topology 683 826 +> 15 0 23 540 topology 725 825 +> 16 0 23 540 topology 758 825 +> 15 0 23 540 topology 729 826 > 16 0 23 540 topology 758 826 -> 15 0 24 540 topology 610 827 -> 16 0 24 540 topology 611 827 -> 15 0 24 540 topology 718 828 -> 16 0 24 540 topology 719 828 -> 15 0 23 540 topology 743 829 +> 15 0 23 540 topology 728 827 +> 16 0 23 540 topology 758 827 +> 15 0 23 540 topology 732 828 +> 16 0 23 540 topology 758 828 +> 15 0 23 540 topology 731 829 > 16 0 23 540 topology 758 829 -> 15 0 24 540 topology 667 830 -> 16 0 24 540 topology 668 830 -> 15 0 24 540 topology 616 831 -> 16 0 24 540 topology 617 831 -> 15 0 24 540 topology 724 832 -> 16 0 24 540 topology 725 832 -> 15 0 23 540 topology 548 833 +> 15 0 23 540 topology 735 830 +> 16 0 23 540 topology 758 830 +> 15 0 23 540 topology 734 831 +> 16 0 23 540 topology 758 831 +> 15 0 23 540 topology 738 832 +> 16 0 23 540 topology 758 832 +> 15 0 23 540 topology 737 833 > 16 0 23 540 topology 758 833 -> 15 0 24 540 topology 673 834 -> 16 0 24 540 topology 674 834 -> 15 0 23 540 topology 600 835 +> 15 0 23 540 topology 741 834 +> 16 0 23 540 topology 758 834 +> 15 0 23 540 topology 740 835 > 16 0 23 540 topology 758 835 -> 15 0 24 540 topology 622 836 -> 16 0 24 540 topology 623 836 -> 15 0 24 540 topology 730 837 -> 16 0 24 540 topology 731 837 -> 15 0 24 540 topology 679 838 -> 16 0 24 540 topology 680 838 -> 15 0 24 540 topology 571 839 -> 16 0 24 540 topology 573 839 -> 15 0 23 540 topology 636 840 +> 15 0 23 540 topology 744 836 +> 16 0 23 540 topology 758 836 +> 15 0 23 540 topology 743 837 +> 16 0 23 540 topology 758 837 +> 15 0 23 540 topology 747 838 +> 16 0 23 540 topology 758 838 +> 15 0 23 540 topology 746 839 +> 16 0 23 540 topology 758 839 +> 15 0 23 540 topology 558 840 > 16 0 23 540 topology 758 840 -> 15 0 23 540 topology 720 841 +> 15 0 23 540 topology 557 841 > 16 0 23 540 topology 758 841 -> 15 0 24 540 topology 736 842 -> 16 0 24 540 topology 737 842 -> 15 0 23 540 topology 588 843 +> 15 0 23 540 topology 750 842 +> 16 0 23 540 topology 758 842 +> 15 0 23 540 topology 749 843 > 16 0 23 540 topology 758 843 -> 15 0 24 540 topology 601 844 -> 16 0 24 540 topology 603 844 -> 15 0 23 540 topology 672 845 +> 15 0 23 540 topology 753 844 +> 16 0 23 540 topology 758 844 +> 15 0 23 540 topology 752 845 > 16 0 23 540 topology 758 845 -> 15 0 24 540 topology 685 846 -> 16 0 24 540 topology 686 846 -> 15 0 24 540 topology 631 847 -> 16 0 24 540 topology 633 847 -> 15 0 23 540 topology 756 848 +> 15 0 23 540 topology 756 846 +> 16 0 23 540 topology 758 846 +> 15 0 23 540 topology 755 847 +> 16 0 23 540 topology 758 847 +> 15 0 23 540 topology 561 848 > 16 0 23 540 topology 758 848 -> 15 0 23 540 topology 624 849 +> 15 0 23 540 topology 560 849 > 16 0 23 540 topology 758 849 -> 15 0 24 540 topology 742 850 -> 16 0 24 540 topology 743 850 -> 15 0 23 540 topology 708 851 +> 15 0 23 540 topology 564 850 +> 16 0 23 540 topology 758 850 +> 15 0 23 540 topology 563 851 > 16 0 23 540 topology 758 851 -> 15 0 24 540 topology 661 852 -> 16 0 24 540 topology 663 852 -> 15 0 24 540 topology 691 853 -> 16 0 24 540 topology 693 853 -> 15 0 24 540 topology 583 854 -> 16 0 24 540 topology 585 854 -> 15 0 23 540 topology 744 855 -> 16 0 23 540 topology 758 855 -> 15 0 24 540 topology 613 856 -> 16 0 24 540 topology 615 856 -> 15 0 24 540 topology 559 857 -> 16 0 24 540 topology 561 857 -> 15 0 24 540 topology 721 858 -> 16 0 24 540 topology 723 858 -> 15 0 24 540 topology 643 859 -> 16 0 24 540 topology 645 859 -> 15 0 23 540 topology 543 860 -> 16 0 23 540 topology 758 860 -> 15 0 24 540 topology 751 861 -> 16 0 24 540 topology 753 861 -> 15 0 23 540 topology 608 862 -> 16 0 23 540 topology 758 862 -> 15 0 24 540 topology 673 863 -> 16 0 24 540 topology 675 863 -> 15 0 23 540 topology 668 864 -> 16 0 23 540 topology 758 864 -> 15 0 24 540 topology 703 865 -> 16 0 24 540 topology 705 865 -> 15 0 24 540 topology 595 866 -> 16 0 24 540 topology 597 866 -> 15 0 23 540 topology 590 867 -> 16 0 23 540 topology 758 867 -> 15 0 23 540 topology 728 868 -> 16 0 23 540 topology 758 868 -> 15 0 23 540 topology 650 869 -> 16 0 23 540 topology 758 869 -> 15 0 24 540 topology 625 870 -> 16 0 24 540 topology 627 870 -> 15 0 24 540 topology 733 871 -> 16 0 24 540 topology 735 871 -> 15 0 24 540 topology 553 872 -> 16 0 24 540 topology 554 872 -> 15 0 23 540 topology 710 873 -> 16 0 23 540 topology 758 873 -> 15 0 24 540 topology 655 874 -> 16 0 24 540 topology 657 874 -> 15 0 23 540 topology 567 875 -> 16 0 23 540 topology 758 875 -> 15 0 24 540 topology 685 876 -> 16 0 24 540 topology 687 876 -> 15 0 24 540 topology 715 877 -> 16 0 24 540 topology 717 877 -> 15 0 24 540 topology 745 878 -> 16 0 24 540 topology 747 878 -> 15 0 23 540 topology 557 879 -> 16 0 23 540 topology 758 879 -> 15 0 23 540 topology 579 880 -> 16 0 23 540 topology 758 880 -> 15 0 23 540 topology 663 881 -> 16 0 23 540 topology 758 881 -> 15 0 23 540 topology 615 882 -> 16 0 23 540 topology 758 882 -> 15 0 23 540 topology 699 883 -> 16 0 23 540 topology 758 883 -> 15 0 24 540 topology 550 884 -> 16 0 24 540 topology 552 884 -> 15 0 23 540 topology 651 885 -> 16 0 23 540 topology 758 885 -> 15 0 23 540 topology 735 886 -> 16 0 23 540 topology 758 886 -> 15 0 23 540 topology 687 887 -> 16 0 23 540 topology 758 887 -> 15 0 23 540 topology 575 888 -> 16 0 23 540 topology 758 888 -> 15 0 24 540 topology 568 889 -> 16 0 24 540 topology 569 889 -> 15 0 23 540 topology 635 890 -> 16 0 23 540 topology 758 890 -> 15 0 23 540 topology 695 891 -> 16 0 23 540 topology 758 891 -> 15 0 24 540 topology 574 892 -> 16 0 24 540 topology 575 892 -> 15 0 23 540 topology 617 893 -> 16 0 23 540 topology 758 893 -> 15 0 24 540 topology 631 894 -> 16 0 24 540 topology 632 894 -> 15 0 23 540 topology 558 895 -> 16 0 23 540 topology 758 895 -> 15 0 23 540 topology 755 896 -> 16 0 23 540 topology 758 896 -> 15 0 23 540 topology 677 897 -> 16 0 23 540 topology 758 897 -> 15 0 24 540 topology 688 898 -> 16 0 24 540 topology 689 898 -> 15 0 24 540 topology 580 899 -> 16 0 24 540 topology 581 899 -> 15 0 23 540 topology 737 900 -> 16 0 23 540 topology 758 900 -> 15 0 24 540 topology 637 901 -> 16 0 24 540 topology 638 901 -> 15 0 24 540 topology 694 902 -> 16 0 24 540 topology 695 902 -> 15 0 24 540 topology 586 903 -> 16 0 24 540 topology 587 903 -> 15 0 24 540 topology 643 904 -> 16 0 24 540 topology 644 904 -> 15 0 24 540 topology 562 905 -> 16 0 24 540 topology 563 905 -> 15 0 23 540 topology 542 906 -> 16 0 23 540 topology 758 906 -> 15 0 24 540 topology 751 907 -> 16 0 24 540 topology 752 907 -> 15 0 24 540 topology 700 908 -> 16 0 24 540 topology 701 908 -> 15 0 24 540 topology 592 909 -> 16 0 24 540 topology 593 909 -> 15 0 23 540 topology 570 910 -> 16 0 23 540 topology 758 910 -> 15 0 24 540 topology 649 911 -> 16 0 24 540 topology 650 911 -> 15 0 24 540 topology 568 912 -> 16 0 24 540 topology 570 912 -> 15 0 24 540 topology 541 913 -> 16 0 24 540 topology 543 913 -> 15 0 24 540 topology 706 914 -> 16 0 24 540 topology 707 914 -> 15 0 23 540 topology 606 915 -> 16 0 23 540 topology 758 915 -> 15 0 23 540 topology 690 916 -> 16 0 23 540 topology 758 916 -> 15 0 24 540 topology 598 917 -> 16 0 24 540 topology 600 917 -> 15 0 24 540 topology 655 918 -> 16 0 24 540 topology 656 918 -> 15 0 23 540 topology 566 919 -> 16 0 23 540 topology 758 919 -> 15 0 23 540 topology 642 920 -> 16 0 23 540 topology 758 920 -> 15 0 24 540 topology 628 921 -> 16 0 24 540 topology 630 921 -> 15 0 24 540 topology 712 922 -> 16 0 24 540 topology 713 922 -> 15 0 23 540 topology 726 923 -> 16 0 23 540 topology 758 923 -> 15 0 24 540 topology 658 924 -> 16 0 24 540 topology 660 924 -> 15 0 23 540 topology 594 925 -> 16 0 23 540 topology 758 925 -> 15 0 23 540 topology 678 926 -> 16 0 23 540 topology 758 926 -> 15 0 24 540 topology 688 927 -> 16 0 24 540 topology 690 927 -> 15 0 24 540 topology 580 928 -> 16 0 24 540 topology 582 928 -> 15 0 24 540 topology 610 929 -> 16 0 24 540 topology 612 929 -> 15 0 23 540 topology 714 930 -> 16 0 23 540 topology 758 930 -> 15 0 24 540 topology 718 931 -> 16 0 24 540 topology 720 931 -> 15 0 24 540 topology 640 932 -> 16 0 24 540 topology 642 932 -> 15 0 24 540 topology 748 933 -> 16 0 24 540 topology 750 933 -> 15 0 23 540 topology 602 934 -> 16 0 23 540 topology 758 934 -> 15 0 24 540 topology 670 935 -> 16 0 24 540 topology 672 935 -> 15 0 23 540 topology 662 936 -> 16 0 23 540 topology 758 936 -> 15 0 24 540 topology 700 937 -> 16 0 24 540 topology 702 937 -> 15 0 24 540 topology 592 938 -> 16 0 24 540 topology 594 938 -> 15 0 23 540 topology 584 939 -> 16 0 23 540 topology 758 939 -> 15 0 24 540 topology 565 940 -> 16 0 24 540 topology 567 940 -> 15 0 23 540 topology 549 941 -> 16 0 23 540 topology 758 941 -> 15 0 24 540 topology 547 942 -> 16 0 24 540 topology 548 942 -> 15 0 23 540 topology 722 943 -> 16 0 23 540 topology 758 943 -> 15 0 23 540 topology 644 944 -> 16 0 23 540 topology 758 944 -> 15 0 24 540 topology 622 945 -> 16 0 24 540 topology 624 945 -> 15 0 24 540 topology 730 946 -> 16 0 24 540 topology 732 946 -> 15 0 23 540 topology 704 947 -> 16 0 23 540 topology 758 947 -> 15 0 24 540 topology 652 948 -> 16 0 24 540 topology 654 948 -> 15 0 23 540 topology 626 949 -> 16 0 23 540 topology 758 949 -> 15 0 24 540 topology 682 950 -> 16 0 24 540 topology 684 950 -> 15 0 23 540 topology 686 951 -> 16 0 23 540 topology 758 951 -> 15 0 24 540 topology 712 952 -> 16 0 24 540 topology 714 952 -> 15 0 23 540 topology 746 953 -> 16 0 23 540 topology 758 953 -> 15 0 24 540 topology 742 954 -> 16 0 24 540 topology 744 954 -> 15 0 23 540 topology 551 955 -> 16 0 23 540 topology 758 955 -> 15 0 23 540 topology 633 956 -> 16 0 23 540 topology 758 956 -> 15 0 23 540 topology 585 957 -> 16 0 23 540 topology 758 957 -> 15 0 23 540 topology 669 958 -> 16 0 23 540 topology 758 958 -> 15 0 23 540 topology 753 959 -> 16 0 23 540 topology 758 959 -> 15 0 23 540 topology 621 960 -> 16 0 23 540 topology 758 960 -> 15 0 23 540 topology 705 961 -> 16 0 23 540 topology 758 961 -> 15 0 23 540 topology 657 962 -> 16 0 23 540 topology 758 962 -> 15 0 24 540 topology 556 963 -> 16 0 24 540 topology 558 963 -> 15 0 23 540 topology 741 964 -> 16 0 23 540 topology 758 964 -> 15 0 23 540 topology 569 965 -> 16 0 23 540 topology 758 965 -> 15 0 23 540 topology 629 966 -> 16 0 23 540 topology 758 966 -> 15 0 23 540 topology 689 967 -> 16 0 23 540 topology 758 967 -> 15 0 23 540 topology 611 968 -> 16 0 23 540 topology 758 968 -> 15 0 24 540 topology 601 969 -> 16 0 24 540 topology 602 969 -> 15 0 23 540 topology 749 970 -> 16 0 23 540 topology 758 970 -> 15 0 23 540 topology 671 971 -> 16 0 23 540 topology 758 971 -> 15 0 24 540 topology 658 972 -> 16 0 24 540 topology 659 972 -> 15 0 23 540 topology 593 973 -> 16 0 23 540 topology 758 973 -> 15 0 23 540 topology 731 974 -> 16 0 23 540 topology 758 974 -> 15 0 23 540 topology 653 975 -> 16 0 23 540 topology 758 975 -> 15 0 24 540 topology 607 976 -> 16 0 24 540 topology 608 976 -> 15 0 23 540 topology 564 977 -> 16 0 23 540 topology 758 977 -> 15 0 23 540 topology 713 978 -> 16 0 23 540 topology 758 978 -> 15 0 24 540 topology 664 979 -> 16 0 24 540 topology 665 979 -> 15 0 24 540 topology 556 980 -> 16 0 24 540 topology 557 980 -> 15 0 24 540 topology 613 981 -> 16 0 24 540 topology 614 981 -> 15 0 24 540 topology 721 982 -> 16 0 24 540 topology 722 982 -> 15 0 24 540 topology 670 983 -> 16 0 24 540 topology 671 983 -> 15 0 24 540 topology 619 984 -> 16 0 24 540 topology 620 984 -> 15 0 24 540 topology 727 985 -> 16 0 24 540 topology 728 985 -> 15 0 24 540 topology 676 986 -> 16 0 24 540 topology 677 986 -> 15 0 23 540 topology 576 987 -> 16 0 23 540 topology 758 987 -> 15 0 23 540 topology 660 988 -> 16 0 23 540 topology 758 988 -> 15 0 24 540 topology 625 989 -> 16 0 24 540 topology 626 989 -> 15 0 23 540 topology 560 990 -> 16 0 23 540 topology 758 990 -> 15 0 24 540 topology 733 991 -> 16 0 24 540 topology 734 991 -> 15 0 24 540 topology 682 992 -> 16 0 24 540 topology 683 992 -> 15 0 23 540 topology 612 993 -> 16 0 23 540 topology 758 993 -> 15 0 23 540 topology 696 994 -> 16 0 23 540 topology 758 994 -> 15 0 24 540 topology 547 995 -> 16 0 24 540 topology 549 995 -> 15 0 24 540 topology 739 996 -> 16 0 24 540 topology 740 996 -> 15 0 23 540 topology 648 997 -> 16 0 23 540 topology 758 997 -> 15 0 24 540 topology 577 998 -> 16 0 24 540 topology 579 998 -> 15 0 24 760 topology 779 999 -> 16 0 24 760 topology 781 999 -> 15 0 23 760 topology 792 1000 +> 15 0 23 540 topology 567 852 +> 16 0 23 540 topology 758 852 +> 15 0 23 540 topology 566 853 +> 16 0 23 540 topology 758 853 +> 15 0 24 540 topology 757 854 +> 16 0 24 540 topology 758 854 +> 15 0 25 540 topology 568 855 +> 16 0 25 540 topology 570 855 +> 15 0 25 540 topology 568 856 +> 16 0 25 540 topology 569 856 +> 15 0 25 540 topology 571 857 +> 16 0 25 540 topology 573 857 +> 15 0 25 540 topology 571 858 +> 16 0 25 540 topology 572 858 +> 15 0 25 540 topology 574 859 +> 16 0 25 540 topology 576 859 +> 15 0 25 540 topology 574 860 +> 16 0 25 540 topology 575 860 +> 15 0 25 540 topology 577 861 +> 16 0 25 540 topology 579 861 +> 15 0 25 540 topology 577 862 +> 16 0 25 540 topology 578 862 +> 15 0 25 540 topology 580 863 +> 16 0 25 540 topology 582 863 +> 15 0 25 540 topology 580 864 +> 16 0 25 540 topology 581 864 +> 15 0 25 540 topology 583 865 +> 16 0 25 540 topology 585 865 +> 15 0 25 540 topology 583 866 +> 16 0 25 540 topology 584 866 +> 15 0 25 540 topology 586 867 +> 16 0 25 540 topology 588 867 +> 15 0 25 540 topology 586 868 +> 16 0 25 540 topology 587 868 +> 15 0 25 540 topology 589 869 +> 16 0 25 540 topology 591 869 +> 15 0 25 540 topology 589 870 +> 16 0 25 540 topology 590 870 +> 15 0 25 540 topology 592 871 +> 16 0 25 540 topology 594 871 +> 15 0 25 540 topology 592 872 +> 16 0 25 540 topology 593 872 +> 15 0 25 540 topology 595 873 +> 16 0 25 540 topology 597 873 +> 15 0 25 540 topology 595 874 +> 16 0 25 540 topology 596 874 +> 15 0 25 540 topology 541 875 +> 16 0 25 540 topology 543 875 +> 15 0 25 540 topology 541 876 +> 16 0 25 540 topology 542 876 +> 15 0 25 540 topology 598 877 +> 16 0 25 540 topology 600 877 +> 15 0 25 540 topology 598 878 +> 16 0 25 540 topology 599 878 +> 15 0 25 540 topology 601 879 +> 16 0 25 540 topology 603 879 +> 15 0 25 540 topology 601 880 +> 16 0 25 540 topology 602 880 +> 15 0 25 540 topology 604 881 +> 16 0 25 540 topology 606 881 +> 15 0 25 540 topology 604 882 +> 16 0 25 540 topology 605 882 +> 15 0 25 540 topology 607 883 +> 16 0 25 540 topology 609 883 +> 15 0 25 540 topology 607 884 +> 16 0 25 540 topology 608 884 +> 15 0 25 540 topology 610 885 +> 16 0 25 540 topology 612 885 +> 15 0 25 540 topology 610 886 +> 16 0 25 540 topology 611 886 +> 15 0 25 540 topology 613 887 +> 16 0 25 540 topology 615 887 +> 15 0 25 540 topology 613 888 +> 16 0 25 540 topology 614 888 +> 15 0 25 540 topology 616 889 +> 16 0 25 540 topology 618 889 +> 15 0 25 540 topology 616 890 +> 16 0 25 540 topology 617 890 +> 15 0 25 540 topology 619 891 +> 16 0 25 540 topology 621 891 +> 15 0 25 540 topology 619 892 +> 16 0 25 540 topology 620 892 +> 15 0 25 540 topology 622 893 +> 16 0 25 540 topology 624 893 +> 15 0 25 540 topology 622 894 +> 16 0 25 540 topology 623 894 +> 15 0 25 540 topology 625 895 +> 16 0 25 540 topology 627 895 +> 15 0 25 540 topology 625 896 +> 16 0 25 540 topology 626 896 +> 15 0 25 540 topology 544 897 +> 16 0 25 540 topology 546 897 +> 15 0 25 540 topology 544 898 +> 16 0 25 540 topology 545 898 +> 15 0 25 540 topology 628 899 +> 16 0 25 540 topology 630 899 +> 15 0 25 540 topology 628 900 +> 16 0 25 540 topology 629 900 +> 15 0 25 540 topology 631 901 +> 16 0 25 540 topology 633 901 +> 15 0 25 540 topology 631 902 +> 16 0 25 540 topology 632 902 +> 15 0 25 540 topology 634 903 +> 16 0 25 540 topology 636 903 +> 15 0 25 540 topology 634 904 +> 16 0 25 540 topology 635 904 +> 15 0 25 540 topology 637 905 +> 16 0 25 540 topology 639 905 +> 15 0 25 540 topology 637 906 +> 16 0 25 540 topology 638 906 +> 15 0 25 540 topology 640 907 +> 16 0 25 540 topology 642 907 +> 15 0 25 540 topology 640 908 +> 16 0 25 540 topology 641 908 +> 15 0 25 540 topology 643 909 +> 16 0 25 540 topology 645 909 +> 15 0 25 540 topology 643 910 +> 16 0 25 540 topology 644 910 +> 15 0 25 540 topology 646 911 +> 16 0 25 540 topology 648 911 +> 15 0 25 540 topology 646 912 +> 16 0 25 540 topology 647 912 +> 15 0 25 540 topology 649 913 +> 16 0 25 540 topology 651 913 +> 15 0 25 540 topology 649 914 +> 16 0 25 540 topology 650 914 +> 15 0 25 540 topology 652 915 +> 16 0 25 540 topology 654 915 +> 15 0 25 540 topology 652 916 +> 16 0 25 540 topology 653 916 +> 15 0 25 540 topology 655 917 +> 16 0 25 540 topology 657 917 +> 15 0 25 540 topology 655 918 +> 16 0 25 540 topology 656 918 +> 15 0 25 540 topology 547 919 +> 16 0 25 540 topology 549 919 +> 15 0 25 540 topology 547 920 +> 16 0 25 540 topology 548 920 +> 15 0 25 540 topology 658 921 +> 16 0 25 540 topology 660 921 +> 15 0 25 540 topology 658 922 +> 16 0 25 540 topology 659 922 +> 15 0 25 540 topology 661 923 +> 16 0 25 540 topology 663 923 +> 15 0 25 540 topology 661 924 +> 16 0 25 540 topology 662 924 +> 15 0 25 540 topology 664 925 +> 16 0 25 540 topology 666 925 +> 15 0 25 540 topology 664 926 +> 16 0 25 540 topology 665 926 +> 15 0 25 540 topology 667 927 +> 16 0 25 540 topology 669 927 +> 15 0 25 540 topology 667 928 +> 16 0 25 540 topology 668 928 +> 15 0 25 540 topology 670 929 +> 16 0 25 540 topology 672 929 +> 15 0 25 540 topology 670 930 +> 16 0 25 540 topology 671 930 +> 15 0 25 540 topology 673 931 +> 16 0 25 540 topology 675 931 +> 15 0 25 540 topology 673 932 +> 16 0 25 540 topology 674 932 +> 15 0 25 540 topology 676 933 +> 16 0 25 540 topology 678 933 +> 15 0 25 540 topology 676 934 +> 16 0 25 540 topology 677 934 +> 15 0 25 540 topology 679 935 +> 16 0 25 540 topology 681 935 +> 15 0 25 540 topology 679 936 +> 16 0 25 540 topology 680 936 +> 15 0 25 540 topology 682 937 +> 16 0 25 540 topology 684 937 +> 15 0 25 540 topology 682 938 +> 16 0 25 540 topology 683 938 +> 15 0 25 540 topology 685 939 +> 16 0 25 540 topology 687 939 +> 15 0 25 540 topology 685 940 +> 16 0 25 540 topology 686 940 +> 15 0 25 540 topology 550 941 +> 16 0 25 540 topology 552 941 +> 15 0 25 540 topology 550 942 +> 16 0 25 540 topology 551 942 +> 15 0 25 540 topology 688 943 +> 16 0 25 540 topology 690 943 +> 15 0 25 540 topology 688 944 +> 16 0 25 540 topology 689 944 +> 15 0 25 540 topology 691 945 +> 16 0 25 540 topology 693 945 +> 15 0 25 540 topology 691 946 +> 16 0 25 540 topology 692 946 +> 15 0 25 540 topology 694 947 +> 16 0 25 540 topology 696 947 +> 15 0 25 540 topology 694 948 +> 16 0 25 540 topology 695 948 +> 15 0 25 540 topology 697 949 +> 16 0 25 540 topology 699 949 +> 15 0 25 540 topology 697 950 +> 16 0 25 540 topology 698 950 +> 15 0 25 540 topology 700 951 +> 16 0 25 540 topology 702 951 +> 15 0 25 540 topology 700 952 +> 16 0 25 540 topology 701 952 +> 15 0 25 540 topology 703 953 +> 16 0 25 540 topology 705 953 +> 15 0 25 540 topology 703 954 +> 16 0 25 540 topology 704 954 +> 15 0 25 540 topology 706 955 +> 16 0 25 540 topology 708 955 +> 15 0 25 540 topology 706 956 +> 16 0 25 540 topology 707 956 +> 15 0 25 540 topology 709 957 +> 16 0 25 540 topology 711 957 +> 15 0 25 540 topology 709 958 +> 16 0 25 540 topology 710 958 +> 15 0 25 540 topology 712 959 +> 16 0 25 540 topology 714 959 +> 15 0 25 540 topology 712 960 +> 16 0 25 540 topology 713 960 +> 15 0 25 540 topology 715 961 +> 16 0 25 540 topology 717 961 +> 15 0 25 540 topology 715 962 +> 16 0 25 540 topology 716 962 +> 15 0 25 540 topology 553 963 +> 16 0 25 540 topology 555 963 +> 15 0 25 540 topology 553 964 +> 16 0 25 540 topology 554 964 +> 15 0 25 540 topology 718 965 +> 16 0 25 540 topology 720 965 +> 15 0 25 540 topology 718 966 +> 16 0 25 540 topology 719 966 +> 15 0 25 540 topology 721 967 +> 16 0 25 540 topology 723 967 +> 15 0 25 540 topology 721 968 +> 16 0 25 540 topology 722 968 +> 15 0 25 540 topology 724 969 +> 16 0 25 540 topology 726 969 +> 15 0 25 540 topology 724 970 +> 16 0 25 540 topology 725 970 +> 15 0 25 540 topology 727 971 +> 16 0 25 540 topology 729 971 +> 15 0 25 540 topology 727 972 +> 16 0 25 540 topology 728 972 +> 15 0 25 540 topology 730 973 +> 16 0 25 540 topology 732 973 +> 15 0 25 540 topology 730 974 +> 16 0 25 540 topology 731 974 +> 15 0 25 540 topology 733 975 +> 16 0 25 540 topology 735 975 +> 15 0 25 540 topology 733 976 +> 16 0 25 540 topology 734 976 +> 15 0 25 540 topology 736 977 +> 16 0 25 540 topology 738 977 +> 15 0 25 540 topology 736 978 +> 16 0 25 540 topology 737 978 +> 15 0 25 540 topology 739 979 +> 16 0 25 540 topology 741 979 +> 15 0 25 540 topology 739 980 +> 16 0 25 540 topology 740 980 +> 15 0 25 540 topology 742 981 +> 16 0 25 540 topology 744 981 +> 15 0 25 540 topology 742 982 +> 16 0 25 540 topology 743 982 +> 15 0 25 540 topology 745 983 +> 16 0 25 540 topology 747 983 +> 15 0 25 540 topology 745 984 +> 16 0 25 540 topology 746 984 +> 15 0 25 540 topology 556 985 +> 16 0 25 540 topology 558 985 +> 15 0 25 540 topology 556 986 +> 16 0 25 540 topology 557 986 +> 15 0 25 540 topology 748 987 +> 16 0 25 540 topology 750 987 +> 15 0 25 540 topology 748 988 +> 16 0 25 540 topology 749 988 +> 15 0 25 540 topology 751 989 +> 16 0 25 540 topology 753 989 +> 15 0 25 540 topology 751 990 +> 16 0 25 540 topology 752 990 +> 15 0 25 540 topology 754 991 +> 16 0 25 540 topology 756 991 +> 15 0 25 540 topology 754 992 +> 16 0 25 540 topology 755 992 +> 15 0 25 540 topology 559 993 +> 16 0 25 540 topology 561 993 +> 15 0 25 540 topology 559 994 +> 16 0 25 540 topology 560 994 +> 15 0 25 540 topology 562 995 +> 16 0 25 540 topology 564 995 +> 15 0 25 540 topology 562 996 +> 16 0 25 540 topology 563 996 +> 15 0 25 540 topology 565 997 +> 16 0 25 540 topology 567 997 +> 15 0 25 540 topology 565 998 +> 16 0 25 540 topology 566 998 +> 15 0 23 760 topology 790 999 +> 16 0 23 760 topology 864 999 +> 15 0 23 760 topology 789 1000 > 16 0 23 760 topology 864 1000 -> 15 0 24 760 topology 806 1001 -> 16 0 24 760 topology 808 1001 -> 15 0 24 760 topology 860 1002 -> 16 0 24 760 topology 862 1002 -> 15 0 23 760 topology 822 1003 +> 15 0 23 760 topology 793 1001 +> 16 0 23 760 topology 864 1001 +> 15 0 23 760 topology 792 1002 +> 16 0 23 760 topology 864 1002 +> 15 0 23 760 topology 796 1003 > 16 0 23 760 topology 864 1003 -> 15 0 24 760 topology 809 1004 -> 16 0 24 760 topology 811 1004 -> 15 0 23 760 topology 852 1005 +> 15 0 23 760 topology 795 1004 +> 16 0 23 760 topology 864 1004 +> 15 0 23 760 topology 799 1005 > 16 0 23 760 topology 864 1005 -> 15 0 23 760 topology 769 1006 +> 15 0 23 760 topology 798 1006 > 16 0 23 760 topology 864 1006 -> 15 0 23 760 topology 804 1007 +> 15 0 23 760 topology 802 1007 > 16 0 23 760 topology 864 1007 -> 15 0 24 760 topology 812 1008 -> 16 0 24 760 topology 814 1008 -> 15 0 24 760 topology 767 1009 -> 16 0 24 760 topology 768 1009 -> 15 0 23 760 topology 834 1010 +> 15 0 23 760 topology 801 1008 +> 16 0 23 760 topology 864 1008 +> 15 0 23 760 topology 805 1009 +> 16 0 23 760 topology 864 1009 +> 15 0 23 760 topology 804 1010 > 16 0 23 760 topology 864 1010 -> 15 0 24 760 topology 815 1011 -> 16 0 24 760 topology 817 1011 -> 15 0 23 760 topology 781 1012 +> 15 0 23 760 topology 808 1011 +> 16 0 23 760 topology 864 1011 +> 15 0 23 760 topology 807 1012 > 16 0 23 760 topology 864 1012 -> 15 0 23 760 topology 816 1013 +> 15 0 23 760 topology 811 1013 > 16 0 23 760 topology 864 1013 -> 15 0 23 760 topology 846 1014 +> 15 0 23 760 topology 810 1014 > 16 0 23 760 topology 864 1014 -> 15 0 24 760 topology 779 1015 -> 16 0 24 760 topology 780 1015 -> 15 0 25 760 topology 863 1016 -> 16 0 25 760 topology 864 1016 -> 15 0 23 760 topology 771 1017 +> 15 0 23 760 topology 814 1015 +> 16 0 23 760 topology 864 1015 +> 15 0 23 760 topology 813 1016 +> 16 0 23 760 topology 864 1016 +> 15 0 23 760 topology 817 1017 > 16 0 23 760 topology 864 1017 -> 15 0 23 760 topology 793 1018 +> 15 0 23 760 topology 816 1018 > 16 0 23 760 topology 864 1018 -> 15 0 23 760 topology 853 1019 +> 15 0 23 760 topology 763 1019 > 16 0 23 760 topology 864 1019 -> 15 0 24 760 topology 764 1020 -> 16 0 24 760 topology 766 1020 -> 15 0 23 760 topology 783 1021 +> 15 0 23 760 topology 762 1020 +> 16 0 23 760 topology 864 1020 +> 15 0 23 760 topology 820 1021 > 16 0 23 760 topology 864 1021 -> 15 0 23 760 topology 829 1022 +> 15 0 23 760 topology 819 1022 > 16 0 23 760 topology 864 1022 -> 15 0 23 760 topology 805 1023 +> 15 0 23 760 topology 823 1023 > 16 0 23 760 topology 864 1023 -> 15 0 23 760 topology 841 1024 +> 15 0 23 760 topology 822 1024 > 16 0 23 760 topology 864 1024 -> 15 0 23 760 topology 817 1025 +> 15 0 23 760 topology 826 1025 > 16 0 23 760 topology 864 1025 -> 15 0 24 760 topology 776 1026 -> 16 0 24 760 topology 778 1026 -> 15 0 23 760 topology 789 1027 +> 15 0 23 760 topology 825 1026 +> 16 0 23 760 topology 864 1026 +> 15 0 23 760 topology 829 1027 > 16 0 23 760 topology 864 1027 -> 15 0 23 760 topology 819 1028 +> 15 0 23 760 topology 828 1028 > 16 0 23 760 topology 864 1028 -> 15 0 24 760 topology 788 1029 -> 16 0 24 760 topology 789 1029 -> 15 0 23 760 topology 849 1030 +> 15 0 23 760 topology 832 1029 +> 16 0 23 760 topology 864 1029 +> 15 0 23 760 topology 831 1030 > 16 0 23 760 topology 864 1030 -> 15 0 23 760 topology 801 1031 +> 15 0 23 760 topology 835 1031 > 16 0 23 760 topology 864 1031 -> 15 0 24 760 topology 818 1032 -> 16 0 24 760 topology 819 1032 -> 15 0 23 760 topology 831 1033 +> 15 0 23 760 topology 834 1032 +> 16 0 23 760 topology 864 1032 +> 15 0 23 760 topology 838 1033 > 16 0 23 760 topology 864 1033 -> 15 0 23 760 topology 772 1034 +> 15 0 23 760 topology 837 1034 > 16 0 23 760 topology 864 1034 -> 15 0 24 760 topology 794 1035 -> 16 0 24 760 topology 795 1035 -> 15 0 24 760 topology 848 1036 -> 16 0 24 760 topology 849 1036 -> 15 0 23 760 topology 861 1037 +> 15 0 23 760 topology 841 1035 +> 16 0 23 760 topology 864 1035 +> 15 0 23 760 topology 840 1036 +> 16 0 23 760 topology 864 1036 +> 15 0 23 760 topology 844 1037 > 16 0 23 760 topology 864 1037 -> 15 0 24 760 topology 770 1038 -> 16 0 24 760 topology 771 1038 -> 15 0 23 760 topology 813 1039 +> 15 0 23 760 topology 843 1038 +> 16 0 23 760 topology 864 1038 +> 15 0 23 760 topology 847 1039 > 16 0 23 760 topology 864 1039 -> 15 0 24 760 topology 824 1040 -> 16 0 24 760 topology 825 1040 -> 15 0 23 760 topology 843 1041 +> 15 0 23 760 topology 846 1040 +> 16 0 23 760 topology 864 1040 +> 15 0 23 760 topology 766 1041 > 16 0 23 760 topology 864 1041 -> 15 0 23 760 topology 784 1042 +> 15 0 23 760 topology 765 1042 > 16 0 23 760 topology 864 1042 -> 15 0 24 760 topology 800 1043 -> 16 0 24 760 topology 801 1043 -> 15 0 24 760 topology 854 1044 -> 16 0 24 760 topology 855 1044 -> 15 0 24 760 topology 830 1045 -> 16 0 24 760 topology 831 1045 -> 15 0 24 760 topology 806 1046 -> 16 0 24 760 topology 807 1046 -> 15 0 24 760 topology 860 1047 -> 16 0 24 760 topology 861 1047 -> 15 0 24 760 topology 782 1048 -> 16 0 24 760 topology 783 1048 -> 15 0 24 760 topology 836 1049 -> 16 0 24 760 topology 837 1049 -> 15 0 23 760 topology 768 1050 +> 15 0 23 760 topology 850 1043 +> 16 0 23 760 topology 864 1043 +> 15 0 23 760 topology 849 1044 +> 16 0 23 760 topology 864 1044 +> 15 0 23 760 topology 853 1045 +> 16 0 23 760 topology 864 1045 +> 15 0 23 760 topology 852 1046 +> 16 0 23 760 topology 864 1046 +> 15 0 23 760 topology 856 1047 +> 16 0 23 760 topology 864 1047 +> 15 0 23 760 topology 855 1048 +> 16 0 23 760 topology 864 1048 +> 15 0 23 760 topology 859 1049 +> 16 0 23 760 topology 864 1049 +> 15 0 23 760 topology 858 1050 > 16 0 23 760 topology 864 1050 -> 15 0 24 760 topology 812 1051 -> 16 0 24 760 topology 813 1051 -> 15 0 23 760 topology 820 1052 +> 15 0 23 760 topology 862 1051 +> 16 0 23 760 topology 864 1051 +> 15 0 23 760 topology 861 1052 > 16 0 23 760 topology 864 1052 -> 15 0 24 760 topology 842 1053 -> 16 0 24 760 topology 843 1053 -> 15 0 24 760 topology 761 1054 -> 16 0 24 760 topology 763 1054 -> 15 0 23 760 topology 796 1055 +> 15 0 23 760 topology 769 1053 +> 16 0 23 760 topology 864 1053 +> 15 0 23 760 topology 768 1054 +> 16 0 23 760 topology 864 1054 +> 15 0 23 760 topology 772 1055 > 16 0 23 760 topology 864 1055 -> 15 0 23 760 topology 780 1056 +> 15 0 23 760 topology 771 1056 > 16 0 23 760 topology 864 1056 -> 15 0 24 760 topology 818 1057 -> 16 0 24 760 topology 820 1057 -> 15 0 23 760 topology 856 1058 +> 15 0 23 760 topology 775 1057 +> 16 0 23 760 topology 864 1057 +> 15 0 23 760 topology 774 1058 > 16 0 23 760 topology 864 1058 -> 15 0 23 760 topology 832 1059 +> 15 0 23 760 topology 778 1059 > 16 0 23 760 topology 864 1059 -> 15 0 23 760 topology 808 1060 +> 15 0 23 760 topology 777 1060 > 16 0 23 760 topology 864 1060 -> 15 0 24 760 topology 821 1061 -> 16 0 24 760 topology 823 1061 -> 15 0 24 760 topology 824 1062 -> 16 0 24 760 topology 826 1062 -> 15 0 23 760 topology 844 1063 +> 15 0 23 760 topology 781 1061 +> 16 0 23 760 topology 864 1061 +> 15 0 23 760 topology 780 1062 +> 16 0 23 760 topology 864 1062 +> 15 0 23 760 topology 784 1063 > 16 0 23 760 topology 864 1063 -> 15 0 24 760 topology 773 1064 -> 16 0 24 760 topology 775 1064 -> 15 0 24 760 topology 827 1065 -> 16 0 24 760 topology 829 1065 -> 15 0 24 760 topology 830 1066 -> 16 0 24 760 topology 832 1066 -> 15 0 24 760 topology 833 1067 -> 16 0 24 760 topology 835 1067 -> 15 0 24 760 topology 761 1068 -> 16 0 24 760 topology 762 1068 -> 15 0 23 760 topology 763 1069 -> 16 0 23 760 topology 864 1069 -> 15 0 23 760 topology 798 1070 -> 16 0 23 760 topology 864 1070 -> 15 0 24 760 topology 836 1071 -> 16 0 24 760 topology 838 1071 -> 15 0 23 760 topology 828 1072 -> 16 0 23 760 topology 864 1072 -> 15 0 24 760 topology 785 1073 -> 16 0 24 760 topology 787 1073 -> 15 0 24 760 topology 839 1074 -> 16 0 24 760 topology 841 1074 -> 15 0 23 760 topology 858 1075 -> 16 0 23 760 topology 864 1075 -> 15 0 23 760 topology 775 1076 -> 16 0 23 760 topology 864 1076 -> 15 0 23 760 topology 810 1077 -> 16 0 23 760 topology 864 1077 -> 15 0 24 760 topology 842 1078 -> 16 0 24 760 topology 844 1078 -> 15 0 23 760 topology 840 1079 -> 16 0 23 760 topology 864 1079 -> 15 0 24 760 topology 845 1080 -> 16 0 24 760 topology 847 1080 -> 15 0 24 760 topology 773 1081 -> 16 0 24 760 topology 774 1081 -> 15 0 23 760 topology 787 1082 -> 16 0 23 760 topology 864 1082 -> 15 0 23 760 topology 765 1083 -> 16 0 23 760 topology 864 1083 -> 15 0 24 760 topology 785 1084 -> 16 0 24 760 topology 786 1084 -> 15 0 23 760 topology 777 1085 -> 16 0 23 760 topology 864 1085 -> 15 0 23 760 topology 823 1086 -> 16 0 23 760 topology 864 1086 -> 15 0 23 760 topology 799 1087 -> 16 0 23 760 topology 864 1087 -> 15 0 23 760 topology 859 1088 -> 16 0 23 760 topology 864 1088 -> 15 0 23 760 topology 835 1089 -> 16 0 23 760 topology 864 1089 -> 15 0 23 760 topology 811 1090 -> 16 0 23 760 topology 864 1090 -> 15 0 24 760 topology 770 1091 -> 16 0 24 760 topology 772 1091 -> 15 0 23 760 topology 847 1092 -> 16 0 23 760 topology 864 1092 -> 15 0 23 760 topology 795 1093 -> 16 0 23 760 topology 864 1093 -> 15 0 24 760 topology 782 1094 -> 16 0 24 760 topology 784 1094 -> 15 0 23 760 topology 825 1095 -> 16 0 23 760 topology 864 1095 -> 15 0 24 760 topology 764 1096 -> 16 0 24 760 topology 765 1096 -> 15 0 23 760 topology 766 1097 -> 16 0 23 760 topology 864 1097 -> 15 0 24 760 topology 791 1098 -> 16 0 24 760 topology 792 1098 -> 15 0 23 760 topology 855 1099 -> 16 0 23 760 topology 864 1099 -> 15 0 23 760 topology 807 1100 -> 16 0 23 760 topology 864 1100 -> 15 0 24 760 topology 821 1101 -> 16 0 24 760 topology 822 1101 -> 15 0 23 760 topology 837 1102 -> 16 0 23 760 topology 864 1102 -> 15 0 23 760 topology 778 1103 -> 16 0 23 760 topology 864 1103 -> 15 0 24 760 topology 797 1104 -> 16 0 24 760 topology 798 1104 -> 15 0 24 760 topology 851 1105 -> 16 0 24 760 topology 852 1105 -> 15 0 24 760 topology 827 1106 -> 16 0 24 760 topology 828 1106 -> 15 0 24 760 topology 776 1107 -> 16 0 24 760 topology 777 1107 -> 15 0 24 760 topology 803 1108 -> 16 0 24 760 topology 804 1108 -> 15 0 24 760 topology 857 1109 -> 16 0 24 760 topology 858 1109 -> 15 0 24 760 topology 833 1110 -> 16 0 24 760 topology 834 1110 -> 15 0 23 760 topology 762 1111 -> 16 0 23 760 topology 864 1111 -> 15 0 24 760 topology 809 1112 -> 16 0 24 760 topology 810 1112 -> 15 0 24 760 topology 839 1113 -> 16 0 24 760 topology 840 1113 -> 15 0 23 760 topology 790 1114 -> 16 0 23 760 topology 864 1114 -> 15 0 23 760 topology 774 1115 -> 16 0 23 760 topology 864 1115 -> 15 0 24 760 topology 815 1116 -> 16 0 24 760 topology 816 1116 -> 15 0 24 760 topology 788 1117 -> 16 0 24 760 topology 790 1117 -> 15 0 23 760 topology 850 1118 -> 16 0 23 760 topology 864 1118 -> 15 0 23 760 topology 826 1119 -> 16 0 23 760 topology 864 1119 -> 15 0 24 760 topology 845 1120 -> 16 0 24 760 topology 846 1120 -> 15 0 24 760 topology 791 1121 -> 16 0 24 760 topology 793 1121 -> 15 0 23 760 topology 802 1122 -> 16 0 23 760 topology 864 1122 -> 15 0 23 760 topology 786 1123 -> 16 0 23 760 topology 864 1123 -> 15 0 24 760 topology 767 1124 -> 16 0 24 760 topology 769 1124 -> 15 0 24 760 topology 794 1125 -> 16 0 24 760 topology 796 1125 -> 15 0 24 760 topology 848 1126 -> 16 0 24 760 topology 850 1126 -> 15 0 23 760 topology 862 1127 -> 16 0 23 760 topology 864 1127 -> 15 0 23 760 topology 838 1128 -> 16 0 23 760 topology 864 1128 -> 15 0 24 760 topology 797 1129 -> 16 0 24 760 topology 799 1129 -> 15 0 23 760 topology 814 1130 -> 16 0 23 760 topology 864 1130 -> 15 0 24 760 topology 851 1131 -> 16 0 24 760 topology 853 1131 -> 15 0 24 760 topology 800 1132 -> 16 0 24 760 topology 802 1132 -> 15 0 24 760 topology 854 1133 -> 16 0 24 760 topology 856 1133 -> 15 0 24 760 topology 803 1134 -> 16 0 24 760 topology 805 1134 -> 15 0 24 760 topology 857 1135 -> 16 0 24 760 topology 859 1135 -> 15 0 26 499 topology 865 1136 -> 16 0 26 499 topology 867 1136 -> 15 0 26 499 topology 759 1137 -> 16 0 26 499 topology 867 1137 +> 15 0 23 760 topology 783 1064 +> 16 0 23 760 topology 864 1064 +> 15 0 23 760 topology 787 1065 +> 16 0 23 760 topology 864 1065 +> 15 0 23 760 topology 786 1066 +> 16 0 23 760 topology 864 1066 +> 15 0 24 760 topology 863 1067 +> 16 0 24 760 topology 864 1067 +> 15 0 25 760 topology 788 1068 +> 16 0 25 760 topology 790 1068 +> 15 0 25 760 topology 788 1069 +> 16 0 25 760 topology 789 1069 +> 15 0 25 760 topology 791 1070 +> 16 0 25 760 topology 793 1070 +> 15 0 25 760 topology 791 1071 +> 16 0 25 760 topology 792 1071 +> 15 0 25 760 topology 794 1072 +> 16 0 25 760 topology 796 1072 +> 15 0 25 760 topology 794 1073 +> 16 0 25 760 topology 795 1073 +> 15 0 25 760 topology 797 1074 +> 16 0 25 760 topology 799 1074 +> 15 0 25 760 topology 797 1075 +> 16 0 25 760 topology 798 1075 +> 15 0 25 760 topology 800 1076 +> 16 0 25 760 topology 802 1076 +> 15 0 25 760 topology 800 1077 +> 16 0 25 760 topology 801 1077 +> 15 0 25 760 topology 803 1078 +> 16 0 25 760 topology 805 1078 +> 15 0 25 760 topology 803 1079 +> 16 0 25 760 topology 804 1079 +> 15 0 25 760 topology 806 1080 +> 16 0 25 760 topology 808 1080 +> 15 0 25 760 topology 806 1081 +> 16 0 25 760 topology 807 1081 +> 15 0 25 760 topology 809 1082 +> 16 0 25 760 topology 811 1082 +> 15 0 25 760 topology 809 1083 +> 16 0 25 760 topology 810 1083 +> 15 0 25 760 topology 812 1084 +> 16 0 25 760 topology 814 1084 +> 15 0 25 760 topology 812 1085 +> 16 0 25 760 topology 813 1085 +> 15 0 25 760 topology 815 1086 +> 16 0 25 760 topology 817 1086 +> 15 0 25 760 topology 815 1087 +> 16 0 25 760 topology 816 1087 +> 15 0 25 760 topology 761 1088 +> 16 0 25 760 topology 763 1088 +> 15 0 25 760 topology 761 1089 +> 16 0 25 760 topology 762 1089 +> 15 0 25 760 topology 818 1090 +> 16 0 25 760 topology 820 1090 +> 15 0 25 760 topology 818 1091 +> 16 0 25 760 topology 819 1091 +> 15 0 25 760 topology 821 1092 +> 16 0 25 760 topology 823 1092 +> 15 0 25 760 topology 821 1093 +> 16 0 25 760 topology 822 1093 +> 15 0 25 760 topology 824 1094 +> 16 0 25 760 topology 826 1094 +> 15 0 25 760 topology 824 1095 +> 16 0 25 760 topology 825 1095 +> 15 0 25 760 topology 827 1096 +> 16 0 25 760 topology 829 1096 +> 15 0 25 760 topology 827 1097 +> 16 0 25 760 topology 828 1097 +> 15 0 25 760 topology 830 1098 +> 16 0 25 760 topology 832 1098 +> 15 0 25 760 topology 830 1099 +> 16 0 25 760 topology 831 1099 +> 15 0 25 760 topology 833 1100 +> 16 0 25 760 topology 835 1100 +> 15 0 25 760 topology 833 1101 +> 16 0 25 760 topology 834 1101 +> 15 0 25 760 topology 836 1102 +> 16 0 25 760 topology 838 1102 +> 15 0 25 760 topology 836 1103 +> 16 0 25 760 topology 837 1103 +> 15 0 25 760 topology 839 1104 +> 16 0 25 760 topology 841 1104 +> 15 0 25 760 topology 839 1105 +> 16 0 25 760 topology 840 1105 +> 15 0 25 760 topology 842 1106 +> 16 0 25 760 topology 844 1106 +> 15 0 25 760 topology 842 1107 +> 16 0 25 760 topology 843 1107 +> 15 0 25 760 topology 845 1108 +> 16 0 25 760 topology 847 1108 +> 15 0 25 760 topology 845 1109 +> 16 0 25 760 topology 846 1109 +> 15 0 25 760 topology 764 1110 +> 16 0 25 760 topology 766 1110 +> 15 0 25 760 topology 764 1111 +> 16 0 25 760 topology 765 1111 +> 15 0 25 760 topology 848 1112 +> 16 0 25 760 topology 850 1112 +> 15 0 25 760 topology 848 1113 +> 16 0 25 760 topology 849 1113 +> 15 0 25 760 topology 851 1114 +> 16 0 25 760 topology 853 1114 +> 15 0 25 760 topology 851 1115 +> 16 0 25 760 topology 852 1115 +> 15 0 25 760 topology 854 1116 +> 16 0 25 760 topology 856 1116 +> 15 0 25 760 topology 854 1117 +> 16 0 25 760 topology 855 1117 +> 15 0 25 760 topology 857 1118 +> 16 0 25 760 topology 859 1118 +> 15 0 25 760 topology 857 1119 +> 16 0 25 760 topology 858 1119 +> 15 0 25 760 topology 860 1120 +> 16 0 25 760 topology 862 1120 +> 15 0 25 760 topology 860 1121 +> 16 0 25 760 topology 861 1121 +> 15 0 25 760 topology 767 1122 +> 16 0 25 760 topology 769 1122 +> 15 0 25 760 topology 767 1123 +> 16 0 25 760 topology 768 1123 +> 15 0 25 760 topology 770 1124 +> 16 0 25 760 topology 772 1124 +> 15 0 25 760 topology 770 1125 +> 16 0 25 760 topology 771 1125 +> 15 0 25 760 topology 773 1126 +> 16 0 25 760 topology 775 1126 +> 15 0 25 760 topology 773 1127 +> 16 0 25 760 topology 774 1127 +> 15 0 25 760 topology 776 1128 +> 16 0 25 760 topology 778 1128 +> 15 0 25 760 topology 776 1129 +> 16 0 25 760 topology 777 1129 +> 15 0 25 760 topology 779 1130 +> 16 0 25 760 topology 781 1130 +> 15 0 25 760 topology 779 1131 +> 16 0 25 760 topology 780 1131 +> 15 0 25 760 topology 782 1132 +> 16 0 25 760 topology 784 1132 +> 15 0 25 760 topology 782 1133 +> 16 0 25 760 topology 783 1133 +> 15 0 25 760 topology 785 1134 +> 16 0 25 760 topology 787 1134 +> 15 0 25 760 topology 785 1135 +> 16 0 25 760 topology 786 1135 +> 15 0 26 499 topology 759 1136 +> 16 0 26 499 topology 757 1136 +> 15 0 26 499 topology 865 1137 +> 16 0 26 499 topology 863 1137 > 15 0 26 499 topology 539 1138 > 16 0 26 499 topology 867 1138 -> 15 0 27 499 topology 537 1139 -> 16 0 27 499 topology 539 1139 -> 15 0 21 499 topology 759 1140 -> 16 0 21 499 topology 865 1140 -> 15 0 21 499 topology 539 1141 -> 16 0 21 499 topology 865 1141 -> 15 0 26 499 topology 865 1142 -> 16 0 26 499 topology 863 1142 -> 15 0 21 499 topology 539 1143 -> 16 0 21 499 topology 759 1143 -> 15 0 26 499 topology 759 1144 -> 16 0 26 499 topology 757 1144 -> 15 0 24 870 topology 874 1145 -> 16 0 24 870 topology 875 1145 -> 15 0 24 870 topology 901 1146 -> 16 0 24 870 topology 902 1146 -> 15 0 23 870 topology 891 1147 +> 15 0 26 499 topology 759 1139 +> 16 0 26 499 topology 867 1139 +> 15 0 26 499 topology 865 1140 +> 16 0 26 499 topology 867 1140 +> 15 0 27 499 topology 537 1141 +> 16 0 27 499 topology 539 1141 +> 15 0 20 499 topology 539 1142 +> 16 0 20 499 topology 759 1142 +> 15 0 20 499 topology 539 1143 +> 16 0 20 499 topology 865 1143 +> 15 0 20 499 topology 759 1144 +> 16 0 20 499 topology 865 1144 +> 15 0 23 870 topology 900 1145 +> 16 0 23 870 topology 950 1145 +> 15 0 23 870 topology 899 1146 +> 16 0 23 870 topology 950 1146 +> 15 0 23 870 topology 903 1147 > 16 0 23 870 topology 950 1147 -> 15 0 24 870 topology 895 1148 -> 16 0 24 870 topology 897 1148 -> 15 0 23 870 topology 926 1149 +> 15 0 23 870 topology 902 1148 +> 16 0 23 870 topology 950 1148 +> 15 0 23 870 topology 906 1149 > 16 0 23 870 topology 950 1149 -> 15 0 24 870 topology 904 1150 -> 16 0 24 870 topology 905 1150 -> 15 0 24 870 topology 925 1151 -> 16 0 24 870 topology 927 1151 -> 15 0 24 870 topology 907 1152 -> 16 0 24 870 topology 908 1152 -> 15 0 24 870 topology 910 1153 -> 16 0 24 870 topology 911 1153 -> 15 0 25 870 topology 949 1154 -> 16 0 25 870 topology 950 1154 -> 15 0 24 870 topology 886 1155 -> 16 0 24 870 topology 887 1155 -> 15 0 24 870 topology 913 1156 -> 16 0 24 870 topology 914 1156 -> 15 0 24 870 topology 916 1157 -> 16 0 24 870 topology 917 1157 -> 15 0 23 870 topology 881 1158 +> 15 0 23 870 topology 905 1150 +> 16 0 23 870 topology 950 1150 +> 15 0 23 870 topology 909 1151 +> 16 0 23 870 topology 950 1151 +> 15 0 23 870 topology 908 1152 +> 16 0 23 870 topology 950 1152 +> 15 0 23 870 topology 912 1153 +> 16 0 23 870 topology 950 1153 +> 15 0 23 870 topology 911 1154 +> 16 0 23 870 topology 950 1154 +> 15 0 23 870 topology 915 1155 +> 16 0 23 870 topology 950 1155 +> 15 0 23 870 topology 914 1156 +> 16 0 23 870 topology 950 1156 +> 15 0 23 870 topology 918 1157 +> 16 0 23 870 topology 950 1157 +> 15 0 23 870 topology 917 1158 > 16 0 23 870 topology 950 1158 -> 15 0 23 870 topology 903 1159 +> 15 0 23 870 topology 921 1159 > 16 0 23 870 topology 950 1159 -> 15 0 24 870 topology 919 1160 -> 16 0 24 870 topology 920 1160 -> 15 0 24 870 topology 922 1161 -> 16 0 24 870 topology 923 1161 -> 15 0 23 870 topology 893 1162 +> 15 0 23 870 topology 920 1160 +> 16 0 23 870 topology 950 1160 +> 15 0 23 870 topology 924 1161 +> 16 0 23 870 topology 950 1161 +> 15 0 23 870 topology 923 1162 > 16 0 23 870 topology 950 1162 -> 15 0 23 870 topology 939 1163 +> 15 0 23 870 topology 927 1163 > 16 0 23 870 topology 950 1163 -> 15 0 23 870 topology 915 1164 +> 15 0 23 870 topology 926 1164 > 16 0 23 870 topology 950 1164 -> 15 0 24 870 topology 925 1165 -> 16 0 24 870 topology 926 1165 -> 15 0 24 870 topology 874 1166 -> 16 0 24 870 topology 876 1166 -> 15 0 23 870 topology 927 1167 +> 15 0 23 870 topology 873 1165 +> 16 0 23 870 topology 950 1165 +> 15 0 23 870 topology 872 1166 +> 16 0 23 870 topology 950 1166 +> 15 0 23 870 topology 930 1167 > 16 0 23 870 topology 950 1167 -> 15 0 23 870 topology 899 1168 +> 15 0 23 870 topology 929 1168 > 16 0 23 870 topology 950 1168 -> 15 0 23 870 topology 929 1169 +> 15 0 23 870 topology 933 1169 > 16 0 23 870 topology 950 1169 -> 15 0 24 870 topology 886 1170 -> 16 0 24 870 topology 888 1170 -> 15 0 23 870 topology 911 1171 +> 15 0 23 870 topology 932 1170 +> 16 0 23 870 topology 950 1170 +> 15 0 23 870 topology 936 1171 > 16 0 23 870 topology 950 1171 -> 15 0 23 870 topology 941 1172 +> 15 0 23 870 topology 935 1172 > 16 0 23 870 topology 950 1172 -> 15 0 24 870 topology 871 1173 -> 16 0 24 870 topology 872 1173 -> 15 0 23 870 topology 882 1174 +> 15 0 23 870 topology 939 1173 +> 16 0 23 870 topology 950 1173 +> 15 0 23 870 topology 938 1174 > 16 0 23 870 topology 950 1174 -> 15 0 23 870 topology 923 1175 +> 15 0 23 870 topology 942 1175 > 16 0 23 870 topology 950 1175 -> 15 0 23 870 topology 894 1176 +> 15 0 23 870 topology 941 1176 > 16 0 23 870 topology 950 1176 -> 15 0 24 870 topology 883 1177 -> 16 0 24 870 topology 884 1177 -> 15 0 23 870 topology 878 1178 +> 15 0 23 870 topology 945 1177 +> 16 0 23 870 topology 950 1177 +> 15 0 23 870 topology 944 1178 > 16 0 23 870 topology 950 1178 -> 15 0 23 870 topology 930 1179 +> 15 0 23 870 topology 948 1179 > 16 0 23 870 topology 950 1179 -> 15 0 23 870 topology 906 1180 +> 15 0 23 870 topology 947 1180 > 16 0 23 870 topology 950 1180 -> 15 0 23 870 topology 890 1181 +> 15 0 23 870 topology 876 1181 > 16 0 23 870 topology 950 1181 -> 15 0 24 870 topology 895 1182 -> 16 0 24 870 topology 896 1182 -> 15 0 23 870 topology 942 1183 +> 15 0 23 870 topology 875 1182 +> 16 0 23 870 topology 950 1182 +> 15 0 23 870 topology 879 1183 > 16 0 23 870 topology 950 1183 -> 15 0 24 870 topology 898 1184 -> 16 0 24 870 topology 900 1184 -> 15 0 23 870 topology 918 1185 +> 15 0 23 870 topology 878 1184 +> 16 0 23 870 topology 950 1184 +> 15 0 23 870 topology 882 1185 > 16 0 23 870 topology 950 1185 -> 15 0 24 870 topology 928 1186 -> 16 0 24 870 topology 930 1186 -> 15 0 24 870 topology 877 1187 -> 16 0 24 870 topology 879 1187 -> 15 0 24 870 topology 904 1188 -> 16 0 24 870 topology 906 1188 -> 15 0 24 870 topology 934 1189 -> 16 0 24 870 topology 936 1189 -> 15 0 24 870 topology 910 1190 -> 16 0 24 870 topology 912 1190 -> 15 0 23 870 topology 873 1191 +> 15 0 23 870 topology 881 1186 +> 16 0 23 870 topology 950 1186 +> 15 0 23 870 topology 885 1187 +> 16 0 23 870 topology 950 1187 +> 15 0 23 870 topology 884 1188 +> 16 0 23 870 topology 950 1188 +> 15 0 23 870 topology 888 1189 +> 16 0 23 870 topology 950 1189 +> 15 0 23 870 topology 887 1190 +> 16 0 23 870 topology 950 1190 +> 15 0 23 870 topology 891 1191 > 16 0 23 870 topology 950 1191 -> 15 0 23 870 topology 908 1192 +> 15 0 23 870 topology 890 1192 > 16 0 23 870 topology 950 1192 -> 15 0 24 870 topology 940 1193 -> 16 0 24 870 topology 942 1193 -> 15 0 23 870 topology 938 1194 +> 15 0 23 870 topology 894 1193 +> 16 0 23 870 topology 950 1193 +> 15 0 23 870 topology 893 1194 > 16 0 23 870 topology 950 1194 -> 15 0 24 870 topology 889 1195 -> 16 0 24 870 topology 891 1195 -> 15 0 24 870 topology 916 1196 -> 16 0 24 870 topology 918 1196 -> 15 0 23 870 topology 885 1197 -> 16 0 23 870 topology 950 1197 -> 15 0 23 870 topology 920 1198 -> 16 0 23 870 topology 950 1198 -> 15 0 24 870 topology 946 1199 -> 16 0 24 870 topology 948 1199 -> 15 0 24 870 topology 928 1200 -> 16 0 24 870 topology 929 1200 -> 15 0 24 870 topology 922 1201 -> 16 0 24 870 topology 924 1201 -> 15 0 24 870 topology 931 1202 -> 16 0 24 870 topology 932 1202 -> 15 0 23 870 topology 897 1203 -> 16 0 23 870 topology 950 1203 -> 15 0 24 870 topology 880 1204 -> 16 0 24 870 topology 881 1204 -> 15 0 24 870 topology 934 1205 -> 16 0 24 870 topology 935 1205 -> 15 0 24 870 topology 937 1206 -> 16 0 24 870 topology 938 1206 -> 15 0 24 870 topology 940 1207 -> 16 0 24 870 topology 941 1207 -> 15 0 23 870 topology 875 1208 -> 16 0 23 870 topology 950 1208 -> 15 0 24 870 topology 943 1209 -> 16 0 24 870 topology 944 1209 -> 15 0 24 870 topology 892 1210 -> 16 0 24 870 topology 893 1210 -> 15 0 24 870 topology 946 1211 -> 16 0 24 870 topology 947 1211 -> 15 0 23 870 topology 887 1212 -> 16 0 23 870 topology 950 1212 -> 15 0 23 870 topology 933 1213 -> 16 0 23 870 topology 950 1213 -> 15 0 23 870 topology 909 1214 -> 16 0 23 870 topology 950 1214 -> 15 0 23 870 topology 945 1215 -> 16 0 23 870 topology 950 1215 -> 15 0 23 870 topology 921 1216 -> 16 0 23 870 topology 950 1216 -> 15 0 24 870 topology 880 1217 -> 16 0 24 870 topology 882 1217 -> 15 0 23 870 topology 905 1218 -> 16 0 23 870 topology 950 1218 -> 15 0 23 870 topology 935 1219 -> 16 0 23 870 topology 950 1219 -> 15 0 23 870 topology 876 1220 -> 16 0 23 870 topology 950 1220 -> 15 0 23 870 topology 917 1221 -> 16 0 23 870 topology 950 1221 -> 15 0 24 870 topology 892 1222 -> 16 0 24 870 topology 894 1222 -> 15 0 23 870 topology 947 1223 -> 16 0 23 870 topology 950 1223 -> 15 0 23 870 topology 888 1224 -> 16 0 23 870 topology 950 1224 -> 15 0 24 870 topology 877 1225 -> 16 0 24 870 topology 878 1225 -> 15 0 23 870 topology 872 1226 -> 16 0 23 870 topology 950 1226 -> 15 0 24 870 topology 889 1227 -> 16 0 24 870 topology 890 1227 -> 15 0 23 870 topology 900 1228 -> 16 0 23 870 topology 950 1228 -> 15 0 23 870 topology 884 1229 -> 16 0 23 870 topology 950 1229 -> 15 0 23 870 topology 936 1230 -> 16 0 23 870 topology 950 1230 -> 15 0 23 870 topology 912 1231 -> 16 0 23 870 topology 950 1231 -> 15 0 23 870 topology 896 1232 -> 16 0 23 870 topology 950 1232 -> 15 0 24 870 topology 871 1233 -> 16 0 24 870 topology 873 1233 -> 15 0 23 870 topology 948 1234 -> 16 0 23 870 topology 950 1234 -> 15 0 24 870 topology 901 1235 -> 16 0 24 870 topology 903 1235 -> 15 0 23 870 topology 924 1236 -> 16 0 23 870 topology 950 1236 -> 15 0 24 870 topology 931 1237 -> 16 0 24 870 topology 933 1237 -> 15 0 24 870 topology 907 1238 -> 16 0 24 870 topology 909 1238 -> 15 0 24 870 topology 883 1239 -> 16 0 24 870 topology 885 1239 -> 15 0 23 870 topology 902 1240 -> 16 0 23 870 topology 950 1240 -> 15 0 24 870 topology 937 1241 -> 16 0 24 870 topology 939 1241 -> 15 0 23 870 topology 932 1242 -> 16 0 23 870 topology 950 1242 -> 15 0 24 870 topology 913 1243 -> 16 0 24 870 topology 915 1243 -> 15 0 23 870 topology 879 1244 -> 16 0 23 870 topology 950 1244 -> 15 0 23 870 topology 914 1245 -> 16 0 23 870 topology 950 1245 -> 15 0 24 870 topology 943 1246 -> 16 0 24 870 topology 945 1246 -> 15 0 24 870 topology 898 1247 -> 16 0 24 870 topology 899 1247 -> 15 0 23 870 topology 944 1248 -> 16 0 23 870 topology 950 1248 -> 15 0 24 870 topology 919 1249 -> 16 0 24 870 topology 921 1249 -> 15 0 23 952 topology 1000 1250 +> 15 0 23 870 topology 897 1195 +> 16 0 23 870 topology 950 1195 +> 15 0 23 870 topology 896 1196 +> 16 0 23 870 topology 950 1196 +> 15 0 24 870 topology 949 1197 +> 16 0 24 870 topology 950 1197 +> 15 0 25 870 topology 898 1198 +> 16 0 25 870 topology 900 1198 +> 15 0 25 870 topology 898 1199 +> 16 0 25 870 topology 899 1199 +> 15 0 25 870 topology 901 1200 +> 16 0 25 870 topology 903 1200 +> 15 0 25 870 topology 901 1201 +> 16 0 25 870 topology 902 1201 +> 15 0 25 870 topology 904 1202 +> 16 0 25 870 topology 906 1202 +> 15 0 25 870 topology 904 1203 +> 16 0 25 870 topology 905 1203 +> 15 0 25 870 topology 907 1204 +> 16 0 25 870 topology 909 1204 +> 15 0 25 870 topology 907 1205 +> 16 0 25 870 topology 908 1205 +> 15 0 25 870 topology 910 1206 +> 16 0 25 870 topology 912 1206 +> 15 0 25 870 topology 910 1207 +> 16 0 25 870 topology 911 1207 +> 15 0 25 870 topology 913 1208 +> 16 0 25 870 topology 915 1208 +> 15 0 25 870 topology 913 1209 +> 16 0 25 870 topology 914 1209 +> 15 0 25 870 topology 916 1210 +> 16 0 25 870 topology 918 1210 +> 15 0 25 870 topology 916 1211 +> 16 0 25 870 topology 917 1211 +> 15 0 25 870 topology 919 1212 +> 16 0 25 870 topology 921 1212 +> 15 0 25 870 topology 919 1213 +> 16 0 25 870 topology 920 1213 +> 15 0 25 870 topology 922 1214 +> 16 0 25 870 topology 924 1214 +> 15 0 25 870 topology 922 1215 +> 16 0 25 870 topology 923 1215 +> 15 0 25 870 topology 925 1216 +> 16 0 25 870 topology 927 1216 +> 15 0 25 870 topology 925 1217 +> 16 0 25 870 topology 926 1217 +> 15 0 25 870 topology 871 1218 +> 16 0 25 870 topology 873 1218 +> 15 0 25 870 topology 871 1219 +> 16 0 25 870 topology 872 1219 +> 15 0 25 870 topology 928 1220 +> 16 0 25 870 topology 930 1220 +> 15 0 25 870 topology 928 1221 +> 16 0 25 870 topology 929 1221 +> 15 0 25 870 topology 931 1222 +> 16 0 25 870 topology 933 1222 +> 15 0 25 870 topology 931 1223 +> 16 0 25 870 topology 932 1223 +> 15 0 25 870 topology 934 1224 +> 16 0 25 870 topology 936 1224 +> 15 0 25 870 topology 934 1225 +> 16 0 25 870 topology 935 1225 +> 15 0 25 870 topology 937 1226 +> 16 0 25 870 topology 939 1226 +> 15 0 25 870 topology 937 1227 +> 16 0 25 870 topology 938 1227 +> 15 0 25 870 topology 940 1228 +> 16 0 25 870 topology 942 1228 +> 15 0 25 870 topology 940 1229 +> 16 0 25 870 topology 941 1229 +> 15 0 25 870 topology 943 1230 +> 16 0 25 870 topology 945 1230 +> 15 0 25 870 topology 943 1231 +> 16 0 25 870 topology 944 1231 +> 15 0 25 870 topology 946 1232 +> 16 0 25 870 topology 948 1232 +> 15 0 25 870 topology 946 1233 +> 16 0 25 870 topology 947 1233 +> 15 0 25 870 topology 874 1234 +> 16 0 25 870 topology 876 1234 +> 15 0 25 870 topology 874 1235 +> 16 0 25 870 topology 875 1235 +> 15 0 25 870 topology 877 1236 +> 16 0 25 870 topology 879 1236 +> 15 0 25 870 topology 877 1237 +> 16 0 25 870 topology 878 1237 +> 15 0 25 870 topology 880 1238 +> 16 0 25 870 topology 882 1238 +> 15 0 25 870 topology 880 1239 +> 16 0 25 870 topology 881 1239 +> 15 0 25 870 topology 883 1240 +> 16 0 25 870 topology 885 1240 +> 15 0 25 870 topology 883 1241 +> 16 0 25 870 topology 884 1241 +> 15 0 25 870 topology 886 1242 +> 16 0 25 870 topology 888 1242 +> 15 0 25 870 topology 886 1243 +> 16 0 25 870 topology 887 1243 +> 15 0 25 870 topology 889 1244 +> 16 0 25 870 topology 891 1244 +> 15 0 25 870 topology 889 1245 +> 16 0 25 870 topology 890 1245 +> 15 0 25 870 topology 892 1246 +> 16 0 25 870 topology 894 1246 +> 15 0 25 870 topology 892 1247 +> 16 0 25 870 topology 893 1247 +> 15 0 25 870 topology 895 1248 +> 16 0 25 870 topology 897 1248 +> 15 0 25 870 topology 895 1249 +> 16 0 25 870 topology 896 1249 +> 15 0 23 952 topology 982 1250 > 16 0 23 952 topology 1014 1250 -> 15 0 24 952 topology 983 1251 -> 16 0 24 952 topology 985 1251 -> 15 0 23 952 topology 955 1252 +> 15 0 23 952 topology 981 1251 +> 16 0 23 952 topology 1014 1251 +> 15 0 23 952 topology 985 1252 > 16 0 23 952 topology 1014 1252 -> 15 0 23 952 topology 990 1253 +> 15 0 23 952 topology 984 1253 > 16 0 23 952 topology 1014 1253 -> 15 0 24 952 topology 995 1254 -> 16 0 24 952 topology 997 1254 -> 15 0 24 952 topology 980 1255 -> 16 0 24 952 topology 981 1255 -> 15 0 23 952 topology 967 1256 +> 15 0 23 952 topology 988 1254 +> 16 0 23 952 topology 1014 1254 +> 15 0 23 952 topology 987 1255 +> 16 0 23 952 topology 1014 1255 +> 15 0 23 952 topology 991 1256 > 16 0 23 952 topology 1014 1256 -> 15 0 23 952 topology 1002 1257 +> 15 0 23 952 topology 990 1257 > 16 0 23 952 topology 1014 1257 -> 15 0 23 952 topology 979 1258 +> 15 0 23 952 topology 994 1258 > 16 0 23 952 topology 1014 1258 -> 15 0 24 952 topology 1007 1259 -> 16 0 24 952 topology 1009 1259 -> 15 0 24 952 topology 992 1260 -> 16 0 24 952 topology 993 1260 -> 15 0 23 952 topology 957 1261 +> 15 0 23 952 topology 993 1259 +> 16 0 23 952 topology 1014 1259 +> 15 0 23 952 topology 997 1260 +> 16 0 23 952 topology 1014 1260 +> 15 0 23 952 topology 996 1261 > 16 0 23 952 topology 1014 1261 -> 15 0 23 952 topology 969 1262 +> 15 0 23 952 topology 1000 1262 > 16 0 23 952 topology 1014 1262 -> 15 0 23 952 topology 991 1263 +> 15 0 23 952 topology 999 1263 > 16 0 23 952 topology 1014 1263 -> 15 0 24 952 topology 1004 1264 -> 16 0 24 952 topology 1005 1264 -> 15 0 24 952 topology 980 1265 -> 16 0 24 952 topology 982 1265 -> 15 0 23 952 topology 1003 1266 +> 15 0 23 952 topology 1003 1264 +> 16 0 23 952 topology 1014 1264 +> 15 0 23 952 topology 1002 1265 +> 16 0 23 952 topology 1014 1265 +> 15 0 23 952 topology 1006 1266 > 16 0 23 952 topology 1014 1266 -> 15 0 24 952 topology 956 1267 -> 16 0 24 952 topology 958 1267 -> 15 0 24 952 topology 962 1268 -> 16 0 24 952 topology 964 1268 -> 15 0 24 952 topology 992 1269 -> 16 0 24 952 topology 994 1269 -> 15 0 23 952 topology 987 1270 +> 15 0 23 952 topology 1005 1267 +> 16 0 23 952 topology 1014 1267 +> 15 0 23 952 topology 1009 1268 +> 16 0 23 952 topology 1014 1268 +> 15 0 23 952 topology 1008 1269 +> 16 0 23 952 topology 1014 1269 +> 15 0 23 952 topology 955 1270 > 16 0 23 952 topology 1014 1270 -> 15 0 24 952 topology 968 1271 -> 16 0 24 952 topology 970 1271 -> 15 0 23 952 topology 958 1272 +> 15 0 23 952 topology 954 1271 +> 16 0 23 952 topology 1014 1271 +> 15 0 23 952 topology 1012 1272 > 16 0 23 952 topology 1014 1272 -> 15 0 24 952 topology 953 1273 -> 16 0 24 952 topology 954 1273 -> 15 0 23 952 topology 999 1274 +> 15 0 23 952 topology 1011 1273 +> 16 0 23 952 topology 1014 1273 +> 15 0 23 952 topology 958 1274 > 16 0 23 952 topology 1014 1274 -> 15 0 25 952 topology 1013 1275 -> 16 0 25 952 topology 1014 1275 -> 15 0 24 952 topology 974 1276 -> 16 0 24 952 topology 976 1276 -> 15 0 24 952 topology 956 1277 -> 16 0 24 952 topology 957 1277 -> 15 0 23 952 topology 970 1278 +> 15 0 23 952 topology 957 1275 +> 16 0 23 952 topology 1014 1275 +> 15 0 23 952 topology 961 1276 +> 16 0 23 952 topology 1014 1276 +> 15 0 23 952 topology 960 1277 +> 16 0 23 952 topology 1014 1277 +> 15 0 23 952 topology 964 1278 > 16 0 23 952 topology 1014 1278 -> 15 0 24 952 topology 983 1279 -> 16 0 24 952 topology 984 1279 -> 15 0 24 952 topology 1004 1280 -> 16 0 24 952 topology 1006 1280 -> 15 0 24 952 topology 959 1281 -> 16 0 24 952 topology 960 1281 -> 15 0 24 952 topology 962 1282 -> 16 0 24 952 topology 963 1282 -> 15 0 24 952 topology 965 1283 -> 16 0 24 952 topology 966 1283 -> 15 0 23 952 topology 954 1284 +> 15 0 23 952 topology 963 1279 +> 16 0 23 952 topology 1014 1279 +> 15 0 23 952 topology 967 1280 +> 16 0 23 952 topology 1014 1280 +> 15 0 23 952 topology 966 1281 +> 16 0 23 952 topology 1014 1281 +> 15 0 23 952 topology 970 1282 +> 16 0 23 952 topology 1014 1282 +> 15 0 23 952 topology 969 1283 +> 16 0 23 952 topology 1014 1283 +> 15 0 23 952 topology 973 1284 > 16 0 23 952 topology 1014 1284 -> 15 0 24 952 topology 968 1285 -> 16 0 24 952 topology 969 1285 -> 15 0 24 952 topology 995 1286 -> 16 0 24 952 topology 996 1286 -> 15 0 24 952 topology 971 1287 -> 16 0 24 952 topology 972 1287 -> 15 0 23 952 topology 982 1288 +> 15 0 23 952 topology 972 1285 +> 16 0 23 952 topology 1014 1285 +> 15 0 23 952 topology 976 1286 +> 16 0 23 952 topology 1014 1286 +> 15 0 23 952 topology 975 1287 +> 16 0 23 952 topology 1014 1287 +> 15 0 23 952 topology 979 1288 > 16 0 23 952 topology 1014 1288 -> 15 0 23 952 topology 966 1289 +> 15 0 23 952 topology 978 1289 > 16 0 23 952 topology 1014 1289 -> 15 0 24 952 topology 974 1290 -> 16 0 24 952 topology 975 1290 -> 15 0 24 952 topology 977 1291 -> 16 0 24 952 topology 978 1291 -> 15 0 23 952 topology 994 1292 -> 16 0 23 952 topology 1014 1292 -> 15 0 23 952 topology 978 1293 -> 16 0 23 952 topology 1014 1293 -> 15 0 24 952 topology 1007 1294 -> 16 0 24 952 topology 1008 1294 -> 15 0 23 952 topology 1006 1295 -> 16 0 23 952 topology 1014 1295 -> 15 0 24 952 topology 1010 1296 -> 16 0 24 952 topology 1012 1296 -> 15 0 24 952 topology 989 1297 -> 16 0 24 952 topology 991 1297 -> 15 0 23 952 topology 984 1298 -> 16 0 23 952 topology 1014 1298 -> 15 0 23 952 topology 961 1299 -> 16 0 23 952 topology 1014 1299 -> 15 0 23 952 topology 996 1300 -> 16 0 23 952 topology 1014 1300 -> 15 0 24 952 topology 1001 1301 -> 16 0 24 952 topology 1003 1301 -> 15 0 23 952 topology 973 1302 -> 16 0 23 952 topology 1014 1302 -> 15 0 23 952 topology 1008 1303 -> 16 0 23 952 topology 1014 1303 -> 15 0 24 952 topology 986 1304 -> 16 0 24 952 topology 987 1304 -> 15 0 24 952 topology 998 1305 -> 16 0 24 952 topology 999 1305 -> 15 0 23 952 topology 963 1306 -> 16 0 23 952 topology 1014 1306 -> 15 0 23 952 topology 985 1307 -> 16 0 23 952 topology 1014 1307 -> 15 0 23 952 topology 975 1308 -> 16 0 23 952 topology 1014 1308 -> 15 0 23 952 topology 997 1309 -> 16 0 23 952 topology 1014 1309 -> 15 0 24 952 topology 953 1310 -> 16 0 24 952 topology 955 1310 -> 15 0 23 952 topology 1009 1311 -> 16 0 23 952 topology 1014 1311 -> 15 0 24 952 topology 959 1312 -> 16 0 24 952 topology 961 1312 -> 15 0 24 952 topology 986 1313 -> 16 0 24 952 topology 988 1313 -> 15 0 23 952 topology 981 1314 -> 16 0 23 952 topology 1014 1314 -> 15 0 24 952 topology 965 1315 -> 16 0 24 952 topology 967 1315 -> 15 0 23 952 topology 1011 1316 -> 16 0 23 952 topology 1014 1316 -> 15 0 23 952 topology 993 1317 -> 16 0 23 952 topology 1014 1317 -> 15 0 24 952 topology 971 1318 -> 16 0 24 952 topology 973 1318 -> 15 0 24 952 topology 998 1319 -> 16 0 24 952 topology 1000 1319 -> 15 0 23 952 topology 964 1320 -> 16 0 23 952 topology 1014 1320 -> 15 0 23 952 topology 1005 1321 -> 16 0 23 952 topology 1014 1321 -> 15 0 24 952 topology 1010 1322 -> 16 0 24 952 topology 1011 1322 -> 15 0 24 952 topology 977 1323 -> 16 0 24 952 topology 979 1323 -> 15 0 23 952 topology 976 1324 -> 16 0 23 952 topology 1014 1324 -> 15 0 24 952 topology 989 1325 -> 16 0 24 952 topology 990 1325 -> 15 0 23 952 topology 960 1326 -> 16 0 23 952 topology 1014 1326 -> 15 0 24 952 topology 1001 1327 -> 16 0 24 952 topology 1002 1327 -> 15 0 23 952 topology 1012 1328 -> 16 0 23 952 topology 1014 1328 -> 15 0 23 952 topology 988 1329 -> 16 0 23 952 topology 1014 1329 -> 15 0 23 952 topology 972 1330 -> 16 0 23 952 topology 1014 1330 -> 15 0 23 1016 topology 1133 1331 +> 15 0 24 952 topology 1013 1290 +> 16 0 24 952 topology 1014 1290 +> 15 0 25 952 topology 980 1291 +> 16 0 25 952 topology 982 1291 +> 15 0 25 952 topology 980 1292 +> 16 0 25 952 topology 981 1292 +> 15 0 25 952 topology 983 1293 +> 16 0 25 952 topology 985 1293 +> 15 0 25 952 topology 983 1294 +> 16 0 25 952 topology 984 1294 +> 15 0 25 952 topology 986 1295 +> 16 0 25 952 topology 988 1295 +> 15 0 25 952 topology 986 1296 +> 16 0 25 952 topology 987 1296 +> 15 0 25 952 topology 989 1297 +> 16 0 25 952 topology 991 1297 +> 15 0 25 952 topology 989 1298 +> 16 0 25 952 topology 990 1298 +> 15 0 25 952 topology 992 1299 +> 16 0 25 952 topology 994 1299 +> 15 0 25 952 topology 992 1300 +> 16 0 25 952 topology 993 1300 +> 15 0 25 952 topology 995 1301 +> 16 0 25 952 topology 997 1301 +> 15 0 25 952 topology 995 1302 +> 16 0 25 952 topology 996 1302 +> 15 0 25 952 topology 998 1303 +> 16 0 25 952 topology 1000 1303 +> 15 0 25 952 topology 998 1304 +> 16 0 25 952 topology 999 1304 +> 15 0 25 952 topology 1001 1305 +> 16 0 25 952 topology 1003 1305 +> 15 0 25 952 topology 1001 1306 +> 16 0 25 952 topology 1002 1306 +> 15 0 25 952 topology 1004 1307 +> 16 0 25 952 topology 1006 1307 +> 15 0 25 952 topology 1004 1308 +> 16 0 25 952 topology 1005 1308 +> 15 0 25 952 topology 1007 1309 +> 16 0 25 952 topology 1009 1309 +> 15 0 25 952 topology 1007 1310 +> 16 0 25 952 topology 1008 1310 +> 15 0 25 952 topology 953 1311 +> 16 0 25 952 topology 955 1311 +> 15 0 25 952 topology 953 1312 +> 16 0 25 952 topology 954 1312 +> 15 0 25 952 topology 1010 1313 +> 16 0 25 952 topology 1012 1313 +> 15 0 25 952 topology 1010 1314 +> 16 0 25 952 topology 1011 1314 +> 15 0 25 952 topology 956 1315 +> 16 0 25 952 topology 958 1315 +> 15 0 25 952 topology 956 1316 +> 16 0 25 952 topology 957 1316 +> 15 0 25 952 topology 959 1317 +> 16 0 25 952 topology 961 1317 +> 15 0 25 952 topology 959 1318 +> 16 0 25 952 topology 960 1318 +> 15 0 25 952 topology 962 1319 +> 16 0 25 952 topology 964 1319 +> 15 0 25 952 topology 962 1320 +> 16 0 25 952 topology 963 1320 +> 15 0 25 952 topology 965 1321 +> 16 0 25 952 topology 967 1321 +> 15 0 25 952 topology 965 1322 +> 16 0 25 952 topology 966 1322 +> 15 0 25 952 topology 968 1323 +> 16 0 25 952 topology 970 1323 +> 15 0 25 952 topology 968 1324 +> 16 0 25 952 topology 969 1324 +> 15 0 25 952 topology 971 1325 +> 16 0 25 952 topology 973 1325 +> 15 0 25 952 topology 971 1326 +> 16 0 25 952 topology 972 1326 +> 15 0 25 952 topology 974 1327 +> 16 0 25 952 topology 976 1327 +> 15 0 25 952 topology 974 1328 +> 16 0 25 952 topology 975 1328 +> 15 0 25 952 topology 977 1329 +> 16 0 25 952 topology 979 1329 +> 15 0 25 952 topology 977 1330 +> 16 0 25 952 topology 978 1330 +> 15 0 23 1016 topology 1046 1331 > 16 0 23 1016 topology 1156 1331 -> 15 0 24 1016 topology 1026 1332 -> 16 0 24 1016 topology 1028 1332 -> 15 0 24 1016 topology 1053 1333 -> 16 0 24 1016 topology 1055 1333 -> 15 0 24 1016 topology 1107 1334 -> 16 0 24 1016 topology 1109 1334 -> 15 0 23 1016 topology 1045 1335 +> 15 0 23 1016 topology 1045 1332 +> 16 0 23 1016 topology 1156 1332 +> 15 0 23 1016 topology 1049 1333 +> 16 0 23 1016 topology 1156 1333 +> 15 0 23 1016 topology 1048 1334 +> 16 0 23 1016 topology 1156 1334 +> 15 0 23 1016 topology 1052 1335 > 16 0 23 1016 topology 1156 1335 -> 15 0 23 1016 topology 1075 1336 +> 15 0 23 1016 topology 1051 1336 > 16 0 23 1016 topology 1156 1336 -> 15 0 24 1016 topology 1083 1337 -> 16 0 24 1016 topology 1085 1337 -> 15 0 24 1016 topology 1137 1338 -> 16 0 24 1016 topology 1139 1338 -> 15 0 23 1016 topology 1105 1339 +> 15 0 23 1016 topology 1055 1337 +> 16 0 23 1016 topology 1156 1337 +> 15 0 23 1016 topology 1054 1338 +> 16 0 23 1016 topology 1156 1338 +> 15 0 23 1016 topology 1058 1339 > 16 0 23 1016 topology 1156 1339 -> 15 0 24 1016 topology 1059 1340 -> 16 0 24 1016 topology 1061 1340 -> 15 0 24 1016 topology 1113 1341 -> 16 0 24 1016 topology 1115 1341 -> 15 0 23 1016 topology 1135 1342 +> 15 0 23 1016 topology 1057 1340 +> 16 0 23 1016 topology 1156 1340 +> 15 0 23 1016 topology 1061 1341 +> 16 0 23 1016 topology 1156 1341 +> 15 0 23 1016 topology 1060 1342 > 16 0 23 1016 topology 1156 1342 -> 15 0 23 1016 topology 1022 1343 +> 15 0 23 1016 topology 1064 1343 > 16 0 23 1016 topology 1156 1343 -> 15 0 23 1016 topology 1057 1344 +> 15 0 23 1016 topology 1063 1344 > 16 0 23 1016 topology 1156 1344 -> 15 0 23 1016 topology 1087 1345 +> 15 0 23 1016 topology 1067 1345 > 16 0 23 1016 topology 1156 1345 -> 15 0 24 1016 topology 1089 1346 -> 16 0 24 1016 topology 1091 1346 -> 15 0 24 1016 topology 1143 1347 -> 16 0 24 1016 topology 1145 1347 -> 15 0 24 1016 topology 1017 1348 -> 16 0 24 1016 topology 1018 1348 -> 15 0 23 1016 topology 1117 1349 +> 15 0 23 1016 topology 1066 1346 +> 16 0 23 1016 topology 1156 1346 +> 15 0 23 1016 topology 1070 1347 +> 16 0 23 1016 topology 1156 1347 +> 15 0 23 1016 topology 1069 1348 +> 16 0 23 1016 topology 1156 1348 +> 15 0 23 1016 topology 1073 1349 > 16 0 23 1016 topology 1156 1349 -> 15 0 24 1016 topology 1038 1350 -> 16 0 24 1016 topology 1040 1350 -> 15 0 24 1016 topology 1065 1351 -> 16 0 24 1016 topology 1067 1351 -> 15 0 24 1016 topology 1119 1352 -> 16 0 24 1016 topology 1121 1352 -> 15 0 23 1016 topology 1147 1353 +> 15 0 23 1016 topology 1072 1350 +> 16 0 23 1016 topology 1156 1350 +> 15 0 23 1016 topology 1019 1351 +> 16 0 23 1016 topology 1156 1351 +> 15 0 23 1016 topology 1018 1352 +> 16 0 23 1016 topology 1156 1352 +> 15 0 23 1016 topology 1076 1353 > 16 0 23 1016 topology 1156 1353 -> 15 0 23 1016 topology 1034 1354 +> 15 0 23 1016 topology 1075 1354 > 16 0 23 1016 topology 1156 1354 -> 15 0 23 1016 topology 1069 1355 +> 15 0 23 1016 topology 1079 1355 > 16 0 23 1016 topology 1156 1355 -> 15 0 24 1016 topology 1074 1356 -> 16 0 24 1016 topology 1075 1356 -> 15 0 24 1016 topology 1095 1357 -> 16 0 24 1016 topology 1097 1357 -> 15 0 23 1016 topology 1099 1358 +> 15 0 23 1016 topology 1078 1356 +> 16 0 23 1016 topology 1156 1356 +> 15 0 23 1016 topology 1082 1357 +> 16 0 23 1016 topology 1156 1357 +> 15 0 23 1016 topology 1081 1358 > 16 0 23 1016 topology 1156 1358 -> 15 0 24 1016 topology 1149 1359 -> 16 0 24 1016 topology 1151 1359 -> 15 0 24 1016 topology 1077 1360 -> 16 0 24 1016 topology 1078 1360 -> 15 0 23 1016 topology 1129 1361 +> 15 0 23 1016 topology 1085 1359 +> 16 0 23 1016 topology 1156 1359 +> 15 0 23 1016 topology 1084 1360 +> 16 0 23 1016 topology 1156 1360 +> 15 0 23 1016 topology 1088 1361 > 16 0 23 1016 topology 1156 1361 -> 15 0 24 1016 topology 1071 1362 -> 16 0 24 1016 topology 1073 1362 -> 15 0 24 1016 topology 1125 1363 -> 16 0 24 1016 topology 1127 1363 -> 15 0 24 1016 topology 1080 1364 -> 16 0 24 1016 topology 1081 1364 -> 15 0 24 1016 topology 1134 1365 -> 16 0 24 1016 topology 1135 1365 -> 15 0 24 1016 topology 1101 1366 -> 16 0 24 1016 topology 1103 1366 -> 15 0 24 1016 topology 1029 1367 -> 16 0 24 1016 topology 1030 1367 -> 15 0 24 1016 topology 1083 1368 -> 16 0 24 1016 topology 1084 1368 -> 15 0 24 1016 topology 1137 1369 -> 16 0 24 1016 topology 1138 1369 -> 15 0 24 1016 topology 1131 1370 -> 16 0 24 1016 topology 1133 1370 -> 15 0 23 1016 topology 1018 1371 +> 15 0 23 1016 topology 1087 1362 +> 16 0 23 1016 topology 1156 1362 +> 15 0 23 1016 topology 1091 1363 +> 16 0 23 1016 topology 1156 1363 +> 15 0 23 1016 topology 1090 1364 +> 16 0 23 1016 topology 1156 1364 +> 15 0 23 1016 topology 1094 1365 +> 16 0 23 1016 topology 1156 1365 +> 15 0 23 1016 topology 1093 1366 +> 16 0 23 1016 topology 1156 1366 +> 15 0 23 1016 topology 1097 1367 +> 16 0 23 1016 topology 1156 1367 +> 15 0 23 1016 topology 1096 1368 +> 16 0 23 1016 topology 1156 1368 +> 15 0 23 1016 topology 1100 1369 +> 16 0 23 1016 topology 1156 1369 +> 15 0 23 1016 topology 1099 1370 +> 16 0 23 1016 topology 1156 1370 +> 15 0 23 1016 topology 1103 1371 > 16 0 23 1016 topology 1156 1371 -> 15 0 24 1016 topology 1086 1372 -> 16 0 24 1016 topology 1087 1372 -> 15 0 24 1016 topology 1140 1373 -> 16 0 24 1016 topology 1141 1373 -> 15 0 24 1016 topology 1089 1374 -> 16 0 24 1016 topology 1090 1374 -> 15 0 24 1016 topology 1143 1375 -> 16 0 24 1016 topology 1144 1375 -> 15 0 23 1016 topology 1030 1376 +> 15 0 23 1016 topology 1102 1372 +> 16 0 23 1016 topology 1156 1372 +> 15 0 23 1016 topology 1022 1373 +> 16 0 23 1016 topology 1156 1373 +> 15 0 23 1016 topology 1021 1374 +> 16 0 23 1016 topology 1156 1374 +> 15 0 23 1016 topology 1106 1375 +> 16 0 23 1016 topology 1156 1375 +> 15 0 23 1016 topology 1105 1376 > 16 0 23 1016 topology 1156 1376 -> 15 0 23 1016 topology 1076 1377 +> 15 0 23 1016 topology 1109 1377 > 16 0 23 1016 topology 1156 1377 -> 15 0 24 1016 topology 1092 1378 -> 16 0 24 1016 topology 1093 1378 -> 15 0 24 1016 topology 1146 1379 -> 16 0 24 1016 topology 1147 1379 -> 15 0 23 1016 topology 1052 1380 +> 15 0 23 1016 topology 1108 1378 +> 16 0 23 1016 topology 1156 1378 +> 15 0 23 1016 topology 1112 1379 +> 16 0 23 1016 topology 1156 1379 +> 15 0 23 1016 topology 1111 1380 > 16 0 23 1016 topology 1156 1380 -> 15 0 24 1016 topology 1041 1381 -> 16 0 24 1016 topology 1042 1381 -> 15 0 24 1016 topology 1095 1382 -> 16 0 24 1016 topology 1096 1382 -> 15 0 23 1016 topology 1136 1383 +> 15 0 23 1016 topology 1115 1381 +> 16 0 23 1016 topology 1156 1381 +> 15 0 23 1016 topology 1114 1382 +> 16 0 23 1016 topology 1156 1382 +> 15 0 23 1016 topology 1118 1383 > 16 0 23 1016 topology 1156 1383 -> 15 0 24 1016 topology 1149 1384 -> 16 0 24 1016 topology 1150 1384 -> 15 0 23 1016 topology 1112 1385 +> 15 0 23 1016 topology 1117 1384 +> 16 0 23 1016 topology 1156 1384 +> 15 0 23 1016 topology 1121 1385 > 16 0 23 1016 topology 1156 1385 -> 15 0 23 1016 topology 1042 1386 +> 15 0 23 1016 topology 1120 1386 > 16 0 23 1016 topology 1156 1386 -> 15 0 23 1016 topology 1088 1387 +> 15 0 23 1016 topology 1124 1387 > 16 0 23 1016 topology 1156 1387 -> 15 0 24 1016 topology 1098 1388 -> 16 0 24 1016 topology 1099 1388 -> 15 0 24 1016 topology 1152 1389 -> 16 0 24 1016 topology 1153 1389 -> 15 0 24 1016 topology 1017 1390 -> 16 0 24 1016 topology 1019 1390 -> 15 0 23 1016 topology 1064 1391 +> 15 0 23 1016 topology 1123 1388 +> 16 0 23 1016 topology 1156 1388 +> 15 0 23 1016 topology 1127 1389 +> 16 0 23 1016 topology 1156 1389 +> 15 0 23 1016 topology 1126 1390 +> 16 0 23 1016 topology 1156 1390 +> 15 0 23 1016 topology 1130 1391 > 16 0 23 1016 topology 1156 1391 -> 15 0 24 1016 topology 1101 1392 -> 16 0 24 1016 topology 1102 1392 -> 15 0 23 1016 topology 1148 1393 +> 15 0 23 1016 topology 1129 1392 +> 16 0 23 1016 topology 1156 1392 +> 15 0 23 1016 topology 1133 1393 > 16 0 23 1016 topology 1156 1393 -> 15 0 23 1016 topology 1124 1394 +> 15 0 23 1016 topology 1132 1394 > 16 0 23 1016 topology 1156 1394 -> 15 0 23 1016 topology 1100 1395 +> 15 0 23 1016 topology 1025 1395 > 16 0 23 1016 topology 1156 1395 -> 15 0 24 1016 topology 1029 1396 -> 16 0 24 1016 topology 1031 1396 -> 15 0 23 1016 topology 1054 1397 +> 15 0 23 1016 topology 1024 1396 +> 16 0 23 1016 topology 1156 1396 +> 15 0 23 1016 topology 1136 1397 > 16 0 23 1016 topology 1156 1397 -> 15 0 23 1016 topology 1084 1398 +> 15 0 23 1016 topology 1135 1398 > 16 0 23 1016 topology 1156 1398 -> 15 0 23 1016 topology 1025 1399 +> 15 0 23 1016 topology 1139 1399 > 16 0 23 1016 topology 1156 1399 -> 15 0 23 1016 topology 1114 1400 +> 15 0 23 1016 topology 1138 1400 > 16 0 23 1016 topology 1156 1400 -> 15 0 23 1016 topology 1144 1401 +> 15 0 23 1016 topology 1142 1401 > 16 0 23 1016 topology 1156 1401 -> 15 0 23 1016 topology 1066 1402 +> 15 0 23 1016 topology 1141 1402 > 16 0 23 1016 topology 1156 1402 -> 15 0 23 1016 topology 1096 1403 +> 15 0 23 1016 topology 1145 1403 > 16 0 23 1016 topology 1156 1403 -> 15 0 23 1016 topology 1037 1404 +> 15 0 23 1016 topology 1144 1404 > 16 0 23 1016 topology 1156 1404 -> 15 0 24 1016 topology 1041 1405 -> 16 0 24 1016 topology 1043 1405 -> 15 0 23 1016 topology 1126 1406 +> 15 0 23 1016 topology 1148 1405 +> 16 0 23 1016 topology 1156 1405 +> 15 0 23 1016 topology 1147 1406 > 16 0 23 1016 topology 1156 1406 -> 15 0 24 1016 topology 1026 1407 -> 16 0 24 1016 topology 1027 1407 -> 15 0 23 1016 topology 1027 1408 +> 15 0 23 1016 topology 1151 1407 +> 16 0 23 1016 topology 1156 1407 +> 15 0 23 1016 topology 1150 1408 > 16 0 23 1016 topology 1156 1408 -> 15 0 24 1016 topology 1038 1409 -> 16 0 24 1016 topology 1039 1409 -> 15 0 23 1016 topology 1079 1410 +> 15 0 23 1016 topology 1154 1409 +> 16 0 23 1016 topology 1156 1409 +> 15 0 23 1016 topology 1153 1410 > 16 0 23 1016 topology 1156 1410 -> 15 0 23 1016 topology 1055 1411 +> 15 0 23 1016 topology 1028 1411 > 16 0 23 1016 topology 1156 1411 -> 15 0 23 1016 topology 1039 1412 +> 15 0 23 1016 topology 1027 1412 > 16 0 23 1016 topology 1156 1412 -> 15 0 23 1016 topology 1139 1413 +> 15 0 23 1016 topology 1031 1413 > 16 0 23 1016 topology 1156 1413 -> 15 0 23 1016 topology 1115 1414 +> 15 0 23 1016 topology 1030 1414 > 16 0 23 1016 topology 1156 1414 -> 15 0 24 1016 topology 1044 1415 -> 16 0 24 1016 topology 1046 1415 -> 15 0 23 1016 topology 1091 1416 +> 15 0 23 1016 topology 1034 1415 +> 16 0 23 1016 topology 1156 1415 +> 15 0 23 1016 topology 1033 1416 > 16 0 23 1016 topology 1156 1416 -> 15 0 23 1016 topology 1067 1417 +> 15 0 23 1016 topology 1037 1417 > 16 0 23 1016 topology 1156 1417 -> 15 0 24 1016 topology 1020 1418 -> 16 0 24 1016 topology 1022 1418 -> 15 0 24 1016 topology 1074 1419 -> 16 0 24 1016 topology 1076 1419 -> 15 0 23 1016 topology 1151 1420 +> 15 0 23 1016 topology 1036 1418 +> 16 0 23 1016 topology 1156 1418 +> 15 0 23 1016 topology 1040 1419 +> 16 0 23 1016 topology 1156 1419 +> 15 0 23 1016 topology 1039 1420 > 16 0 23 1016 topology 1156 1420 -> 15 0 23 1016 topology 1127 1421 +> 15 0 23 1016 topology 1043 1421 > 16 0 23 1016 topology 1156 1421 -> 15 0 24 1016 topology 1050 1422 -> 16 0 24 1016 topology 1052 1422 -> 15 0 23 1016 topology 1103 1423 -> 16 0 23 1016 topology 1156 1423 -> 15 0 24 1016 topology 1104 1424 -> 16 0 24 1016 topology 1106 1424 -> 15 0 24 1016 topology 1080 1425 -> 16 0 24 1016 topology 1082 1425 -> 15 0 24 1016 topology 1134 1426 -> 16 0 24 1016 topology 1136 1426 -> 15 0 24 1016 topology 1056 1427 -> 16 0 24 1016 topology 1058 1427 -> 15 0 24 1016 topology 1110 1428 -> 16 0 24 1016 topology 1112 1428 -> 15 0 23 1016 topology 1051 1429 -> 16 0 23 1016 topology 1156 1429 -> 15 0 24 1016 topology 1032 1430 -> 16 0 24 1016 topology 1034 1430 -> 15 0 23 1016 topology 1081 1431 -> 16 0 23 1016 topology 1156 1431 -> 15 0 24 1016 topology 1086 1432 -> 16 0 24 1016 topology 1088 1432 -> 15 0 24 1016 topology 1140 1433 -> 16 0 24 1016 topology 1142 1433 -> 15 0 23 1016 topology 1111 1434 -> 16 0 23 1016 topology 1156 1434 -> 15 0 24 1016 topology 1062 1435 -> 16 0 24 1016 topology 1064 1435 -> 15 0 24 1016 topology 1116 1436 -> 16 0 24 1016 topology 1118 1436 -> 15 0 23 1016 topology 1141 1437 -> 16 0 23 1016 topology 1156 1437 -> 15 0 23 1016 topology 1028 1438 -> 16 0 23 1016 topology 1156 1438 -> 15 0 24 1016 topology 1044 1439 -> 16 0 24 1016 topology 1045 1439 -> 15 0 23 1016 topology 1063 1440 -> 16 0 23 1016 topology 1156 1440 -> 15 0 23 1016 topology 1093 1441 -> 16 0 23 1016 topology 1156 1441 -> 15 0 24 1016 topology 1092 1442 -> 16 0 24 1016 topology 1094 1442 -> 15 0 24 1016 topology 1146 1443 -> 16 0 24 1016 topology 1148 1443 -> 15 0 24 1016 topology 1047 1444 -> 16 0 24 1016 topology 1048 1444 -> 15 0 23 1016 topology 1123 1445 -> 16 0 23 1016 topology 1156 1445 -> 15 0 24 1016 topology 1068 1446 -> 16 0 24 1016 topology 1070 1446 -> 15 0 24 1016 topology 1122 1447 -> 16 0 24 1016 topology 1124 1447 -> 15 0 23 1016 topology 1153 1448 -> 16 0 23 1016 topology 1156 1448 -> 15 0 24 1016 topology 1023 1449 -> 16 0 24 1016 topology 1024 1449 -> 15 0 23 1016 topology 1040 1450 -> 16 0 23 1016 topology 1156 1450 -> 15 0 24 1016 topology 1050 1451 -> 16 0 24 1016 topology 1051 1451 -> 15 0 24 1016 topology 1104 1452 -> 16 0 24 1016 topology 1105 1452 -> 15 0 24 1016 topology 1098 1453 -> 16 0 24 1016 topology 1100 1453 -> 15 0 24 1016 topology 1152 1454 -> 16 0 24 1016 topology 1154 1454 -> 15 0 24 1016 topology 1053 1455 -> 16 0 24 1016 topology 1054 1455 -> 15 0 24 1016 topology 1107 1456 -> 16 0 24 1016 topology 1108 1456 -> 15 0 24 1016 topology 1128 1457 -> 16 0 24 1016 topology 1130 1457 -> 15 0 24 1016 topology 1056 1458 -> 16 0 24 1016 topology 1057 1458 -> 15 0 24 1016 topology 1110 1459 -> 16 0 24 1016 topology 1111 1459 -> 15 0 24 1016 topology 1059 1460 -> 16 0 24 1016 topology 1060 1460 -> 15 0 24 1016 topology 1113 1461 -> 16 0 24 1016 topology 1114 1461 -> 15 0 23 1016 topology 1024 1462 -> 16 0 23 1016 topology 1156 1462 -> 15 0 24 1016 topology 1035 1463 -> 16 0 24 1016 topology 1036 1463 -> 15 0 24 1016 topology 1062 1464 -> 16 0 24 1016 topology 1063 1464 -> 15 0 24 1016 topology 1116 1465 -> 16 0 24 1016 topology 1117 1465 -> 15 0 23 1016 topology 1046 1466 -> 16 0 23 1016 topology 1156 1466 -> 15 0 24 1016 topology 1065 1467 -> 16 0 24 1016 topology 1066 1467 -> 15 0 24 1016 topology 1119 1468 -> 16 0 24 1016 topology 1120 1468 -> 15 0 23 1016 topology 1106 1469 -> 16 0 23 1016 topology 1156 1469 -> 15 0 23 1016 topology 1036 1470 -> 16 0 23 1016 topology 1156 1470 -> 15 0 24 1016 topology 1068 1471 -> 16 0 24 1016 topology 1069 1471 -> 15 0 23 1016 topology 1082 1472 -> 16 0 23 1016 topology 1156 1472 -> 15 0 24 1016 topology 1122 1473 -> 16 0 24 1016 topology 1123 1473 -> 15 0 23 1016 topology 1058 1474 -> 16 0 23 1016 topology 1156 1474 -> 15 0 24 1016 topology 1071 1475 -> 16 0 24 1016 topology 1072 1475 -> 15 0 24 1016 topology 1125 1476 -> 16 0 24 1016 topology 1126 1476 -> 15 0 23 1016 topology 1142 1477 -> 16 0 23 1016 topology 1156 1477 -> 15 0 23 1016 topology 1118 1478 -> 16 0 23 1016 topology 1156 1478 -> 15 0 23 1016 topology 1094 1479 -> 16 0 23 1016 topology 1156 1479 -> 15 0 24 1016 topology 1128 1480 -> 16 0 24 1016 topology 1129 1480 -> 15 0 23 1016 topology 1070 1481 -> 16 0 23 1016 topology 1156 1481 -> 15 0 24 1016 topology 1131 1482 -> 16 0 24 1016 topology 1132 1482 -> 15 0 23 1016 topology 1154 1483 -> 16 0 23 1016 topology 1156 1483 -> 15 0 24 1016 topology 1023 1484 -> 16 0 24 1016 topology 1025 1484 -> 15 0 23 1016 topology 1130 1485 -> 16 0 23 1016 topology 1156 1485 -> 15 0 23 1016 topology 1048 1486 -> 16 0 23 1016 topology 1156 1486 -> 15 0 23 1016 topology 1078 1487 -> 16 0 23 1016 topology 1156 1487 -> 15 0 23 1016 topology 1019 1488 -> 16 0 23 1016 topology 1156 1488 -> 15 0 23 1016 topology 1108 1489 -> 16 0 23 1016 topology 1156 1489 -> 15 0 25 1016 topology 1155 1490 -> 16 0 25 1016 topology 1156 1490 -> 15 0 23 1016 topology 1138 1491 -> 16 0 23 1016 topology 1156 1491 -> 15 0 24 1016 topology 1035 1492 -> 16 0 24 1016 topology 1037 1492 -> 15 0 23 1016 topology 1060 1493 -> 16 0 23 1016 topology 1156 1493 -> 15 0 23 1016 topology 1090 1494 -> 16 0 23 1016 topology 1156 1494 -> 15 0 23 1016 topology 1031 1495 -> 16 0 23 1016 topology 1156 1495 -> 15 0 23 1016 topology 1120 1496 -> 16 0 23 1016 topology 1156 1496 -> 15 0 24 1016 topology 1020 1497 -> 16 0 24 1016 topology 1021 1497 -> 15 0 23 1016 topology 1150 1498 -> 16 0 23 1016 topology 1156 1498 -> 15 0 23 1016 topology 1072 1499 -> 16 0 23 1016 topology 1156 1499 -> 15 0 23 1016 topology 1102 1500 -> 16 0 23 1016 topology 1156 1500 -> 15 0 23 1016 topology 1043 1501 -> 16 0 23 1016 topology 1156 1501 -> 15 0 23 1016 topology 1132 1502 -> 16 0 23 1016 topology 1156 1502 -> 15 0 24 1016 topology 1032 1503 -> 16 0 24 1016 topology 1033 1503 -> 15 0 23 1016 topology 1021 1504 -> 16 0 23 1016 topology 1156 1504 -> 15 0 23 1016 topology 1049 1505 -> 16 0 23 1016 topology 1156 1505 -> 15 0 23 1016 topology 1033 1506 -> 16 0 23 1016 topology 1156 1506 -> 15 0 23 1016 topology 1109 1507 -> 16 0 23 1016 topology 1156 1507 -> 15 0 23 1016 topology 1085 1508 -> 16 0 23 1016 topology 1156 1508 -> 15 0 23 1016 topology 1061 1509 -> 16 0 23 1016 topology 1156 1509 -> 15 0 23 1016 topology 1145 1510 -> 16 0 23 1016 topology 1156 1510 -> 15 0 23 1016 topology 1121 1511 -> 16 0 23 1016 topology 1156 1511 -> 15 0 24 1016 topology 1047 1512 -> 16 0 24 1016 topology 1049 1512 -> 15 0 23 1016 topology 1097 1513 -> 16 0 23 1016 topology 1156 1513 -> 15 0 23 1016 topology 1073 1514 -> 16 0 23 1016 topology 1156 1514 -> 15 0 24 1016 topology 1077 1515 -> 16 0 24 1016 topology 1079 1515 -> 15 0 23 1158 topology 1175 1516 +> 15 0 23 1016 topology 1042 1422 +> 16 0 23 1016 topology 1156 1422 +> 15 0 24 1016 topology 1155 1423 +> 16 0 24 1016 topology 1156 1423 +> 15 0 25 1016 topology 1044 1424 +> 16 0 25 1016 topology 1046 1424 +> 15 0 25 1016 topology 1044 1425 +> 16 0 25 1016 topology 1045 1425 +> 15 0 25 1016 topology 1047 1426 +> 16 0 25 1016 topology 1049 1426 +> 15 0 25 1016 topology 1047 1427 +> 16 0 25 1016 topology 1048 1427 +> 15 0 25 1016 topology 1050 1428 +> 16 0 25 1016 topology 1052 1428 +> 15 0 25 1016 topology 1050 1429 +> 16 0 25 1016 topology 1051 1429 +> 15 0 25 1016 topology 1053 1430 +> 16 0 25 1016 topology 1055 1430 +> 15 0 25 1016 topology 1053 1431 +> 16 0 25 1016 topology 1054 1431 +> 15 0 25 1016 topology 1056 1432 +> 16 0 25 1016 topology 1058 1432 +> 15 0 25 1016 topology 1056 1433 +> 16 0 25 1016 topology 1057 1433 +> 15 0 25 1016 topology 1059 1434 +> 16 0 25 1016 topology 1061 1434 +> 15 0 25 1016 topology 1059 1435 +> 16 0 25 1016 topology 1060 1435 +> 15 0 25 1016 topology 1062 1436 +> 16 0 25 1016 topology 1064 1436 +> 15 0 25 1016 topology 1062 1437 +> 16 0 25 1016 topology 1063 1437 +> 15 0 25 1016 topology 1065 1438 +> 16 0 25 1016 topology 1067 1438 +> 15 0 25 1016 topology 1065 1439 +> 16 0 25 1016 topology 1066 1439 +> 15 0 25 1016 topology 1068 1440 +> 16 0 25 1016 topology 1070 1440 +> 15 0 25 1016 topology 1068 1441 +> 16 0 25 1016 topology 1069 1441 +> 15 0 25 1016 topology 1071 1442 +> 16 0 25 1016 topology 1073 1442 +> 15 0 25 1016 topology 1071 1443 +> 16 0 25 1016 topology 1072 1443 +> 15 0 25 1016 topology 1017 1444 +> 16 0 25 1016 topology 1019 1444 +> 15 0 25 1016 topology 1017 1445 +> 16 0 25 1016 topology 1018 1445 +> 15 0 25 1016 topology 1074 1446 +> 16 0 25 1016 topology 1076 1446 +> 15 0 25 1016 topology 1074 1447 +> 16 0 25 1016 topology 1075 1447 +> 15 0 25 1016 topology 1077 1448 +> 16 0 25 1016 topology 1079 1448 +> 15 0 25 1016 topology 1077 1449 +> 16 0 25 1016 topology 1078 1449 +> 15 0 25 1016 topology 1080 1450 +> 16 0 25 1016 topology 1082 1450 +> 15 0 25 1016 topology 1080 1451 +> 16 0 25 1016 topology 1081 1451 +> 15 0 25 1016 topology 1083 1452 +> 16 0 25 1016 topology 1085 1452 +> 15 0 25 1016 topology 1083 1453 +> 16 0 25 1016 topology 1084 1453 +> 15 0 25 1016 topology 1086 1454 +> 16 0 25 1016 topology 1088 1454 +> 15 0 25 1016 topology 1086 1455 +> 16 0 25 1016 topology 1087 1455 +> 15 0 25 1016 topology 1089 1456 +> 16 0 25 1016 topology 1091 1456 +> 15 0 25 1016 topology 1089 1457 +> 16 0 25 1016 topology 1090 1457 +> 15 0 25 1016 topology 1092 1458 +> 16 0 25 1016 topology 1094 1458 +> 15 0 25 1016 topology 1092 1459 +> 16 0 25 1016 topology 1093 1459 +> 15 0 25 1016 topology 1095 1460 +> 16 0 25 1016 topology 1097 1460 +> 15 0 25 1016 topology 1095 1461 +> 16 0 25 1016 topology 1096 1461 +> 15 0 25 1016 topology 1098 1462 +> 16 0 25 1016 topology 1100 1462 +> 15 0 25 1016 topology 1098 1463 +> 16 0 25 1016 topology 1099 1463 +> 15 0 25 1016 topology 1101 1464 +> 16 0 25 1016 topology 1103 1464 +> 15 0 25 1016 topology 1101 1465 +> 16 0 25 1016 topology 1102 1465 +> 15 0 25 1016 topology 1020 1466 +> 16 0 25 1016 topology 1022 1466 +> 15 0 25 1016 topology 1020 1467 +> 16 0 25 1016 topology 1021 1467 +> 15 0 25 1016 topology 1104 1468 +> 16 0 25 1016 topology 1106 1468 +> 15 0 25 1016 topology 1104 1469 +> 16 0 25 1016 topology 1105 1469 +> 15 0 25 1016 topology 1107 1470 +> 16 0 25 1016 topology 1109 1470 +> 15 0 25 1016 topology 1107 1471 +> 16 0 25 1016 topology 1108 1471 +> 15 0 25 1016 topology 1110 1472 +> 16 0 25 1016 topology 1112 1472 +> 15 0 25 1016 topology 1110 1473 +> 16 0 25 1016 topology 1111 1473 +> 15 0 25 1016 topology 1113 1474 +> 16 0 25 1016 topology 1115 1474 +> 15 0 25 1016 topology 1113 1475 +> 16 0 25 1016 topology 1114 1475 +> 15 0 25 1016 topology 1116 1476 +> 16 0 25 1016 topology 1118 1476 +> 15 0 25 1016 topology 1116 1477 +> 16 0 25 1016 topology 1117 1477 +> 15 0 25 1016 topology 1119 1478 +> 16 0 25 1016 topology 1121 1478 +> 15 0 25 1016 topology 1119 1479 +> 16 0 25 1016 topology 1120 1479 +> 15 0 25 1016 topology 1122 1480 +> 16 0 25 1016 topology 1124 1480 +> 15 0 25 1016 topology 1122 1481 +> 16 0 25 1016 topology 1123 1481 +> 15 0 25 1016 topology 1125 1482 +> 16 0 25 1016 topology 1127 1482 +> 15 0 25 1016 topology 1125 1483 +> 16 0 25 1016 topology 1126 1483 +> 15 0 25 1016 topology 1128 1484 +> 16 0 25 1016 topology 1130 1484 +> 15 0 25 1016 topology 1128 1485 +> 16 0 25 1016 topology 1129 1485 +> 15 0 25 1016 topology 1131 1486 +> 16 0 25 1016 topology 1133 1486 +> 15 0 25 1016 topology 1131 1487 +> 16 0 25 1016 topology 1132 1487 +> 15 0 25 1016 topology 1023 1488 +> 16 0 25 1016 topology 1025 1488 +> 15 0 25 1016 topology 1023 1489 +> 16 0 25 1016 topology 1024 1489 +> 15 0 25 1016 topology 1134 1490 +> 16 0 25 1016 topology 1136 1490 +> 15 0 25 1016 topology 1134 1491 +> 16 0 25 1016 topology 1135 1491 +> 15 0 25 1016 topology 1137 1492 +> 16 0 25 1016 topology 1139 1492 +> 15 0 25 1016 topology 1137 1493 +> 16 0 25 1016 topology 1138 1493 +> 15 0 25 1016 topology 1140 1494 +> 16 0 25 1016 topology 1142 1494 +> 15 0 25 1016 topology 1140 1495 +> 16 0 25 1016 topology 1141 1495 +> 15 0 25 1016 topology 1143 1496 +> 16 0 25 1016 topology 1145 1496 +> 15 0 25 1016 topology 1143 1497 +> 16 0 25 1016 topology 1144 1497 +> 15 0 25 1016 topology 1146 1498 +> 16 0 25 1016 topology 1148 1498 +> 15 0 25 1016 topology 1146 1499 +> 16 0 25 1016 topology 1147 1499 +> 15 0 25 1016 topology 1149 1500 +> 16 0 25 1016 topology 1151 1500 +> 15 0 25 1016 topology 1149 1501 +> 16 0 25 1016 topology 1150 1501 +> 15 0 25 1016 topology 1152 1502 +> 16 0 25 1016 topology 1154 1502 +> 15 0 25 1016 topology 1152 1503 +> 16 0 25 1016 topology 1153 1503 +> 15 0 25 1016 topology 1026 1504 +> 16 0 25 1016 topology 1028 1504 +> 15 0 25 1016 topology 1026 1505 +> 16 0 25 1016 topology 1027 1505 +> 15 0 25 1016 topology 1029 1506 +> 16 0 25 1016 topology 1031 1506 +> 15 0 25 1016 topology 1029 1507 +> 16 0 25 1016 topology 1030 1507 +> 15 0 25 1016 topology 1032 1508 +> 16 0 25 1016 topology 1034 1508 +> 15 0 25 1016 topology 1032 1509 +> 16 0 25 1016 topology 1033 1509 +> 15 0 25 1016 topology 1035 1510 +> 16 0 25 1016 topology 1037 1510 +> 15 0 25 1016 topology 1035 1511 +> 16 0 25 1016 topology 1036 1511 +> 15 0 25 1016 topology 1038 1512 +> 16 0 25 1016 topology 1040 1512 +> 15 0 25 1016 topology 1038 1513 +> 16 0 25 1016 topology 1039 1513 +> 15 0 25 1016 topology 1041 1514 +> 16 0 25 1016 topology 1043 1514 +> 15 0 25 1016 topology 1041 1515 +> 16 0 25 1016 topology 1042 1515 +> 15 0 23 1158 topology 1161 1516 > 16 0 23 1158 topology 1184 1516 -> 15 0 24 1158 topology 1159 1517 -> 16 0 24 1158 topology 1161 1517 -> 15 0 24 1158 topology 1162 1518 -> 16 0 24 1158 topology 1164 1518 -> 15 0 24 1158 topology 1165 1519 -> 16 0 24 1158 topology 1167 1519 -> 15 0 24 1158 topology 1168 1520 -> 16 0 24 1158 topology 1170 1520 -> 15 0 24 1158 topology 1171 1521 -> 16 0 24 1158 topology 1173 1521 -> 15 0 24 1158 topology 1174 1522 -> 16 0 24 1158 topology 1176 1522 -> 15 0 23 1158 topology 1164 1523 +> 15 0 23 1158 topology 1160 1517 +> 16 0 23 1158 topology 1184 1517 +> 15 0 23 1158 topology 1164 1518 +> 16 0 23 1158 topology 1184 1518 +> 15 0 23 1158 topology 1163 1519 +> 16 0 23 1158 topology 1184 1519 +> 15 0 23 1158 topology 1167 1520 +> 16 0 23 1158 topology 1184 1520 +> 15 0 23 1158 topology 1166 1521 +> 16 0 23 1158 topology 1184 1521 +> 15 0 23 1158 topology 1170 1522 +> 16 0 23 1158 topology 1184 1522 +> 15 0 23 1158 topology 1169 1523 > 16 0 23 1158 topology 1184 1523 -> 15 0 24 1158 topology 1177 1524 -> 16 0 24 1158 topology 1179 1524 -> 15 0 24 1158 topology 1180 1525 -> 16 0 24 1158 topology 1182 1525 -> 15 0 24 1158 topology 1162 1526 -> 16 0 24 1158 topology 1163 1526 -> 15 0 23 1158 topology 1176 1527 +> 15 0 23 1158 topology 1173 1524 +> 16 0 23 1158 topology 1184 1524 +> 15 0 23 1158 topology 1172 1525 +> 16 0 23 1158 topology 1184 1525 +> 15 0 23 1158 topology 1176 1526 +> 16 0 23 1158 topology 1184 1526 +> 15 0 23 1158 topology 1175 1527 > 16 0 23 1158 topology 1184 1527 -> 15 0 24 1158 topology 1168 1528 -> 16 0 24 1158 topology 1169 1528 -> 15 0 23 1158 topology 1160 1529 +> 15 0 23 1158 topology 1179 1528 +> 16 0 23 1158 topology 1184 1528 +> 15 0 23 1158 topology 1178 1529 > 16 0 23 1158 topology 1184 1529 -> 15 0 24 1158 topology 1174 1530 -> 16 0 24 1158 topology 1175 1530 -> 15 0 23 1158 topology 1172 1531 +> 15 0 23 1158 topology 1182 1530 +> 16 0 23 1158 topology 1184 1530 +> 15 0 23 1158 topology 1181 1531 > 16 0 23 1158 topology 1184 1531 -> 15 0 24 1158 topology 1180 1532 -> 16 0 24 1158 topology 1181 1532 -> 15 0 23 1158 topology 1167 1533 -> 16 0 23 1158 topology 1184 1533 -> 15 0 23 1158 topology 1179 1534 -> 16 0 23 1158 topology 1184 1534 -> 15 0 25 1158 topology 1183 1535 -> 16 0 25 1158 topology 1184 1535 -> 15 0 23 1158 topology 1169 1536 -> 16 0 23 1158 topology 1184 1536 -> 15 0 23 1158 topology 1181 1537 -> 16 0 23 1158 topology 1184 1537 -> 15 0 24 1158 topology 1159 1538 -> 16 0 24 1158 topology 1160 1538 -> 15 0 23 1158 topology 1170 1539 -> 16 0 23 1158 topology 1184 1539 -> 15 0 24 1158 topology 1165 1540 -> 16 0 24 1158 topology 1166 1540 -> 15 0 23 1158 topology 1182 1541 -> 16 0 23 1158 topology 1184 1541 -> 15 0 24 1158 topology 1171 1542 -> 16 0 24 1158 topology 1172 1542 -> 15 0 23 1158 topology 1166 1543 -> 16 0 23 1158 topology 1184 1543 -> 15 0 24 1158 topology 1177 1544 -> 16 0 24 1158 topology 1178 1544 -> 15 0 23 1158 topology 1178 1545 -> 16 0 23 1158 topology 1184 1545 -> 15 0 23 1158 topology 1161 1546 -> 16 0 23 1158 topology 1184 1546 -> 15 0 23 1158 topology 1173 1547 -> 16 0 23 1158 topology 1184 1547 -> 15 0 23 1158 topology 1163 1548 -> 16 0 23 1158 topology 1184 1548 -> 15 0 26 869 topology 1157 1549 -> 16 0 26 869 topology 1187 1549 -> 15 0 27 869 topology 949 1550 -> 16 0 27 869 topology 951 1550 +> 15 0 24 1158 topology 1183 1532 +> 16 0 24 1158 topology 1184 1532 +> 15 0 25 1158 topology 1159 1533 +> 16 0 25 1158 topology 1161 1533 +> 15 0 25 1158 topology 1159 1534 +> 16 0 25 1158 topology 1160 1534 +> 15 0 25 1158 topology 1162 1535 +> 16 0 25 1158 topology 1164 1535 +> 15 0 25 1158 topology 1162 1536 +> 16 0 25 1158 topology 1163 1536 +> 15 0 25 1158 topology 1165 1537 +> 16 0 25 1158 topology 1167 1537 +> 15 0 25 1158 topology 1165 1538 +> 16 0 25 1158 topology 1166 1538 +> 15 0 25 1158 topology 1168 1539 +> 16 0 25 1158 topology 1170 1539 +> 15 0 25 1158 topology 1168 1540 +> 16 0 25 1158 topology 1169 1540 +> 15 0 25 1158 topology 1171 1541 +> 16 0 25 1158 topology 1173 1541 +> 15 0 25 1158 topology 1171 1542 +> 16 0 25 1158 topology 1172 1542 +> 15 0 25 1158 topology 1174 1543 +> 16 0 25 1158 topology 1176 1543 +> 15 0 25 1158 topology 1174 1544 +> 16 0 25 1158 topology 1175 1544 +> 15 0 25 1158 topology 1177 1545 +> 16 0 25 1158 topology 1179 1545 +> 15 0 25 1158 topology 1177 1546 +> 16 0 25 1158 topology 1178 1546 +> 15 0 25 1158 topology 1180 1547 +> 16 0 25 1158 topology 1182 1547 +> 15 0 25 1158 topology 1180 1548 +> 16 0 25 1158 topology 1181 1548 +> 15 0 26 869 topology 1015 1549 +> 16 0 26 869 topology 1013 1549 +> 15 0 26 869 topology 1157 1550 +> 16 0 26 869 topology 1155 1550 > 15 0 26 869 topology 1185 1551 -> 16 0 26 869 topology 1187 1551 -> 15 0 26 869 topology 1015 1552 -> 16 0 26 869 topology 1013 1552 -> 15 0 21 869 topology 1015 1553 -> 16 0 21 869 topology 1185 1553 -> 15 0 21 869 topology 951 1554 -> 16 0 21 869 topology 1185 1554 -> 15 0 26 869 topology 1015 1555 +> 16 0 26 869 topology 1183 1551 +> 15 0 26 869 topology 951 1552 +> 16 0 26 869 topology 1187 1552 +> 15 0 26 869 topology 1015 1553 +> 16 0 26 869 topology 1187 1553 +> 15 0 26 869 topology 1157 1554 +> 16 0 26 869 topology 1187 1554 +> 15 0 26 869 topology 1185 1555 > 16 0 26 869 topology 1187 1555 -> 15 0 21 869 topology 1015 1556 -> 16 0 21 869 topology 1157 1556 -> 15 0 26 869 topology 951 1557 -> 16 0 26 869 topology 1187 1557 -> 15 0 21 869 topology 1157 1558 -> 16 0 21 869 topology 1185 1558 -> 15 0 26 869 topology 1185 1559 -> 16 0 26 869 topology 1183 1559 -> 15 0 21 869 topology 951 1560 -> 16 0 21 869 topology 1015 1560 -> 15 0 26 869 topology 1157 1561 -> 16 0 26 869 topology 1155 1561 -> 15 0 21 869 topology 951 1562 -> 16 0 21 869 topology 1157 1562 -> 15 0 23 1190 topology 1231 1563 +> 15 0 27 869 topology 949 1556 +> 16 0 27 869 topology 951 1556 +> 15 0 20 869 topology 951 1557 +> 16 0 20 869 topology 1015 1557 +> 15 0 20 869 topology 951 1558 +> 16 0 20 869 topology 1157 1558 +> 15 0 20 869 topology 1015 1559 +> 16 0 20 869 topology 1157 1559 +> 15 0 20 869 topology 951 1560 +> 16 0 20 869 topology 1185 1560 +> 15 0 20 869 topology 1015 1561 +> 16 0 20 869 topology 1185 1561 +> 15 0 20 869 topology 1157 1562 +> 16 0 20 869 topology 1185 1562 +> 15 0 23 1190 topology 1220 1563 > 16 0 23 1190 topology 1360 1563 -> 15 0 24 1190 topology 1320 1564 -> 16 0 24 1190 topology 1321 1564 -> 15 0 23 1190 topology 1202 1565 +> 15 0 23 1190 topology 1219 1564 +> 16 0 23 1190 topology 1360 1564 +> 15 0 23 1190 topology 1223 1565 > 16 0 23 1190 topology 1360 1565 -> 15 0 23 1190 topology 1291 1566 +> 15 0 23 1190 topology 1222 1566 > 16 0 23 1190 topology 1360 1566 -> 15 0 24 1190 topology 1296 1567 -> 16 0 24 1190 topology 1297 1567 -> 15 0 24 1190 topology 1272 1568 -> 16 0 24 1190 topology 1273 1568 -> 15 0 23 1190 topology 1351 1569 +> 15 0 23 1190 topology 1226 1567 +> 16 0 23 1190 topology 1360 1567 +> 15 0 23 1190 topology 1225 1568 +> 16 0 23 1190 topology 1360 1568 +> 15 0 23 1190 topology 1229 1569 > 16 0 23 1190 topology 1360 1569 -> 15 0 23 1190 topology 1273 1570 +> 15 0 23 1190 topology 1228 1570 > 16 0 23 1190 topology 1360 1570 -> 15 0 24 1190 topology 1356 1571 -> 16 0 24 1190 topology 1357 1571 -> 15 0 24 1190 topology 1248 1572 -> 16 0 24 1190 topology 1250 1572 -> 15 0 23 1190 topology 1333 1573 +> 15 0 23 1190 topology 1232 1571 +> 16 0 23 1190 topology 1360 1571 +> 15 0 23 1190 topology 1231 1572 +> 16 0 23 1190 topology 1360 1572 +> 15 0 23 1190 topology 1235 1573 > 16 0 23 1190 topology 1360 1573 -> 15 0 24 1190 topology 1332 1574 -> 16 0 24 1190 topology 1333 1574 -> 15 0 24 1190 topology 1254 1575 -> 16 0 24 1190 topology 1256 1575 -> 15 0 24 1190 topology 1311 1576 -> 16 0 24 1190 topology 1313 1576 -> 15 0 23 1190 topology 1198 1577 +> 15 0 23 1190 topology 1234 1574 +> 16 0 23 1190 topology 1360 1574 +> 15 0 23 1190 topology 1238 1575 +> 16 0 23 1190 topology 1360 1575 +> 15 0 23 1190 topology 1237 1576 +> 16 0 23 1190 topology 1360 1576 +> 15 0 23 1190 topology 1241 1577 > 16 0 23 1190 topology 1360 1577 -> 15 0 24 1190 topology 1260 1578 -> 16 0 24 1190 topology 1262 1578 -> 15 0 23 1190 topology 1250 1579 +> 15 0 23 1190 topology 1240 1578 +> 16 0 23 1190 topology 1360 1578 +> 15 0 23 1190 topology 1244 1579 > 16 0 23 1190 topology 1360 1579 -> 15 0 24 1190 topology 1209 1580 -> 16 0 24 1190 topology 1211 1580 -> 15 0 24 1190 topology 1317 1581 -> 16 0 24 1190 topology 1319 1581 -> 15 0 24 1190 topology 1266 1582 -> 16 0 24 1190 topology 1268 1582 -> 15 0 23 1190 topology 1286 1583 +> 15 0 23 1190 topology 1243 1580 +> 16 0 23 1190 topology 1360 1580 +> 15 0 23 1190 topology 1247 1581 +> 16 0 23 1190 topology 1360 1581 +> 15 0 23 1190 topology 1246 1582 +> 16 0 23 1190 topology 1360 1582 +> 15 0 23 1190 topology 1193 1583 > 16 0 23 1190 topology 1360 1583 -> 15 0 23 1190 topology 1238 1584 +> 15 0 23 1190 topology 1192 1584 > 16 0 23 1190 topology 1360 1584 -> 15 0 24 1190 topology 1323 1585 -> 16 0 24 1190 topology 1325 1585 -> 15 0 23 1190 topology 1322 1586 +> 15 0 23 1190 topology 1250 1585 +> 16 0 23 1190 topology 1360 1585 +> 15 0 23 1190 topology 1249 1586 > 16 0 23 1190 topology 1360 1586 -> 15 0 24 1190 topology 1272 1587 -> 16 0 24 1190 topology 1274 1587 -> 15 0 23 1190 topology 1274 1588 +> 15 0 23 1190 topology 1253 1587 +> 16 0 23 1190 topology 1360 1587 +> 15 0 23 1190 topology 1252 1588 > 16 0 23 1190 topology 1360 1588 -> 15 0 24 1190 topology 1329 1589 -> 16 0 24 1190 topology 1331 1589 -> 15 0 23 1190 topology 1358 1590 +> 15 0 23 1190 topology 1256 1589 +> 16 0 23 1190 topology 1360 1589 +> 15 0 23 1190 topology 1255 1590 > 16 0 23 1190 topology 1360 1590 -> 15 0 24 1190 topology 1335 1591 -> 16 0 24 1190 topology 1337 1591 -> 15 0 24 1190 topology 1209 1592 -> 16 0 24 1190 topology 1210 1592 -> 15 0 23 1190 topology 1193 1593 +> 15 0 23 1190 topology 1259 1591 +> 16 0 23 1190 topology 1360 1591 +> 15 0 23 1190 topology 1258 1592 +> 16 0 23 1190 topology 1360 1592 +> 15 0 23 1190 topology 1262 1593 > 16 0 23 1190 topology 1360 1593 -> 15 0 23 1190 topology 1258 1594 +> 15 0 23 1190 topology 1261 1594 > 16 0 23 1190 topology 1360 1594 -> 15 0 23 1190 topology 1318 1595 +> 15 0 23 1190 topology 1265 1595 > 16 0 23 1190 topology 1360 1595 -> 15 0 23 1190 topology 1240 1596 +> 15 0 23 1190 topology 1264 1596 > 16 0 23 1190 topology 1360 1596 -> 15 0 23 1190 topology 1300 1597 +> 15 0 23 1190 topology 1268 1597 > 16 0 23 1190 topology 1360 1597 -> 15 0 24 1190 topology 1194 1598 -> 16 0 24 1190 topology 1196 1598 -> 15 0 23 1190 topology 1217 1599 +> 15 0 23 1190 topology 1267 1598 +> 16 0 23 1190 topology 1360 1598 +> 15 0 23 1190 topology 1271 1599 > 16 0 23 1190 topology 1360 1599 -> 15 0 23 1190 topology 1207 1600 +> 15 0 23 1190 topology 1270 1600 > 16 0 23 1190 topology 1360 1600 -> 15 0 23 1190 topology 1229 1601 +> 15 0 23 1190 topology 1274 1601 > 16 0 23 1190 topology 1360 1601 -> 15 0 23 1190 topology 1313 1602 +> 15 0 23 1190 topology 1273 1602 > 16 0 23 1190 topology 1360 1602 -> 15 0 23 1190 topology 1265 1603 +> 15 0 23 1190 topology 1277 1603 > 16 0 23 1190 topology 1360 1603 -> 15 0 24 1190 topology 1251 1604 -> 16 0 24 1190 topology 1252 1604 -> 15 0 23 1190 topology 1349 1605 +> 15 0 23 1190 topology 1276 1604 +> 16 0 23 1190 topology 1360 1604 +> 15 0 23 1190 topology 1196 1605 > 16 0 23 1190 topology 1360 1605 -> 15 0 24 1190 topology 1227 1606 -> 16 0 24 1190 topology 1228 1606 -> 15 0 23 1190 topology 1301 1607 +> 15 0 23 1190 topology 1195 1606 +> 16 0 23 1190 topology 1360 1606 +> 15 0 23 1190 topology 1280 1607 > 16 0 23 1190 topology 1360 1607 -> 15 0 24 1190 topology 1311 1608 -> 16 0 24 1190 topology 1312 1608 -> 15 0 23 1190 topology 1337 1609 +> 15 0 23 1190 topology 1279 1608 +> 16 0 23 1190 topology 1360 1608 +> 15 0 23 1190 topology 1283 1609 > 16 0 23 1190 topology 1360 1609 -> 15 0 24 1190 topology 1287 1610 -> 16 0 24 1190 topology 1288 1610 -> 15 0 23 1190 topology 1225 1611 +> 15 0 23 1190 topology 1282 1610 +> 16 0 23 1190 topology 1360 1610 +> 15 0 23 1190 topology 1286 1611 > 16 0 23 1190 topology 1360 1611 -> 15 0 24 1190 topology 1263 1612 -> 16 0 24 1190 topology 1264 1612 -> 15 0 24 1190 topology 1212 1613 -> 16 0 24 1190 topology 1213 1613 -> 15 0 24 1190 topology 1239 1614 -> 16 0 24 1190 topology 1240 1614 -> 15 0 23 1190 topology 1285 1615 +> 15 0 23 1190 topology 1285 1612 +> 16 0 23 1190 topology 1360 1612 +> 15 0 23 1190 topology 1289 1613 +> 16 0 23 1190 topology 1360 1613 +> 15 0 23 1190 topology 1288 1614 +> 16 0 23 1190 topology 1360 1614 +> 15 0 23 1190 topology 1292 1615 > 16 0 23 1190 topology 1360 1615 -> 15 0 24 1190 topology 1347 1616 -> 16 0 24 1190 topology 1348 1616 -> 15 0 24 1190 topology 1323 1617 -> 16 0 24 1190 topology 1324 1617 -> 15 0 23 1190 topology 1345 1618 +> 15 0 23 1190 topology 1291 1616 +> 16 0 23 1190 topology 1360 1616 +> 15 0 23 1190 topology 1295 1617 +> 16 0 23 1190 topology 1360 1617 +> 15 0 23 1190 topology 1294 1618 > 16 0 23 1190 topology 1360 1618 -> 15 0 23 1190 topology 1267 1619 +> 15 0 23 1190 topology 1298 1619 > 16 0 23 1190 topology 1360 1619 -> 15 0 23 1190 topology 1208 1620 +> 15 0 23 1190 topology 1297 1620 > 16 0 23 1190 topology 1360 1620 -> 15 0 24 1190 topology 1299 1621 -> 16 0 24 1190 topology 1300 1621 -> 15 0 24 1190 topology 1218 1622 -> 16 0 24 1190 topology 1220 1622 -> 15 0 23 1190 topology 1327 1623 +> 15 0 23 1190 topology 1301 1621 +> 16 0 23 1190 topology 1360 1621 +> 15 0 23 1190 topology 1300 1622 +> 16 0 23 1190 topology 1360 1622 +> 15 0 23 1190 topology 1304 1623 > 16 0 23 1190 topology 1360 1623 -> 15 0 24 1190 topology 1275 1624 -> 16 0 24 1190 topology 1276 1624 -> 15 0 24 1190 topology 1224 1625 -> 16 0 24 1190 topology 1226 1625 -> 15 0 24 1190 topology 1335 1626 -> 16 0 24 1190 topology 1336 1626 -> 15 0 24 1190 topology 1281 1627 -> 16 0 24 1190 topology 1283 1627 -> 15 0 23 1190 topology 1192 1628 +> 15 0 23 1190 topology 1303 1624 +> 16 0 23 1190 topology 1360 1624 +> 15 0 23 1190 topology 1307 1625 +> 16 0 23 1190 topology 1360 1625 +> 15 0 23 1190 topology 1306 1626 +> 16 0 23 1190 topology 1360 1626 +> 15 0 23 1190 topology 1199 1627 +> 16 0 23 1190 topology 1360 1627 +> 15 0 23 1190 topology 1198 1628 > 16 0 23 1190 topology 1360 1628 -> 15 0 24 1190 topology 1203 1629 -> 16 0 24 1190 topology 1205 1629 -> 15 0 24 1190 topology 1230 1630 -> 16 0 24 1190 topology 1232 1630 -> 15 0 24 1190 topology 1338 1631 -> 16 0 24 1190 topology 1340 1631 -> 15 0 23 1190 topology 1220 1632 +> 15 0 23 1190 topology 1310 1629 +> 16 0 23 1190 topology 1360 1629 +> 15 0 23 1190 topology 1309 1630 +> 16 0 23 1190 topology 1360 1630 +> 15 0 23 1190 topology 1313 1631 +> 16 0 23 1190 topology 1360 1631 +> 15 0 23 1190 topology 1312 1632 > 16 0 23 1190 topology 1360 1632 -> 15 0 24 1190 topology 1287 1633 -> 16 0 24 1190 topology 1289 1633 -> 15 0 24 1190 topology 1236 1634 -> 16 0 24 1190 topology 1238 1634 -> 15 0 24 1190 topology 1344 1635 -> 16 0 24 1190 topology 1346 1635 -> 15 0 24 1190 topology 1191 1636 -> 16 0 24 1190 topology 1192 1636 -> 15 0 23 1190 topology 1256 1637 +> 15 0 23 1190 topology 1316 1633 +> 16 0 23 1190 topology 1360 1633 +> 15 0 23 1190 topology 1315 1634 +> 16 0 23 1190 topology 1360 1634 +> 15 0 23 1190 topology 1319 1635 +> 16 0 23 1190 topology 1360 1635 +> 15 0 23 1190 topology 1318 1636 +> 16 0 23 1190 topology 1360 1636 +> 15 0 23 1190 topology 1322 1637 > 16 0 23 1190 topology 1360 1637 -> 15 0 24 1190 topology 1293 1638 -> 16 0 24 1190 topology 1295 1638 -> 15 0 23 1190 topology 1340 1639 +> 15 0 23 1190 topology 1321 1638 +> 16 0 23 1190 topology 1360 1638 +> 15 0 23 1190 topology 1325 1639 > 16 0 23 1190 topology 1360 1639 -> 15 0 23 1190 topology 1216 1640 +> 15 0 23 1190 topology 1324 1640 > 16 0 23 1190 topology 1360 1640 -> 15 0 24 1190 topology 1242 1641 -> 16 0 24 1190 topology 1244 1641 -> 15 0 23 1190 topology 1292 1642 +> 15 0 23 1190 topology 1328 1641 +> 16 0 23 1190 topology 1360 1641 +> 15 0 23 1190 topology 1327 1642 > 16 0 23 1190 topology 1360 1642 -> 15 0 24 1190 topology 1350 1643 -> 16 0 24 1190 topology 1352 1643 -> 15 0 23 1190 topology 1244 1644 +> 15 0 23 1190 topology 1331 1643 +> 16 0 23 1190 topology 1360 1643 +> 15 0 23 1190 topology 1330 1644 > 16 0 23 1190 topology 1360 1644 -> 15 0 24 1190 topology 1299 1645 -> 16 0 24 1190 topology 1301 1645 -> 15 0 23 1190 topology 1328 1646 +> 15 0 23 1190 topology 1334 1645 +> 16 0 23 1190 topology 1360 1645 +> 15 0 23 1190 topology 1333 1646 > 16 0 23 1190 topology 1360 1646 -> 15 0 24 1190 topology 1356 1647 -> 16 0 24 1190 topology 1358 1647 -> 15 0 24 1190 topology 1305 1648 -> 16 0 24 1190 topology 1307 1648 -> 15 0 23 1190 topology 1252 1649 +> 15 0 23 1190 topology 1337 1647 +> 16 0 23 1190 topology 1360 1647 +> 15 0 23 1190 topology 1336 1648 +> 16 0 23 1190 topology 1360 1648 +> 15 0 23 1190 topology 1202 1649 > 16 0 23 1190 topology 1360 1649 -> 15 0 23 1190 topology 1312 1650 +> 15 0 23 1190 topology 1201 1650 > 16 0 23 1190 topology 1360 1650 -> 15 0 23 1190 topology 1199 1651 +> 15 0 23 1190 topology 1340 1651 > 16 0 23 1190 topology 1360 1651 -> 15 0 23 1190 topology 1234 1652 +> 15 0 23 1190 topology 1339 1652 > 16 0 23 1190 topology 1360 1652 -> 15 0 24 1190 topology 1215 1653 -> 16 0 24 1190 topology 1216 1653 -> 15 0 23 1190 topology 1294 1654 +> 15 0 23 1190 topology 1343 1653 +> 16 0 23 1190 topology 1360 1653 +> 15 0 23 1190 topology 1342 1654 > 16 0 23 1190 topology 1360 1654 -> 15 0 23 1190 topology 1354 1655 +> 15 0 23 1190 topology 1346 1655 > 16 0 23 1190 topology 1360 1655 -> 15 0 23 1190 topology 1276 1656 +> 15 0 23 1190 topology 1345 1656 > 16 0 23 1190 topology 1360 1656 -> 15 0 23 1190 topology 1336 1657 +> 15 0 23 1190 topology 1349 1657 > 16 0 23 1190 topology 1360 1657 -> 15 0 23 1190 topology 1201 1658 +> 15 0 23 1190 topology 1348 1658 > 16 0 23 1190 topology 1360 1658 -> 15 0 24 1190 topology 1218 1659 -> 16 0 24 1190 topology 1219 1659 -> 15 0 23 1190 topology 1283 1660 +> 15 0 23 1190 topology 1352 1659 +> 16 0 23 1190 topology 1360 1659 +> 15 0 23 1190 topology 1351 1660 > 16 0 23 1190 topology 1360 1660 -> 15 0 24 1190 topology 1212 1661 -> 16 0 24 1190 topology 1214 1661 -> 15 0 24 1190 topology 1194 1662 -> 16 0 24 1190 topology 1195 1662 -> 15 0 23 1190 topology 1235 1663 +> 15 0 23 1190 topology 1355 1661 +> 16 0 23 1190 topology 1360 1661 +> 15 0 23 1190 topology 1354 1662 +> 16 0 23 1190 topology 1360 1662 +> 15 0 23 1190 topology 1358 1663 > 16 0 23 1190 topology 1360 1663 -> 15 0 23 1190 topology 1319 1664 +> 15 0 23 1190 topology 1357 1664 > 16 0 23 1190 topology 1360 1664 -> 15 0 24 1190 topology 1278 1665 -> 16 0 24 1190 topology 1279 1665 -> 15 0 23 1190 topology 1271 1666 +> 15 0 23 1190 topology 1205 1665 +> 16 0 23 1190 topology 1360 1665 +> 15 0 23 1190 topology 1204 1666 > 16 0 23 1190 topology 1360 1666 -> 15 0 24 1190 topology 1254 1667 -> 16 0 24 1190 topology 1255 1667 -> 15 0 23 1190 topology 1355 1668 +> 15 0 23 1190 topology 1208 1667 +> 16 0 23 1190 topology 1360 1667 +> 15 0 23 1190 topology 1207 1668 > 16 0 23 1190 topology 1360 1668 -> 15 0 24 1190 topology 1230 1669 -> 16 0 24 1190 topology 1231 1669 -> 15 0 23 1190 topology 1307 1670 +> 15 0 23 1190 topology 1211 1669 +> 16 0 23 1190 topology 1360 1669 +> 15 0 23 1190 topology 1210 1670 > 16 0 23 1190 topology 1360 1670 -> 15 0 24 1190 topology 1338 1671 -> 16 0 24 1190 topology 1339 1671 -> 15 0 23 1190 topology 1219 1672 +> 15 0 23 1190 topology 1214 1671 +> 16 0 23 1190 topology 1360 1671 +> 15 0 23 1190 topology 1213 1672 > 16 0 23 1190 topology 1360 1672 -> 15 0 24 1190 topology 1314 1673 -> 16 0 24 1190 topology 1315 1673 -> 15 0 23 1190 topology 1279 1674 +> 15 0 23 1190 topology 1217 1673 +> 16 0 23 1190 topology 1360 1673 +> 15 0 23 1190 topology 1216 1674 > 16 0 23 1190 topology 1360 1674 -> 15 0 24 1190 topology 1290 1675 -> 16 0 24 1190 topology 1291 1675 -> 15 0 24 1190 topology 1266 1676 -> 16 0 24 1190 topology 1267 1676 -> 15 0 23 1190 topology 1339 1677 -> 16 0 23 1190 topology 1360 1677 -> 15 0 23 1190 topology 1261 1678 -> 16 0 23 1190 topology 1360 1678 -> 15 0 24 1190 topology 1242 1679 -> 16 0 24 1190 topology 1243 1679 -> 15 0 24 1190 topology 1350 1680 -> 16 0 24 1190 topology 1351 1680 -> 15 0 23 1190 topology 1321 1681 -> 16 0 23 1190 topology 1360 1681 -> 15 0 24 1190 topology 1326 1682 -> 16 0 24 1190 topology 1327 1682 -> 15 0 23 1190 topology 1243 1683 -> 16 0 23 1190 topology 1360 1683 -> 15 0 23 1190 topology 1303 1684 -> 16 0 23 1190 topology 1360 1684 -> 15 0 24 1190 topology 1302 1685 -> 16 0 24 1190 topology 1303 1685 -> 15 0 23 1190 topology 1214 1686 -> 16 0 23 1190 topology 1360 1686 -> 15 0 24 1190 topology 1251 1687 -> 16 0 24 1190 topology 1253 1687 -> 15 0 24 1190 topology 1197 1688 -> 16 0 24 1190 topology 1199 1688 -> 15 0 24 1190 topology 1308 1689 -> 16 0 24 1190 topology 1310 1689 -> 15 0 24 1190 topology 1257 1690 -> 16 0 24 1190 topology 1259 1690 -> 15 0 25 1190 topology 1359 1691 -> 16 0 25 1190 topology 1360 1691 -> 15 0 24 1190 topology 1314 1692 -> 16 0 24 1190 topology 1316 1692 -> 15 0 24 1190 topology 1263 1693 -> 16 0 24 1190 topology 1265 1693 -> 15 0 23 1190 topology 1226 1694 -> 16 0 23 1190 topology 1360 1694 -> 15 0 23 1190 topology 1310 1695 -> 16 0 23 1190 topology 1360 1695 -> 15 0 23 1190 topology 1210 1696 -> 16 0 23 1190 topology 1360 1696 -> 15 0 24 1190 topology 1320 1697 -> 16 0 24 1190 topology 1322 1697 -> 15 0 23 1190 topology 1262 1698 -> 16 0 23 1190 topology 1360 1698 -> 15 0 24 1190 topology 1269 1699 -> 16 0 24 1190 topology 1271 1699 -> 15 0 23 1190 topology 1346 1700 -> 16 0 23 1190 topology 1360 1700 -> 15 0 24 1190 topology 1197 1701 -> 16 0 24 1190 topology 1198 1701 -> 15 0 24 1190 topology 1326 1702 -> 16 0 24 1190 topology 1328 1702 -> 15 0 23 1190 topology 1298 1703 -> 16 0 23 1190 topology 1360 1703 -> 15 0 24 1190 topology 1275 1704 -> 16 0 24 1190 topology 1277 1704 -> 15 0 23 1190 topology 1334 1705 -> 16 0 23 1190 topology 1360 1705 -> 15 0 24 1190 topology 1332 1706 -> 16 0 24 1190 topology 1334 1706 -> 15 0 23 1190 topology 1228 1707 -> 16 0 23 1190 topology 1360 1707 -> 15 0 23 1190 topology 1288 1708 -> 16 0 23 1190 topology 1360 1708 -> 15 0 23 1190 topology 1205 1709 -> 16 0 23 1190 topology 1360 1709 -> 15 0 23 1190 topology 1348 1710 -> 16 0 23 1190 topology 1360 1710 -> 15 0 23 1190 topology 1270 1711 -> 16 0 23 1190 topology 1360 1711 -> 15 0 23 1190 topology 1330 1712 -> 16 0 23 1190 topology 1360 1712 -> 15 0 23 1190 topology 1195 1713 -> 16 0 23 1190 topology 1360 1713 -> 15 0 24 1190 topology 1206 1714 -> 16 0 24 1190 topology 1208 1714 -> 15 0 23 1190 topology 1253 1715 -> 16 0 23 1190 topology 1360 1715 -> 15 0 23 1190 topology 1289 1716 -> 16 0 23 1190 topology 1360 1716 -> 15 0 24 1190 topology 1221 1717 -> 16 0 24 1190 topology 1222 1717 -> 15 0 23 1190 topology 1241 1718 -> 16 0 23 1190 topology 1360 1718 -> 15 0 23 1190 topology 1325 1719 -> 16 0 23 1190 topology 1360 1719 -> 15 0 24 1190 topology 1281 1720 -> 16 0 24 1190 topology 1282 1720 -> 15 0 24 1190 topology 1200 1721 -> 16 0 24 1190 topology 1201 1721 -> 15 0 23 1190 topology 1277 1722 -> 16 0 23 1190 topology 1360 1722 -> 15 0 24 1190 topology 1257 1723 -> 16 0 24 1190 topology 1258 1723 -> 15 0 24 1190 topology 1233 1724 -> 16 0 24 1190 topology 1234 1724 -> 15 0 24 1190 topology 1341 1725 -> 16 0 24 1190 topology 1342 1725 -> 15 0 24 1190 topology 1317 1726 -> 16 0 24 1190 topology 1318 1726 -> 15 0 23 1190 topology 1255 1727 -> 16 0 23 1190 topology 1360 1727 -> 15 0 24 1190 topology 1293 1728 -> 16 0 24 1190 topology 1294 1728 -> 15 0 23 1190 topology 1196 1729 -> 16 0 23 1190 topology 1360 1729 -> 15 0 23 1190 topology 1315 1730 -> 16 0 23 1190 topology 1360 1730 -> 15 0 24 1190 topology 1269 1731 -> 16 0 24 1190 topology 1270 1731 -> 15 0 23 1190 topology 1237 1732 -> 16 0 23 1190 topology 1360 1732 -> 15 0 23 1190 topology 1297 1733 -> 16 0 23 1190 topology 1360 1733 -> 15 0 24 1190 topology 1245 1734 -> 16 0 24 1190 topology 1246 1734 -> 15 0 24 1190 topology 1353 1735 -> 16 0 24 1190 topology 1354 1735 -> 15 0 24 1190 topology 1191 1736 -> 16 0 24 1190 topology 1193 1736 -> 15 0 24 1190 topology 1329 1737 -> 16 0 24 1190 topology 1330 1737 -> 15 0 23 1190 topology 1357 1738 -> 16 0 23 1190 topology 1360 1738 -> 15 0 24 1190 topology 1221 1739 -> 16 0 24 1190 topology 1223 1739 -> 15 0 24 1190 topology 1305 1740 -> 16 0 24 1190 topology 1306 1740 -> 15 0 24 1190 topology 1278 1741 -> 16 0 24 1190 topology 1280 1741 -> 15 0 24 1190 topology 1227 1742 -> 16 0 24 1190 topology 1229 1742 -> 15 0 24 1190 topology 1284 1743 -> 16 0 24 1190 topology 1286 1743 -> 15 0 24 1190 topology 1233 1744 -> 16 0 24 1190 topology 1235 1744 -> 15 0 24 1190 topology 1341 1745 -> 16 0 24 1190 topology 1343 1745 -> 15 0 23 1190 topology 1204 1746 -> 16 0 23 1190 topology 1360 1746 -> 15 0 24 1190 topology 1290 1747 -> 16 0 24 1190 topology 1292 1747 -> 15 0 23 1190 topology 1280 1748 -> 16 0 23 1190 topology 1360 1748 -> 15 0 24 1190 topology 1239 1749 -> 16 0 24 1190 topology 1241 1749 -> 15 0 23 1190 topology 1232 1750 -> 16 0 23 1190 topology 1360 1750 -> 15 0 24 1190 topology 1347 1751 -> 16 0 24 1190 topology 1349 1751 -> 15 0 23 1190 topology 1316 1752 -> 16 0 23 1190 topology 1360 1752 -> 15 0 24 1190 topology 1296 1753 -> 16 0 24 1190 topology 1298 1753 -> 15 0 24 1190 topology 1215 1754 -> 16 0 24 1190 topology 1217 1754 -> 15 0 23 1190 topology 1268 1755 -> 16 0 23 1190 topology 1360 1755 -> 15 0 24 1190 topology 1245 1756 -> 16 0 24 1190 topology 1247 1756 -> 15 0 23 1190 topology 1352 1757 -> 16 0 23 1190 topology 1360 1757 -> 15 0 24 1190 topology 1353 1758 -> 16 0 24 1190 topology 1355 1758 -> 15 0 23 1190 topology 1304 1759 -> 16 0 23 1190 topology 1360 1759 -> 15 0 24 1190 topology 1302 1760 -> 16 0 24 1190 topology 1304 1760 -> 15 0 24 1190 topology 1203 1761 -> 16 0 24 1190 topology 1204 1761 -> 15 0 23 1190 topology 1222 1762 -> 16 0 23 1190 topology 1360 1762 -> 15 0 23 1190 topology 1282 1763 -> 16 0 23 1190 topology 1360 1763 -> 15 0 23 1190 topology 1342 1764 -> 16 0 23 1190 topology 1360 1764 -> 15 0 23 1190 topology 1264 1765 -> 16 0 23 1190 topology 1360 1765 -> 15 0 23 1190 topology 1324 1766 -> 16 0 23 1190 topology 1360 1766 -> 15 0 23 1190 topology 1246 1767 -> 16 0 23 1190 topology 1360 1767 -> 15 0 23 1190 topology 1211 1768 -> 16 0 23 1190 topology 1360 1768 -> 15 0 23 1190 topology 1306 1769 -> 16 0 23 1190 topology 1360 1769 -> 15 0 24 1190 topology 1200 1770 -> 16 0 24 1190 topology 1202 1770 -> 15 0 23 1190 topology 1223 1771 -> 16 0 23 1190 topology 1360 1771 -> 15 0 23 1190 topology 1259 1772 -> 16 0 23 1190 topology 1360 1772 -> 15 0 23 1190 topology 1213 1773 -> 16 0 23 1190 topology 1360 1773 -> 15 0 24 1190 topology 1248 1774 -> 16 0 24 1190 topology 1249 1774 -> 15 0 23 1190 topology 1343 1775 -> 16 0 23 1190 topology 1360 1775 -> 15 0 23 1190 topology 1295 1776 -> 16 0 23 1190 topology 1360 1776 -> 15 0 24 1190 topology 1224 1777 -> 16 0 24 1190 topology 1225 1777 -> 15 0 24 1190 topology 1308 1778 -> 16 0 24 1190 topology 1309 1778 -> 15 0 23 1190 topology 1247 1779 -> 16 0 23 1190 topology 1360 1779 -> 15 0 23 1190 topology 1331 1780 -> 16 0 23 1190 topology 1360 1780 -> 15 0 24 1190 topology 1284 1781 -> 16 0 24 1190 topology 1285 1781 -> 15 0 24 1190 topology 1260 1782 -> 16 0 24 1190 topology 1261 1782 -> 15 0 24 1190 topology 1206 1783 -> 16 0 24 1190 topology 1207 1783 -> 15 0 23 1190 topology 1249 1784 -> 16 0 23 1190 topology 1360 1784 -> 15 0 24 1190 topology 1236 1785 -> 16 0 24 1190 topology 1237 1785 -> 15 0 24 1190 topology 1344 1786 -> 16 0 24 1190 topology 1345 1786 -> 15 0 23 1190 topology 1309 1787 -> 16 0 23 1190 topology 1360 1787 -> 15 0 23 1362 topology 1455 1788 +> 15 0 24 1190 topology 1359 1675 +> 16 0 24 1190 topology 1360 1675 +> 15 0 25 1190 topology 1218 1676 +> 16 0 25 1190 topology 1220 1676 +> 15 0 25 1190 topology 1218 1677 +> 16 0 25 1190 topology 1219 1677 +> 15 0 25 1190 topology 1221 1678 +> 16 0 25 1190 topology 1223 1678 +> 15 0 25 1190 topology 1221 1679 +> 16 0 25 1190 topology 1222 1679 +> 15 0 25 1190 topology 1224 1680 +> 16 0 25 1190 topology 1226 1680 +> 15 0 25 1190 topology 1224 1681 +> 16 0 25 1190 topology 1225 1681 +> 15 0 25 1190 topology 1227 1682 +> 16 0 25 1190 topology 1229 1682 +> 15 0 25 1190 topology 1227 1683 +> 16 0 25 1190 topology 1228 1683 +> 15 0 25 1190 topology 1230 1684 +> 16 0 25 1190 topology 1232 1684 +> 15 0 25 1190 topology 1230 1685 +> 16 0 25 1190 topology 1231 1685 +> 15 0 25 1190 topology 1233 1686 +> 16 0 25 1190 topology 1235 1686 +> 15 0 25 1190 topology 1233 1687 +> 16 0 25 1190 topology 1234 1687 +> 15 0 25 1190 topology 1236 1688 +> 16 0 25 1190 topology 1238 1688 +> 15 0 25 1190 topology 1236 1689 +> 16 0 25 1190 topology 1237 1689 +> 15 0 25 1190 topology 1239 1690 +> 16 0 25 1190 topology 1241 1690 +> 15 0 25 1190 topology 1239 1691 +> 16 0 25 1190 topology 1240 1691 +> 15 0 25 1190 topology 1242 1692 +> 16 0 25 1190 topology 1244 1692 +> 15 0 25 1190 topology 1242 1693 +> 16 0 25 1190 topology 1243 1693 +> 15 0 25 1190 topology 1245 1694 +> 16 0 25 1190 topology 1247 1694 +> 15 0 25 1190 topology 1245 1695 +> 16 0 25 1190 topology 1246 1695 +> 15 0 25 1190 topology 1191 1696 +> 16 0 25 1190 topology 1193 1696 +> 15 0 25 1190 topology 1191 1697 +> 16 0 25 1190 topology 1192 1697 +> 15 0 25 1190 topology 1248 1698 +> 16 0 25 1190 topology 1250 1698 +> 15 0 25 1190 topology 1248 1699 +> 16 0 25 1190 topology 1249 1699 +> 15 0 25 1190 topology 1251 1700 +> 16 0 25 1190 topology 1253 1700 +> 15 0 25 1190 topology 1251 1701 +> 16 0 25 1190 topology 1252 1701 +> 15 0 25 1190 topology 1254 1702 +> 16 0 25 1190 topology 1256 1702 +> 15 0 25 1190 topology 1254 1703 +> 16 0 25 1190 topology 1255 1703 +> 15 0 25 1190 topology 1257 1704 +> 16 0 25 1190 topology 1259 1704 +> 15 0 25 1190 topology 1257 1705 +> 16 0 25 1190 topology 1258 1705 +> 15 0 25 1190 topology 1260 1706 +> 16 0 25 1190 topology 1262 1706 +> 15 0 25 1190 topology 1260 1707 +> 16 0 25 1190 topology 1261 1707 +> 15 0 25 1190 topology 1263 1708 +> 16 0 25 1190 topology 1265 1708 +> 15 0 25 1190 topology 1263 1709 +> 16 0 25 1190 topology 1264 1709 +> 15 0 25 1190 topology 1266 1710 +> 16 0 25 1190 topology 1268 1710 +> 15 0 25 1190 topology 1266 1711 +> 16 0 25 1190 topology 1267 1711 +> 15 0 25 1190 topology 1269 1712 +> 16 0 25 1190 topology 1271 1712 +> 15 0 25 1190 topology 1269 1713 +> 16 0 25 1190 topology 1270 1713 +> 15 0 25 1190 topology 1272 1714 +> 16 0 25 1190 topology 1274 1714 +> 15 0 25 1190 topology 1272 1715 +> 16 0 25 1190 topology 1273 1715 +> 15 0 25 1190 topology 1275 1716 +> 16 0 25 1190 topology 1277 1716 +> 15 0 25 1190 topology 1275 1717 +> 16 0 25 1190 topology 1276 1717 +> 15 0 25 1190 topology 1194 1718 +> 16 0 25 1190 topology 1196 1718 +> 15 0 25 1190 topology 1194 1719 +> 16 0 25 1190 topology 1195 1719 +> 15 0 25 1190 topology 1278 1720 +> 16 0 25 1190 topology 1280 1720 +> 15 0 25 1190 topology 1278 1721 +> 16 0 25 1190 topology 1279 1721 +> 15 0 25 1190 topology 1281 1722 +> 16 0 25 1190 topology 1283 1722 +> 15 0 25 1190 topology 1281 1723 +> 16 0 25 1190 topology 1282 1723 +> 15 0 25 1190 topology 1284 1724 +> 16 0 25 1190 topology 1286 1724 +> 15 0 25 1190 topology 1284 1725 +> 16 0 25 1190 topology 1285 1725 +> 15 0 25 1190 topology 1287 1726 +> 16 0 25 1190 topology 1289 1726 +> 15 0 25 1190 topology 1287 1727 +> 16 0 25 1190 topology 1288 1727 +> 15 0 25 1190 topology 1290 1728 +> 16 0 25 1190 topology 1292 1728 +> 15 0 25 1190 topology 1290 1729 +> 16 0 25 1190 topology 1291 1729 +> 15 0 25 1190 topology 1293 1730 +> 16 0 25 1190 topology 1295 1730 +> 15 0 25 1190 topology 1293 1731 +> 16 0 25 1190 topology 1294 1731 +> 15 0 25 1190 topology 1296 1732 +> 16 0 25 1190 topology 1298 1732 +> 15 0 25 1190 topology 1296 1733 +> 16 0 25 1190 topology 1297 1733 +> 15 0 25 1190 topology 1299 1734 +> 16 0 25 1190 topology 1301 1734 +> 15 0 25 1190 topology 1299 1735 +> 16 0 25 1190 topology 1300 1735 +> 15 0 25 1190 topology 1302 1736 +> 16 0 25 1190 topology 1304 1736 +> 15 0 25 1190 topology 1302 1737 +> 16 0 25 1190 topology 1303 1737 +> 15 0 25 1190 topology 1305 1738 +> 16 0 25 1190 topology 1307 1738 +> 15 0 25 1190 topology 1305 1739 +> 16 0 25 1190 topology 1306 1739 +> 15 0 25 1190 topology 1197 1740 +> 16 0 25 1190 topology 1199 1740 +> 15 0 25 1190 topology 1197 1741 +> 16 0 25 1190 topology 1198 1741 +> 15 0 25 1190 topology 1308 1742 +> 16 0 25 1190 topology 1310 1742 +> 15 0 25 1190 topology 1308 1743 +> 16 0 25 1190 topology 1309 1743 +> 15 0 25 1190 topology 1311 1744 +> 16 0 25 1190 topology 1313 1744 +> 15 0 25 1190 topology 1311 1745 +> 16 0 25 1190 topology 1312 1745 +> 15 0 25 1190 topology 1314 1746 +> 16 0 25 1190 topology 1316 1746 +> 15 0 25 1190 topology 1314 1747 +> 16 0 25 1190 topology 1315 1747 +> 15 0 25 1190 topology 1317 1748 +> 16 0 25 1190 topology 1319 1748 +> 15 0 25 1190 topology 1317 1749 +> 16 0 25 1190 topology 1318 1749 +> 15 0 25 1190 topology 1320 1750 +> 16 0 25 1190 topology 1322 1750 +> 15 0 25 1190 topology 1320 1751 +> 16 0 25 1190 topology 1321 1751 +> 15 0 25 1190 topology 1323 1752 +> 16 0 25 1190 topology 1325 1752 +> 15 0 25 1190 topology 1323 1753 +> 16 0 25 1190 topology 1324 1753 +> 15 0 25 1190 topology 1326 1754 +> 16 0 25 1190 topology 1328 1754 +> 15 0 25 1190 topology 1326 1755 +> 16 0 25 1190 topology 1327 1755 +> 15 0 25 1190 topology 1329 1756 +> 16 0 25 1190 topology 1331 1756 +> 15 0 25 1190 topology 1329 1757 +> 16 0 25 1190 topology 1330 1757 +> 15 0 25 1190 topology 1332 1758 +> 16 0 25 1190 topology 1334 1758 +> 15 0 25 1190 topology 1332 1759 +> 16 0 25 1190 topology 1333 1759 +> 15 0 25 1190 topology 1335 1760 +> 16 0 25 1190 topology 1337 1760 +> 15 0 25 1190 topology 1335 1761 +> 16 0 25 1190 topology 1336 1761 +> 15 0 25 1190 topology 1200 1762 +> 16 0 25 1190 topology 1202 1762 +> 15 0 25 1190 topology 1200 1763 +> 16 0 25 1190 topology 1201 1763 +> 15 0 25 1190 topology 1338 1764 +> 16 0 25 1190 topology 1340 1764 +> 15 0 25 1190 topology 1338 1765 +> 16 0 25 1190 topology 1339 1765 +> 15 0 25 1190 topology 1341 1766 +> 16 0 25 1190 topology 1343 1766 +> 15 0 25 1190 topology 1341 1767 +> 16 0 25 1190 topology 1342 1767 +> 15 0 25 1190 topology 1344 1768 +> 16 0 25 1190 topology 1346 1768 +> 15 0 25 1190 topology 1344 1769 +> 16 0 25 1190 topology 1345 1769 +> 15 0 25 1190 topology 1347 1770 +> 16 0 25 1190 topology 1349 1770 +> 15 0 25 1190 topology 1347 1771 +> 16 0 25 1190 topology 1348 1771 +> 15 0 25 1190 topology 1350 1772 +> 16 0 25 1190 topology 1352 1772 +> 15 0 25 1190 topology 1350 1773 +> 16 0 25 1190 topology 1351 1773 +> 15 0 25 1190 topology 1353 1774 +> 16 0 25 1190 topology 1355 1774 +> 15 0 25 1190 topology 1353 1775 +> 16 0 25 1190 topology 1354 1775 +> 15 0 25 1190 topology 1356 1776 +> 16 0 25 1190 topology 1358 1776 +> 15 0 25 1190 topology 1356 1777 +> 16 0 25 1190 topology 1357 1777 +> 15 0 25 1190 topology 1203 1778 +> 16 0 25 1190 topology 1205 1778 +> 15 0 25 1190 topology 1203 1779 +> 16 0 25 1190 topology 1204 1779 +> 15 0 25 1190 topology 1206 1780 +> 16 0 25 1190 topology 1208 1780 +> 15 0 25 1190 topology 1206 1781 +> 16 0 25 1190 topology 1207 1781 +> 15 0 25 1190 topology 1209 1782 +> 16 0 25 1190 topology 1211 1782 +> 15 0 25 1190 topology 1209 1783 +> 16 0 25 1190 topology 1210 1783 +> 15 0 25 1190 topology 1212 1784 +> 16 0 25 1190 topology 1214 1784 +> 15 0 25 1190 topology 1212 1785 +> 16 0 25 1190 topology 1213 1785 +> 15 0 25 1190 topology 1215 1786 +> 16 0 25 1190 topology 1217 1786 +> 15 0 25 1190 topology 1215 1787 +> 16 0 25 1190 topology 1216 1787 +> 15 0 23 1362 topology 1392 1788 > 16 0 23 1362 topology 1601 1788 -> 15 0 24 1362 topology 1465 1789 -> 16 0 24 1362 topology 1467 1789 -> 15 0 24 1362 topology 1573 1790 -> 16 0 24 1362 topology 1575 1790 -> 15 0 25 1362 topology 1600 1791 -> 16 0 25 1362 topology 1601 1791 -> 15 0 23 1362 topology 1407 1792 +> 15 0 23 1362 topology 1391 1789 +> 16 0 23 1362 topology 1601 1789 +> 15 0 23 1362 topology 1395 1790 +> 16 0 23 1362 topology 1601 1790 +> 15 0 23 1362 topology 1394 1791 +> 16 0 23 1362 topology 1601 1791 +> 15 0 23 1362 topology 1398 1792 > 16 0 23 1362 topology 1601 1792 -> 15 0 24 1362 topology 1414 1793 -> 16 0 24 1362 topology 1416 1793 -> 15 0 23 1362 topology 1491 1794 +> 15 0 23 1362 topology 1397 1793 +> 16 0 23 1362 topology 1601 1793 +> 15 0 23 1362 topology 1401 1794 > 16 0 23 1362 topology 1601 1794 -> 15 0 24 1362 topology 1522 1795 -> 16 0 24 1362 topology 1524 1795 -> 15 0 23 1362 topology 1575 1796 +> 15 0 23 1362 topology 1400 1795 +> 16 0 23 1362 topology 1601 1795 +> 15 0 23 1362 topology 1404 1796 > 16 0 23 1362 topology 1601 1796 -> 15 0 23 1362 topology 1443 1797 +> 15 0 23 1362 topology 1403 1797 > 16 0 23 1362 topology 1601 1797 -> 15 0 24 1362 topology 1471 1798 -> 16 0 24 1362 topology 1473 1798 -> 15 0 24 1362 topology 1579 1799 -> 16 0 24 1362 topology 1581 1799 -> 15 0 24 1362 topology 1372 1800 -> 16 0 24 1362 topology 1373 1800 -> 15 0 23 1362 topology 1527 1801 +> 15 0 23 1362 topology 1407 1798 +> 16 0 23 1362 topology 1601 1798 +> 15 0 23 1362 topology 1406 1799 +> 16 0 23 1362 topology 1601 1799 +> 15 0 23 1362 topology 1410 1800 +> 16 0 23 1362 topology 1601 1800 +> 15 0 23 1362 topology 1409 1801 > 16 0 23 1362 topology 1601 1801 -> 15 0 24 1362 topology 1528 1802 -> 16 0 24 1362 topology 1530 1802 -> 15 0 23 1362 topology 1479 1803 +> 15 0 23 1362 topology 1413 1802 +> 16 0 23 1362 topology 1601 1802 +> 15 0 23 1362 topology 1412 1803 > 16 0 23 1362 topology 1601 1803 -> 15 0 24 1362 topology 1477 1804 -> 16 0 24 1362 topology 1479 1804 -> 15 0 23 1362 topology 1563 1805 +> 15 0 23 1362 topology 1416 1804 +> 16 0 23 1362 topology 1601 1804 +> 15 0 23 1362 topology 1415 1805 > 16 0 23 1362 topology 1601 1805 -> 15 0 24 1362 topology 1585 1806 -> 16 0 24 1362 topology 1587 1806 -> 15 0 23 1362 topology 1421 1807 +> 15 0 23 1362 topology 1419 1806 +> 16 0 23 1362 topology 1601 1806 +> 15 0 23 1362 topology 1418 1807 > 16 0 23 1362 topology 1601 1807 -> 15 0 24 1362 topology 1534 1808 -> 16 0 24 1362 topology 1536 1808 -> 15 0 23 1362 topology 1599 1809 +> 15 0 23 1362 topology 1365 1808 +> 16 0 23 1362 topology 1601 1808 +> 15 0 23 1362 topology 1364 1809 > 16 0 23 1362 topology 1601 1809 -> 15 0 23 1362 topology 1481 1810 +> 15 0 23 1362 topology 1422 1810 > 16 0 23 1362 topology 1601 1810 -> 15 0 24 1362 topology 1591 1811 -> 16 0 24 1362 topology 1593 1811 -> 15 0 23 1362 topology 1403 1812 +> 15 0 23 1362 topology 1421 1811 +> 16 0 23 1362 topology 1601 1811 +> 15 0 23 1362 topology 1425 1812 > 16 0 23 1362 topology 1601 1812 -> 15 0 23 1362 topology 1541 1813 +> 15 0 23 1362 topology 1424 1813 > 16 0 23 1362 topology 1601 1813 -> 15 0 23 1362 topology 1463 1814 +> 15 0 23 1362 topology 1428 1814 > 16 0 23 1362 topology 1601 1814 -> 15 0 24 1362 topology 1597 1815 -> 16 0 24 1362 topology 1599 1815 -> 15 0 23 1362 topology 1380 1816 +> 15 0 23 1362 topology 1427 1815 +> 16 0 23 1362 topology 1601 1815 +> 15 0 23 1362 topology 1431 1816 > 16 0 23 1362 topology 1601 1816 -> 15 0 23 1362 topology 1523 1817 +> 15 0 23 1362 topology 1430 1817 > 16 0 23 1362 topology 1601 1817 -> 15 0 23 1362 topology 1445 1818 +> 15 0 23 1362 topology 1434 1818 > 16 0 23 1362 topology 1601 1818 -> 15 0 23 1362 topology 1583 1819 +> 15 0 23 1362 topology 1433 1819 > 16 0 23 1362 topology 1601 1819 -> 15 0 23 1362 topology 1505 1820 +> 15 0 23 1362 topology 1437 1820 > 16 0 23 1362 topology 1601 1820 -> 15 0 23 1362 topology 1565 1821 +> 15 0 23 1362 topology 1436 1821 > 16 0 23 1362 topology 1601 1821 -> 15 0 23 1362 topology 1376 1822 +> 15 0 23 1362 topology 1440 1822 > 16 0 23 1362 topology 1601 1822 -> 15 0 24 1362 topology 1381 1823 -> 16 0 24 1362 topology 1383 1823 -> 15 0 23 1362 topology 1398 1824 +> 15 0 23 1362 topology 1439 1823 +> 16 0 23 1362 topology 1601 1823 +> 15 0 23 1362 topology 1443 1824 > 16 0 23 1362 topology 1601 1824 -> 15 0 23 1362 topology 1482 1825 +> 15 0 23 1362 topology 1442 1825 > 16 0 23 1362 topology 1601 1825 -> 15 0 23 1362 topology 1434 1826 +> 15 0 23 1362 topology 1446 1826 > 16 0 23 1362 topology 1601 1826 -> 15 0 23 1362 topology 1518 1827 +> 15 0 23 1362 topology 1445 1827 > 16 0 23 1362 topology 1601 1827 -> 15 0 24 1362 topology 1423 1828 -> 16 0 24 1362 topology 1424 1828 -> 15 0 23 1362 topology 1470 1829 +> 15 0 23 1362 topology 1449 1828 +> 16 0 23 1362 topology 1601 1828 +> 15 0 23 1362 topology 1448 1829 > 16 0 23 1362 topology 1601 1829 -> 15 0 24 1362 topology 1399 1830 -> 16 0 24 1362 topology 1400 1830 -> 15 0 23 1362 topology 1554 1831 +> 15 0 23 1362 topology 1368 1830 +> 16 0 23 1362 topology 1601 1830 +> 15 0 23 1362 topology 1367 1831 > 16 0 23 1362 topology 1601 1831 -> 15 0 24 1362 topology 1375 1832 -> 16 0 24 1362 topology 1376 1832 -> 15 0 24 1362 topology 1483 1833 -> 16 0 24 1362 topology 1484 1833 -> 15 0 23 1362 topology 1506 1834 +> 15 0 23 1362 topology 1452 1832 +> 16 0 23 1362 topology 1601 1832 +> 15 0 23 1362 topology 1451 1833 +> 16 0 23 1362 topology 1601 1833 +> 15 0 23 1362 topology 1455 1834 > 16 0 23 1362 topology 1601 1834 -> 15 0 23 1362 topology 1590 1835 +> 15 0 23 1362 topology 1454 1835 > 16 0 23 1362 topology 1601 1835 -> 15 0 24 1362 topology 1459 1836 -> 16 0 24 1362 topology 1460 1836 -> 15 0 24 1362 topology 1435 1837 -> 16 0 24 1362 topology 1436 1837 -> 15 0 24 1362 topology 1543 1838 -> 16 0 24 1362 topology 1544 1838 -> 15 0 24 1362 topology 1411 1839 -> 16 0 24 1362 topology 1412 1839 -> 15 0 23 1362 topology 1430 1840 +> 15 0 23 1362 topology 1458 1836 +> 16 0 23 1362 topology 1601 1836 +> 15 0 23 1362 topology 1457 1837 +> 16 0 23 1362 topology 1601 1837 +> 15 0 23 1362 topology 1461 1838 +> 16 0 23 1362 topology 1601 1838 +> 15 0 23 1362 topology 1460 1839 +> 16 0 23 1362 topology 1601 1839 +> 15 0 23 1362 topology 1464 1840 > 16 0 23 1362 topology 1601 1840 -> 15 0 24 1362 topology 1519 1841 -> 16 0 24 1362 topology 1520 1841 -> 15 0 23 1362 topology 1371 1842 +> 15 0 23 1362 topology 1463 1841 +> 16 0 23 1362 topology 1601 1841 +> 15 0 23 1362 topology 1467 1842 > 16 0 23 1362 topology 1601 1842 -> 15 0 23 1362 topology 1490 1843 +> 15 0 23 1362 topology 1466 1843 > 16 0 23 1362 topology 1601 1843 -> 15 0 24 1362 topology 1495 1844 -> 16 0 24 1362 topology 1496 1844 -> 15 0 23 1362 topology 1412 1845 +> 15 0 23 1362 topology 1470 1844 +> 16 0 23 1362 topology 1601 1844 +> 15 0 23 1362 topology 1469 1845 > 16 0 23 1362 topology 1601 1845 -> 15 0 24 1362 topology 1471 1846 -> 16 0 24 1362 topology 1472 1846 -> 15 0 23 1362 topology 1550 1847 +> 15 0 23 1362 topology 1473 1846 +> 16 0 23 1362 topology 1601 1846 +> 15 0 23 1362 topology 1472 1847 > 16 0 23 1362 topology 1601 1847 -> 15 0 24 1362 topology 1579 1848 -> 16 0 24 1362 topology 1580 1848 -> 15 0 23 1362 topology 1472 1849 +> 15 0 23 1362 topology 1476 1848 +> 16 0 23 1362 topology 1601 1848 +> 15 0 23 1362 topology 1475 1849 > 16 0 23 1362 topology 1601 1849 -> 15 0 24 1362 topology 1447 1850 -> 16 0 24 1362 topology 1448 1850 -> 15 0 24 1362 topology 1555 1851 -> 16 0 24 1362 topology 1556 1851 -> 15 0 24 1362 topology 1366 1852 -> 16 0 24 1362 topology 1368 1852 -> 15 0 23 1362 topology 1532 1853 +> 15 0 23 1362 topology 1479 1850 +> 16 0 23 1362 topology 1601 1850 +> 15 0 23 1362 topology 1478 1851 +> 16 0 23 1362 topology 1601 1851 +> 15 0 23 1362 topology 1371 1852 +> 16 0 23 1362 topology 1601 1852 +> 15 0 23 1362 topology 1370 1853 > 16 0 23 1362 topology 1601 1853 -> 15 0 24 1362 topology 1531 1854 -> 16 0 24 1362 topology 1532 1854 -> 15 0 24 1362 topology 1423 1855 -> 16 0 24 1362 topology 1425 1855 -> 15 0 23 1362 topology 1592 1856 +> 15 0 23 1362 topology 1482 1854 +> 16 0 23 1362 topology 1601 1854 +> 15 0 23 1362 topology 1481 1855 +> 16 0 23 1362 topology 1601 1855 +> 15 0 23 1362 topology 1485 1856 > 16 0 23 1362 topology 1601 1856 -> 15 0 24 1362 topology 1507 1857 -> 16 0 24 1362 topology 1508 1857 -> 15 0 24 1362 topology 1480 1858 -> 16 0 24 1362 topology 1482 1858 -> 15 0 24 1362 topology 1591 1859 -> 16 0 24 1362 topology 1592 1859 -> 15 0 24 1362 topology 1429 1860 -> 16 0 24 1362 topology 1431 1860 -> 15 0 24 1362 topology 1567 1861 -> 16 0 24 1362 topology 1568 1861 -> 15 0 24 1362 topology 1486 1862 -> 16 0 24 1362 topology 1488 1862 -> 15 0 23 1362 topology 1425 1863 +> 15 0 23 1362 topology 1484 1857 +> 16 0 23 1362 topology 1601 1857 +> 15 0 23 1362 topology 1488 1858 +> 16 0 23 1362 topology 1601 1858 +> 15 0 23 1362 topology 1487 1859 +> 16 0 23 1362 topology 1601 1859 +> 15 0 23 1362 topology 1491 1860 +> 16 0 23 1362 topology 1601 1860 +> 15 0 23 1362 topology 1490 1861 +> 16 0 23 1362 topology 1601 1861 +> 15 0 23 1362 topology 1494 1862 +> 16 0 23 1362 topology 1601 1862 +> 15 0 23 1362 topology 1493 1863 > 16 0 23 1362 topology 1601 1863 -> 15 0 24 1362 topology 1435 1864 -> 16 0 24 1362 topology 1437 1864 -> 15 0 24 1362 topology 1543 1865 -> 16 0 24 1362 topology 1545 1865 -> 15 0 23 1362 topology 1385 1866 +> 15 0 23 1362 topology 1497 1864 +> 16 0 23 1362 topology 1601 1864 +> 15 0 23 1362 topology 1496 1865 +> 16 0 23 1362 topology 1601 1865 +> 15 0 23 1362 topology 1500 1866 > 16 0 23 1362 topology 1601 1866 -> 15 0 24 1362 topology 1492 1867 -> 16 0 24 1362 topology 1494 1867 -> 15 0 23 1362 topology 1461 1868 +> 15 0 23 1362 topology 1499 1867 +> 16 0 23 1362 topology 1601 1867 +> 15 0 23 1362 topology 1503 1868 > 16 0 23 1362 topology 1601 1868 -> 15 0 24 1362 topology 1441 1869 -> 16 0 24 1362 topology 1443 1869 -> 15 0 23 1362 topology 1545 1870 +> 15 0 23 1362 topology 1502 1869 +> 16 0 23 1362 topology 1601 1869 +> 15 0 23 1362 topology 1506 1870 > 16 0 23 1362 topology 1601 1870 -> 15 0 24 1362 topology 1549 1871 -> 16 0 24 1362 topology 1551 1871 -> 15 0 23 1362 topology 1413 1872 +> 15 0 23 1362 topology 1505 1871 +> 16 0 23 1362 topology 1601 1871 +> 15 0 23 1362 topology 1509 1872 > 16 0 23 1362 topology 1601 1872 -> 15 0 23 1362 topology 1497 1873 +> 15 0 23 1362 topology 1508 1873 > 16 0 23 1362 topology 1601 1873 -> 15 0 24 1362 topology 1498 1874 -> 16 0 24 1362 topology 1500 1874 -> 15 0 23 1362 topology 1581 1875 +> 15 0 23 1362 topology 1374 1874 +> 16 0 23 1362 topology 1601 1874 +> 15 0 23 1362 topology 1373 1875 > 16 0 23 1362 topology 1601 1875 -> 15 0 24 1362 topology 1447 1876 -> 16 0 24 1362 topology 1449 1876 -> 15 0 23 1362 topology 1449 1877 +> 15 0 23 1362 topology 1512 1876 +> 16 0 23 1362 topology 1601 1876 +> 15 0 23 1362 topology 1511 1877 > 16 0 23 1362 topology 1601 1877 -> 15 0 24 1362 topology 1555 1878 -> 16 0 24 1362 topology 1557 1878 -> 15 0 23 1362 topology 1533 1879 +> 15 0 23 1362 topology 1515 1878 +> 16 0 23 1362 topology 1601 1878 +> 15 0 23 1362 topology 1514 1879 > 16 0 23 1362 topology 1601 1879 -> 15 0 24 1362 topology 1504 1880 -> 16 0 24 1362 topology 1506 1880 -> 15 0 24 1362 topology 1378 1881 -> 16 0 24 1362 topology 1379 1881 -> 15 0 24 1362 topology 1561 1882 -> 16 0 24 1362 topology 1563 1882 -> 15 0 23 1362 topology 1569 1883 +> 15 0 23 1362 topology 1518 1880 +> 16 0 23 1362 topology 1601 1880 +> 15 0 23 1362 topology 1517 1881 +> 16 0 23 1362 topology 1601 1881 +> 15 0 23 1362 topology 1521 1882 +> 16 0 23 1362 topology 1601 1882 +> 15 0 23 1362 topology 1520 1883 > 16 0 23 1362 topology 1601 1883 -> 15 0 23 1362 topology 1397 1884 +> 15 0 23 1362 topology 1524 1884 > 16 0 23 1362 topology 1601 1884 -> 15 0 23 1362 topology 1457 1885 +> 15 0 23 1362 topology 1523 1885 > 16 0 23 1362 topology 1601 1885 -> 15 0 24 1362 topology 1567 1886 -> 16 0 24 1362 topology 1569 1886 -> 15 0 23 1362 topology 1517 1887 +> 15 0 23 1362 topology 1527 1886 +> 16 0 23 1362 topology 1601 1886 +> 15 0 23 1362 topology 1526 1887 > 16 0 23 1362 topology 1601 1887 -> 15 0 23 1362 topology 1439 1888 +> 15 0 23 1362 topology 1530 1888 > 16 0 23 1362 topology 1601 1888 -> 15 0 23 1362 topology 1577 1889 +> 15 0 23 1362 topology 1529 1889 > 16 0 23 1362 topology 1601 1889 -> 15 0 23 1362 topology 1499 1890 +> 15 0 23 1362 topology 1533 1890 > 16 0 23 1362 topology 1601 1890 -> 15 0 23 1362 topology 1386 1891 +> 15 0 23 1362 topology 1532 1891 > 16 0 23 1362 topology 1601 1891 -> 15 0 23 1362 topology 1559 1892 +> 15 0 23 1362 topology 1536 1892 > 16 0 23 1362 topology 1601 1892 -> 15 0 24 1362 topology 1375 1893 -> 16 0 24 1362 topology 1377 1893 -> 15 0 23 1362 topology 1370 1894 +> 15 0 23 1362 topology 1535 1893 +> 16 0 23 1362 topology 1601 1893 +> 15 0 23 1362 topology 1539 1894 > 16 0 23 1362 topology 1601 1894 -> 15 0 23 1362 topology 1452 1895 +> 15 0 23 1362 topology 1538 1895 > 16 0 23 1362 topology 1601 1895 -> 15 0 24 1362 topology 1390 1896 -> 16 0 24 1362 topology 1391 1896 -> 15 0 23 1362 topology 1404 1897 +> 15 0 23 1362 topology 1377 1896 +> 16 0 23 1362 topology 1601 1896 +> 15 0 23 1362 topology 1376 1897 > 16 0 23 1362 topology 1601 1897 -> 15 0 23 1362 topology 1488 1898 +> 15 0 23 1362 topology 1542 1898 > 16 0 23 1362 topology 1601 1898 -> 15 0 23 1362 topology 1572 1899 +> 15 0 23 1362 topology 1541 1899 > 16 0 23 1362 topology 1601 1899 -> 15 0 23 1362 topology 1440 1900 +> 15 0 23 1362 topology 1545 1900 > 16 0 23 1362 topology 1601 1900 -> 15 0 24 1362 topology 1450 1901 -> 16 0 24 1362 topology 1451 1901 -> 15 0 23 1362 topology 1524 1902 +> 15 0 23 1362 topology 1544 1901 +> 16 0 23 1362 topology 1601 1901 +> 15 0 23 1362 topology 1548 1902 > 16 0 23 1362 topology 1601 1902 -> 15 0 24 1362 topology 1426 1903 -> 16 0 24 1362 topology 1427 1903 -> 15 0 23 1362 topology 1476 1904 +> 15 0 23 1362 topology 1547 1903 +> 16 0 23 1362 topology 1601 1903 +> 15 0 23 1362 topology 1551 1904 > 16 0 23 1362 topology 1601 1904 -> 15 0 24 1362 topology 1402 1905 -> 16 0 24 1362 topology 1403 1905 -> 15 0 24 1362 topology 1510 1906 -> 16 0 24 1362 topology 1511 1906 -> 15 0 23 1362 topology 1560 1907 +> 15 0 23 1362 topology 1550 1905 +> 16 0 23 1362 topology 1601 1905 +> 15 0 23 1362 topology 1554 1906 +> 16 0 23 1362 topology 1601 1906 +> 15 0 23 1362 topology 1553 1907 > 16 0 23 1362 topology 1601 1907 -> 15 0 24 1362 topology 1486 1908 -> 16 0 24 1362 topology 1487 1908 -> 15 0 23 1362 topology 1596 1909 +> 15 0 23 1362 topology 1557 1908 +> 16 0 23 1362 topology 1601 1908 +> 15 0 23 1362 topology 1556 1909 > 16 0 23 1362 topology 1601 1909 -> 15 0 24 1362 topology 1381 1910 -> 16 0 24 1362 topology 1382 1910 -> 15 0 23 1362 topology 1424 1911 +> 15 0 23 1362 topology 1560 1910 +> 16 0 23 1362 topology 1601 1910 +> 15 0 23 1362 topology 1559 1911 > 16 0 23 1362 topology 1601 1911 -> 15 0 24 1362 topology 1462 1912 -> 16 0 24 1362 topology 1463 1912 -> 15 0 24 1362 topology 1570 1913 -> 16 0 24 1362 topology 1571 1913 -> 15 0 24 1362 topology 1438 1914 -> 16 0 24 1362 topology 1439 1914 -> 15 0 23 1362 topology 1484 1915 +> 15 0 23 1362 topology 1563 1912 +> 16 0 23 1362 topology 1601 1912 +> 15 0 23 1362 topology 1562 1913 +> 16 0 23 1362 topology 1601 1913 +> 15 0 23 1362 topology 1566 1914 +> 16 0 23 1362 topology 1601 1914 +> 15 0 23 1362 topology 1565 1915 > 16 0 23 1362 topology 1601 1915 -> 15 0 24 1362 topology 1546 1916 -> 16 0 24 1362 topology 1547 1916 -> 15 0 23 1362 topology 1406 1917 +> 15 0 23 1362 topology 1569 1916 +> 16 0 23 1362 topology 1601 1916 +> 15 0 23 1362 topology 1568 1917 > 16 0 23 1362 topology 1601 1917 -> 15 0 24 1362 topology 1414 1918 -> 16 0 24 1362 topology 1415 1918 -> 15 0 24 1362 topology 1522 1919 -> 16 0 24 1362 topology 1523 1919 -> 15 0 23 1362 topology 1544 1920 +> 15 0 23 1362 topology 1380 1918 +> 16 0 23 1362 topology 1601 1918 +> 15 0 23 1362 topology 1379 1919 +> 16 0 23 1362 topology 1601 1919 +> 15 0 23 1362 topology 1572 1920 > 16 0 23 1362 topology 1601 1920 -> 15 0 23 1362 topology 1377 1921 +> 15 0 23 1362 topology 1571 1921 > 16 0 23 1362 topology 1601 1921 -> 15 0 23 1362 topology 1466 1922 +> 15 0 23 1362 topology 1575 1922 > 16 0 23 1362 topology 1601 1922 -> 15 0 24 1362 topology 1498 1923 -> 16 0 24 1362 topology 1499 1923 -> 15 0 23 1362 topology 1526 1924 +> 15 0 23 1362 topology 1574 1923 +> 16 0 23 1362 topology 1601 1923 +> 15 0 23 1362 topology 1578 1924 > 16 0 23 1362 topology 1601 1924 -> 15 0 23 1362 topology 1448 1925 +> 15 0 23 1362 topology 1577 1925 > 16 0 23 1362 topology 1601 1925 -> 15 0 24 1362 topology 1474 1926 -> 16 0 24 1362 topology 1475 1926 -> 15 0 24 1362 topology 1582 1927 -> 16 0 24 1362 topology 1583 1927 -> 15 0 24 1362 topology 1393 1928 -> 16 0 24 1362 topology 1395 1928 -> 15 0 23 1362 topology 1586 1929 +> 15 0 23 1362 topology 1581 1926 +> 16 0 23 1362 topology 1601 1926 +> 15 0 23 1362 topology 1580 1927 +> 16 0 23 1362 topology 1601 1927 +> 15 0 23 1362 topology 1584 1928 +> 16 0 23 1362 topology 1601 1928 +> 15 0 23 1362 topology 1583 1929 > 16 0 23 1362 topology 1601 1929 -> 15 0 23 1362 topology 1508 1930 +> 15 0 23 1362 topology 1587 1930 > 16 0 23 1362 topology 1601 1930 -> 15 0 24 1362 topology 1558 1931 -> 16 0 24 1362 topology 1559 1931 -> 15 0 24 1362 topology 1450 1932 -> 16 0 24 1362 topology 1452 1932 -> 15 0 24 1362 topology 1534 1933 -> 16 0 24 1362 topology 1535 1933 -> 15 0 23 1362 topology 1568 1934 +> 15 0 23 1362 topology 1586 1931 +> 16 0 23 1362 topology 1601 1931 +> 15 0 23 1362 topology 1590 1932 +> 16 0 23 1362 topology 1601 1932 +> 15 0 23 1362 topology 1589 1933 +> 16 0 23 1362 topology 1601 1933 +> 15 0 23 1362 topology 1593 1934 > 16 0 23 1362 topology 1601 1934 -> 15 0 24 1362 topology 1399 1935 -> 16 0 24 1362 topology 1401 1935 -> 15 0 24 1362 topology 1456 1936 -> 16 0 24 1362 topology 1458 1936 -> 15 0 24 1362 topology 1594 1937 -> 16 0 24 1362 topology 1595 1937 -> 15 0 24 1362 topology 1405 1938 -> 16 0 24 1362 topology 1407 1938 -> 15 0 24 1362 topology 1513 1939 -> 16 0 24 1362 topology 1515 1939 -> 15 0 23 1362 topology 1395 1940 +> 15 0 23 1362 topology 1592 1935 +> 16 0 23 1362 topology 1601 1935 +> 15 0 23 1362 topology 1596 1936 +> 16 0 23 1362 topology 1601 1936 +> 15 0 23 1362 topology 1595 1937 +> 16 0 23 1362 topology 1601 1937 +> 15 0 23 1362 topology 1599 1938 +> 16 0 23 1362 topology 1601 1938 +> 15 0 23 1362 topology 1598 1939 +> 16 0 23 1362 topology 1601 1939 +> 15 0 23 1362 topology 1383 1940 > 16 0 23 1362 topology 1601 1940 -> 15 0 23 1362 topology 1379 1941 +> 15 0 23 1362 topology 1382 1941 > 16 0 23 1362 topology 1601 1941 -> 15 0 24 1362 topology 1462 1942 -> 16 0 24 1362 topology 1464 1942 -> 15 0 24 1362 topology 1570 1943 -> 16 0 24 1362 topology 1572 1943 -> 15 0 23 1362 topology 1431 1944 +> 15 0 23 1362 topology 1386 1942 +> 16 0 23 1362 topology 1601 1942 +> 15 0 23 1362 topology 1385 1943 +> 16 0 23 1362 topology 1601 1943 +> 15 0 23 1362 topology 1389 1944 > 16 0 23 1362 topology 1601 1944 -> 15 0 24 1362 topology 1411 1945 -> 16 0 24 1362 topology 1413 1945 -> 15 0 24 1362 topology 1384 1946 -> 16 0 24 1362 topology 1386 1946 -> 15 0 24 1362 topology 1519 1947 -> 16 0 24 1362 topology 1521 1947 -> 15 0 23 1362 topology 1515 1948 -> 16 0 23 1362 topology 1601 1948 -> 15 0 24 1362 topology 1468 1949 -> 16 0 24 1362 topology 1470 1949 -> 15 0 24 1362 topology 1576 1950 -> 16 0 24 1362 topology 1578 1950 -> 15 0 23 1362 topology 1467 1951 -> 16 0 23 1362 topology 1601 1951 -> 15 0 24 1362 topology 1417 1952 -> 16 0 24 1362 topology 1419 1952 -> 15 0 24 1362 topology 1525 1953 -> 16 0 24 1362 topology 1527 1953 -> 15 0 23 1362 topology 1551 1954 -> 16 0 23 1362 topology 1601 1954 -> 15 0 23 1362 topology 1419 1955 -> 16 0 23 1362 topology 1601 1955 -> 15 0 23 1362 topology 1503 1956 -> 16 0 23 1362 topology 1601 1956 -> 15 0 24 1362 topology 1474 1957 -> 16 0 24 1362 topology 1476 1957 -> 15 0 24 1362 topology 1582 1958 -> 16 0 24 1362 topology 1584 1958 -> 15 0 23 1362 topology 1587 1959 -> 16 0 23 1362 topology 1601 1959 -> 15 0 24 1362 topology 1531 1960 -> 16 0 24 1362 topology 1533 1960 -> 15 0 23 1362 topology 1391 1961 -> 16 0 23 1362 topology 1601 1961 -> 15 0 23 1362 topology 1539 1962 -> 16 0 23 1362 topology 1601 1962 -> 15 0 24 1362 topology 1588 1963 -> 16 0 24 1362 topology 1590 1963 -> 15 0 23 1362 topology 1451 1964 -> 16 0 23 1362 topology 1601 1964 -> 15 0 24 1362 topology 1537 1965 -> 16 0 24 1362 topology 1539 1965 -> 15 0 24 1362 topology 1384 1966 -> 16 0 24 1362 topology 1385 1966 -> 15 0 23 1362 topology 1368 1967 -> 16 0 23 1362 topology 1601 1967 -> 15 0 23 1362 topology 1511 1968 -> 16 0 23 1362 topology 1601 1968 -> 15 0 23 1362 topology 1433 1969 -> 16 0 23 1362 topology 1601 1969 -> 15 0 24 1362 topology 1594 1970 -> 16 0 24 1362 topology 1596 1970 -> 15 0 23 1362 topology 1571 1971 -> 16 0 23 1362 topology 1601 1971 -> 15 0 23 1362 topology 1493 1972 -> 16 0 23 1362 topology 1601 1972 -> 15 0 23 1362 topology 1415 1973 -> 16 0 23 1362 topology 1601 1973 -> 15 0 23 1362 topology 1553 1974 -> 16 0 23 1362 topology 1601 1974 -> 15 0 23 1362 topology 1475 1975 -> 16 0 23 1362 topology 1601 1975 -> 15 0 23 1362 topology 1535 1976 -> 16 0 23 1362 topology 1601 1976 -> 15 0 24 1362 topology 1369 1977 -> 16 0 24 1362 topology 1371 1977 -> 15 0 23 1362 topology 1595 1978 -> 16 0 23 1362 topology 1601 1978 -> 15 0 23 1362 topology 1364 1979 -> 16 0 23 1362 topology 1601 1979 -> 15 0 23 1362 topology 1422 1980 -> 16 0 23 1362 topology 1601 1980 -> 15 0 24 1362 topology 1363 1981 -> 16 0 24 1362 topology 1364 1981 -> 15 0 23 1362 topology 1458 1982 -> 16 0 23 1362 topology 1601 1982 -> 15 0 24 1362 topology 1393 1983 -> 16 0 24 1362 topology 1394 1983 -> 15 0 23 1362 topology 1388 1984 -> 16 0 23 1362 topology 1601 1984 -> 15 0 23 1362 topology 1542 1985 -> 16 0 23 1362 topology 1601 1985 -> 15 0 23 1362 topology 1410 1986 -> 16 0 23 1362 topology 1601 1986 -> 15 0 23 1362 topology 1494 1987 -> 16 0 23 1362 topology 1601 1987 -> 15 0 23 1362 topology 1578 1988 -> 16 0 23 1362 topology 1601 1988 -> 15 0 24 1362 topology 1453 1989 -> 16 0 24 1362 topology 1454 1989 -> 15 0 23 1362 topology 1446 1990 -> 16 0 23 1362 topology 1601 1990 -> 15 0 23 1362 topology 1530 1991 -> 16 0 23 1362 topology 1601 1991 -> 15 0 24 1362 topology 1429 1992 -> 16 0 24 1362 topology 1430 1992 -> 15 0 24 1362 topology 1405 1993 -> 16 0 24 1362 topology 1406 1993 -> 15 0 24 1362 topology 1513 1994 -> 16 0 24 1362 topology 1514 1994 -> 15 0 23 1362 topology 1566 1995 -> 16 0 23 1362 topology 1601 1995 -> 15 0 24 1362 topology 1489 1996 -> 16 0 24 1362 topology 1490 1996 -> 15 0 23 1362 topology 1400 1997 -> 16 0 23 1362 topology 1601 1997 -> 15 0 24 1362 topology 1465 1998 -> 16 0 24 1362 topology 1466 1998 -> 15 0 24 1362 topology 1573 1999 -> 16 0 24 1362 topology 1574 1999 -> 15 0 23 1362 topology 1460 2000 -> 16 0 23 1362 topology 1601 2000 -> 15 0 24 1362 topology 1441 2001 -> 16 0 24 1362 topology 1442 2001 -> 15 0 24 1362 topology 1387 2002 -> 16 0 24 1362 topology 1388 2002 -> 15 0 24 1362 topology 1549 2003 -> 16 0 24 1362 topology 1550 2003 -> 15 0 23 1362 topology 1520 2004 -> 16 0 23 1362 topology 1601 2004 -> 15 0 23 1362 topology 1442 2005 -> 16 0 23 1362 topology 1601 2005 -> 15 0 24 1362 topology 1417 2006 -> 16 0 24 1362 topology 1418 2006 -> 15 0 24 1362 topology 1525 2007 -> 16 0 24 1362 topology 1526 2007 -> 15 0 23 1362 topology 1383 2008 -> 16 0 23 1362 topology 1601 2008 -> 15 0 23 1362 topology 1580 2009 -> 16 0 23 1362 topology 1601 2009 -> 15 0 23 1362 topology 1502 2010 -> 16 0 23 1362 topology 1601 2010 -> 15 0 24 1362 topology 1501 2011 -> 16 0 24 1362 topology 1502 2011 -> 15 0 24 1362 topology 1420 2012 -> 16 0 24 1362 topology 1422 2012 -> 15 0 24 1362 topology 1477 2013 -> 16 0 24 1362 topology 1478 2013 -> 15 0 23 1362 topology 1562 2014 -> 16 0 23 1362 topology 1601 2014 -> 15 0 24 1362 topology 1585 2015 -> 16 0 24 1362 topology 1586 2015 -> 15 0 24 1362 topology 1561 2016 -> 16 0 24 1362 topology 1562 2016 -> 15 0 24 1362 topology 1426 2017 -> 16 0 24 1362 topology 1428 2017 -> 15 0 24 1362 topology 1537 2018 -> 16 0 24 1362 topology 1538 2018 -> 15 0 24 1362 topology 1483 2019 -> 16 0 24 1362 topology 1485 2019 -> 15 0 24 1362 topology 1432 2020 -> 16 0 24 1362 topology 1434 2020 -> 15 0 24 1362 topology 1378 2021 -> 16 0 24 1362 topology 1380 2021 -> 15 0 23 1362 topology 1373 2022 -> 16 0 23 1362 topology 1601 2022 -> 15 0 24 1362 topology 1540 2023 -> 16 0 24 1362 topology 1542 2023 -> 15 0 24 1362 topology 1597 2024 -> 16 0 24 1362 topology 1598 2024 -> 15 0 24 1362 topology 1489 2025 -> 16 0 24 1362 topology 1491 2025 -> 15 0 23 1362 topology 1401 2026 -> 16 0 23 1362 topology 1601 2026 -> 15 0 23 1362 topology 1485 2027 -> 16 0 23 1362 topology 1601 2027 -> 15 0 24 1362 topology 1438 2028 -> 16 0 24 1362 topology 1440 2028 -> 15 0 24 1362 topology 1546 2029 -> 16 0 24 1362 topology 1548 2029 -> 15 0 24 1362 topology 1366 2030 -> 16 0 24 1362 topology 1367 2030 -> 15 0 24 1362 topology 1495 2031 -> 16 0 24 1362 topology 1497 2031 -> 15 0 23 1362 topology 1437 2032 -> 16 0 23 1362 topology 1601 2032 -> 15 0 23 1362 topology 1521 2033 -> 16 0 23 1362 topology 1601 2033 -> 15 0 24 1362 topology 1444 2034 -> 16 0 24 1362 topology 1446 2034 -> 15 0 24 1362 topology 1552 2035 -> 16 0 24 1362 topology 1554 2035 -> 15 0 23 1362 topology 1473 2036 -> 16 0 23 1362 topology 1601 2036 -> 15 0 24 1362 topology 1501 2037 -> 16 0 24 1362 topology 1503 2037 -> 15 0 23 1362 topology 1557 2038 -> 16 0 23 1362 topology 1601 2038 -> 15 0 23 1362 topology 1509 2039 -> 16 0 23 1362 topology 1601 2039 -> 15 0 24 1362 topology 1558 2040 -> 16 0 24 1362 topology 1560 2040 -> 15 0 23 1362 topology 1593 2041 -> 16 0 23 1362 topology 1601 2041 -> 15 0 24 1362 topology 1507 2042 -> 16 0 24 1362 topology 1509 2042 -> 15 0 23 1362 topology 1427 2043 -> 16 0 23 1362 topology 1601 2043 -> 15 0 24 1362 topology 1564 2044 -> 16 0 24 1362 topology 1566 2044 -> 15 0 23 1362 topology 1487 2045 -> 16 0 23 1362 topology 1601 2045 -> 15 0 23 1362 topology 1409 2046 -> 16 0 23 1362 topology 1601 2046 -> 15 0 23 1362 topology 1374 2047 -> 16 0 23 1362 topology 1601 2047 -> 15 0 23 1362 topology 1547 2048 -> 16 0 23 1362 topology 1601 2048 -> 15 0 23 1362 topology 1469 2049 -> 16 0 23 1362 topology 1601 2049 -> 15 0 24 1362 topology 1363 2050 -> 16 0 24 1362 topology 1365 2050 -> 15 0 23 1362 topology 1529 2051 -> 16 0 23 1362 topology 1601 2051 -> 15 0 23 1362 topology 1589 2052 -> 16 0 23 1362 topology 1601 2052 -> 15 0 23 1362 topology 1392 2053 -> 16 0 23 1362 topology 1601 2053 -> 15 0 23 1362 topology 1428 2054 -> 16 0 23 1362 topology 1601 2054 -> 15 0 23 1362 topology 1382 2055 -> 16 0 23 1362 topology 1601 2055 -> 15 0 23 1362 topology 1512 2056 -> 16 0 23 1362 topology 1601 2056 -> 15 0 24 1362 topology 1420 2057 -> 16 0 24 1362 topology 1421 2057 -> 15 0 23 1362 topology 1464 2058 -> 16 0 23 1362 topology 1601 2058 -> 15 0 24 1362 topology 1387 2059 -> 16 0 24 1362 topology 1389 2059 -> 15 0 24 1362 topology 1396 2060 -> 16 0 24 1362 topology 1397 2060 -> 15 0 24 1362 topology 1369 2061 -> 16 0 24 1362 topology 1370 2061 -> 15 0 23 1362 topology 1548 2062 -> 16 0 23 1362 topology 1601 2062 -> 15 0 23 1362 topology 1416 2063 -> 16 0 23 1362 topology 1601 2063 -> 15 0 23 1362 topology 1500 2064 -> 16 0 23 1362 topology 1601 2064 -> 15 0 24 1362 topology 1480 2065 -> 16 0 24 1362 topology 1481 2065 -> 15 0 23 1362 topology 1584 2066 -> 16 0 23 1362 topology 1601 2066 -> 15 0 24 1362 topology 1456 2067 -> 16 0 24 1362 topology 1457 2067 -> 15 0 23 1362 topology 1536 2068 -> 16 0 23 1362 topology 1601 2068 -> 15 0 24 1362 topology 1432 2069 -> 16 0 24 1362 topology 1433 2069 -> 15 0 24 1362 topology 1540 2070 -> 16 0 24 1362 topology 1541 2070 -> 15 0 23 1362 topology 1394 2071 -> 16 0 23 1362 topology 1601 2071 -> 15 0 24 1362 topology 1408 2072 -> 16 0 24 1362 topology 1409 2072 -> 15 0 24 1362 topology 1516 2073 -> 16 0 24 1362 topology 1517 2073 -> 15 0 23 1362 topology 1454 2074 -> 16 0 23 1362 topology 1601 2074 -> 15 0 23 1362 topology 1365 2075 -> 16 0 23 1362 topology 1601 2075 -> 15 0 24 1362 topology 1492 2076 -> 16 0 24 1362 topology 1493 2076 -> 15 0 23 1362 topology 1514 2077 -> 16 0 23 1362 topology 1601 2077 -> 15 0 24 1362 topology 1468 2078 -> 16 0 24 1362 topology 1469 2078 -> 15 0 23 1362 topology 1436 2079 -> 16 0 23 1362 topology 1601 2079 -> 15 0 24 1362 topology 1576 2080 -> 16 0 24 1362 topology 1577 2080 -> 15 0 23 1362 topology 1574 2081 -> 16 0 23 1362 topology 1601 2081 -> 15 0 23 1362 topology 1496 2082 -> 16 0 23 1362 topology 1601 2082 -> 15 0 24 1362 topology 1444 2083 -> 16 0 24 1362 topology 1445 2083 -> 15 0 24 1362 topology 1552 2084 -> 16 0 24 1362 topology 1553 2084 -> 15 0 23 1362 topology 1418 2085 -> 16 0 23 1362 topology 1601 2085 -> 15 0 24 1362 topology 1390 2086 -> 16 0 24 1362 topology 1392 2086 -> 15 0 24 1362 topology 1528 2087 -> 16 0 24 1362 topology 1529 2087 -> 15 0 23 1362 topology 1556 2088 -> 16 0 23 1362 topology 1601 2088 -> 15 0 23 1362 topology 1478 2089 -> 16 0 23 1362 topology 1601 2089 -> 15 0 23 1362 topology 1389 2090 -> 16 0 23 1362 topology 1601 2090 -> 15 0 24 1362 topology 1504 2091 -> 16 0 24 1362 topology 1505 2091 -> 15 0 24 1362 topology 1396 2092 -> 16 0 24 1362 topology 1398 2092 -> 15 0 23 1362 topology 1538 2093 -> 16 0 23 1362 topology 1601 2093 -> 15 0 24 1362 topology 1588 2094 -> 16 0 24 1362 topology 1589 2094 -> 15 0 24 1362 topology 1453 2095 -> 16 0 24 1362 topology 1455 2095 -> 15 0 24 1362 topology 1372 2096 -> 16 0 24 1362 topology 1374 2096 -> 15 0 23 1362 topology 1598 2097 -> 16 0 23 1362 topology 1601 2097 -> 15 0 24 1362 topology 1564 2098 -> 16 0 24 1362 topology 1565 2098 -> 15 0 24 1362 topology 1402 2099 -> 16 0 24 1362 topology 1404 2099 -> 15 0 23 1362 topology 1367 2100 -> 16 0 23 1362 topology 1601 2100 -> 15 0 24 1362 topology 1510 2101 -> 16 0 24 1362 topology 1512 2101 -> 15 0 24 1362 topology 1459 2102 -> 16 0 24 1362 topology 1461 2102 -> 15 0 24 1362 topology 1408 2103 -> 16 0 24 1362 topology 1410 2103 -> 15 0 24 1362 topology 1516 2104 -> 16 0 24 1362 topology 1518 2104 -> 15 0 26 1189 topology 1602 2105 -> 16 0 26 1189 topology 1600 2105 -> 15 0 27 1189 topology 1359 2106 -> 16 0 27 1189 topology 1361 2106 -> 15 0 26 1189 topology 1361 2107 -> 16 0 26 1189 topology 1604 2107 -> 15 0 21 1189 topology 1361 2108 -> 16 0 21 1189 topology 1602 2108 +> 15 0 23 1362 topology 1388 1945 +> 16 0 23 1362 topology 1601 1945 +> 15 0 24 1362 topology 1600 1946 +> 16 0 24 1362 topology 1601 1946 +> 15 0 25 1362 topology 1390 1947 +> 16 0 25 1362 topology 1392 1947 +> 15 0 25 1362 topology 1390 1948 +> 16 0 25 1362 topology 1391 1948 +> 15 0 25 1362 topology 1393 1949 +> 16 0 25 1362 topology 1395 1949 +> 15 0 25 1362 topology 1393 1950 +> 16 0 25 1362 topology 1394 1950 +> 15 0 25 1362 topology 1396 1951 +> 16 0 25 1362 topology 1398 1951 +> 15 0 25 1362 topology 1396 1952 +> 16 0 25 1362 topology 1397 1952 +> 15 0 25 1362 topology 1399 1953 +> 16 0 25 1362 topology 1401 1953 +> 15 0 25 1362 topology 1399 1954 +> 16 0 25 1362 topology 1400 1954 +> 15 0 25 1362 topology 1402 1955 +> 16 0 25 1362 topology 1404 1955 +> 15 0 25 1362 topology 1402 1956 +> 16 0 25 1362 topology 1403 1956 +> 15 0 25 1362 topology 1405 1957 +> 16 0 25 1362 topology 1407 1957 +> 15 0 25 1362 topology 1405 1958 +> 16 0 25 1362 topology 1406 1958 +> 15 0 25 1362 topology 1408 1959 +> 16 0 25 1362 topology 1410 1959 +> 15 0 25 1362 topology 1408 1960 +> 16 0 25 1362 topology 1409 1960 +> 15 0 25 1362 topology 1411 1961 +> 16 0 25 1362 topology 1413 1961 +> 15 0 25 1362 topology 1411 1962 +> 16 0 25 1362 topology 1412 1962 +> 15 0 25 1362 topology 1414 1963 +> 16 0 25 1362 topology 1416 1963 +> 15 0 25 1362 topology 1414 1964 +> 16 0 25 1362 topology 1415 1964 +> 15 0 25 1362 topology 1417 1965 +> 16 0 25 1362 topology 1419 1965 +> 15 0 25 1362 topology 1417 1966 +> 16 0 25 1362 topology 1418 1966 +> 15 0 25 1362 topology 1363 1967 +> 16 0 25 1362 topology 1365 1967 +> 15 0 25 1362 topology 1363 1968 +> 16 0 25 1362 topology 1364 1968 +> 15 0 25 1362 topology 1420 1969 +> 16 0 25 1362 topology 1422 1969 +> 15 0 25 1362 topology 1420 1970 +> 16 0 25 1362 topology 1421 1970 +> 15 0 25 1362 topology 1423 1971 +> 16 0 25 1362 topology 1425 1971 +> 15 0 25 1362 topology 1423 1972 +> 16 0 25 1362 topology 1424 1972 +> 15 0 25 1362 topology 1426 1973 +> 16 0 25 1362 topology 1428 1973 +> 15 0 25 1362 topology 1426 1974 +> 16 0 25 1362 topology 1427 1974 +> 15 0 25 1362 topology 1429 1975 +> 16 0 25 1362 topology 1431 1975 +> 15 0 25 1362 topology 1429 1976 +> 16 0 25 1362 topology 1430 1976 +> 15 0 25 1362 topology 1432 1977 +> 16 0 25 1362 topology 1434 1977 +> 15 0 25 1362 topology 1432 1978 +> 16 0 25 1362 topology 1433 1978 +> 15 0 25 1362 topology 1435 1979 +> 16 0 25 1362 topology 1437 1979 +> 15 0 25 1362 topology 1435 1980 +> 16 0 25 1362 topology 1436 1980 +> 15 0 25 1362 topology 1438 1981 +> 16 0 25 1362 topology 1440 1981 +> 15 0 25 1362 topology 1438 1982 +> 16 0 25 1362 topology 1439 1982 +> 15 0 25 1362 topology 1441 1983 +> 16 0 25 1362 topology 1443 1983 +> 15 0 25 1362 topology 1441 1984 +> 16 0 25 1362 topology 1442 1984 +> 15 0 25 1362 topology 1444 1985 +> 16 0 25 1362 topology 1446 1985 +> 15 0 25 1362 topology 1444 1986 +> 16 0 25 1362 topology 1445 1986 +> 15 0 25 1362 topology 1447 1987 +> 16 0 25 1362 topology 1449 1987 +> 15 0 25 1362 topology 1447 1988 +> 16 0 25 1362 topology 1448 1988 +> 15 0 25 1362 topology 1366 1989 +> 16 0 25 1362 topology 1368 1989 +> 15 0 25 1362 topology 1366 1990 +> 16 0 25 1362 topology 1367 1990 +> 15 0 25 1362 topology 1450 1991 +> 16 0 25 1362 topology 1452 1991 +> 15 0 25 1362 topology 1450 1992 +> 16 0 25 1362 topology 1451 1992 +> 15 0 25 1362 topology 1453 1993 +> 16 0 25 1362 topology 1455 1993 +> 15 0 25 1362 topology 1453 1994 +> 16 0 25 1362 topology 1454 1994 +> 15 0 25 1362 topology 1456 1995 +> 16 0 25 1362 topology 1458 1995 +> 15 0 25 1362 topology 1456 1996 +> 16 0 25 1362 topology 1457 1996 +> 15 0 25 1362 topology 1459 1997 +> 16 0 25 1362 topology 1461 1997 +> 15 0 25 1362 topology 1459 1998 +> 16 0 25 1362 topology 1460 1998 +> 15 0 25 1362 topology 1462 1999 +> 16 0 25 1362 topology 1464 1999 +> 15 0 25 1362 topology 1462 2000 +> 16 0 25 1362 topology 1463 2000 +> 15 0 25 1362 topology 1465 2001 +> 16 0 25 1362 topology 1467 2001 +> 15 0 25 1362 topology 1465 2002 +> 16 0 25 1362 topology 1466 2002 +> 15 0 25 1362 topology 1468 2003 +> 16 0 25 1362 topology 1470 2003 +> 15 0 25 1362 topology 1468 2004 +> 16 0 25 1362 topology 1469 2004 +> 15 0 25 1362 topology 1471 2005 +> 16 0 25 1362 topology 1473 2005 +> 15 0 25 1362 topology 1471 2006 +> 16 0 25 1362 topology 1472 2006 +> 15 0 25 1362 topology 1474 2007 +> 16 0 25 1362 topology 1476 2007 +> 15 0 25 1362 topology 1474 2008 +> 16 0 25 1362 topology 1475 2008 +> 15 0 25 1362 topology 1477 2009 +> 16 0 25 1362 topology 1479 2009 +> 15 0 25 1362 topology 1477 2010 +> 16 0 25 1362 topology 1478 2010 +> 15 0 25 1362 topology 1369 2011 +> 16 0 25 1362 topology 1371 2011 +> 15 0 25 1362 topology 1369 2012 +> 16 0 25 1362 topology 1370 2012 +> 15 0 25 1362 topology 1480 2013 +> 16 0 25 1362 topology 1482 2013 +> 15 0 25 1362 topology 1480 2014 +> 16 0 25 1362 topology 1481 2014 +> 15 0 25 1362 topology 1483 2015 +> 16 0 25 1362 topology 1485 2015 +> 15 0 25 1362 topology 1483 2016 +> 16 0 25 1362 topology 1484 2016 +> 15 0 25 1362 topology 1486 2017 +> 16 0 25 1362 topology 1488 2017 +> 15 0 25 1362 topology 1486 2018 +> 16 0 25 1362 topology 1487 2018 +> 15 0 25 1362 topology 1489 2019 +> 16 0 25 1362 topology 1491 2019 +> 15 0 25 1362 topology 1489 2020 +> 16 0 25 1362 topology 1490 2020 +> 15 0 25 1362 topology 1492 2021 +> 16 0 25 1362 topology 1494 2021 +> 15 0 25 1362 topology 1492 2022 +> 16 0 25 1362 topology 1493 2022 +> 15 0 25 1362 topology 1495 2023 +> 16 0 25 1362 topology 1497 2023 +> 15 0 25 1362 topology 1495 2024 +> 16 0 25 1362 topology 1496 2024 +> 15 0 25 1362 topology 1498 2025 +> 16 0 25 1362 topology 1500 2025 +> 15 0 25 1362 topology 1498 2026 +> 16 0 25 1362 topology 1499 2026 +> 15 0 25 1362 topology 1501 2027 +> 16 0 25 1362 topology 1503 2027 +> 15 0 25 1362 topology 1501 2028 +> 16 0 25 1362 topology 1502 2028 +> 15 0 25 1362 topology 1504 2029 +> 16 0 25 1362 topology 1506 2029 +> 15 0 25 1362 topology 1504 2030 +> 16 0 25 1362 topology 1505 2030 +> 15 0 25 1362 topology 1507 2031 +> 16 0 25 1362 topology 1509 2031 +> 15 0 25 1362 topology 1507 2032 +> 16 0 25 1362 topology 1508 2032 +> 15 0 25 1362 topology 1372 2033 +> 16 0 25 1362 topology 1374 2033 +> 15 0 25 1362 topology 1372 2034 +> 16 0 25 1362 topology 1373 2034 +> 15 0 25 1362 topology 1510 2035 +> 16 0 25 1362 topology 1512 2035 +> 15 0 25 1362 topology 1510 2036 +> 16 0 25 1362 topology 1511 2036 +> 15 0 25 1362 topology 1513 2037 +> 16 0 25 1362 topology 1515 2037 +> 15 0 25 1362 topology 1513 2038 +> 16 0 25 1362 topology 1514 2038 +> 15 0 25 1362 topology 1516 2039 +> 16 0 25 1362 topology 1518 2039 +> 15 0 25 1362 topology 1516 2040 +> 16 0 25 1362 topology 1517 2040 +> 15 0 25 1362 topology 1519 2041 +> 16 0 25 1362 topology 1521 2041 +> 15 0 25 1362 topology 1519 2042 +> 16 0 25 1362 topology 1520 2042 +> 15 0 25 1362 topology 1522 2043 +> 16 0 25 1362 topology 1524 2043 +> 15 0 25 1362 topology 1522 2044 +> 16 0 25 1362 topology 1523 2044 +> 15 0 25 1362 topology 1525 2045 +> 16 0 25 1362 topology 1527 2045 +> 15 0 25 1362 topology 1525 2046 +> 16 0 25 1362 topology 1526 2046 +> 15 0 25 1362 topology 1528 2047 +> 16 0 25 1362 topology 1530 2047 +> 15 0 25 1362 topology 1528 2048 +> 16 0 25 1362 topology 1529 2048 +> 15 0 25 1362 topology 1531 2049 +> 16 0 25 1362 topology 1533 2049 +> 15 0 25 1362 topology 1531 2050 +> 16 0 25 1362 topology 1532 2050 +> 15 0 25 1362 topology 1534 2051 +> 16 0 25 1362 topology 1536 2051 +> 15 0 25 1362 topology 1534 2052 +> 16 0 25 1362 topology 1535 2052 +> 15 0 25 1362 topology 1537 2053 +> 16 0 25 1362 topology 1539 2053 +> 15 0 25 1362 topology 1537 2054 +> 16 0 25 1362 topology 1538 2054 +> 15 0 25 1362 topology 1375 2055 +> 16 0 25 1362 topology 1377 2055 +> 15 0 25 1362 topology 1375 2056 +> 16 0 25 1362 topology 1376 2056 +> 15 0 25 1362 topology 1540 2057 +> 16 0 25 1362 topology 1542 2057 +> 15 0 25 1362 topology 1540 2058 +> 16 0 25 1362 topology 1541 2058 +> 15 0 25 1362 topology 1543 2059 +> 16 0 25 1362 topology 1545 2059 +> 15 0 25 1362 topology 1543 2060 +> 16 0 25 1362 topology 1544 2060 +> 15 0 25 1362 topology 1546 2061 +> 16 0 25 1362 topology 1548 2061 +> 15 0 25 1362 topology 1546 2062 +> 16 0 25 1362 topology 1547 2062 +> 15 0 25 1362 topology 1549 2063 +> 16 0 25 1362 topology 1551 2063 +> 15 0 25 1362 topology 1549 2064 +> 16 0 25 1362 topology 1550 2064 +> 15 0 25 1362 topology 1552 2065 +> 16 0 25 1362 topology 1554 2065 +> 15 0 25 1362 topology 1552 2066 +> 16 0 25 1362 topology 1553 2066 +> 15 0 25 1362 topology 1555 2067 +> 16 0 25 1362 topology 1557 2067 +> 15 0 25 1362 topology 1555 2068 +> 16 0 25 1362 topology 1556 2068 +> 15 0 25 1362 topology 1558 2069 +> 16 0 25 1362 topology 1560 2069 +> 15 0 25 1362 topology 1558 2070 +> 16 0 25 1362 topology 1559 2070 +> 15 0 25 1362 topology 1561 2071 +> 16 0 25 1362 topology 1563 2071 +> 15 0 25 1362 topology 1561 2072 +> 16 0 25 1362 topology 1562 2072 +> 15 0 25 1362 topology 1564 2073 +> 16 0 25 1362 topology 1566 2073 +> 15 0 25 1362 topology 1564 2074 +> 16 0 25 1362 topology 1565 2074 +> 15 0 25 1362 topology 1567 2075 +> 16 0 25 1362 topology 1569 2075 +> 15 0 25 1362 topology 1567 2076 +> 16 0 25 1362 topology 1568 2076 +> 15 0 25 1362 topology 1378 2077 +> 16 0 25 1362 topology 1380 2077 +> 15 0 25 1362 topology 1378 2078 +> 16 0 25 1362 topology 1379 2078 +> 15 0 25 1362 topology 1570 2079 +> 16 0 25 1362 topology 1572 2079 +> 15 0 25 1362 topology 1570 2080 +> 16 0 25 1362 topology 1571 2080 +> 15 0 25 1362 topology 1573 2081 +> 16 0 25 1362 topology 1575 2081 +> 15 0 25 1362 topology 1573 2082 +> 16 0 25 1362 topology 1574 2082 +> 15 0 25 1362 topology 1576 2083 +> 16 0 25 1362 topology 1578 2083 +> 15 0 25 1362 topology 1576 2084 +> 16 0 25 1362 topology 1577 2084 +> 15 0 25 1362 topology 1579 2085 +> 16 0 25 1362 topology 1581 2085 +> 15 0 25 1362 topology 1579 2086 +> 16 0 25 1362 topology 1580 2086 +> 15 0 25 1362 topology 1582 2087 +> 16 0 25 1362 topology 1584 2087 +> 15 0 25 1362 topology 1582 2088 +> 16 0 25 1362 topology 1583 2088 +> 15 0 25 1362 topology 1585 2089 +> 16 0 25 1362 topology 1587 2089 +> 15 0 25 1362 topology 1585 2090 +> 16 0 25 1362 topology 1586 2090 +> 15 0 25 1362 topology 1588 2091 +> 16 0 25 1362 topology 1590 2091 +> 15 0 25 1362 topology 1588 2092 +> 16 0 25 1362 topology 1589 2092 +> 15 0 25 1362 topology 1591 2093 +> 16 0 25 1362 topology 1593 2093 +> 15 0 25 1362 topology 1591 2094 +> 16 0 25 1362 topology 1592 2094 +> 15 0 25 1362 topology 1594 2095 +> 16 0 25 1362 topology 1596 2095 +> 15 0 25 1362 topology 1594 2096 +> 16 0 25 1362 topology 1595 2096 +> 15 0 25 1362 topology 1597 2097 +> 16 0 25 1362 topology 1599 2097 +> 15 0 25 1362 topology 1597 2098 +> 16 0 25 1362 topology 1598 2098 +> 15 0 25 1362 topology 1381 2099 +> 16 0 25 1362 topology 1383 2099 +> 15 0 25 1362 topology 1381 2100 +> 16 0 25 1362 topology 1382 2100 +> 15 0 25 1362 topology 1384 2101 +> 16 0 25 1362 topology 1386 2101 +> 15 0 25 1362 topology 1384 2102 +> 16 0 25 1362 topology 1385 2102 +> 15 0 25 1362 topology 1387 2103 +> 16 0 25 1362 topology 1389 2103 +> 15 0 25 1362 topology 1387 2104 +> 16 0 25 1362 topology 1388 2104 +> 15 0 26 1189 topology 1361 2105 +> 16 0 26 1189 topology 1604 2105 +> 15 0 26 1189 topology 1602 2106 +> 16 0 26 1189 topology 1604 2106 +> 15 0 27 1189 topology 1359 2107 +> 16 0 27 1189 topology 1361 2107 +> 15 0 20 1189 topology 1361 2108 +> 16 0 20 1189 topology 1602 2108 > 15 0 26 1189 topology 1602 2109 -> 16 0 26 1189 topology 1604 2109 -> 15 0 28 1608 topology 1641 2110 +> 16 0 26 1189 topology 1600 2109 +> 15 0 28 1608 topology 1638 2110 > 16 0 28 1608 topology 1727 2110 -> 15 0 28 1608 topology 1701 2111 +> 15 0 28 1608 topology 1637 2111 > 16 0 28 1608 topology 1727 2111 -> 15 0 28 1608 topology 1631 2112 +> 15 0 28 1608 topology 1641 2112 > 16 0 28 1608 topology 1727 2112 -> 15 0 28 1608 topology 1677 2113 +> 15 0 28 1608 topology 1640 2113 > 16 0 28 1608 topology 1727 2113 -> 15 0 28 1608 topology 1653 2114 +> 15 0 28 1608 topology 1644 2114 > 16 0 28 1608 topology 1727 2114 -> 15 0 29 1608 topology 1633 2115 -> 16 0 29 1608 topology 1634 2115 -> 15 0 28 1608 topology 1713 2116 +> 15 0 28 1608 topology 1643 2115 +> 16 0 28 1608 topology 1727 2115 +> 15 0 28 1608 topology 1647 2116 > 16 0 28 1608 topology 1727 2116 -> 15 0 28 1608 topology 1689 2117 +> 15 0 28 1608 topology 1646 2117 > 16 0 28 1608 topology 1727 2117 -> 15 0 29 1608 topology 1609 2118 -> 16 0 29 1608 topology 1611 2118 -> 15 0 29 1608 topology 1636 2119 -> 16 0 29 1608 topology 1638 2119 -> 15 0 28 1608 topology 1665 2120 +> 15 0 28 1608 topology 1650 2118 +> 16 0 28 1608 topology 1727 2118 +> 15 0 28 1608 topology 1649 2119 +> 16 0 28 1608 topology 1727 2119 +> 15 0 28 1608 topology 1653 2120 > 16 0 28 1608 topology 1727 2120 -> 15 0 29 1608 topology 1639 2121 -> 16 0 29 1608 topology 1641 2121 -> 15 0 28 1608 topology 1725 2122 +> 15 0 28 1608 topology 1652 2121 +> 16 0 28 1608 topology 1727 2121 +> 15 0 28 1608 topology 1656 2122 > 16 0 28 1608 topology 1727 2122 -> 15 0 28 1608 topology 1637 2123 +> 15 0 28 1608 topology 1655 2123 > 16 0 28 1608 topology 1727 2123 -> 15 0 29 1608 topology 1642 2124 -> 16 0 29 1608 topology 1644 2124 -> 15 0 29 1608 topology 1696 2125 -> 16 0 29 1608 topology 1698 2125 -> 15 0 28 1608 topology 1667 2126 +> 15 0 28 1608 topology 1659 2124 +> 16 0 28 1608 topology 1727 2124 +> 15 0 28 1608 topology 1658 2125 +> 16 0 28 1608 topology 1727 2125 +> 15 0 28 1608 topology 1662 2126 > 16 0 28 1608 topology 1727 2126 -> 15 0 29 1608 topology 1645 2127 -> 16 0 29 1608 topology 1647 2127 -> 15 0 28 1608 topology 1697 2128 +> 15 0 28 1608 topology 1661 2127 +> 16 0 28 1608 topology 1727 2127 +> 15 0 28 1608 topology 1665 2128 > 16 0 28 1608 topology 1727 2128 -> 15 0 29 1608 topology 1699 2129 -> 16 0 29 1608 topology 1701 2129 -> 15 0 29 1608 topology 1621 2130 -> 16 0 29 1608 topology 1623 2130 -> 15 0 28 1608 topology 1649 2131 +> 15 0 28 1608 topology 1664 2129 +> 16 0 28 1608 topology 1727 2129 +> 15 0 28 1608 topology 1611 2130 +> 16 0 28 1608 topology 1727 2130 +> 15 0 28 1608 topology 1610 2131 > 16 0 28 1608 topology 1727 2131 -> 15 0 29 1608 topology 1648 2132 -> 16 0 29 1608 topology 1650 2132 -> 15 0 29 1608 topology 1702 2133 -> 16 0 29 1608 topology 1704 2133 -> 15 0 28 1608 topology 1679 2134 +> 15 0 28 1608 topology 1668 2132 +> 16 0 28 1608 topology 1727 2132 +> 15 0 28 1608 topology 1667 2133 +> 16 0 28 1608 topology 1727 2133 +> 15 0 28 1608 topology 1671 2134 > 16 0 28 1608 topology 1727 2134 -> 15 0 28 1608 topology 1620 2135 +> 15 0 28 1608 topology 1670 2135 > 16 0 28 1608 topology 1727 2135 -> 15 0 29 1608 topology 1651 2136 -> 16 0 29 1608 topology 1653 2136 -> 15 0 29 1608 topology 1705 2137 -> 16 0 29 1608 topology 1707 2137 -> 15 0 28 1608 topology 1709 2138 +> 15 0 28 1608 topology 1674 2136 +> 16 0 28 1608 topology 1727 2136 +> 15 0 28 1608 topology 1673 2137 +> 16 0 28 1608 topology 1727 2137 +> 15 0 28 1608 topology 1677 2138 > 16 0 28 1608 topology 1727 2138 -> 15 0 29 1608 topology 1654 2139 -> 16 0 29 1608 topology 1656 2139 -> 15 0 28 1608 topology 1661 2140 +> 15 0 28 1608 topology 1676 2139 +> 16 0 28 1608 topology 1727 2139 +> 15 0 28 1608 topology 1680 2140 > 16 0 28 1608 topology 1727 2140 -> 15 0 29 1608 topology 1708 2141 -> 16 0 29 1608 topology 1710 2141 -> 15 0 29 1608 topology 1636 2142 -> 16 0 29 1608 topology 1637 2142 -> 15 0 28 1608 topology 1691 2143 +> 15 0 28 1608 topology 1679 2141 +> 16 0 28 1608 topology 1727 2141 +> 15 0 28 1608 topology 1683 2142 +> 16 0 28 1608 topology 1727 2142 +> 15 0 28 1608 topology 1682 2143 > 16 0 28 1608 topology 1727 2143 -> 15 0 28 1608 topology 1632 2144 +> 15 0 28 1608 topology 1686 2144 > 16 0 28 1608 topology 1727 2144 -> 15 0 29 1608 topology 1657 2145 -> 16 0 29 1608 topology 1659 2145 -> 15 0 29 1608 topology 1711 2146 -> 16 0 29 1608 topology 1713 2146 -> 15 0 28 1608 topology 1721 2147 +> 15 0 28 1608 topology 1685 2145 +> 16 0 28 1608 topology 1727 2145 +> 15 0 28 1608 topology 1689 2146 +> 16 0 28 1608 topology 1727 2146 +> 15 0 28 1608 topology 1688 2147 > 16 0 28 1608 topology 1727 2147 -> 15 0 29 1608 topology 1612 2148 -> 16 0 29 1608 topology 1613 2148 -> 15 0 29 1608 topology 1666 2149 -> 16 0 29 1608 topology 1667 2149 -> 15 0 30 1608 topology 1726 2150 -> 16 0 30 1608 topology 1727 2150 -> 15 0 29 1608 topology 1633 2151 -> 16 0 29 1608 topology 1635 2151 -> 15 0 29 1608 topology 1660 2152 -> 16 0 29 1608 topology 1662 2152 -> 15 0 29 1608 topology 1714 2153 -> 16 0 29 1608 topology 1716 2153 -> 15 0 29 1608 topology 1642 2154 -> 16 0 29 1608 topology 1643 2154 -> 15 0 29 1608 topology 1696 2155 -> 16 0 29 1608 topology 1697 2155 -> 15 0 29 1608 topology 1663 2156 -> 16 0 29 1608 topology 1665 2156 -> 15 0 29 1608 topology 1717 2157 -> 16 0 29 1608 topology 1719 2157 -> 15 0 29 1608 topology 1672 2158 -> 16 0 29 1608 topology 1673 2158 -> 15 0 29 1608 topology 1720 2159 -> 16 0 29 1608 topology 1722 2159 -> 15 0 29 1608 topology 1648 2160 -> 16 0 29 1608 topology 1649 2160 -> 15 0 29 1608 topology 1702 2161 -> 16 0 29 1608 topology 1703 2161 -> 15 0 28 1608 topology 1616 2162 +> 15 0 28 1608 topology 1692 2148 +> 16 0 28 1608 topology 1727 2148 +> 15 0 28 1608 topology 1691 2149 +> 16 0 28 1608 topology 1727 2149 +> 15 0 28 1608 topology 1695 2150 +> 16 0 28 1608 topology 1727 2150 +> 15 0 28 1608 topology 1694 2151 +> 16 0 28 1608 topology 1727 2151 +> 15 0 28 1608 topology 1614 2152 +> 16 0 28 1608 topology 1727 2152 +> 15 0 28 1608 topology 1613 2153 +> 16 0 28 1608 topology 1727 2153 +> 15 0 28 1608 topology 1698 2154 +> 16 0 28 1608 topology 1727 2154 +> 15 0 28 1608 topology 1697 2155 +> 16 0 28 1608 topology 1727 2155 +> 15 0 28 1608 topology 1701 2156 +> 16 0 28 1608 topology 1727 2156 +> 15 0 28 1608 topology 1700 2157 +> 16 0 28 1608 topology 1727 2157 +> 15 0 28 1608 topology 1704 2158 +> 16 0 28 1608 topology 1727 2158 +> 15 0 28 1608 topology 1703 2159 +> 16 0 28 1608 topology 1727 2159 +> 15 0 28 1608 topology 1707 2160 +> 16 0 28 1608 topology 1727 2160 +> 15 0 28 1608 topology 1706 2161 +> 16 0 28 1608 topology 1727 2161 +> 15 0 28 1608 topology 1710 2162 > 16 0 28 1608 topology 1727 2162 -> 15 0 29 1608 topology 1723 2163 -> 16 0 29 1608 topology 1725 2163 -> 15 0 29 1608 topology 1624 2164 -> 16 0 29 1608 topology 1625 2164 -> 15 0 29 1608 topology 1678 2165 -> 16 0 29 1608 topology 1679 2165 -> 15 0 28 1608 topology 1668 2166 +> 15 0 28 1608 topology 1709 2163 +> 16 0 28 1608 topology 1727 2163 +> 15 0 28 1608 topology 1713 2164 +> 16 0 28 1608 topology 1727 2164 +> 15 0 28 1608 topology 1712 2165 +> 16 0 28 1608 topology 1727 2165 +> 15 0 28 1608 topology 1716 2166 > 16 0 28 1608 topology 1727 2166 -> 15 0 28 1608 topology 1644 2167 +> 15 0 28 1608 topology 1715 2167 > 16 0 28 1608 topology 1727 2167 -> 15 0 29 1608 topology 1654 2168 -> 16 0 29 1608 topology 1655 2168 -> 15 0 29 1608 topology 1708 2169 -> 16 0 29 1608 topology 1709 2169 -> 15 0 28 1608 topology 1628 2170 +> 15 0 28 1608 topology 1719 2168 +> 16 0 28 1608 topology 1727 2168 +> 15 0 28 1608 topology 1718 2169 +> 16 0 28 1608 topology 1727 2169 +> 15 0 28 1608 topology 1722 2170 > 16 0 28 1608 topology 1727 2170 -> 15 0 29 1608 topology 1684 2171 -> 16 0 29 1608 topology 1685 2171 -> 15 0 28 1608 topology 1704 2172 +> 15 0 28 1608 topology 1721 2171 +> 16 0 28 1608 topology 1727 2171 +> 15 0 28 1608 topology 1725 2172 > 16 0 28 1608 topology 1727 2172 -> 15 0 28 1608 topology 1680 2173 +> 15 0 28 1608 topology 1724 2173 > 16 0 28 1608 topology 1727 2173 -> 15 0 28 1608 topology 1656 2174 +> 15 0 28 1608 topology 1617 2174 > 16 0 28 1608 topology 1727 2174 -> 15 0 29 1608 topology 1660 2175 -> 16 0 29 1608 topology 1661 2175 -> 15 0 29 1608 topology 1714 2176 -> 16 0 29 1608 topology 1715 2176 -> 15 0 29 1608 topology 1690 2177 -> 16 0 29 1608 topology 1691 2177 -> 15 0 28 1608 topology 1716 2178 +> 15 0 28 1608 topology 1616 2175 +> 16 0 28 1608 topology 1727 2175 +> 15 0 28 1608 topology 1620 2176 +> 16 0 28 1608 topology 1727 2176 +> 15 0 28 1608 topology 1619 2177 +> 16 0 28 1608 topology 1727 2177 +> 15 0 28 1608 topology 1623 2178 > 16 0 28 1608 topology 1727 2178 -> 15 0 28 1608 topology 1692 2179 +> 15 0 28 1608 topology 1622 2179 > 16 0 28 1608 topology 1727 2179 -> 15 0 29 1608 topology 1720 2180 -> 16 0 29 1608 topology 1721 2180 -> 15 0 29 1608 topology 1618 2181 -> 16 0 29 1608 topology 1620 2181 -> 15 0 28 1608 topology 1611 2182 +> 15 0 28 1608 topology 1626 2180 +> 16 0 28 1608 topology 1727 2180 +> 15 0 28 1608 topology 1625 2181 +> 16 0 28 1608 topology 1727 2181 +> 15 0 28 1608 topology 1629 2182 > 16 0 28 1608 topology 1727 2182 -> 15 0 28 1608 topology 1646 2183 +> 15 0 28 1608 topology 1628 2183 > 16 0 28 1608 topology 1727 2183 -> 15 0 28 1608 topology 1676 2184 +> 15 0 28 1608 topology 1632 2184 > 16 0 28 1608 topology 1727 2184 -> 15 0 28 1608 topology 1706 2185 +> 15 0 28 1608 topology 1631 2185 > 16 0 28 1608 topology 1727 2185 -> 15 0 28 1608 topology 1623 2186 +> 15 0 28 1608 topology 1635 2186 > 16 0 28 1608 topology 1727 2186 -> 15 0 28 1608 topology 1658 2187 +> 15 0 28 1608 topology 1634 2187 > 16 0 28 1608 topology 1727 2187 -> 15 0 28 1608 topology 1688 2188 -> 16 0 28 1608 topology 1727 2188 -> 15 0 28 1608 topology 1718 2189 -> 16 0 28 1608 topology 1727 2189 -> 15 0 29 1608 topology 1630 2190 -> 16 0 29 1608 topology 1632 2190 -> 15 0 28 1608 topology 1635 2191 -> 16 0 28 1608 topology 1727 2191 -> 15 0 29 1608 topology 1615 2192 -> 16 0 29 1608 topology 1616 2192 -> 15 0 28 1608 topology 1613 2193 -> 16 0 28 1608 topology 1727 2193 -> 15 0 28 1608 topology 1625 2194 -> 16 0 28 1608 topology 1727 2194 -> 15 0 29 1608 topology 1627 2195 -> 16 0 29 1608 topology 1628 2195 -> 15 0 28 1608 topology 1671 2196 -> 16 0 28 1608 topology 1727 2196 -> 15 0 28 1608 topology 1647 2197 -> 16 0 28 1608 topology 1727 2197 -> 15 0 28 1608 topology 1707 2198 -> 16 0 28 1608 topology 1727 2198 -> 15 0 28 1608 topology 1683 2199 -> 16 0 28 1608 topology 1727 2199 -> 15 0 28 1608 topology 1659 2200 -> 16 0 28 1608 topology 1727 2200 -> 15 0 28 1608 topology 1719 2201 -> 16 0 28 1608 topology 1727 2201 -> 15 0 28 1608 topology 1695 2202 -> 16 0 28 1608 topology 1727 2202 -> 15 0 29 1608 topology 1666 2203 -> 16 0 29 1608 topology 1668 2203 -> 15 0 29 1608 topology 1615 2204 -> 16 0 29 1608 topology 1617 2204 -> 15 0 29 1608 topology 1669 2205 -> 16 0 29 1608 topology 1671 2205 -> 15 0 28 1608 topology 1643 2206 -> 16 0 28 1608 topology 1727 2206 -> 15 0 29 1608 topology 1672 2207 -> 16 0 29 1608 topology 1674 2207 -> 15 0 28 1608 topology 1673 2208 -> 16 0 28 1608 topology 1727 2208 -> 15 0 28 1608 topology 1614 2209 -> 16 0 28 1608 topology 1727 2209 -> 15 0 29 1608 topology 1675 2210 -> 16 0 29 1608 topology 1677 2210 -> 15 0 28 1608 topology 1703 2211 -> 16 0 28 1608 topology 1727 2211 -> 15 0 28 1608 topology 1655 2212 -> 16 0 28 1608 topology 1727 2212 -> 15 0 29 1608 topology 1678 2213 -> 16 0 29 1608 topology 1680 2213 -> 15 0 28 1608 topology 1685 2214 -> 16 0 28 1608 topology 1727 2214 -> 15 0 28 1608 topology 1626 2215 -> 16 0 28 1608 topology 1727 2215 -> 15 0 29 1608 topology 1627 2216 -> 16 0 29 1608 topology 1629 2216 -> 15 0 29 1608 topology 1681 2217 -> 16 0 29 1608 topology 1683 2217 -> 15 0 28 1608 topology 1715 2218 -> 16 0 28 1608 topology 1727 2218 -> 15 0 29 1608 topology 1684 2219 -> 16 0 29 1608 topology 1686 2219 -> 15 0 29 1608 topology 1639 2220 -> 16 0 29 1608 topology 1640 2220 -> 15 0 29 1608 topology 1687 2221 -> 16 0 29 1608 topology 1689 2221 -> 15 0 29 1608 topology 1669 2222 -> 16 0 29 1608 topology 1670 2222 -> 15 0 29 1608 topology 1690 2223 -> 16 0 29 1608 topology 1692 2223 -> 15 0 29 1608 topology 1618 2224 -> 16 0 29 1608 topology 1619 2224 -> 15 0 29 1608 topology 1645 2225 -> 16 0 29 1608 topology 1646 2225 -> 15 0 29 1608 topology 1699 2226 -> 16 0 29 1608 topology 1700 2226 -> 15 0 28 1608 topology 1610 2227 -> 16 0 28 1608 topology 1727 2227 -> 15 0 29 1608 topology 1693 2228 -> 16 0 29 1608 topology 1695 2228 -> 15 0 29 1608 topology 1675 2229 -> 16 0 29 1608 topology 1676 2229 -> 15 0 28 1608 topology 1638 2230 -> 16 0 28 1608 topology 1727 2230 -> 15 0 29 1608 topology 1651 2231 -> 16 0 29 1608 topology 1652 2231 -> 15 0 29 1608 topology 1705 2232 -> 16 0 29 1608 topology 1706 2232 -> 15 0 28 1608 topology 1622 2233 -> 16 0 28 1608 topology 1727 2233 -> 15 0 29 1608 topology 1681 2234 -> 16 0 29 1608 topology 1682 2234 -> 15 0 28 1608 topology 1698 2235 -> 16 0 28 1608 topology 1727 2235 -> 15 0 28 1608 topology 1674 2236 -> 16 0 28 1608 topology 1727 2236 -> 15 0 29 1608 topology 1630 2237 -> 16 0 29 1608 topology 1631 2237 -> 15 0 28 1608 topology 1650 2238 -> 16 0 28 1608 topology 1727 2238 -> 15 0 29 1608 topology 1657 2239 -> 16 0 29 1608 topology 1658 2239 -> 15 0 29 1608 topology 1711 2240 -> 16 0 29 1608 topology 1712 2240 -> 15 0 28 1608 topology 1634 2241 -> 16 0 28 1608 topology 1727 2241 -> 15 0 29 1608 topology 1687 2242 -> 16 0 29 1608 topology 1688 2242 -> 15 0 28 1608 topology 1710 2243 -> 16 0 28 1608 topology 1727 2243 -> 15 0 28 1608 topology 1686 2244 -> 16 0 28 1608 topology 1727 2244 -> 15 0 28 1608 topology 1662 2245 -> 16 0 28 1608 topology 1727 2245 -> 15 0 29 1608 topology 1663 2246 -> 16 0 29 1608 topology 1664 2246 -> 15 0 29 1608 topology 1717 2247 -> 16 0 29 1608 topology 1718 2247 -> 15 0 29 1608 topology 1693 2248 -> 16 0 29 1608 topology 1694 2248 -> 15 0 28 1608 topology 1722 2249 -> 16 0 28 1608 topology 1727 2249 -> 15 0 29 1608 topology 1612 2250 -> 16 0 29 1608 topology 1614 2250 -> 15 0 29 1608 topology 1723 2251 -> 16 0 29 1608 topology 1724 2251 -> 15 0 28 1608 topology 1640 2252 -> 16 0 28 1608 topology 1727 2252 -> 15 0 28 1608 topology 1670 2253 -> 16 0 28 1608 topology 1727 2253 -> 15 0 28 1608 topology 1700 2254 -> 16 0 28 1608 topology 1727 2254 -> 15 0 28 1608 topology 1617 2255 -> 16 0 28 1608 topology 1727 2255 -> 15 0 28 1608 topology 1652 2256 -> 16 0 28 1608 topology 1727 2256 -> 15 0 29 1608 topology 1624 2257 -> 16 0 29 1608 topology 1626 2257 -> 15 0 28 1608 topology 1682 2258 -> 16 0 28 1608 topology 1727 2258 -> 15 0 28 1608 topology 1712 2259 -> 16 0 28 1608 topology 1727 2259 -> 15 0 29 1608 topology 1609 2260 -> 16 0 29 1608 topology 1610 2260 -> 15 0 28 1608 topology 1629 2261 -> 16 0 28 1608 topology 1727 2261 -> 15 0 28 1608 topology 1664 2262 -> 16 0 28 1608 topology 1727 2262 -> 15 0 28 1608 topology 1694 2263 -> 16 0 28 1608 topology 1727 2263 -> 15 0 28 1608 topology 1724 2264 -> 16 0 28 1608 topology 1727 2264 -> 15 0 29 1608 topology 1621 2265 -> 16 0 29 1608 topology 1622 2265 -> 15 0 28 1608 topology 1619 2266 -> 16 0 28 1608 topology 1727 2266 -> 15 0 28 1728 topology 1764 2267 +> 15 0 29 1608 topology 1726 2188 +> 16 0 29 1608 topology 1727 2188 +> 15 0 30 1608 topology 1636 2189 +> 16 0 30 1608 topology 1638 2189 +> 15 0 30 1608 topology 1636 2190 +> 16 0 30 1608 topology 1637 2190 +> 15 0 30 1608 topology 1639 2191 +> 16 0 30 1608 topology 1641 2191 +> 15 0 30 1608 topology 1639 2192 +> 16 0 30 1608 topology 1640 2192 +> 15 0 30 1608 topology 1642 2193 +> 16 0 30 1608 topology 1644 2193 +> 15 0 30 1608 topology 1642 2194 +> 16 0 30 1608 topology 1643 2194 +> 15 0 30 1608 topology 1645 2195 +> 16 0 30 1608 topology 1647 2195 +> 15 0 30 1608 topology 1645 2196 +> 16 0 30 1608 topology 1646 2196 +> 15 0 30 1608 topology 1648 2197 +> 16 0 30 1608 topology 1650 2197 +> 15 0 30 1608 topology 1648 2198 +> 16 0 30 1608 topology 1649 2198 +> 15 0 30 1608 topology 1651 2199 +> 16 0 30 1608 topology 1653 2199 +> 15 0 30 1608 topology 1651 2200 +> 16 0 30 1608 topology 1652 2200 +> 15 0 30 1608 topology 1654 2201 +> 16 0 30 1608 topology 1656 2201 +> 15 0 30 1608 topology 1654 2202 +> 16 0 30 1608 topology 1655 2202 +> 15 0 30 1608 topology 1657 2203 +> 16 0 30 1608 topology 1659 2203 +> 15 0 30 1608 topology 1657 2204 +> 16 0 30 1608 topology 1658 2204 +> 15 0 30 1608 topology 1660 2205 +> 16 0 30 1608 topology 1662 2205 +> 15 0 30 1608 topology 1660 2206 +> 16 0 30 1608 topology 1661 2206 +> 15 0 30 1608 topology 1663 2207 +> 16 0 30 1608 topology 1665 2207 +> 15 0 30 1608 topology 1663 2208 +> 16 0 30 1608 topology 1664 2208 +> 15 0 30 1608 topology 1609 2209 +> 16 0 30 1608 topology 1611 2209 +> 15 0 30 1608 topology 1609 2210 +> 16 0 30 1608 topology 1610 2210 +> 15 0 30 1608 topology 1666 2211 +> 16 0 30 1608 topology 1668 2211 +> 15 0 30 1608 topology 1666 2212 +> 16 0 30 1608 topology 1667 2212 +> 15 0 30 1608 topology 1669 2213 +> 16 0 30 1608 topology 1671 2213 +> 15 0 30 1608 topology 1669 2214 +> 16 0 30 1608 topology 1670 2214 +> 15 0 30 1608 topology 1672 2215 +> 16 0 30 1608 topology 1674 2215 +> 15 0 30 1608 topology 1672 2216 +> 16 0 30 1608 topology 1673 2216 +> 15 0 30 1608 topology 1675 2217 +> 16 0 30 1608 topology 1677 2217 +> 15 0 30 1608 topology 1675 2218 +> 16 0 30 1608 topology 1676 2218 +> 15 0 30 1608 topology 1678 2219 +> 16 0 30 1608 topology 1680 2219 +> 15 0 30 1608 topology 1678 2220 +> 16 0 30 1608 topology 1679 2220 +> 15 0 30 1608 topology 1681 2221 +> 16 0 30 1608 topology 1683 2221 +> 15 0 30 1608 topology 1681 2222 +> 16 0 30 1608 topology 1682 2222 +> 15 0 30 1608 topology 1684 2223 +> 16 0 30 1608 topology 1686 2223 +> 15 0 30 1608 topology 1684 2224 +> 16 0 30 1608 topology 1685 2224 +> 15 0 30 1608 topology 1687 2225 +> 16 0 30 1608 topology 1689 2225 +> 15 0 30 1608 topology 1687 2226 +> 16 0 30 1608 topology 1688 2226 +> 15 0 30 1608 topology 1690 2227 +> 16 0 30 1608 topology 1692 2227 +> 15 0 30 1608 topology 1690 2228 +> 16 0 30 1608 topology 1691 2228 +> 15 0 30 1608 topology 1693 2229 +> 16 0 30 1608 topology 1695 2229 +> 15 0 30 1608 topology 1693 2230 +> 16 0 30 1608 topology 1694 2230 +> 15 0 30 1608 topology 1612 2231 +> 16 0 30 1608 topology 1614 2231 +> 15 0 30 1608 topology 1612 2232 +> 16 0 30 1608 topology 1613 2232 +> 15 0 30 1608 topology 1696 2233 +> 16 0 30 1608 topology 1698 2233 +> 15 0 30 1608 topology 1696 2234 +> 16 0 30 1608 topology 1697 2234 +> 15 0 30 1608 topology 1699 2235 +> 16 0 30 1608 topology 1701 2235 +> 15 0 30 1608 topology 1699 2236 +> 16 0 30 1608 topology 1700 2236 +> 15 0 30 1608 topology 1702 2237 +> 16 0 30 1608 topology 1704 2237 +> 15 0 30 1608 topology 1702 2238 +> 16 0 30 1608 topology 1703 2238 +> 15 0 30 1608 topology 1705 2239 +> 16 0 30 1608 topology 1707 2239 +> 15 0 30 1608 topology 1705 2240 +> 16 0 30 1608 topology 1706 2240 +> 15 0 30 1608 topology 1708 2241 +> 16 0 30 1608 topology 1710 2241 +> 15 0 30 1608 topology 1708 2242 +> 16 0 30 1608 topology 1709 2242 +> 15 0 30 1608 topology 1711 2243 +> 16 0 30 1608 topology 1713 2243 +> 15 0 30 1608 topology 1711 2244 +> 16 0 30 1608 topology 1712 2244 +> 15 0 30 1608 topology 1714 2245 +> 16 0 30 1608 topology 1716 2245 +> 15 0 30 1608 topology 1714 2246 +> 16 0 30 1608 topology 1715 2246 +> 15 0 30 1608 topology 1717 2247 +> 16 0 30 1608 topology 1719 2247 +> 15 0 30 1608 topology 1717 2248 +> 16 0 30 1608 topology 1718 2248 +> 15 0 30 1608 topology 1720 2249 +> 16 0 30 1608 topology 1722 2249 +> 15 0 30 1608 topology 1720 2250 +> 16 0 30 1608 topology 1721 2250 +> 15 0 30 1608 topology 1723 2251 +> 16 0 30 1608 topology 1725 2251 +> 15 0 30 1608 topology 1723 2252 +> 16 0 30 1608 topology 1724 2252 +> 15 0 30 1608 topology 1615 2253 +> 16 0 30 1608 topology 1617 2253 +> 15 0 30 1608 topology 1615 2254 +> 16 0 30 1608 topology 1616 2254 +> 15 0 30 1608 topology 1618 2255 +> 16 0 30 1608 topology 1620 2255 +> 15 0 30 1608 topology 1618 2256 +> 16 0 30 1608 topology 1619 2256 +> 15 0 30 1608 topology 1621 2257 +> 16 0 30 1608 topology 1623 2257 +> 15 0 30 1608 topology 1621 2258 +> 16 0 30 1608 topology 1622 2258 +> 15 0 30 1608 topology 1624 2259 +> 16 0 30 1608 topology 1626 2259 +> 15 0 30 1608 topology 1624 2260 +> 16 0 30 1608 topology 1625 2260 +> 15 0 30 1608 topology 1627 2261 +> 16 0 30 1608 topology 1629 2261 +> 15 0 30 1608 topology 1627 2262 +> 16 0 30 1608 topology 1628 2262 +> 15 0 30 1608 topology 1630 2263 +> 16 0 30 1608 topology 1632 2263 +> 15 0 30 1608 topology 1630 2264 +> 16 0 30 1608 topology 1631 2264 +> 15 0 30 1608 topology 1633 2265 +> 16 0 30 1608 topology 1635 2265 +> 15 0 30 1608 topology 1633 2266 +> 16 0 30 1608 topology 1634 2266 +> 15 0 28 1728 topology 1731 2267 > 16 0 28 1728 topology 1835 2267 -> 15 0 28 1728 topology 1740 2268 +> 15 0 28 1728 topology 1730 2268 > 16 0 28 1728 topology 1835 2268 -> 15 0 28 1728 topology 1824 2269 +> 15 0 28 1728 topology 1734 2269 > 16 0 28 1728 topology 1835 2269 -> 15 0 28 1728 topology 1800 2270 +> 15 0 28 1728 topology 1733 2270 > 16 0 28 1728 topology 1835 2270 -> 15 0 28 1728 topology 1776 2271 +> 15 0 28 1728 topology 1737 2271 > 16 0 28 1728 topology 1835 2271 -> 15 0 28 1728 topology 1752 2272 +> 15 0 28 1728 topology 1736 2272 > 16 0 28 1728 topology 1835 2272 -> 15 0 28 1728 topology 1812 2273 +> 15 0 28 1728 topology 1740 2273 > 16 0 28 1728 topology 1835 2273 -> 15 0 28 1728 topology 1788 2274 +> 15 0 28 1728 topology 1739 2274 > 16 0 28 1728 topology 1835 2274 -> 15 0 29 1728 topology 1729 2275 -> 16 0 29 1728 topology 1731 2275 -> 15 0 28 1728 topology 1730 2276 +> 15 0 28 1728 topology 1743 2275 +> 16 0 28 1728 topology 1835 2275 +> 15 0 28 1728 topology 1742 2276 > 16 0 28 1728 topology 1835 2276 -> 15 0 29 1728 topology 1732 2277 -> 16 0 29 1728 topology 1734 2277 -> 15 0 28 1728 topology 1760 2278 +> 15 0 28 1728 topology 1746 2277 +> 16 0 28 1728 topology 1835 2277 +> 15 0 28 1728 topology 1745 2278 > 16 0 28 1728 topology 1835 2278 -> 15 0 29 1728 topology 1735 2279 -> 16 0 29 1728 topology 1737 2279 -> 15 0 28 1728 topology 1790 2280 +> 15 0 28 1728 topology 1749 2279 +> 16 0 28 1728 topology 1835 2279 +> 15 0 28 1728 topology 1748 2280 > 16 0 28 1728 topology 1835 2280 -> 15 0 29 1728 topology 1789 2281 -> 16 0 29 1728 topology 1791 2281 -> 15 0 28 1728 topology 1820 2282 +> 15 0 28 1728 topology 1752 2281 +> 16 0 28 1728 topology 1835 2281 +> 15 0 28 1728 topology 1751 2282 > 16 0 28 1728 topology 1835 2282 -> 15 0 29 1728 topology 1738 2283 -> 16 0 29 1728 topology 1740 2283 -> 15 0 28 1728 topology 1742 2284 +> 15 0 28 1728 topology 1755 2283 +> 16 0 28 1728 topology 1835 2283 +> 15 0 28 1728 topology 1754 2284 > 16 0 28 1728 topology 1835 2284 -> 15 0 29 1728 topology 1792 2285 -> 16 0 29 1728 topology 1794 2285 -> 15 0 28 1728 topology 1772 2286 +> 15 0 28 1728 topology 1758 2285 +> 16 0 28 1728 topology 1835 2285 +> 15 0 28 1728 topology 1757 2286 > 16 0 28 1728 topology 1835 2286 -> 15 0 29 1728 topology 1741 2287 -> 16 0 29 1728 topology 1743 2287 -> 15 0 29 1728 topology 1795 2288 -> 16 0 29 1728 topology 1797 2288 -> 15 0 28 1728 topology 1802 2289 +> 15 0 28 1728 topology 1761 2287 +> 16 0 28 1728 topology 1835 2287 +> 15 0 28 1728 topology 1760 2288 +> 16 0 28 1728 topology 1835 2288 +> 15 0 28 1728 topology 1764 2289 > 16 0 28 1728 topology 1835 2289 -> 15 0 28 1728 topology 1832 2290 +> 15 0 28 1728 topology 1763 2290 > 16 0 28 1728 topology 1835 2290 -> 15 0 29 1728 topology 1744 2291 -> 16 0 29 1728 topology 1746 2291 -> 15 0 28 1728 topology 1754 2292 +> 15 0 28 1728 topology 1767 2291 +> 16 0 28 1728 topology 1835 2291 +> 15 0 28 1728 topology 1766 2292 > 16 0 28 1728 topology 1835 2292 -> 15 0 29 1728 topology 1798 2293 -> 16 0 29 1728 topology 1800 2293 -> 15 0 28 1728 topology 1784 2294 +> 15 0 28 1728 topology 1770 2293 +> 16 0 28 1728 topology 1835 2293 +> 15 0 28 1728 topology 1769 2294 > 16 0 28 1728 topology 1835 2294 -> 15 0 29 1728 topology 1747 2295 -> 16 0 29 1728 topology 1749 2295 -> 15 0 29 1728 topology 1801 2296 -> 16 0 29 1728 topology 1803 2296 -> 15 0 28 1728 topology 1814 2297 +> 15 0 28 1728 topology 1773 2295 +> 16 0 28 1728 topology 1835 2295 +> 15 0 28 1728 topology 1772 2296 +> 16 0 28 1728 topology 1835 2296 +> 15 0 28 1728 topology 1776 2297 > 16 0 28 1728 topology 1835 2297 -> 15 0 29 1728 topology 1729 2298 -> 16 0 29 1728 topology 1730 2298 -> 15 0 29 1728 topology 1750 2299 -> 16 0 29 1728 topology 1752 2299 -> 15 0 29 1728 topology 1804 2300 -> 16 0 29 1728 topology 1806 2300 -> 15 0 29 1728 topology 1759 2301 -> 16 0 29 1728 topology 1760 2301 -> 15 0 29 1728 topology 1753 2302 -> 16 0 29 1728 topology 1755 2302 -> 15 0 29 1728 topology 1807 2303 -> 16 0 29 1728 topology 1809 2303 -> 15 0 29 1728 topology 1735 2304 -> 16 0 29 1728 topology 1736 2304 -> 15 0 29 1728 topology 1789 2305 -> 16 0 29 1728 topology 1790 2305 -> 15 0 29 1728 topology 1756 2306 -> 16 0 29 1728 topology 1758 2306 -> 15 0 29 1728 topology 1810 2307 -> 16 0 29 1728 topology 1812 2307 -> 15 0 29 1728 topology 1765 2308 -> 16 0 29 1728 topology 1766 2308 -> 15 0 29 1728 topology 1819 2309 -> 16 0 29 1728 topology 1820 2309 -> 15 0 29 1728 topology 1813 2310 -> 16 0 29 1728 topology 1815 2310 -> 15 0 28 1728 topology 1731 2311 +> 15 0 28 1728 topology 1775 2298 +> 16 0 28 1728 topology 1835 2298 +> 15 0 28 1728 topology 1779 2299 +> 16 0 28 1728 topology 1835 2299 +> 15 0 28 1728 topology 1778 2300 +> 16 0 28 1728 topology 1835 2300 +> 15 0 28 1728 topology 1782 2301 +> 16 0 28 1728 topology 1835 2301 +> 15 0 28 1728 topology 1781 2302 +> 16 0 28 1728 topology 1835 2302 +> 15 0 28 1728 topology 1785 2303 +> 16 0 28 1728 topology 1835 2303 +> 15 0 28 1728 topology 1784 2304 +> 16 0 28 1728 topology 1835 2304 +> 15 0 28 1728 topology 1788 2305 +> 16 0 28 1728 topology 1835 2305 +> 15 0 28 1728 topology 1787 2306 +> 16 0 28 1728 topology 1835 2306 +> 15 0 28 1728 topology 1791 2307 +> 16 0 28 1728 topology 1835 2307 +> 15 0 28 1728 topology 1790 2308 +> 16 0 28 1728 topology 1835 2308 +> 15 0 28 1728 topology 1794 2309 +> 16 0 28 1728 topology 1835 2309 +> 15 0 28 1728 topology 1793 2310 +> 16 0 28 1728 topology 1835 2310 +> 15 0 28 1728 topology 1797 2311 > 16 0 28 1728 topology 1835 2311 -> 15 0 29 1728 topology 1741 2312 -> 16 0 29 1728 topology 1742 2312 -> 15 0 29 1728 topology 1795 2313 -> 16 0 29 1728 topology 1796 2313 -> 15 0 29 1728 topology 1816 2314 -> 16 0 29 1728 topology 1818 2314 -> 15 0 29 1728 topology 1771 2315 -> 16 0 29 1728 topology 1772 2315 -> 15 0 28 1728 topology 1791 2316 +> 15 0 28 1728 topology 1796 2312 +> 16 0 28 1728 topology 1835 2312 +> 15 0 28 1728 topology 1800 2313 +> 16 0 28 1728 topology 1835 2313 +> 15 0 28 1728 topology 1799 2314 +> 16 0 28 1728 topology 1835 2314 +> 15 0 28 1728 topology 1803 2315 +> 16 0 28 1728 topology 1835 2315 +> 15 0 28 1728 topology 1802 2316 > 16 0 28 1728 topology 1835 2316 -> 15 0 29 1728 topology 1825 2317 -> 16 0 29 1728 topology 1826 2317 -> 15 0 28 1728 topology 1767 2318 +> 15 0 28 1728 topology 1806 2317 +> 16 0 28 1728 topology 1835 2317 +> 15 0 28 1728 topology 1805 2318 > 16 0 28 1728 topology 1835 2318 -> 15 0 28 1728 topology 1743 2319 +> 15 0 28 1728 topology 1809 2319 > 16 0 28 1728 topology 1835 2319 -> 15 0 29 1728 topology 1747 2320 -> 16 0 29 1728 topology 1748 2320 -> 15 0 29 1728 topology 1801 2321 -> 16 0 29 1728 topology 1802 2321 -> 15 0 28 1728 topology 1827 2322 +> 15 0 28 1728 topology 1808 2320 +> 16 0 28 1728 topology 1835 2320 +> 15 0 28 1728 topology 1812 2321 +> 16 0 28 1728 topology 1835 2321 +> 15 0 28 1728 topology 1811 2322 > 16 0 28 1728 topology 1835 2322 -> 15 0 29 1728 topology 1777 2323 -> 16 0 29 1728 topology 1778 2323 -> 15 0 28 1728 topology 1803 2324 +> 15 0 28 1728 topology 1815 2323 +> 16 0 28 1728 topology 1835 2323 +> 15 0 28 1728 topology 1814 2324 > 16 0 28 1728 topology 1835 2324 -> 15 0 29 1728 topology 1831 2325 -> 16 0 29 1728 topology 1832 2325 -> 15 0 28 1728 topology 1779 2326 +> 15 0 28 1728 topology 1818 2325 +> 16 0 28 1728 topology 1835 2325 +> 15 0 28 1728 topology 1817 2326 > 16 0 28 1728 topology 1835 2326 -> 15 0 29 1728 topology 1753 2327 -> 16 0 29 1728 topology 1754 2327 -> 15 0 28 1728 topology 1755 2328 +> 15 0 28 1728 topology 1821 2327 +> 16 0 28 1728 topology 1835 2327 +> 15 0 28 1728 topology 1820 2328 > 16 0 28 1728 topology 1835 2328 -> 15 0 29 1728 topology 1807 2329 -> 16 0 29 1728 topology 1808 2329 -> 15 0 29 1728 topology 1783 2330 -> 16 0 29 1728 topology 1784 2330 -> 15 0 28 1728 topology 1815 2331 +> 15 0 28 1728 topology 1824 2329 +> 16 0 28 1728 topology 1835 2329 +> 15 0 28 1728 topology 1823 2330 +> 16 0 28 1728 topology 1835 2330 +> 15 0 28 1728 topology 1827 2331 > 16 0 28 1728 topology 1835 2331 -> 15 0 29 1728 topology 1813 2332 -> 16 0 29 1728 topology 1814 2332 -> 15 0 28 1728 topology 1739 2333 +> 15 0 28 1728 topology 1826 2332 +> 16 0 28 1728 topology 1835 2332 +> 15 0 28 1728 topology 1830 2333 > 16 0 28 1728 topology 1835 2333 -> 15 0 28 1728 topology 1769 2334 +> 15 0 28 1728 topology 1829 2334 > 16 0 28 1728 topology 1835 2334 -> 15 0 28 1728 topology 1799 2335 +> 15 0 28 1728 topology 1833 2335 > 16 0 28 1728 topology 1835 2335 -> 15 0 28 1728 topology 1829 2336 +> 15 0 28 1728 topology 1832 2336 > 16 0 28 1728 topology 1835 2336 -> 15 0 28 1728 topology 1751 2337 -> 16 0 28 1728 topology 1835 2337 -> 15 0 28 1728 topology 1781 2338 -> 16 0 28 1728 topology 1835 2338 -> 15 0 30 1728 topology 1834 2339 -> 16 0 30 1728 topology 1835 2339 -> 15 0 28 1728 topology 1811 2340 -> 16 0 28 1728 topology 1835 2340 -> 15 0 28 1728 topology 1734 2341 -> 16 0 28 1728 topology 1835 2341 -> 15 0 28 1728 topology 1794 2342 -> 16 0 28 1728 topology 1835 2342 -> 15 0 28 1728 topology 1770 2343 -> 16 0 28 1728 topology 1835 2343 -> 15 0 28 1728 topology 1746 2344 -> 16 0 28 1728 topology 1835 2344 -> 15 0 28 1728 topology 1830 2345 -> 16 0 28 1728 topology 1835 2345 -> 15 0 28 1728 topology 1806 2346 -> 16 0 28 1728 topology 1835 2346 -> 15 0 28 1728 topology 1782 2347 -> 16 0 28 1728 topology 1835 2347 -> 15 0 28 1728 topology 1758 2348 -> 16 0 28 1728 topology 1835 2348 -> 15 0 28 1728 topology 1818 2349 -> 16 0 28 1728 topology 1835 2349 -> 15 0 29 1728 topology 1759 2350 -> 16 0 29 1728 topology 1761 2350 -> 15 0 28 1728 topology 1736 2351 -> 16 0 28 1728 topology 1835 2351 -> 15 0 29 1728 topology 1762 2352 -> 16 0 29 1728 topology 1764 2352 -> 15 0 28 1728 topology 1766 2353 -> 16 0 28 1728 topology 1835 2353 -> 15 0 29 1728 topology 1765 2354 -> 16 0 29 1728 topology 1767 2354 -> 15 0 28 1728 topology 1796 2355 -> 16 0 28 1728 topology 1835 2355 -> 15 0 29 1728 topology 1819 2356 -> 16 0 29 1728 topology 1821 2356 -> 15 0 28 1728 topology 1826 2357 -> 16 0 28 1728 topology 1835 2357 -> 15 0 28 1728 topology 1748 2358 -> 16 0 28 1728 topology 1835 2358 -> 15 0 29 1728 topology 1768 2359 -> 16 0 29 1728 topology 1770 2359 -> 15 0 29 1728 topology 1822 2360 -> 16 0 29 1728 topology 1824 2360 -> 15 0 28 1728 topology 1778 2361 -> 16 0 28 1728 topology 1835 2361 -> 15 0 29 1728 topology 1771 2362 -> 16 0 29 1728 topology 1773 2362 -> 15 0 28 1728 topology 1808 2363 -> 16 0 28 1728 topology 1835 2363 -> 15 0 29 1728 topology 1825 2364 -> 16 0 29 1728 topology 1827 2364 -> 15 0 29 1728 topology 1774 2365 -> 16 0 29 1728 topology 1776 2365 -> 15 0 29 1728 topology 1828 2366 -> 16 0 29 1728 topology 1830 2366 -> 15 0 29 1728 topology 1777 2367 -> 16 0 29 1728 topology 1779 2367 -> 15 0 29 1728 topology 1831 2368 -> 16 0 29 1728 topology 1833 2368 -> 15 0 29 1728 topology 1732 2369 -> 16 0 29 1728 topology 1733 2369 -> 15 0 29 1728 topology 1780 2370 -> 16 0 29 1728 topology 1782 2370 -> 15 0 29 1728 topology 1762 2371 -> 16 0 29 1728 topology 1763 2371 -> 15 0 29 1728 topology 1783 2372 -> 16 0 29 1728 topology 1785 2372 -> 15 0 29 1728 topology 1738 2373 -> 16 0 29 1728 topology 1739 2373 -> 15 0 29 1728 topology 1792 2374 -> 16 0 29 1728 topology 1793 2374 -> 15 0 29 1728 topology 1786 2375 -> 16 0 29 1728 topology 1788 2375 -> 15 0 29 1728 topology 1768 2376 -> 16 0 29 1728 topology 1769 2376 -> 15 0 29 1728 topology 1822 2377 -> 16 0 29 1728 topology 1823 2377 -> 15 0 28 1728 topology 1761 2378 -> 16 0 28 1728 topology 1835 2378 -> 15 0 28 1728 topology 1737 2379 -> 16 0 28 1728 topology 1835 2379 -> 15 0 29 1728 topology 1744 2380 -> 16 0 29 1728 topology 1745 2380 -> 15 0 29 1728 topology 1798 2381 -> 16 0 29 1728 topology 1799 2381 -> 15 0 28 1728 topology 1821 2382 -> 16 0 28 1728 topology 1835 2382 -> 15 0 29 1728 topology 1774 2383 -> 16 0 29 1728 topology 1775 2383 -> 15 0 28 1728 topology 1797 2384 -> 16 0 28 1728 topology 1835 2384 -> 15 0 29 1728 topology 1828 2385 -> 16 0 29 1728 topology 1829 2385 -> 15 0 28 1728 topology 1773 2386 -> 16 0 28 1728 topology 1835 2386 -> 15 0 28 1728 topology 1749 2387 -> 16 0 28 1728 topology 1835 2387 -> 15 0 29 1728 topology 1750 2388 -> 16 0 29 1728 topology 1751 2388 -> 15 0 29 1728 topology 1804 2389 -> 16 0 29 1728 topology 1805 2389 -> 15 0 28 1728 topology 1833 2390 -> 16 0 28 1728 topology 1835 2390 -> 15 0 29 1728 topology 1780 2391 -> 16 0 29 1728 topology 1781 2391 -> 15 0 28 1728 topology 1809 2392 -> 16 0 28 1728 topology 1835 2392 -> 15 0 28 1728 topology 1785 2393 -> 16 0 28 1728 topology 1835 2393 -> 15 0 29 1728 topology 1756 2394 -> 16 0 29 1728 topology 1757 2394 -> 15 0 29 1728 topology 1810 2395 -> 16 0 29 1728 topology 1811 2395 -> 15 0 29 1728 topology 1786 2396 -> 16 0 29 1728 topology 1787 2396 -> 15 0 28 1728 topology 1733 2397 -> 16 0 28 1728 topology 1835 2397 -> 15 0 29 1728 topology 1816 2398 -> 16 0 29 1728 topology 1817 2398 -> 15 0 28 1728 topology 1763 2399 -> 16 0 28 1728 topology 1835 2399 -> 15 0 28 1728 topology 1793 2400 -> 16 0 28 1728 topology 1835 2400 -> 15 0 28 1728 topology 1823 2401 -> 16 0 28 1728 topology 1835 2401 -> 15 0 28 1728 topology 1745 2402 -> 16 0 28 1728 topology 1835 2402 -> 15 0 28 1728 topology 1775 2403 -> 16 0 28 1728 topology 1835 2403 -> 15 0 28 1728 topology 1805 2404 -> 16 0 28 1728 topology 1835 2404 -> 15 0 28 1728 topology 1757 2405 -> 16 0 28 1728 topology 1835 2405 -> 15 0 28 1728 topology 1787 2406 -> 16 0 28 1728 topology 1835 2406 -> 15 0 28 1728 topology 1817 2407 -> 16 0 28 1728 topology 1835 2407 -> 15 0 28 1836 topology 1880 2408 +> 15 0 29 1728 topology 1834 2337 +> 16 0 29 1728 topology 1835 2337 +> 15 0 30 1728 topology 1729 2338 +> 16 0 30 1728 topology 1731 2338 +> 15 0 30 1728 topology 1729 2339 +> 16 0 30 1728 topology 1730 2339 +> 15 0 30 1728 topology 1732 2340 +> 16 0 30 1728 topology 1734 2340 +> 15 0 30 1728 topology 1732 2341 +> 16 0 30 1728 topology 1733 2341 +> 15 0 30 1728 topology 1735 2342 +> 16 0 30 1728 topology 1737 2342 +> 15 0 30 1728 topology 1735 2343 +> 16 0 30 1728 topology 1736 2343 +> 15 0 30 1728 topology 1738 2344 +> 16 0 30 1728 topology 1740 2344 +> 15 0 30 1728 topology 1738 2345 +> 16 0 30 1728 topology 1739 2345 +> 15 0 30 1728 topology 1741 2346 +> 16 0 30 1728 topology 1743 2346 +> 15 0 30 1728 topology 1741 2347 +> 16 0 30 1728 topology 1742 2347 +> 15 0 30 1728 topology 1744 2348 +> 16 0 30 1728 topology 1746 2348 +> 15 0 30 1728 topology 1744 2349 +> 16 0 30 1728 topology 1745 2349 +> 15 0 30 1728 topology 1747 2350 +> 16 0 30 1728 topology 1749 2350 +> 15 0 30 1728 topology 1747 2351 +> 16 0 30 1728 topology 1748 2351 +> 15 0 30 1728 topology 1750 2352 +> 16 0 30 1728 topology 1752 2352 +> 15 0 30 1728 topology 1750 2353 +> 16 0 30 1728 topology 1751 2353 +> 15 0 30 1728 topology 1753 2354 +> 16 0 30 1728 topology 1755 2354 +> 15 0 30 1728 topology 1753 2355 +> 16 0 30 1728 topology 1754 2355 +> 15 0 30 1728 topology 1756 2356 +> 16 0 30 1728 topology 1758 2356 +> 15 0 30 1728 topology 1756 2357 +> 16 0 30 1728 topology 1757 2357 +> 15 0 30 1728 topology 1759 2358 +> 16 0 30 1728 topology 1761 2358 +> 15 0 30 1728 topology 1759 2359 +> 16 0 30 1728 topology 1760 2359 +> 15 0 30 1728 topology 1762 2360 +> 16 0 30 1728 topology 1764 2360 +> 15 0 30 1728 topology 1762 2361 +> 16 0 30 1728 topology 1763 2361 +> 15 0 30 1728 topology 1765 2362 +> 16 0 30 1728 topology 1767 2362 +> 15 0 30 1728 topology 1765 2363 +> 16 0 30 1728 topology 1766 2363 +> 15 0 30 1728 topology 1768 2364 +> 16 0 30 1728 topology 1770 2364 +> 15 0 30 1728 topology 1768 2365 +> 16 0 30 1728 topology 1769 2365 +> 15 0 30 1728 topology 1771 2366 +> 16 0 30 1728 topology 1773 2366 +> 15 0 30 1728 topology 1771 2367 +> 16 0 30 1728 topology 1772 2367 +> 15 0 30 1728 topology 1774 2368 +> 16 0 30 1728 topology 1776 2368 +> 15 0 30 1728 topology 1774 2369 +> 16 0 30 1728 topology 1775 2369 +> 15 0 30 1728 topology 1777 2370 +> 16 0 30 1728 topology 1779 2370 +> 15 0 30 1728 topology 1777 2371 +> 16 0 30 1728 topology 1778 2371 +> 15 0 30 1728 topology 1780 2372 +> 16 0 30 1728 topology 1782 2372 +> 15 0 30 1728 topology 1780 2373 +> 16 0 30 1728 topology 1781 2373 +> 15 0 30 1728 topology 1783 2374 +> 16 0 30 1728 topology 1785 2374 +> 15 0 30 1728 topology 1783 2375 +> 16 0 30 1728 topology 1784 2375 +> 15 0 30 1728 topology 1786 2376 +> 16 0 30 1728 topology 1788 2376 +> 15 0 30 1728 topology 1786 2377 +> 16 0 30 1728 topology 1787 2377 +> 15 0 30 1728 topology 1789 2378 +> 16 0 30 1728 topology 1791 2378 +> 15 0 30 1728 topology 1789 2379 +> 16 0 30 1728 topology 1790 2379 +> 15 0 30 1728 topology 1792 2380 +> 16 0 30 1728 topology 1794 2380 +> 15 0 30 1728 topology 1792 2381 +> 16 0 30 1728 topology 1793 2381 +> 15 0 30 1728 topology 1795 2382 +> 16 0 30 1728 topology 1797 2382 +> 15 0 30 1728 topology 1795 2383 +> 16 0 30 1728 topology 1796 2383 +> 15 0 30 1728 topology 1798 2384 +> 16 0 30 1728 topology 1800 2384 +> 15 0 30 1728 topology 1798 2385 +> 16 0 30 1728 topology 1799 2385 +> 15 0 30 1728 topology 1801 2386 +> 16 0 30 1728 topology 1803 2386 +> 15 0 30 1728 topology 1801 2387 +> 16 0 30 1728 topology 1802 2387 +> 15 0 30 1728 topology 1804 2388 +> 16 0 30 1728 topology 1806 2388 +> 15 0 30 1728 topology 1804 2389 +> 16 0 30 1728 topology 1805 2389 +> 15 0 30 1728 topology 1807 2390 +> 16 0 30 1728 topology 1809 2390 +> 15 0 30 1728 topology 1807 2391 +> 16 0 30 1728 topology 1808 2391 +> 15 0 30 1728 topology 1810 2392 +> 16 0 30 1728 topology 1812 2392 +> 15 0 30 1728 topology 1810 2393 +> 16 0 30 1728 topology 1811 2393 +> 15 0 30 1728 topology 1813 2394 +> 16 0 30 1728 topology 1815 2394 +> 15 0 30 1728 topology 1813 2395 +> 16 0 30 1728 topology 1814 2395 +> 15 0 30 1728 topology 1816 2396 +> 16 0 30 1728 topology 1818 2396 +> 15 0 30 1728 topology 1816 2397 +> 16 0 30 1728 topology 1817 2397 +> 15 0 30 1728 topology 1819 2398 +> 16 0 30 1728 topology 1821 2398 +> 15 0 30 1728 topology 1819 2399 +> 16 0 30 1728 topology 1820 2399 +> 15 0 30 1728 topology 1822 2400 +> 16 0 30 1728 topology 1824 2400 +> 15 0 30 1728 topology 1822 2401 +> 16 0 30 1728 topology 1823 2401 +> 15 0 30 1728 topology 1825 2402 +> 16 0 30 1728 topology 1827 2402 +> 15 0 30 1728 topology 1825 2403 +> 16 0 30 1728 topology 1826 2403 +> 15 0 30 1728 topology 1828 2404 +> 16 0 30 1728 topology 1830 2404 +> 15 0 30 1728 topology 1828 2405 +> 16 0 30 1728 topology 1829 2405 +> 15 0 30 1728 topology 1831 2406 +> 16 0 30 1728 topology 1833 2406 +> 15 0 30 1728 topology 1831 2407 +> 16 0 30 1728 topology 1832 2407 +> 15 0 28 1836 topology 1914 2408 > 16 0 28 1836 topology 1928 2408 -> 15 0 28 1836 topology 1910 2409 +> 15 0 28 1836 topology 1913 2409 > 16 0 28 1836 topology 1928 2409 -> 15 0 28 1836 topology 1919 2410 +> 15 0 28 1836 topology 1917 2410 > 16 0 28 1836 topology 1928 2410 -> 15 0 29 1836 topology 1912 2411 -> 16 0 29 1836 topology 1914 2411 -> 15 0 28 1836 topology 1887 2412 +> 15 0 28 1836 topology 1916 2411 +> 16 0 28 1836 topology 1928 2411 +> 15 0 28 1836 topology 1920 2412 > 16 0 28 1836 topology 1928 2412 -> 15 0 28 1836 topology 1863 2413 +> 15 0 28 1836 topology 1919 2413 > 16 0 28 1836 topology 1928 2413 -> 15 0 28 1836 topology 1839 2414 +> 15 0 28 1836 topology 1923 2414 > 16 0 28 1836 topology 1928 2414 -> 15 0 28 1836 topology 1899 2415 +> 15 0 28 1836 topology 1922 2415 > 16 0 28 1836 topology 1928 2415 -> 15 0 28 1836 topology 1875 2416 +> 15 0 28 1836 topology 1926 2416 > 16 0 28 1836 topology 1928 2416 -> 15 0 28 1836 topology 1851 2417 +> 15 0 28 1836 topology 1925 2417 > 16 0 28 1836 topology 1928 2417 -> 15 0 29 1836 topology 1924 2418 -> 16 0 29 1836 topology 1926 2418 -> 15 0 28 1836 topology 1914 2419 +> 15 0 28 1836 topology 1839 2418 +> 16 0 28 1836 topology 1928 2418 +> 15 0 28 1836 topology 1838 2419 > 16 0 28 1836 topology 1928 2419 -> 15 0 28 1836 topology 1911 2420 +> 15 0 28 1836 topology 1842 2420 > 16 0 28 1836 topology 1928 2420 -> 15 0 28 1836 topology 1853 2421 +> 15 0 28 1836 topology 1841 2421 > 16 0 28 1836 topology 1928 2421 -> 15 0 28 1836 topology 1926 2422 +> 15 0 28 1836 topology 1845 2422 > 16 0 28 1836 topology 1928 2422 -> 15 0 28 1836 topology 1883 2423 +> 15 0 28 1836 topology 1844 2423 > 16 0 28 1836 topology 1928 2423 -> 15 0 29 1836 topology 1915 2424 -> 16 0 29 1836 topology 1916 2424 -> 15 0 29 1836 topology 1882 2425 -> 16 0 29 1836 topology 1884 2425 -> 15 0 28 1836 topology 1865 2426 +> 15 0 28 1836 topology 1848 2424 +> 16 0 28 1836 topology 1928 2424 +> 15 0 28 1836 topology 1847 2425 +> 16 0 28 1836 topology 1928 2425 +> 15 0 28 1836 topology 1851 2426 > 16 0 28 1836 topology 1928 2426 -> 15 0 29 1836 topology 1885 2427 -> 16 0 29 1836 topology 1887 2427 -> 15 0 28 1836 topology 1895 2428 +> 15 0 28 1836 topology 1850 2427 +> 16 0 28 1836 topology 1928 2427 +> 15 0 28 1836 topology 1854 2428 > 16 0 28 1836 topology 1928 2428 -> 15 0 28 1836 topology 1847 2429 +> 15 0 28 1836 topology 1853 2429 > 16 0 28 1836 topology 1928 2429 -> 15 0 29 1836 topology 1888 2430 -> 16 0 29 1836 topology 1890 2430 -> 15 0 28 1836 topology 1877 2431 +> 15 0 28 1836 topology 1857 2430 +> 16 0 28 1836 topology 1928 2430 +> 15 0 28 1836 topology 1856 2431 > 16 0 28 1836 topology 1928 2431 -> 15 0 29 1836 topology 1837 2432 -> 16 0 29 1836 topology 1839 2432 -> 15 0 29 1836 topology 1891 2433 -> 16 0 29 1836 topology 1893 2433 -> 15 0 28 1836 topology 1907 2434 +> 15 0 28 1836 topology 1860 2432 +> 16 0 28 1836 topology 1928 2432 +> 15 0 28 1836 topology 1859 2433 +> 16 0 28 1836 topology 1928 2433 +> 15 0 28 1836 topology 1863 2434 > 16 0 28 1836 topology 1928 2434 -> 15 0 28 1836 topology 1916 2435 +> 15 0 28 1836 topology 1862 2435 > 16 0 28 1836 topology 1928 2435 -> 15 0 29 1836 topology 1840 2436 -> 16 0 29 1836 topology 1842 2436 -> 15 0 29 1836 topology 1894 2437 -> 16 0 29 1836 topology 1896 2437 -> 15 0 29 1836 topology 1843 2438 -> 16 0 29 1836 topology 1845 2438 -> 15 0 29 1836 topology 1897 2439 -> 16 0 29 1836 topology 1899 2439 -> 15 0 29 1836 topology 1852 2440 -> 16 0 29 1836 topology 1853 2440 -> 15 0 29 1836 topology 1846 2441 -> 16 0 29 1836 topology 1848 2441 -> 15 0 29 1836 topology 1900 2442 -> 16 0 29 1836 topology 1902 2442 -> 15 0 29 1836 topology 1882 2443 -> 16 0 29 1836 topology 1883 2443 -> 15 0 29 1836 topology 1849 2444 -> 16 0 29 1836 topology 1851 2444 -> 15 0 29 1836 topology 1903 2445 -> 16 0 29 1836 topology 1905 2445 -> 15 0 29 1836 topology 1858 2446 -> 16 0 29 1836 topology 1859 2446 -> 15 0 28 1836 topology 1854 2447 +> 15 0 28 1836 topology 1866 2436 +> 16 0 28 1836 topology 1928 2436 +> 15 0 28 1836 topology 1865 2437 +> 16 0 28 1836 topology 1928 2437 +> 15 0 28 1836 topology 1869 2438 +> 16 0 28 1836 topology 1928 2438 +> 15 0 28 1836 topology 1868 2439 +> 16 0 28 1836 topology 1928 2439 +> 15 0 28 1836 topology 1872 2440 +> 16 0 28 1836 topology 1928 2440 +> 15 0 28 1836 topology 1871 2441 +> 16 0 28 1836 topology 1928 2441 +> 15 0 28 1836 topology 1875 2442 +> 16 0 28 1836 topology 1928 2442 +> 15 0 28 1836 topology 1874 2443 +> 16 0 28 1836 topology 1928 2443 +> 15 0 28 1836 topology 1878 2444 +> 16 0 28 1836 topology 1928 2444 +> 15 0 28 1836 topology 1877 2445 +> 16 0 28 1836 topology 1928 2445 +> 15 0 28 1836 topology 1881 2446 +> 16 0 28 1836 topology 1928 2446 +> 15 0 28 1836 topology 1880 2447 > 16 0 28 1836 topology 1928 2447 -> 15 0 29 1836 topology 1906 2448 -> 16 0 29 1836 topology 1908 2448 -> 15 0 29 1836 topology 1888 2449 -> 16 0 29 1836 topology 1889 2449 -> 15 0 29 1836 topology 1909 2450 -> 16 0 29 1836 topology 1911 2450 -> 15 0 29 1836 topology 1915 2451 -> 16 0 29 1836 topology 1917 2451 -> 15 0 29 1836 topology 1864 2452 -> 16 0 29 1836 topology 1865 2452 -> 15 0 28 1836 topology 1890 2453 +> 15 0 28 1836 topology 1884 2448 +> 16 0 28 1836 topology 1928 2448 +> 15 0 28 1836 topology 1883 2449 +> 16 0 28 1836 topology 1928 2449 +> 15 0 28 1836 topology 1887 2450 +> 16 0 28 1836 topology 1928 2450 +> 15 0 28 1836 topology 1886 2451 +> 16 0 28 1836 topology 1928 2451 +> 15 0 28 1836 topology 1890 2452 +> 16 0 28 1836 topology 1928 2452 +> 15 0 28 1836 topology 1889 2453 > 16 0 28 1836 topology 1928 2453 -> 15 0 28 1836 topology 1866 2454 +> 15 0 28 1836 topology 1893 2454 > 16 0 28 1836 topology 1928 2454 -> 15 0 29 1836 topology 1840 2455 -> 16 0 29 1836 topology 1841 2455 -> 15 0 28 1836 topology 1842 2456 +> 15 0 28 1836 topology 1892 2455 +> 16 0 28 1836 topology 1928 2455 +> 15 0 28 1836 topology 1896 2456 > 16 0 28 1836 topology 1928 2456 -> 15 0 29 1836 topology 1894 2457 -> 16 0 29 1836 topology 1895 2457 -> 15 0 29 1836 topology 1870 2458 -> 16 0 29 1836 topology 1871 2458 -> 15 0 28 1836 topology 1902 2459 +> 15 0 28 1836 topology 1895 2457 +> 16 0 28 1836 topology 1928 2457 +> 15 0 28 1836 topology 1899 2458 +> 16 0 28 1836 topology 1928 2458 +> 15 0 28 1836 topology 1898 2459 > 16 0 28 1836 topology 1928 2459 -> 15 0 28 1836 topology 1878 2460 +> 15 0 28 1836 topology 1902 2460 > 16 0 28 1836 topology 1928 2460 -> 15 0 29 1836 topology 1846 2461 -> 16 0 29 1836 topology 1847 2461 -> 15 0 29 1836 topology 1900 2462 -> 16 0 29 1836 topology 1901 2462 -> 15 0 28 1836 topology 1917 2463 +> 15 0 28 1836 topology 1901 2461 +> 16 0 28 1836 topology 1928 2461 +> 15 0 28 1836 topology 1905 2462 +> 16 0 28 1836 topology 1928 2462 +> 15 0 28 1836 topology 1904 2463 > 16 0 28 1836 topology 1928 2463 -> 15 0 29 1836 topology 1876 2464 -> 16 0 29 1836 topology 1877 2464 -> 15 0 29 1836 topology 1906 2465 -> 16 0 29 1836 topology 1907 2465 -> 15 0 29 1836 topology 1912 2466 -> 16 0 29 1836 topology 1913 2466 -> 15 0 28 1836 topology 1862 2467 +> 15 0 28 1836 topology 1908 2464 +> 16 0 28 1836 topology 1928 2464 +> 15 0 28 1836 topology 1907 2465 +> 16 0 28 1836 topology 1928 2465 +> 15 0 28 1836 topology 1911 2466 +> 16 0 28 1836 topology 1928 2466 +> 15 0 28 1836 topology 1910 2467 > 16 0 28 1836 topology 1928 2467 -> 15 0 28 1836 topology 1892 2468 -> 16 0 28 1836 topology 1928 2468 -> 15 0 28 1836 topology 1844 2469 -> 16 0 28 1836 topology 1928 2469 -> 15 0 28 1836 topology 1874 2470 -> 16 0 28 1836 topology 1928 2470 -> 15 0 28 1836 topology 1904 2471 -> 16 0 28 1836 topology 1928 2471 -> 15 0 29 1836 topology 1924 2472 -> 16 0 29 1836 topology 1925 2472 -> 15 0 28 1836 topology 1913 2473 -> 16 0 28 1836 topology 1928 2473 -> 15 0 28 1836 topology 1925 2474 -> 16 0 28 1836 topology 1928 2474 -> 15 0 28 1836 topology 1857 2475 -> 16 0 28 1836 topology 1928 2475 -> 15 0 28 1836 topology 1893 2476 -> 16 0 28 1836 topology 1928 2476 -> 15 0 29 1836 topology 1918 2477 -> 16 0 29 1836 topology 1920 2477 -> 15 0 28 1836 topology 1869 2478 -> 16 0 28 1836 topology 1928 2478 -> 15 0 28 1836 topology 1845 2479 -> 16 0 28 1836 topology 1928 2479 -> 15 0 28 1836 topology 1905 2480 -> 16 0 28 1836 topology 1928 2480 -> 15 0 28 1836 topology 1881 2481 -> 16 0 28 1836 topology 1928 2481 -> 15 0 28 1836 topology 1920 2482 -> 16 0 28 1836 topology 1928 2482 -> 15 0 29 1836 topology 1852 2483 -> 16 0 29 1836 topology 1854 2483 -> 15 0 28 1836 topology 1859 2484 -> 16 0 28 1836 topology 1928 2484 -> 15 0 29 1836 topology 1855 2485 -> 16 0 29 1836 topology 1857 2485 -> 15 0 28 1836 topology 1889 2486 -> 16 0 28 1836 topology 1928 2486 -> 15 0 30 1836 topology 1927 2487 -> 16 0 30 1836 topology 1928 2487 -> 15 0 28 1836 topology 1841 2488 -> 16 0 28 1836 topology 1928 2488 -> 15 0 29 1836 topology 1858 2489 -> 16 0 29 1836 topology 1860 2489 -> 15 0 28 1836 topology 1871 2490 -> 16 0 28 1836 topology 1928 2490 -> 15 0 29 1836 topology 1921 2491 -> 16 0 29 1836 topology 1922 2491 -> 15 0 29 1836 topology 1861 2492 -> 16 0 29 1836 topology 1863 2492 -> 15 0 28 1836 topology 1901 2493 -> 16 0 28 1836 topology 1928 2493 -> 15 0 29 1836 topology 1864 2494 -> 16 0 29 1836 topology 1866 2494 -> 15 0 29 1836 topology 1867 2495 -> 16 0 29 1836 topology 1869 2495 -> 15 0 28 1836 topology 1922 2496 -> 16 0 28 1836 topology 1928 2496 -> 15 0 29 1836 topology 1870 2497 -> 16 0 29 1836 topology 1872 2497 -> 15 0 29 1836 topology 1873 2498 -> 16 0 29 1836 topology 1875 2498 -> 15 0 29 1836 topology 1855 2499 -> 16 0 29 1836 topology 1856 2499 -> 15 0 29 1836 topology 1876 2500 -> 16 0 29 1836 topology 1878 2500 -> 15 0 29 1836 topology 1885 2501 -> 16 0 29 1836 topology 1886 2501 -> 15 0 29 1836 topology 1879 2502 -> 16 0 29 1836 topology 1881 2502 -> 15 0 29 1836 topology 1861 2503 -> 16 0 29 1836 topology 1862 2503 -> 15 0 28 1836 topology 1884 2504 -> 16 0 28 1836 topology 1928 2504 -> 15 0 28 1836 topology 1860 2505 -> 16 0 28 1836 topology 1928 2505 -> 15 0 29 1836 topology 1837 2506 -> 16 0 29 1836 topology 1838 2506 -> 15 0 29 1836 topology 1891 2507 -> 16 0 29 1836 topology 1892 2507 -> 15 0 29 1836 topology 1867 2508 -> 16 0 29 1836 topology 1868 2508 -> 15 0 28 1836 topology 1896 2509 -> 16 0 28 1836 topology 1928 2509 -> 15 0 28 1836 topology 1872 2510 -> 16 0 28 1836 topology 1928 2510 -> 15 0 29 1836 topology 1921 2511 -> 16 0 29 1836 topology 1923 2511 -> 15 0 29 1836 topology 1843 2512 -> 16 0 29 1836 topology 1844 2512 -> 15 0 28 1836 topology 1848 2513 -> 16 0 28 1836 topology 1928 2513 -> 15 0 29 1836 topology 1897 2514 -> 16 0 29 1836 topology 1898 2514 -> 15 0 29 1836 topology 1873 2515 -> 16 0 29 1836 topology 1874 2515 -> 15 0 28 1836 topology 1908 2516 -> 16 0 28 1836 topology 1928 2516 -> 15 0 29 1836 topology 1849 2517 -> 16 0 29 1836 topology 1850 2517 -> 15 0 29 1836 topology 1903 2518 -> 16 0 29 1836 topology 1904 2518 -> 15 0 28 1836 topology 1923 2519 -> 16 0 28 1836 topology 1928 2519 -> 15 0 29 1836 topology 1879 2520 -> 16 0 29 1836 topology 1880 2520 -> 15 0 28 1836 topology 1856 2521 -> 16 0 28 1836 topology 1928 2521 -> 15 0 28 1836 topology 1886 2522 -> 16 0 28 1836 topology 1928 2522 -> 15 0 29 1836 topology 1909 2523 -> 16 0 29 1836 topology 1910 2523 -> 15 0 28 1836 topology 1838 2524 -> 16 0 28 1836 topology 1928 2524 -> 15 0 29 1836 topology 1918 2525 -> 16 0 29 1836 topology 1919 2525 -> 15 0 28 1836 topology 1868 2526 -> 16 0 28 1836 topology 1928 2526 -> 15 0 28 1836 topology 1898 2527 -> 16 0 28 1836 topology 1928 2527 -> 15 0 28 1836 topology 1850 2528 -> 16 0 28 1836 topology 1928 2528 -> 15 0 29 1929 topology 1981 2529 -> 16 0 29 1929 topology 1982 2529 -> 15 0 28 1929 topology 2004 2530 +> 15 0 29 1836 topology 1927 2468 +> 16 0 29 1836 topology 1928 2468 +> 15 0 30 1836 topology 1912 2469 +> 16 0 30 1836 topology 1914 2469 +> 15 0 30 1836 topology 1912 2470 +> 16 0 30 1836 topology 1913 2470 +> 15 0 30 1836 topology 1915 2471 +> 16 0 30 1836 topology 1917 2471 +> 15 0 30 1836 topology 1915 2472 +> 16 0 30 1836 topology 1916 2472 +> 15 0 30 1836 topology 1918 2473 +> 16 0 30 1836 topology 1920 2473 +> 15 0 30 1836 topology 1918 2474 +> 16 0 30 1836 topology 1919 2474 +> 15 0 30 1836 topology 1921 2475 +> 16 0 30 1836 topology 1923 2475 +> 15 0 30 1836 topology 1921 2476 +> 16 0 30 1836 topology 1922 2476 +> 15 0 30 1836 topology 1924 2477 +> 16 0 30 1836 topology 1926 2477 +> 15 0 30 1836 topology 1924 2478 +> 16 0 30 1836 topology 1925 2478 +> 15 0 30 1836 topology 1837 2479 +> 16 0 30 1836 topology 1839 2479 +> 15 0 30 1836 topology 1837 2480 +> 16 0 30 1836 topology 1838 2480 +> 15 0 30 1836 topology 1840 2481 +> 16 0 30 1836 topology 1842 2481 +> 15 0 30 1836 topology 1840 2482 +> 16 0 30 1836 topology 1841 2482 +> 15 0 30 1836 topology 1843 2483 +> 16 0 30 1836 topology 1845 2483 +> 15 0 30 1836 topology 1843 2484 +> 16 0 30 1836 topology 1844 2484 +> 15 0 30 1836 topology 1846 2485 +> 16 0 30 1836 topology 1848 2485 +> 15 0 30 1836 topology 1846 2486 +> 16 0 30 1836 topology 1847 2486 +> 15 0 30 1836 topology 1849 2487 +> 16 0 30 1836 topology 1851 2487 +> 15 0 30 1836 topology 1849 2488 +> 16 0 30 1836 topology 1850 2488 +> 15 0 30 1836 topology 1852 2489 +> 16 0 30 1836 topology 1854 2489 +> 15 0 30 1836 topology 1852 2490 +> 16 0 30 1836 topology 1853 2490 +> 15 0 30 1836 topology 1855 2491 +> 16 0 30 1836 topology 1857 2491 +> 15 0 30 1836 topology 1855 2492 +> 16 0 30 1836 topology 1856 2492 +> 15 0 30 1836 topology 1858 2493 +> 16 0 30 1836 topology 1860 2493 +> 15 0 30 1836 topology 1858 2494 +> 16 0 30 1836 topology 1859 2494 +> 15 0 30 1836 topology 1861 2495 +> 16 0 30 1836 topology 1863 2495 +> 15 0 30 1836 topology 1861 2496 +> 16 0 30 1836 topology 1862 2496 +> 15 0 30 1836 topology 1864 2497 +> 16 0 30 1836 topology 1866 2497 +> 15 0 30 1836 topology 1864 2498 +> 16 0 30 1836 topology 1865 2498 +> 15 0 30 1836 topology 1867 2499 +> 16 0 30 1836 topology 1869 2499 +> 15 0 30 1836 topology 1867 2500 +> 16 0 30 1836 topology 1868 2500 +> 15 0 30 1836 topology 1870 2501 +> 16 0 30 1836 topology 1872 2501 +> 15 0 30 1836 topology 1870 2502 +> 16 0 30 1836 topology 1871 2502 +> 15 0 30 1836 topology 1873 2503 +> 16 0 30 1836 topology 1875 2503 +> 15 0 30 1836 topology 1873 2504 +> 16 0 30 1836 topology 1874 2504 +> 15 0 30 1836 topology 1876 2505 +> 16 0 30 1836 topology 1878 2505 +> 15 0 30 1836 topology 1876 2506 +> 16 0 30 1836 topology 1877 2506 +> 15 0 30 1836 topology 1879 2507 +> 16 0 30 1836 topology 1881 2507 +> 15 0 30 1836 topology 1879 2508 +> 16 0 30 1836 topology 1880 2508 +> 15 0 30 1836 topology 1882 2509 +> 16 0 30 1836 topology 1884 2509 +> 15 0 30 1836 topology 1882 2510 +> 16 0 30 1836 topology 1883 2510 +> 15 0 30 1836 topology 1885 2511 +> 16 0 30 1836 topology 1887 2511 +> 15 0 30 1836 topology 1885 2512 +> 16 0 30 1836 topology 1886 2512 +> 15 0 30 1836 topology 1888 2513 +> 16 0 30 1836 topology 1890 2513 +> 15 0 30 1836 topology 1888 2514 +> 16 0 30 1836 topology 1889 2514 +> 15 0 30 1836 topology 1891 2515 +> 16 0 30 1836 topology 1893 2515 +> 15 0 30 1836 topology 1891 2516 +> 16 0 30 1836 topology 1892 2516 +> 15 0 30 1836 topology 1894 2517 +> 16 0 30 1836 topology 1896 2517 +> 15 0 30 1836 topology 1894 2518 +> 16 0 30 1836 topology 1895 2518 +> 15 0 30 1836 topology 1897 2519 +> 16 0 30 1836 topology 1899 2519 +> 15 0 30 1836 topology 1897 2520 +> 16 0 30 1836 topology 1898 2520 +> 15 0 30 1836 topology 1900 2521 +> 16 0 30 1836 topology 1902 2521 +> 15 0 30 1836 topology 1900 2522 +> 16 0 30 1836 topology 1901 2522 +> 15 0 30 1836 topology 1903 2523 +> 16 0 30 1836 topology 1905 2523 +> 15 0 30 1836 topology 1903 2524 +> 16 0 30 1836 topology 1904 2524 +> 15 0 30 1836 topology 1906 2525 +> 16 0 30 1836 topology 1908 2525 +> 15 0 30 1836 topology 1906 2526 +> 16 0 30 1836 topology 1907 2526 +> 15 0 30 1836 topology 1909 2527 +> 16 0 30 1836 topology 1911 2527 +> 15 0 30 1836 topology 1909 2528 +> 16 0 30 1836 topology 1910 2528 +> 15 0 28 1929 topology 1932 2529 +> 16 0 28 1929 topology 2051 2529 +> 15 0 28 1929 topology 1931 2530 > 16 0 28 1929 topology 2051 2530 -> 15 0 29 1929 topology 2035 2531 -> 16 0 29 1929 topology 2036 2531 -> 15 0 29 1929 topology 2002 2532 -> 16 0 29 1929 topology 2004 2532 -> 15 0 28 1929 topology 1946 2533 +> 15 0 28 1929 topology 1935 2531 +> 16 0 28 1929 topology 2051 2531 +> 15 0 28 1929 topology 1934 2532 +> 16 0 28 1929 topology 2051 2532 +> 15 0 28 1929 topology 1938 2533 > 16 0 28 1929 topology 2051 2533 -> 15 0 29 1929 topology 1960 2534 -> 16 0 29 1929 topology 1961 2534 -> 15 0 28 1929 topology 1976 2535 +> 15 0 28 1929 topology 1937 2534 +> 16 0 28 1929 topology 2051 2534 +> 15 0 28 1929 topology 1941 2535 > 16 0 28 1929 topology 2051 2535 -> 15 0 29 1929 topology 2014 2536 -> 16 0 29 1929 topology 2015 2536 -> 15 0 28 1929 topology 2006 2537 +> 15 0 28 1929 topology 1940 2536 +> 16 0 28 1929 topology 2051 2536 +> 15 0 28 1929 topology 1944 2537 > 16 0 28 1929 topology 2051 2537 -> 15 0 28 1929 topology 2036 2538 +> 15 0 28 1929 topology 1943 2538 > 16 0 28 1929 topology 2051 2538 -> 15 0 28 1929 topology 1958 2539 +> 15 0 28 1929 topology 1947 2539 > 16 0 28 1929 topology 2051 2539 -> 15 0 29 1929 topology 1939 2540 -> 16 0 29 1929 topology 1940 2540 -> 15 0 28 1929 topology 1988 2541 +> 15 0 28 1929 topology 1946 2540 +> 16 0 28 1929 topology 2051 2540 +> 15 0 28 1929 topology 1950 2541 > 16 0 28 1929 topology 2051 2541 -> 15 0 29 1929 topology 1993 2542 -> 16 0 29 1929 topology 1994 2542 -> 15 0 29 1929 topology 2047 2543 -> 16 0 29 1929 topology 2048 2543 -> 15 0 28 1929 topology 2018 2544 +> 15 0 28 1929 topology 1949 2542 +> 16 0 28 1929 topology 2051 2542 +> 15 0 28 1929 topology 1953 2543 +> 16 0 28 1929 topology 2051 2543 +> 15 0 28 1929 topology 1952 2544 > 16 0 28 1929 topology 2051 2544 -> 15 0 28 1929 topology 1940 2545 +> 15 0 28 1929 topology 1956 2545 > 16 0 28 1929 topology 2051 2545 -> 15 0 28 1929 topology 2048 2546 +> 15 0 28 1929 topology 1955 2546 > 16 0 28 1929 topology 2051 2546 -> 15 0 28 1929 topology 1970 2547 +> 15 0 28 1929 topology 1959 2547 > 16 0 28 1929 topology 2051 2547 -> 15 0 29 1929 topology 1972 2548 -> 16 0 29 1929 topology 1973 2548 -> 15 0 28 1929 topology 2000 2549 +> 15 0 28 1929 topology 1958 2548 +> 16 0 28 1929 topology 2051 2548 +> 15 0 28 1929 topology 1962 2549 > 16 0 28 1929 topology 2051 2549 -> 15 0 29 1929 topology 2026 2550 -> 16 0 29 1929 topology 2027 2550 -> 15 0 28 1929 topology 2030 2551 +> 15 0 28 1929 topology 1961 2550 +> 16 0 28 1929 topology 2051 2550 +> 15 0 28 1929 topology 1965 2551 > 16 0 28 1929 topology 2051 2551 -> 15 0 29 1929 topology 1948 2552 -> 16 0 29 1929 topology 1950 2552 -> 15 0 29 1929 topology 1981 2553 -> 16 0 29 1929 topology 1983 2553 -> 15 0 29 1929 topology 2035 2554 -> 16 0 29 1929 topology 2037 2554 -> 15 0 28 1929 topology 1947 2555 +> 15 0 28 1929 topology 1964 2552 +> 16 0 28 1929 topology 2051 2552 +> 15 0 28 1929 topology 1968 2553 +> 16 0 28 1929 topology 2051 2553 +> 15 0 28 1929 topology 1967 2554 +> 16 0 28 1929 topology 2051 2554 +> 15 0 28 1929 topology 1971 2555 > 16 0 28 1929 topology 2051 2555 -> 15 0 29 1929 topology 1960 2556 -> 16 0 29 1929 topology 1962 2556 -> 15 0 29 1929 topology 2014 2557 -> 16 0 29 1929 topology 2016 2557 -> 15 0 28 1929 topology 2007 2558 +> 15 0 28 1929 topology 1970 2556 +> 16 0 28 1929 topology 2051 2556 +> 15 0 28 1929 topology 1974 2557 +> 16 0 28 1929 topology 2051 2557 +> 15 0 28 1929 topology 1973 2558 > 16 0 28 1929 topology 2051 2558 -> 15 0 28 1929 topology 1983 2559 +> 15 0 28 1929 topology 1977 2559 > 16 0 28 1929 topology 2051 2559 -> 15 0 29 1929 topology 1945 2560 -> 16 0 29 1929 topology 1946 2560 -> 15 0 28 1929 topology 1959 2561 +> 15 0 28 1929 topology 1976 2560 +> 16 0 28 1929 topology 2051 2560 +> 15 0 28 1929 topology 1980 2561 > 16 0 28 1929 topology 2051 2561 -> 15 0 28 1929 topology 1935 2562 +> 15 0 28 1929 topology 1979 2562 > 16 0 28 1929 topology 2051 2562 -> 15 0 29 1929 topology 1939 2563 -> 16 0 29 1929 topology 1941 2563 -> 15 0 29 1929 topology 1993 2564 -> 16 0 29 1929 topology 1995 2564 -> 15 0 28 1929 topology 2043 2565 +> 15 0 28 1929 topology 1983 2563 +> 16 0 28 1929 topology 2051 2563 +> 15 0 28 1929 topology 1982 2564 +> 16 0 28 1929 topology 2051 2564 +> 15 0 28 1929 topology 1986 2565 > 16 0 28 1929 topology 2051 2565 -> 15 0 29 1929 topology 2047 2566 -> 16 0 29 1929 topology 2049 2566 -> 15 0 28 1929 topology 2019 2567 +> 15 0 28 1929 topology 1985 2566 +> 16 0 28 1929 topology 2051 2566 +> 15 0 28 1929 topology 1989 2567 > 16 0 28 1929 topology 2051 2567 -> 15 0 28 1929 topology 1995 2568 +> 15 0 28 1929 topology 1988 2568 > 16 0 28 1929 topology 2051 2568 -> 15 0 28 1929 topology 1971 2569 +> 15 0 28 1929 topology 1992 2569 > 16 0 28 1929 topology 2051 2569 -> 15 0 29 1929 topology 1978 2570 -> 16 0 29 1929 topology 1979 2570 -> 15 0 29 1929 topology 1972 2571 -> 16 0 29 1929 topology 1974 2571 -> 15 0 29 1929 topology 2026 2572 -> 16 0 29 1929 topology 2028 2572 -> 15 0 28 1929 topology 2031 2573 +> 15 0 28 1929 topology 1991 2570 +> 16 0 28 1929 topology 2051 2570 +> 15 0 28 1929 topology 1995 2571 +> 16 0 28 1929 topology 2051 2571 +> 15 0 28 1929 topology 1994 2572 +> 16 0 28 1929 topology 2051 2572 +> 15 0 28 1929 topology 1998 2573 > 16 0 28 1929 topology 2051 2573 -> 15 0 29 1929 topology 1957 2574 -> 16 0 29 1929 topology 1958 2574 -> 15 0 29 1929 topology 2011 2575 -> 16 0 29 1929 topology 2012 2575 -> 15 0 29 1929 topology 1936 2576 -> 16 0 29 1929 topology 1937 2576 -> 15 0 28 1929 topology 1955 2577 +> 15 0 28 1929 topology 1997 2574 +> 16 0 28 1929 topology 2051 2574 +> 15 0 28 1929 topology 2001 2575 +> 16 0 28 1929 topology 2051 2575 +> 15 0 28 1929 topology 2000 2576 +> 16 0 28 1929 topology 2051 2576 +> 15 0 28 1929 topology 2004 2577 > 16 0 28 1929 topology 2051 2577 -> 15 0 29 1929 topology 1990 2578 -> 16 0 29 1929 topology 1991 2578 -> 15 0 29 1929 topology 2044 2579 -> 16 0 29 1929 topology 2045 2579 -> 15 0 28 1929 topology 1985 2580 +> 15 0 28 1929 topology 2003 2578 +> 16 0 28 1929 topology 2051 2578 +> 15 0 28 1929 topology 2007 2579 +> 16 0 28 1929 topology 2051 2579 +> 15 0 28 1929 topology 2006 2580 > 16 0 28 1929 topology 2051 2580 -> 15 0 28 1929 topology 2015 2581 +> 15 0 28 1929 topology 2010 2581 > 16 0 28 1929 topology 2051 2581 -> 15 0 28 1929 topology 1937 2582 +> 15 0 28 1929 topology 2009 2582 > 16 0 28 1929 topology 2051 2582 -> 15 0 28 1929 topology 2045 2583 +> 15 0 28 1929 topology 2013 2583 > 16 0 28 1929 topology 2051 2583 -> 15 0 28 1929 topology 1967 2584 +> 15 0 28 1929 topology 2012 2584 > 16 0 28 1929 topology 2051 2584 -> 15 0 29 1929 topology 1969 2585 -> 16 0 29 1929 topology 1970 2585 -> 15 0 29 1929 topology 2023 2586 -> 16 0 29 1929 topology 2024 2586 -> 15 0 28 1929 topology 1997 2587 +> 15 0 28 1929 topology 2016 2585 +> 16 0 28 1929 topology 2051 2585 +> 15 0 28 1929 topology 2015 2586 +> 16 0 28 1929 topology 2051 2586 +> 15 0 28 1929 topology 2019 2587 > 16 0 28 1929 topology 2051 2587 -> 15 0 28 1929 topology 2027 2588 +> 15 0 28 1929 topology 2018 2588 > 16 0 28 1929 topology 2051 2588 -> 15 0 29 1929 topology 2002 2589 -> 16 0 29 1929 topology 2003 2589 -> 15 0 29 1929 topology 1951 2590 -> 16 0 29 1929 topology 1953 2590 -> 15 0 29 1929 topology 2005 2591 -> 16 0 29 1929 topology 2007 2591 -> 15 0 29 1929 topology 1930 2592 -> 16 0 29 1929 topology 1932 2592 -> 15 0 29 1929 topology 1984 2593 -> 16 0 29 1929 topology 1986 2593 -> 15 0 29 1929 topology 2038 2594 -> 16 0 29 1929 topology 2040 2594 -> 15 0 28 1929 topology 1950 2595 +> 15 0 28 1929 topology 2022 2589 +> 16 0 28 1929 topology 2051 2589 +> 15 0 28 1929 topology 2021 2590 +> 16 0 28 1929 topology 2051 2590 +> 15 0 28 1929 topology 2025 2591 +> 16 0 28 1929 topology 2051 2591 +> 15 0 28 1929 topology 2024 2592 +> 16 0 28 1929 topology 2051 2592 +> 15 0 28 1929 topology 2028 2593 +> 16 0 28 1929 topology 2051 2593 +> 15 0 28 1929 topology 2027 2594 +> 16 0 28 1929 topology 2051 2594 +> 15 0 28 1929 topology 2031 2595 > 16 0 28 1929 topology 2051 2595 -> 15 0 29 1929 topology 1963 2596 -> 16 0 29 1929 topology 1965 2596 -> 15 0 28 1929 topology 2010 2597 +> 15 0 28 1929 topology 2030 2596 +> 16 0 28 1929 topology 2051 2596 +> 15 0 28 1929 topology 2034 2597 > 16 0 28 1929 topology 2051 2597 -> 15 0 29 1929 topology 2017 2598 -> 16 0 29 1929 topology 2019 2598 -> 15 0 28 1929 topology 1986 2599 +> 15 0 28 1929 topology 2033 2598 +> 16 0 28 1929 topology 2051 2598 +> 15 0 28 1929 topology 2037 2599 > 16 0 28 1929 topology 2051 2599 -> 15 0 28 1929 topology 1962 2600 +> 15 0 28 1929 topology 2036 2600 > 16 0 28 1929 topology 2051 2600 -> 15 0 28 1929 topology 1938 2601 +> 15 0 28 1929 topology 2040 2601 > 16 0 28 1929 topology 2051 2601 -> 15 0 29 1929 topology 1975 2602 -> 16 0 29 1929 topology 1976 2602 -> 15 0 28 1929 topology 2046 2603 +> 15 0 28 1929 topology 2039 2602 +> 16 0 28 1929 topology 2051 2602 +> 15 0 28 1929 topology 2043 2603 > 16 0 28 1929 topology 2051 2603 -> 15 0 29 1929 topology 1942 2604 -> 16 0 29 1929 topology 1944 2604 -> 15 0 29 1929 topology 1996 2605 -> 16 0 29 1929 topology 1998 2605 -> 15 0 28 1929 topology 2022 2606 +> 15 0 28 1929 topology 2042 2604 +> 16 0 28 1929 topology 2051 2604 +> 15 0 28 1929 topology 2046 2605 +> 16 0 28 1929 topology 2051 2605 +> 15 0 28 1929 topology 2045 2606 > 16 0 28 1929 topology 2051 2606 -> 15 0 28 1929 topology 1998 2607 +> 15 0 28 1929 topology 2049 2607 > 16 0 28 1929 topology 2051 2607 -> 15 0 28 1929 topology 1974 2608 +> 15 0 28 1929 topology 2048 2608 > 16 0 28 1929 topology 2051 2608 -> 15 0 29 1929 topology 1954 2609 -> 16 0 29 1929 topology 1955 2609 -> 15 0 29 1929 topology 2008 2610 -> 16 0 29 1929 topology 2009 2610 -> 15 0 29 1929 topology 2029 2611 -> 16 0 29 1929 topology 2031 2611 -> 15 0 28 1929 topology 2034 2612 -> 16 0 28 1929 topology 2051 2612 -> 15 0 29 1929 topology 1933 2613 -> 16 0 29 1929 topology 1934 2613 -> 15 0 29 1929 topology 1987 2614 -> 16 0 29 1929 topology 1988 2614 -> 15 0 29 1929 topology 2041 2615 -> 16 0 29 1929 topology 2042 2615 -> 15 0 28 1929 topology 1952 2616 -> 16 0 28 1929 topology 2051 2616 -> 15 0 28 1929 topology 1982 2617 -> 16 0 28 1929 topology 2051 2617 -> 15 0 28 1929 topology 2012 2618 -> 16 0 28 1929 topology 2051 2618 -> 15 0 28 1929 topology 1934 2619 -> 16 0 28 1929 topology 2051 2619 -> 15 0 29 1929 topology 1966 2620 -> 16 0 29 1929 topology 1967 2620 -> 15 0 29 1929 topology 2020 2621 -> 16 0 29 1929 topology 2021 2621 -> 15 0 28 1929 topology 2042 2622 -> 16 0 28 1929 topology 2051 2622 -> 15 0 28 1929 topology 1964 2623 -> 16 0 28 1929 topology 2051 2623 -> 15 0 28 1929 topology 1994 2624 -> 16 0 28 1929 topology 2051 2624 -> 15 0 28 1929 topology 2024 2625 -> 16 0 28 1929 topology 2051 2625 -> 15 0 29 1929 topology 1999 2626 -> 16 0 29 1929 topology 2000 2626 -> 15 0 29 1929 topology 1975 2627 -> 16 0 29 1929 topology 1977 2627 -> 15 0 29 1929 topology 2032 2628 -> 16 0 29 1929 topology 2033 2628 -> 15 0 29 1929 topology 1954 2629 -> 16 0 29 1929 topology 1956 2629 -> 15 0 29 1929 topology 2008 2630 -> 16 0 29 1929 topology 2010 2630 -> 15 0 29 1929 topology 1933 2631 -> 16 0 29 1929 topology 1935 2631 -> 15 0 28 1929 topology 1977 2632 -> 16 0 28 1929 topology 2051 2632 -> 15 0 29 1929 topology 1987 2633 -> 16 0 29 1929 topology 1989 2633 -> 15 0 29 1929 topology 2041 2634 -> 16 0 29 1929 topology 2043 2634 -> 15 0 28 1929 topology 1953 2635 -> 16 0 28 1929 topology 2051 2635 -> 15 0 28 1929 topology 2037 2636 -> 16 0 28 1929 topology 2051 2636 -> 15 0 28 1929 topology 2013 2637 -> 16 0 28 1929 topology 2051 2637 -> 15 0 29 1929 topology 1966 2638 -> 16 0 29 1929 topology 1968 2638 -> 15 0 28 1929 topology 1989 2639 -> 16 0 28 1929 topology 2051 2639 -> 15 0 29 1929 topology 2020 2640 -> 16 0 29 1929 topology 2022 2640 -> 15 0 28 1929 topology 1965 2641 -> 16 0 28 1929 topology 2051 2641 -> 15 0 28 1929 topology 1941 2642 -> 16 0 28 1929 topology 2051 2642 -> 15 0 28 1929 topology 2049 2643 -> 16 0 28 1929 topology 2051 2643 -> 15 0 29 1929 topology 1951 2644 -> 16 0 29 1929 topology 1952 2644 -> 15 0 29 1929 topology 2005 2645 -> 16 0 29 1929 topology 2006 2645 -> 15 0 28 1929 topology 2025 2646 -> 16 0 28 1929 topology 2051 2646 -> 15 0 29 1929 topology 1999 2647 -> 16 0 29 1929 topology 2001 2647 -> 15 0 28 1929 topology 2001 2648 -> 16 0 28 1929 topology 2051 2648 -> 15 0 29 1929 topology 1930 2649 -> 16 0 29 1929 topology 1931 2649 -> 15 0 29 1929 topology 1984 2650 -> 16 0 29 1929 topology 1985 2650 -> 15 0 29 1929 topology 2038 2651 -> 16 0 29 1929 topology 2039 2651 -> 15 0 29 1929 topology 2032 2652 -> 16 0 29 1929 topology 2034 2652 -> 15 0 28 1929 topology 1949 2653 -> 16 0 28 1929 topology 2051 2653 -> 15 0 28 1929 topology 1979 2654 -> 16 0 28 1929 topology 2051 2654 -> 15 0 29 1929 topology 1963 2655 -> 16 0 29 1929 topology 1964 2655 -> 15 0 28 1929 topology 2009 2656 -> 16 0 28 1929 topology 2051 2656 -> 15 0 29 1929 topology 2017 2657 -> 16 0 29 1929 topology 2018 2657 -> 15 0 28 1929 topology 1931 2658 -> 16 0 28 1929 topology 2051 2658 -> 15 0 28 1929 topology 2039 2659 -> 16 0 28 1929 topology 2051 2659 -> 15 0 28 1929 topology 1961 2660 -> 16 0 28 1929 topology 2051 2660 -> 15 0 28 1929 topology 1991 2661 -> 16 0 28 1929 topology 2051 2661 -> 15 0 29 1929 topology 1942 2662 -> 16 0 29 1929 topology 1943 2662 -> 15 0 29 1929 topology 1996 2663 -> 16 0 29 1929 topology 1997 2663 -> 15 0 28 1929 topology 2021 2664 -> 16 0 28 1929 topology 2051 2664 -> 15 0 28 1929 topology 1943 2665 -> 16 0 28 1929 topology 2051 2665 -> 15 0 28 1929 topology 1973 2666 -> 16 0 28 1929 topology 2051 2666 -> 15 0 29 1929 topology 1945 2667 -> 16 0 29 1929 topology 1947 2667 -> 15 0 28 1929 topology 2003 2668 -> 16 0 28 1929 topology 2051 2668 -> 15 0 29 1929 topology 2029 2669 -> 16 0 29 1929 topology 2030 2669 -> 15 0 28 1929 topology 2033 2670 -> 16 0 28 1929 topology 2051 2670 -> 15 0 29 1929 topology 1978 2671 -> 16 0 29 1929 topology 1980 2671 -> 15 0 29 1929 topology 1957 2672 -> 16 0 29 1929 topology 1959 2672 -> 15 0 29 1929 topology 2011 2673 -> 16 0 29 1929 topology 2013 2673 -> 15 0 28 1929 topology 1980 2674 -> 16 0 28 1929 topology 2051 2674 -> 15 0 29 1929 topology 1936 2675 -> 16 0 29 1929 topology 1938 2675 -> 15 0 28 1929 topology 1956 2676 -> 16 0 28 1929 topology 2051 2676 -> 15 0 29 1929 topology 1990 2677 -> 16 0 29 1929 topology 1992 2677 -> 15 0 29 1929 topology 2044 2678 -> 16 0 29 1929 topology 2046 2678 -> 15 0 28 1929 topology 1932 2679 -> 16 0 28 1929 topology 2051 2679 -> 15 0 28 1929 topology 2040 2680 -> 16 0 28 1929 topology 2051 2680 -> 15 0 28 1929 topology 2016 2681 -> 16 0 28 1929 topology 2051 2681 -> 15 0 29 1929 topology 1948 2682 -> 16 0 29 1929 topology 1949 2682 -> 15 0 28 1929 topology 1992 2683 -> 16 0 28 1929 topology 2051 2683 -> 15 0 28 1929 topology 1968 2684 -> 16 0 28 1929 topology 2051 2684 -> 15 0 29 1929 topology 1969 2685 -> 16 0 29 1929 topology 1971 2685 -> 15 0 29 1929 topology 2023 2686 -> 16 0 29 1929 topology 2025 2686 -> 15 0 30 1929 topology 2050 2687 -> 16 0 30 1929 topology 2051 2687 -> 15 0 28 1929 topology 1944 2688 -> 16 0 28 1929 topology 2051 2688 -> 15 0 28 1929 topology 2028 2689 -> 16 0 28 1929 topology 2051 2689 +> 15 0 29 1929 topology 2050 2609 +> 16 0 29 1929 topology 2051 2609 +> 15 0 30 1929 topology 1930 2610 +> 16 0 30 1929 topology 1932 2610 +> 15 0 30 1929 topology 1930 2611 +> 16 0 30 1929 topology 1931 2611 +> 15 0 30 1929 topology 1933 2612 +> 16 0 30 1929 topology 1935 2612 +> 15 0 30 1929 topology 1933 2613 +> 16 0 30 1929 topology 1934 2613 +> 15 0 30 1929 topology 1936 2614 +> 16 0 30 1929 topology 1938 2614 +> 15 0 30 1929 topology 1936 2615 +> 16 0 30 1929 topology 1937 2615 +> 15 0 30 1929 topology 1939 2616 +> 16 0 30 1929 topology 1941 2616 +> 15 0 30 1929 topology 1939 2617 +> 16 0 30 1929 topology 1940 2617 +> 15 0 30 1929 topology 1942 2618 +> 16 0 30 1929 topology 1944 2618 +> 15 0 30 1929 topology 1942 2619 +> 16 0 30 1929 topology 1943 2619 +> 15 0 30 1929 topology 1945 2620 +> 16 0 30 1929 topology 1947 2620 +> 15 0 30 1929 topology 1945 2621 +> 16 0 30 1929 topology 1946 2621 +> 15 0 30 1929 topology 1948 2622 +> 16 0 30 1929 topology 1950 2622 +> 15 0 30 1929 topology 1948 2623 +> 16 0 30 1929 topology 1949 2623 +> 15 0 30 1929 topology 1951 2624 +> 16 0 30 1929 topology 1953 2624 +> 15 0 30 1929 topology 1951 2625 +> 16 0 30 1929 topology 1952 2625 +> 15 0 30 1929 topology 1954 2626 +> 16 0 30 1929 topology 1956 2626 +> 15 0 30 1929 topology 1954 2627 +> 16 0 30 1929 topology 1955 2627 +> 15 0 30 1929 topology 1957 2628 +> 16 0 30 1929 topology 1959 2628 +> 15 0 30 1929 topology 1957 2629 +> 16 0 30 1929 topology 1958 2629 +> 15 0 30 1929 topology 1960 2630 +> 16 0 30 1929 topology 1962 2630 +> 15 0 30 1929 topology 1960 2631 +> 16 0 30 1929 topology 1961 2631 +> 15 0 30 1929 topology 1963 2632 +> 16 0 30 1929 topology 1965 2632 +> 15 0 30 1929 topology 1963 2633 +> 16 0 30 1929 topology 1964 2633 +> 15 0 30 1929 topology 1966 2634 +> 16 0 30 1929 topology 1968 2634 +> 15 0 30 1929 topology 1966 2635 +> 16 0 30 1929 topology 1967 2635 +> 15 0 30 1929 topology 1969 2636 +> 16 0 30 1929 topology 1971 2636 +> 15 0 30 1929 topology 1969 2637 +> 16 0 30 1929 topology 1970 2637 +> 15 0 30 1929 topology 1972 2638 +> 16 0 30 1929 topology 1974 2638 +> 15 0 30 1929 topology 1972 2639 +> 16 0 30 1929 topology 1973 2639 +> 15 0 30 1929 topology 1975 2640 +> 16 0 30 1929 topology 1977 2640 +> 15 0 30 1929 topology 1975 2641 +> 16 0 30 1929 topology 1976 2641 +> 15 0 30 1929 topology 1978 2642 +> 16 0 30 1929 topology 1980 2642 +> 15 0 30 1929 topology 1978 2643 +> 16 0 30 1929 topology 1979 2643 +> 15 0 30 1929 topology 1981 2644 +> 16 0 30 1929 topology 1983 2644 +> 15 0 30 1929 topology 1981 2645 +> 16 0 30 1929 topology 1982 2645 +> 15 0 30 1929 topology 1984 2646 +> 16 0 30 1929 topology 1986 2646 +> 15 0 30 1929 topology 1984 2647 +> 16 0 30 1929 topology 1985 2647 +> 15 0 30 1929 topology 1987 2648 +> 16 0 30 1929 topology 1989 2648 +> 15 0 30 1929 topology 1987 2649 +> 16 0 30 1929 topology 1988 2649 +> 15 0 30 1929 topology 1990 2650 +> 16 0 30 1929 topology 1992 2650 +> 15 0 30 1929 topology 1990 2651 +> 16 0 30 1929 topology 1991 2651 +> 15 0 30 1929 topology 1993 2652 +> 16 0 30 1929 topology 1995 2652 +> 15 0 30 1929 topology 1993 2653 +> 16 0 30 1929 topology 1994 2653 +> 15 0 30 1929 topology 1996 2654 +> 16 0 30 1929 topology 1998 2654 +> 15 0 30 1929 topology 1996 2655 +> 16 0 30 1929 topology 1997 2655 +> 15 0 30 1929 topology 1999 2656 +> 16 0 30 1929 topology 2001 2656 +> 15 0 30 1929 topology 1999 2657 +> 16 0 30 1929 topology 2000 2657 +> 15 0 30 1929 topology 2002 2658 +> 16 0 30 1929 topology 2004 2658 +> 15 0 30 1929 topology 2002 2659 +> 16 0 30 1929 topology 2003 2659 +> 15 0 30 1929 topology 2005 2660 +> 16 0 30 1929 topology 2007 2660 +> 15 0 30 1929 topology 2005 2661 +> 16 0 30 1929 topology 2006 2661 +> 15 0 30 1929 topology 2008 2662 +> 16 0 30 1929 topology 2010 2662 +> 15 0 30 1929 topology 2008 2663 +> 16 0 30 1929 topology 2009 2663 +> 15 0 30 1929 topology 2011 2664 +> 16 0 30 1929 topology 2013 2664 +> 15 0 30 1929 topology 2011 2665 +> 16 0 30 1929 topology 2012 2665 +> 15 0 30 1929 topology 2014 2666 +> 16 0 30 1929 topology 2016 2666 +> 15 0 30 1929 topology 2014 2667 +> 16 0 30 1929 topology 2015 2667 +> 15 0 30 1929 topology 2017 2668 +> 16 0 30 1929 topology 2019 2668 +> 15 0 30 1929 topology 2017 2669 +> 16 0 30 1929 topology 2018 2669 +> 15 0 30 1929 topology 2020 2670 +> 16 0 30 1929 topology 2022 2670 +> 15 0 30 1929 topology 2020 2671 +> 16 0 30 1929 topology 2021 2671 +> 15 0 30 1929 topology 2023 2672 +> 16 0 30 1929 topology 2025 2672 +> 15 0 30 1929 topology 2023 2673 +> 16 0 30 1929 topology 2024 2673 +> 15 0 30 1929 topology 2026 2674 +> 16 0 30 1929 topology 2028 2674 +> 15 0 30 1929 topology 2026 2675 +> 16 0 30 1929 topology 2027 2675 +> 15 0 30 1929 topology 2029 2676 +> 16 0 30 1929 topology 2031 2676 +> 15 0 30 1929 topology 2029 2677 +> 16 0 30 1929 topology 2030 2677 +> 15 0 30 1929 topology 2032 2678 +> 16 0 30 1929 topology 2034 2678 +> 15 0 30 1929 topology 2032 2679 +> 16 0 30 1929 topology 2033 2679 +> 15 0 30 1929 topology 2035 2680 +> 16 0 30 1929 topology 2037 2680 +> 15 0 30 1929 topology 2035 2681 +> 16 0 30 1929 topology 2036 2681 +> 15 0 30 1929 topology 2038 2682 +> 16 0 30 1929 topology 2040 2682 +> 15 0 30 1929 topology 2038 2683 +> 16 0 30 1929 topology 2039 2683 +> 15 0 30 1929 topology 2041 2684 +> 16 0 30 1929 topology 2043 2684 +> 15 0 30 1929 topology 2041 2685 +> 16 0 30 1929 topology 2042 2685 +> 15 0 30 1929 topology 2044 2686 +> 16 0 30 1929 topology 2046 2686 +> 15 0 30 1929 topology 2044 2687 +> 16 0 30 1929 topology 2045 2687 +> 15 0 30 1929 topology 2047 2688 +> 16 0 30 1929 topology 2049 2688 +> 15 0 30 1929 topology 2047 2689 +> 16 0 30 1929 topology 2048 2689 > 15 0 31 1607 topology 2054 2690 > 16 0 31 1607 topology 2053 2690 > 15 0 31 1607 topology 2054 2691 @@ -18484,12040 +18484,12040 @@ $ tail -n +3 trace_platform.trace > 16 0 31 1607 topology 2050 2693 > 15 0 32 1607 topology 1726 2694 > 16 0 32 1607 topology 2054 2694 -> 15 0 28 2057 topology 2068 2695 +> 15 0 28 2057 topology 2087 2695 > 16 0 28 2057 topology 2155 2695 -> 15 0 29 2057 topology 2073 2696 -> 16 0 29 2057 topology 2074 2696 -> 15 0 29 2057 topology 2076 2697 -> 16 0 29 2057 topology 2077 2697 -> 15 0 28 2057 topology 2120 2698 +> 15 0 28 2057 topology 2086 2696 +> 16 0 28 2057 topology 2155 2696 +> 15 0 28 2057 topology 2090 2697 +> 16 0 28 2057 topology 2155 2697 +> 15 0 28 2057 topology 2089 2698 > 16 0 28 2057 topology 2155 2698 -> 15 0 29 2057 topology 2130 2699 -> 16 0 29 2057 topology 2131 2699 -> 15 0 28 2057 topology 2096 2700 +> 15 0 28 2057 topology 2093 2699 +> 16 0 28 2057 topology 2155 2699 +> 15 0 28 2057 topology 2092 2700 > 16 0 28 2057 topology 2155 2700 -> 15 0 29 2057 topology 2079 2701 -> 16 0 29 2057 topology 2080 2701 -> 15 0 28 2057 topology 2080 2702 +> 15 0 28 2057 topology 2096 2701 +> 16 0 28 2057 topology 2155 2701 +> 15 0 28 2057 topology 2095 2702 > 16 0 28 2057 topology 2155 2702 -> 15 0 29 2057 topology 2082 2703 -> 16 0 29 2057 topology 2083 2703 -> 15 0 29 2057 topology 2109 2704 -> 16 0 29 2057 topology 2110 2704 -> 15 0 28 2057 topology 2132 2705 +> 15 0 28 2057 topology 2099 2703 +> 16 0 28 2057 topology 2155 2703 +> 15 0 28 2057 topology 2098 2704 +> 16 0 28 2057 topology 2155 2704 +> 15 0 28 2057 topology 2102 2705 > 16 0 28 2057 topology 2155 2705 -> 15 0 28 2057 topology 2108 2706 +> 15 0 28 2057 topology 2101 2706 > 16 0 28 2057 topology 2155 2706 -> 15 0 29 2057 topology 2142 2707 -> 16 0 29 2057 topology 2143 2707 -> 15 0 28 2057 topology 2144 2708 +> 15 0 28 2057 topology 2105 2707 +> 16 0 28 2057 topology 2155 2707 +> 15 0 28 2057 topology 2104 2708 > 16 0 28 2057 topology 2155 2708 -> 15 0 29 2057 topology 2091 2709 -> 16 0 29 2057 topology 2093 2709 -> 15 0 29 2057 topology 2145 2710 -> 16 0 29 2057 topology 2146 2710 -> 15 0 28 2057 topology 2092 2711 +> 15 0 28 2057 topology 2108 2709 +> 16 0 28 2057 topology 2155 2709 +> 15 0 28 2057 topology 2107 2710 +> 16 0 28 2057 topology 2155 2710 +> 15 0 28 2057 topology 2111 2711 > 16 0 28 2057 topology 2155 2711 -> 15 0 28 2057 topology 2122 2712 +> 15 0 28 2057 topology 2110 2712 > 16 0 28 2057 topology 2155 2712 -> 15 0 29 2057 topology 2124 2713 -> 16 0 29 2057 topology 2126 2713 -> 15 0 28 2057 topology 2069 2714 +> 15 0 28 2057 topology 2114 2713 +> 16 0 28 2057 topology 2155 2713 +> 15 0 28 2057 topology 2113 2714 > 16 0 28 2057 topology 2155 2714 -> 15 0 28 2057 topology 2104 2715 +> 15 0 28 2057 topology 2060 2715 > 16 0 28 2057 topology 2155 2715 -> 15 0 28 2057 topology 2134 2716 +> 15 0 28 2057 topology 2059 2716 > 16 0 28 2057 topology 2155 2716 -> 15 0 29 2057 topology 2103 2717 -> 16 0 29 2057 topology 2105 2717 -> 15 0 28 2057 topology 2081 2718 +> 15 0 28 2057 topology 2117 2717 +> 16 0 28 2057 topology 2155 2717 +> 15 0 28 2057 topology 2116 2718 > 16 0 28 2057 topology 2155 2718 -> 15 0 29 2057 topology 2088 2719 -> 16 0 29 2057 topology 2089 2719 -> 15 0 29 2057 topology 2136 2720 -> 16 0 29 2057 topology 2138 2720 -> 15 0 29 2057 topology 2121 2721 -> 16 0 29 2057 topology 2122 2721 -> 15 0 28 2057 topology 2065 2722 +> 15 0 28 2057 topology 2120 2719 +> 16 0 28 2057 topology 2155 2719 +> 15 0 28 2057 topology 2119 2720 +> 16 0 28 2057 topology 2155 2720 +> 15 0 28 2057 topology 2123 2721 +> 16 0 28 2057 topology 2155 2721 +> 15 0 28 2057 topology 2122 2722 > 16 0 28 2057 topology 2155 2722 -> 15 0 28 2057 topology 2087 2723 +> 15 0 28 2057 topology 2126 2723 > 16 0 28 2057 topology 2155 2723 -> 15 0 29 2057 topology 2100 2724 -> 16 0 29 2057 topology 2101 2724 -> 15 0 28 2057 topology 2077 2725 +> 15 0 28 2057 topology 2125 2724 +> 16 0 28 2057 topology 2155 2724 +> 15 0 28 2057 topology 2129 2725 > 16 0 28 2057 topology 2155 2725 -> 15 0 28 2057 topology 2123 2726 +> 15 0 28 2057 topology 2128 2726 > 16 0 28 2057 topology 2155 2726 -> 15 0 28 2057 topology 2099 2727 +> 15 0 28 2057 topology 2132 2727 > 16 0 28 2057 topology 2155 2727 -> 15 0 29 2057 topology 2133 2728 -> 16 0 29 2057 topology 2134 2728 +> 15 0 28 2057 topology 2131 2728 +> 16 0 28 2057 topology 2155 2728 > 15 0 28 2057 topology 2135 2729 > 16 0 28 2057 topology 2155 2729 -> 15 0 28 2057 topology 2111 2730 +> 15 0 28 2057 topology 2134 2730 > 16 0 28 2057 topology 2155 2730 -> 15 0 29 2057 topology 2112 2731 -> 16 0 29 2057 topology 2113 2731 -> 15 0 29 2057 topology 2061 2732 -> 16 0 29 2057 topology 2063 2732 -> 15 0 29 2057 topology 2088 2733 -> 16 0 29 2057 topology 2090 2733 -> 15 0 28 2057 topology 2147 2734 +> 15 0 28 2057 topology 2138 2731 +> 16 0 28 2057 topology 2155 2731 +> 15 0 28 2057 topology 2137 2732 +> 16 0 28 2057 topology 2155 2732 +> 15 0 28 2057 topology 2141 2733 +> 16 0 28 2057 topology 2155 2733 +> 15 0 28 2057 topology 2140 2734 > 16 0 28 2057 topology 2155 2734 -> 15 0 28 2057 topology 2089 2735 +> 15 0 28 2057 topology 2144 2735 > 16 0 28 2057 topology 2155 2735 -> 15 0 29 2057 topology 2067 2736 -> 16 0 29 2057 topology 2069 2736 -> 15 0 28 2057 topology 2119 2737 +> 15 0 28 2057 topology 2143 2736 +> 16 0 28 2057 topology 2155 2736 +> 15 0 28 2057 topology 2063 2737 > 16 0 28 2057 topology 2155 2737 -> 15 0 29 2057 topology 2121 2738 -> 16 0 29 2057 topology 2123 2738 -> 15 0 28 2057 topology 2060 2739 +> 15 0 28 2057 topology 2062 2738 +> 16 0 28 2057 topology 2155 2738 +> 15 0 28 2057 topology 2066 2739 > 16 0 28 2057 topology 2155 2739 -> 15 0 29 2057 topology 2148 2740 -> 16 0 29 2057 topology 2149 2740 -> 15 0 28 2057 topology 2101 2741 +> 15 0 28 2057 topology 2065 2740 +> 16 0 28 2057 topology 2155 2740 +> 15 0 28 2057 topology 2069 2741 > 16 0 28 2057 topology 2155 2741 -> 15 0 29 2057 topology 2073 2742 -> 16 0 29 2057 topology 2075 2742 -> 15 0 29 2057 topology 2100 2743 -> 16 0 29 2057 topology 2102 2743 -> 15 0 28 2057 topology 2131 2744 +> 15 0 28 2057 topology 2068 2742 +> 16 0 28 2057 topology 2155 2742 +> 15 0 28 2057 topology 2147 2743 +> 16 0 28 2057 topology 2155 2743 +> 15 0 28 2057 topology 2146 2744 > 16 0 28 2057 topology 2155 2744 -> 15 0 28 2057 topology 2072 2745 +> 15 0 28 2057 topology 2150 2745 > 16 0 28 2057 topology 2155 2745 -> 15 0 28 2057 topology 2113 2746 +> 15 0 28 2057 topology 2149 2746 > 16 0 28 2057 topology 2155 2746 -> 15 0 29 2057 topology 2079 2747 -> 16 0 29 2057 topology 2081 2747 -> 15 0 29 2057 topology 2133 2748 -> 16 0 29 2057 topology 2135 2748 -> 15 0 28 2057 topology 2143 2749 +> 15 0 28 2057 topology 2072 2747 +> 16 0 28 2057 topology 2155 2747 +> 15 0 28 2057 topology 2071 2748 +> 16 0 28 2057 topology 2155 2748 +> 15 0 28 2057 topology 2153 2749 > 16 0 28 2057 topology 2155 2749 -> 15 0 28 2057 topology 2084 2750 +> 15 0 28 2057 topology 2152 2750 > 16 0 28 2057 topology 2155 2750 -> 15 0 29 2057 topology 2091 2751 -> 16 0 29 2057 topology 2092 2751 -> 15 0 28 2057 topology 2149 2752 +> 15 0 28 2057 topology 2075 2751 +> 16 0 28 2057 topology 2155 2751 +> 15 0 28 2057 topology 2074 2752 > 16 0 28 2057 topology 2155 2752 -> 15 0 29 2057 topology 2112 2753 -> 16 0 29 2057 topology 2114 2753 -> 15 0 28 2057 topology 2062 2754 +> 15 0 28 2057 topology 2078 2753 +> 16 0 28 2057 topology 2155 2753 +> 15 0 28 2057 topology 2077 2754 > 16 0 28 2057 topology 2155 2754 -> 15 0 29 2057 topology 2124 2755 -> 16 0 29 2057 topology 2125 2755 -> 15 0 28 2057 topology 2090 2756 +> 15 0 28 2057 topology 2081 2755 +> 16 0 28 2057 topology 2155 2755 +> 15 0 28 2057 topology 2080 2756 > 16 0 28 2057 topology 2155 2756 -> 15 0 28 2057 topology 2074 2757 +> 15 0 28 2057 topology 2084 2757 > 16 0 28 2057 topology 2155 2757 -> 15 0 29 2057 topology 2103 2758 -> 16 0 29 2057 topology 2104 2758 -> 15 0 29 2057 topology 2148 2759 -> 16 0 29 2057 topology 2150 2759 -> 15 0 28 2057 topology 2126 2760 -> 16 0 28 2057 topology 2155 2760 -> 15 0 28 2057 topology 2102 2761 -> 16 0 28 2057 topology 2155 2761 -> 15 0 29 2057 topology 2136 2762 -> 16 0 29 2057 topology 2137 2762 -> 15 0 28 2057 topology 2138 2763 -> 16 0 28 2057 topology 2155 2763 -> 15 0 29 2057 topology 2085 2764 -> 16 0 29 2057 topology 2087 2764 -> 15 0 28 2057 topology 2114 2765 -> 16 0 28 2057 topology 2155 2765 -> 15 0 28 2057 topology 2086 2766 -> 16 0 28 2057 topology 2155 2766 -> 15 0 29 2057 topology 2118 2767 -> 16 0 29 2057 topology 2120 2767 -> 15 0 28 2057 topology 2150 2768 -> 16 0 28 2057 topology 2155 2768 -> 15 0 28 2057 topology 2116 2769 -> 16 0 28 2057 topology 2155 2769 -> 15 0 28 2057 topology 2063 2770 -> 16 0 28 2057 topology 2155 2770 -> 15 0 28 2057 topology 2098 2771 -> 16 0 28 2057 topology 2155 2771 -> 15 0 29 2057 topology 2097 2772 -> 16 0 29 2057 topology 2099 2772 -> 15 0 28 2057 topology 2128 2773 -> 16 0 28 2057 topology 2155 2773 -> 15 0 28 2057 topology 2152 2774 -> 16 0 28 2057 topology 2155 2774 -> 15 0 28 2057 topology 2075 2775 -> 16 0 28 2057 topology 2155 2775 -> 15 0 28 2057 topology 2110 2776 -> 16 0 28 2057 topology 2155 2776 -> 15 0 29 2057 topology 2130 2777 -> 16 0 29 2057 topology 2132 2777 -> 15 0 28 2057 topology 2140 2778 -> 16 0 28 2057 topology 2155 2778 -> 15 0 29 2057 topology 2115 2779 -> 16 0 29 2057 topology 2116 2779 -> 15 0 29 2057 topology 2109 2780 -> 16 0 29 2057 topology 2111 2780 -> 15 0 28 2057 topology 2146 2781 -> 16 0 28 2057 topology 2155 2781 -> 15 0 29 2057 topology 2094 2782 -> 16 0 29 2057 topology 2095 2782 -> 15 0 28 2057 topology 2059 2783 -> 16 0 28 2057 topology 2155 2783 -> 15 0 29 2057 topology 2142 2784 -> 16 0 29 2057 topology 2144 2784 -> 15 0 29 2057 topology 2127 2785 -> 16 0 29 2057 topology 2128 2785 -> 15 0 29 2057 topology 2151 2786 -> 16 0 29 2057 topology 2152 2786 -> 15 0 28 2057 topology 2071 2787 -> 16 0 28 2057 topology 2155 2787 -> 15 0 28 2057 topology 2117 2788 -> 16 0 28 2057 topology 2155 2788 -> 15 0 29 2057 topology 2145 2789 -> 16 0 29 2057 topology 2147 2789 -> 15 0 28 2057 topology 2093 2790 -> 16 0 28 2057 topology 2155 2790 -> 15 0 29 2057 topology 2106 2791 -> 16 0 29 2057 topology 2107 2791 -> 15 0 28 2057 topology 2083 2792 -> 16 0 28 2057 topology 2155 2792 -> 15 0 28 2057 topology 2129 2793 -> 16 0 28 2057 topology 2155 2793 -> 15 0 28 2057 topology 2153 2794 -> 16 0 28 2057 topology 2155 2794 -> 15 0 28 2057 topology 2105 2795 -> 16 0 28 2057 topology 2155 2795 -> 15 0 29 2057 topology 2139 2796 -> 16 0 29 2057 topology 2140 2796 -> 15 0 29 2057 topology 2058 2797 -> 16 0 29 2057 topology 2060 2797 -> 15 0 28 2057 topology 2141 2798 -> 16 0 28 2057 topology 2155 2798 -> 15 0 29 2057 topology 2115 2799 -> 16 0 29 2057 topology 2117 2799 -> 15 0 29 2057 topology 2064 2800 -> 16 0 29 2057 topology 2066 2800 -> 15 0 29 2057 topology 2094 2801 -> 16 0 29 2057 topology 2096 2801 -> 15 0 28 2057 topology 2095 2802 -> 16 0 28 2057 topology 2155 2802 -> 15 0 29 2057 topology 2070 2803 -> 16 0 29 2057 topology 2072 2803 -> 15 0 28 2057 topology 2125 2804 -> 16 0 28 2057 topology 2155 2804 -> 15 0 28 2057 topology 2066 2805 -> 16 0 28 2057 topology 2155 2805 -> 15 0 29 2057 topology 2127 2806 -> 16 0 29 2057 topology 2129 2806 -> 15 0 29 2057 topology 2151 2807 -> 16 0 29 2057 topology 2153 2807 -> 15 0 28 2057 topology 2107 2808 -> 16 0 28 2057 topology 2155 2808 -> 15 0 29 2057 topology 2076 2809 -> 16 0 29 2057 topology 2078 2809 -> 15 0 28 2057 topology 2137 2810 -> 16 0 28 2057 topology 2155 2810 -> 15 0 29 2057 topology 2058 2811 -> 16 0 29 2057 topology 2059 2811 -> 15 0 28 2057 topology 2078 2812 -> 16 0 28 2057 topology 2155 2812 -> 15 0 29 2057 topology 2085 2813 -> 16 0 29 2057 topology 2086 2813 -> 15 0 29 2057 topology 2106 2814 -> 16 0 29 2057 topology 2108 2814 -> 15 0 29 2057 topology 2061 2815 -> 16 0 29 2057 topology 2062 2815 -> 15 0 29 2057 topology 2082 2816 -> 16 0 29 2057 topology 2084 2816 -> 15 0 30 2057 topology 2154 2817 -> 16 0 30 2057 topology 2155 2817 -> 15 0 29 2057 topology 2064 2818 -> 16 0 29 2057 topology 2065 2818 -> 15 0 29 2057 topology 2118 2819 -> 16 0 29 2057 topology 2119 2819 -> 15 0 29 2057 topology 2139 2820 -> 16 0 29 2057 topology 2141 2820 -> 15 0 29 2057 topology 2067 2821 -> 16 0 29 2057 topology 2068 2821 -> 15 0 29 2057 topology 2070 2822 -> 16 0 29 2057 topology 2071 2822 -> 15 0 29 2057 topology 2097 2823 -> 16 0 29 2057 topology 2098 2823 -> 15 0 29 2156 topology 2166 2824 -> 16 0 29 2156 topology 2167 2824 -> 15 0 29 2156 topology 2220 2825 -> 16 0 29 2156 topology 2221 2825 -> 15 0 28 2156 topology 2159 2826 +> 15 0 28 2057 topology 2083 2758 +> 16 0 28 2057 topology 2155 2758 +> 15 0 29 2057 topology 2154 2759 +> 16 0 29 2057 topology 2155 2759 +> 15 0 30 2057 topology 2085 2760 +> 16 0 30 2057 topology 2087 2760 +> 15 0 30 2057 topology 2085 2761 +> 16 0 30 2057 topology 2086 2761 +> 15 0 30 2057 topology 2088 2762 +> 16 0 30 2057 topology 2090 2762 +> 15 0 30 2057 topology 2088 2763 +> 16 0 30 2057 topology 2089 2763 +> 15 0 30 2057 topology 2091 2764 +> 16 0 30 2057 topology 2093 2764 +> 15 0 30 2057 topology 2091 2765 +> 16 0 30 2057 topology 2092 2765 +> 15 0 30 2057 topology 2094 2766 +> 16 0 30 2057 topology 2096 2766 +> 15 0 30 2057 topology 2094 2767 +> 16 0 30 2057 topology 2095 2767 +> 15 0 30 2057 topology 2097 2768 +> 16 0 30 2057 topology 2099 2768 +> 15 0 30 2057 topology 2097 2769 +> 16 0 30 2057 topology 2098 2769 +> 15 0 30 2057 topology 2100 2770 +> 16 0 30 2057 topology 2102 2770 +> 15 0 30 2057 topology 2100 2771 +> 16 0 30 2057 topology 2101 2771 +> 15 0 30 2057 topology 2103 2772 +> 16 0 30 2057 topology 2105 2772 +> 15 0 30 2057 topology 2103 2773 +> 16 0 30 2057 topology 2104 2773 +> 15 0 30 2057 topology 2106 2774 +> 16 0 30 2057 topology 2108 2774 +> 15 0 30 2057 topology 2106 2775 +> 16 0 30 2057 topology 2107 2775 +> 15 0 30 2057 topology 2109 2776 +> 16 0 30 2057 topology 2111 2776 +> 15 0 30 2057 topology 2109 2777 +> 16 0 30 2057 topology 2110 2777 +> 15 0 30 2057 topology 2112 2778 +> 16 0 30 2057 topology 2114 2778 +> 15 0 30 2057 topology 2112 2779 +> 16 0 30 2057 topology 2113 2779 +> 15 0 30 2057 topology 2058 2780 +> 16 0 30 2057 topology 2060 2780 +> 15 0 30 2057 topology 2058 2781 +> 16 0 30 2057 topology 2059 2781 +> 15 0 30 2057 topology 2115 2782 +> 16 0 30 2057 topology 2117 2782 +> 15 0 30 2057 topology 2115 2783 +> 16 0 30 2057 topology 2116 2783 +> 15 0 30 2057 topology 2118 2784 +> 16 0 30 2057 topology 2120 2784 +> 15 0 30 2057 topology 2118 2785 +> 16 0 30 2057 topology 2119 2785 +> 15 0 30 2057 topology 2121 2786 +> 16 0 30 2057 topology 2123 2786 +> 15 0 30 2057 topology 2121 2787 +> 16 0 30 2057 topology 2122 2787 +> 15 0 30 2057 topology 2124 2788 +> 16 0 30 2057 topology 2126 2788 +> 15 0 30 2057 topology 2124 2789 +> 16 0 30 2057 topology 2125 2789 +> 15 0 30 2057 topology 2127 2790 +> 16 0 30 2057 topology 2129 2790 +> 15 0 30 2057 topology 2127 2791 +> 16 0 30 2057 topology 2128 2791 +> 15 0 30 2057 topology 2130 2792 +> 16 0 30 2057 topology 2132 2792 +> 15 0 30 2057 topology 2130 2793 +> 16 0 30 2057 topology 2131 2793 +> 15 0 30 2057 topology 2133 2794 +> 16 0 30 2057 topology 2135 2794 +> 15 0 30 2057 topology 2133 2795 +> 16 0 30 2057 topology 2134 2795 +> 15 0 30 2057 topology 2136 2796 +> 16 0 30 2057 topology 2138 2796 +> 15 0 30 2057 topology 2136 2797 +> 16 0 30 2057 topology 2137 2797 +> 15 0 30 2057 topology 2139 2798 +> 16 0 30 2057 topology 2141 2798 +> 15 0 30 2057 topology 2139 2799 +> 16 0 30 2057 topology 2140 2799 +> 15 0 30 2057 topology 2142 2800 +> 16 0 30 2057 topology 2144 2800 +> 15 0 30 2057 topology 2142 2801 +> 16 0 30 2057 topology 2143 2801 +> 15 0 30 2057 topology 2061 2802 +> 16 0 30 2057 topology 2063 2802 +> 15 0 30 2057 topology 2061 2803 +> 16 0 30 2057 topology 2062 2803 +> 15 0 30 2057 topology 2064 2804 +> 16 0 30 2057 topology 2066 2804 +> 15 0 30 2057 topology 2064 2805 +> 16 0 30 2057 topology 2065 2805 +> 15 0 30 2057 topology 2067 2806 +> 16 0 30 2057 topology 2069 2806 +> 15 0 30 2057 topology 2067 2807 +> 16 0 30 2057 topology 2068 2807 +> 15 0 30 2057 topology 2145 2808 +> 16 0 30 2057 topology 2147 2808 +> 15 0 30 2057 topology 2145 2809 +> 16 0 30 2057 topology 2146 2809 +> 15 0 30 2057 topology 2148 2810 +> 16 0 30 2057 topology 2150 2810 +> 15 0 30 2057 topology 2148 2811 +> 16 0 30 2057 topology 2149 2811 +> 15 0 30 2057 topology 2070 2812 +> 16 0 30 2057 topology 2072 2812 +> 15 0 30 2057 topology 2070 2813 +> 16 0 30 2057 topology 2071 2813 +> 15 0 30 2057 topology 2151 2814 +> 16 0 30 2057 topology 2153 2814 +> 15 0 30 2057 topology 2151 2815 +> 16 0 30 2057 topology 2152 2815 +> 15 0 30 2057 topology 2073 2816 +> 16 0 30 2057 topology 2075 2816 +> 15 0 30 2057 topology 2073 2817 +> 16 0 30 2057 topology 2074 2817 +> 15 0 30 2057 topology 2076 2818 +> 16 0 30 2057 topology 2078 2818 +> 15 0 30 2057 topology 2076 2819 +> 16 0 30 2057 topology 2077 2819 +> 15 0 30 2057 topology 2079 2820 +> 16 0 30 2057 topology 2081 2820 +> 15 0 30 2057 topology 2079 2821 +> 16 0 30 2057 topology 2080 2821 +> 15 0 30 2057 topology 2082 2822 +> 16 0 30 2057 topology 2084 2822 +> 15 0 30 2057 topology 2082 2823 +> 16 0 30 2057 topology 2083 2823 +> 15 0 28 2156 topology 2159 2824 +> 16 0 28 2156 topology 2242 2824 +> 15 0 28 2156 topology 2158 2825 +> 16 0 28 2156 topology 2242 2825 +> 15 0 28 2156 topology 2162 2826 > 16 0 28 2156 topology 2242 2826 -> 15 0 29 2156 topology 2199 2827 -> 16 0 29 2156 topology 2200 2827 -> 15 0 28 2156 topology 2219 2828 +> 15 0 28 2156 topology 2161 2827 +> 16 0 28 2156 topology 2242 2827 +> 15 0 28 2156 topology 2165 2828 > 16 0 28 2156 topology 2242 2828 -> 15 0 28 2156 topology 2195 2829 +> 15 0 28 2156 topology 2164 2829 > 16 0 28 2156 topology 2242 2829 -> 15 0 28 2156 topology 2171 2830 +> 15 0 28 2156 topology 2168 2830 > 16 0 28 2156 topology 2242 2830 -> 15 0 29 2156 topology 2178 2831 -> 16 0 29 2156 topology 2179 2831 -> 15 0 29 2156 topology 2232 2832 -> 16 0 29 2156 topology 2233 2832 -> 15 0 28 2156 topology 2231 2833 +> 15 0 28 2156 topology 2167 2831 +> 16 0 28 2156 topology 2242 2831 +> 15 0 28 2156 topology 2171 2832 +> 16 0 28 2156 topology 2242 2832 +> 15 0 28 2156 topology 2170 2833 > 16 0 28 2156 topology 2242 2833 -> 15 0 28 2156 topology 2207 2834 +> 15 0 28 2156 topology 2174 2834 > 16 0 28 2156 topology 2242 2834 -> 15 0 28 2156 topology 2183 2835 +> 15 0 28 2156 topology 2173 2835 > 16 0 28 2156 topology 2242 2835 -> 15 0 29 2156 topology 2211 2836 -> 16 0 29 2156 topology 2212 2836 -> 15 0 29 2156 topology 2160 2837 -> 16 0 29 2156 topology 2162 2837 -> 15 0 28 2156 topology 2161 2838 +> 15 0 28 2156 topology 2177 2836 +> 16 0 28 2156 topology 2242 2836 +> 15 0 28 2156 topology 2176 2837 +> 16 0 28 2156 topology 2242 2837 +> 15 0 28 2156 topology 2180 2838 > 16 0 28 2156 topology 2242 2838 -> 15 0 28 2156 topology 2191 2839 +> 15 0 28 2156 topology 2179 2839 > 16 0 28 2156 topology 2242 2839 -> 15 0 29 2156 topology 2193 2840 -> 16 0 29 2156 topology 2195 2840 -> 15 0 28 2156 topology 2221 2841 +> 15 0 28 2156 topology 2183 2840 +> 16 0 28 2156 topology 2242 2840 +> 15 0 28 2156 topology 2182 2841 > 16 0 28 2156 topology 2242 2841 -> 15 0 28 2156 topology 2173 2842 +> 15 0 28 2156 topology 2186 2842 > 16 0 28 2156 topology 2242 2842 -> 15 0 28 2156 topology 2203 2843 +> 15 0 28 2156 topology 2185 2843 > 16 0 28 2156 topology 2242 2843 -> 15 0 29 2156 topology 2172 2844 -> 16 0 29 2156 topology 2174 2844 -> 15 0 29 2156 topology 2226 2845 -> 16 0 29 2156 topology 2228 2845 -> 15 0 28 2156 topology 2233 2846 +> 15 0 28 2156 topology 2189 2844 +> 16 0 28 2156 topology 2242 2844 +> 15 0 28 2156 topology 2188 2845 +> 16 0 28 2156 topology 2242 2845 +> 15 0 28 2156 topology 2192 2846 > 16 0 28 2156 topology 2242 2846 -> 15 0 28 2156 topology 2185 2847 +> 15 0 28 2156 topology 2191 2847 > 16 0 28 2156 topology 2242 2847 -> 15 0 29 2156 topology 2157 2848 -> 16 0 29 2156 topology 2158 2848 -> 15 0 28 2156 topology 2215 2849 +> 15 0 28 2156 topology 2195 2848 +> 16 0 28 2156 topology 2242 2848 +> 15 0 28 2156 topology 2194 2849 > 16 0 28 2156 topology 2242 2849 -> 15 0 29 2156 topology 2205 2850 -> 16 0 29 2156 topology 2207 2850 -> 15 0 29 2156 topology 2190 2851 -> 16 0 29 2156 topology 2191 2851 -> 15 0 29 2156 topology 2184 2852 -> 16 0 29 2156 topology 2186 2852 -> 15 0 29 2156 topology 2238 2853 -> 16 0 29 2156 topology 2240 2853 -> 15 0 29 2156 topology 2169 2854 -> 16 0 29 2156 topology 2170 2854 -> 15 0 29 2156 topology 2223 2855 -> 16 0 29 2156 topology 2224 2855 -> 15 0 28 2156 topology 2162 2856 +> 15 0 28 2156 topology 2198 2850 +> 16 0 28 2156 topology 2242 2850 +> 15 0 28 2156 topology 2197 2851 +> 16 0 28 2156 topology 2242 2851 +> 15 0 28 2156 topology 2201 2852 +> 16 0 28 2156 topology 2242 2852 +> 15 0 28 2156 topology 2200 2853 +> 16 0 28 2156 topology 2242 2853 +> 15 0 28 2156 topology 2204 2854 +> 16 0 28 2156 topology 2242 2854 +> 15 0 28 2156 topology 2203 2855 +> 16 0 28 2156 topology 2242 2855 +> 15 0 28 2156 topology 2207 2856 > 16 0 28 2156 topology 2242 2856 -> 15 0 29 2156 topology 2202 2857 -> 16 0 29 2156 topology 2203 2857 -> 15 0 28 2156 topology 2222 2858 +> 15 0 28 2156 topology 2206 2857 +> 16 0 28 2156 topology 2242 2857 +> 15 0 28 2156 topology 2210 2858 > 16 0 28 2156 topology 2242 2858 -> 15 0 28 2156 topology 2198 2859 +> 15 0 28 2156 topology 2209 2859 > 16 0 28 2156 topology 2242 2859 -> 15 0 28 2156 topology 2174 2860 +> 15 0 28 2156 topology 2213 2860 > 16 0 28 2156 topology 2242 2860 -> 15 0 29 2156 topology 2181 2861 -> 16 0 29 2156 topology 2182 2861 -> 15 0 28 2156 topology 2234 2862 +> 15 0 28 2156 topology 2212 2861 +> 16 0 28 2156 topology 2242 2861 +> 15 0 28 2156 topology 2216 2862 > 16 0 28 2156 topology 2242 2862 -> 15 0 29 2156 topology 2235 2863 -> 16 0 29 2156 topology 2236 2863 -> 15 0 28 2156 topology 2210 2864 +> 15 0 28 2156 topology 2215 2863 +> 16 0 28 2156 topology 2242 2863 +> 15 0 28 2156 topology 2219 2864 > 16 0 28 2156 topology 2242 2864 -> 15 0 28 2156 topology 2186 2865 +> 15 0 28 2156 topology 2218 2865 > 16 0 28 2156 topology 2242 2865 -> 15 0 29 2156 topology 2157 2866 -> 16 0 29 2156 topology 2159 2866 -> 15 0 29 2156 topology 2214 2867 -> 16 0 29 2156 topology 2215 2867 -> 15 0 28 2156 topology 2158 2868 +> 15 0 28 2156 topology 2222 2866 +> 16 0 28 2156 topology 2242 2866 +> 15 0 28 2156 topology 2221 2867 +> 16 0 28 2156 topology 2242 2867 +> 15 0 28 2156 topology 2225 2868 > 16 0 28 2156 topology 2242 2868 -> 15 0 28 2156 topology 2188 2869 +> 15 0 28 2156 topology 2224 2869 > 16 0 28 2156 topology 2242 2869 -> 15 0 29 2156 topology 2190 2870 -> 16 0 29 2156 topology 2192 2870 -> 15 0 28 2156 topology 2218 2871 +> 15 0 28 2156 topology 2228 2870 +> 16 0 28 2156 topology 2242 2870 +> 15 0 28 2156 topology 2227 2871 > 16 0 28 2156 topology 2242 2871 -> 15 0 28 2156 topology 2170 2872 +> 15 0 28 2156 topology 2231 2872 > 16 0 28 2156 topology 2242 2872 -> 15 0 29 2156 topology 2169 2873 -> 16 0 29 2156 topology 2171 2873 -> 15 0 28 2156 topology 2200 2874 +> 15 0 28 2156 topology 2230 2873 +> 16 0 28 2156 topology 2242 2873 +> 15 0 28 2156 topology 2234 2874 > 16 0 28 2156 topology 2242 2874 -> 15 0 29 2156 topology 2223 2875 -> 16 0 29 2156 topology 2225 2875 -> 15 0 28 2156 topology 2230 2876 +> 15 0 28 2156 topology 2233 2875 +> 16 0 28 2156 topology 2242 2875 +> 15 0 28 2156 topology 2237 2876 > 16 0 28 2156 topology 2242 2876 -> 15 0 28 2156 topology 2182 2877 +> 15 0 28 2156 topology 2236 2877 > 16 0 28 2156 topology 2242 2877 -> 15 0 29 2156 topology 2202 2878 -> 16 0 29 2156 topology 2204 2878 -> 15 0 28 2156 topology 2212 2879 +> 15 0 28 2156 topology 2240 2878 +> 16 0 28 2156 topology 2242 2878 +> 15 0 28 2156 topology 2239 2879 > 16 0 28 2156 topology 2242 2879 -> 15 0 29 2156 topology 2160 2880 -> 16 0 29 2156 topology 2161 2880 -> 15 0 29 2156 topology 2181 2881 -> 16 0 29 2156 topology 2183 2881 -> 15 0 29 2156 topology 2235 2882 -> 16 0 29 2156 topology 2237 2882 -> 15 0 29 2156 topology 2193 2883 -> 16 0 29 2156 topology 2194 2883 -> 15 0 29 2156 topology 2214 2884 -> 16 0 29 2156 topology 2216 2884 -> 15 0 29 2156 topology 2172 2885 -> 16 0 29 2156 topology 2173 2885 -> 15 0 28 2156 topology 2189 2886 -> 16 0 28 2156 topology 2242 2886 -> 15 0 29 2156 topology 2226 2887 -> 16 0 29 2156 topology 2227 2887 -> 15 0 28 2156 topology 2165 2888 -> 16 0 28 2156 topology 2242 2888 -> 15 0 28 2156 topology 2225 2889 -> 16 0 28 2156 topology 2242 2889 -> 15 0 28 2156 topology 2201 2890 -> 16 0 28 2156 topology 2242 2890 -> 15 0 29 2156 topology 2205 2891 -> 16 0 29 2156 topology 2206 2891 -> 15 0 28 2156 topology 2177 2892 -> 16 0 28 2156 topology 2242 2892 -> 15 0 28 2156 topology 2237 2893 -> 16 0 28 2156 topology 2242 2893 -> 15 0 29 2156 topology 2184 2894 -> 16 0 29 2156 topology 2185 2894 -> 15 0 28 2156 topology 2213 2895 -> 16 0 28 2156 topology 2242 2895 -> 15 0 29 2156 topology 2238 2896 -> 16 0 29 2156 topology 2239 2896 -> 15 0 29 2156 topology 2187 2897 -> 16 0 29 2156 topology 2189 2897 -> 15 0 28 2156 topology 2167 2898 -> 16 0 28 2156 topology 2242 2898 -> 15 0 29 2156 topology 2166 2899 -> 16 0 29 2156 topology 2168 2899 -> 15 0 29 2156 topology 2220 2900 -> 16 0 29 2156 topology 2222 2900 -> 15 0 28 2156 topology 2197 2901 -> 16 0 28 2156 topology 2242 2901 -> 15 0 28 2156 topology 2227 2902 -> 16 0 28 2156 topology 2242 2902 -> 15 0 28 2156 topology 2179 2903 -> 16 0 28 2156 topology 2242 2903 -> 15 0 29 2156 topology 2199 2904 -> 16 0 29 2156 topology 2201 2904 -> 15 0 28 2156 topology 2209 2905 -> 16 0 28 2156 topology 2242 2905 -> 15 0 28 2156 topology 2239 2906 -> 16 0 28 2156 topology 2242 2906 -> 15 0 30 2156 topology 2241 2907 -> 16 0 30 2156 topology 2242 2907 -> 15 0 29 2156 topology 2178 2908 -> 16 0 29 2156 topology 2180 2908 -> 15 0 29 2156 topology 2232 2909 -> 16 0 29 2156 topology 2234 2909 -> 15 0 29 2156 topology 2163 2910 -> 16 0 29 2156 topology 2164 2910 -> 15 0 29 2156 topology 2217 2911 -> 16 0 29 2156 topology 2218 2911 -> 15 0 29 2156 topology 2211 2912 -> 16 0 29 2156 topology 2213 2912 -> 15 0 29 2156 topology 2196 2913 -> 16 0 29 2156 topology 2197 2913 -> 15 0 28 2156 topology 2192 2914 -> 16 0 28 2156 topology 2242 2914 -> 15 0 28 2156 topology 2168 2915 -> 16 0 28 2156 topology 2242 2915 -> 15 0 29 2156 topology 2175 2916 -> 16 0 29 2156 topology 2176 2916 -> 15 0 29 2156 topology 2229 2917 -> 16 0 29 2156 topology 2230 2917 -> 15 0 28 2156 topology 2228 2918 -> 16 0 28 2156 topology 2242 2918 -> 15 0 28 2156 topology 2204 2919 -> 16 0 28 2156 topology 2242 2919 -> 15 0 28 2156 topology 2180 2920 -> 16 0 28 2156 topology 2242 2920 -> 15 0 29 2156 topology 2208 2921 -> 16 0 29 2156 topology 2209 2921 -> 15 0 28 2156 topology 2240 2922 -> 16 0 28 2156 topology 2242 2922 -> 15 0 28 2156 topology 2216 2923 -> 16 0 28 2156 topology 2242 2923 -> 15 0 29 2156 topology 2163 2924 -> 16 0 29 2156 topology 2165 2924 -> 15 0 29 2156 topology 2217 2925 -> 16 0 29 2156 topology 2219 2925 -> 15 0 28 2156 topology 2164 2926 -> 16 0 28 2156 topology 2242 2926 -> 15 0 28 2156 topology 2194 2927 -> 16 0 28 2156 topology 2242 2927 -> 15 0 28 2156 topology 2224 2928 -> 16 0 28 2156 topology 2242 2928 -> 15 0 29 2156 topology 2196 2929 -> 16 0 29 2156 topology 2198 2929 -> 15 0 28 2156 topology 2176 2930 -> 16 0 28 2156 topology 2242 2930 -> 15 0 28 2156 topology 2206 2931 -> 16 0 28 2156 topology 2242 2931 -> 15 0 28 2156 topology 2236 2932 -> 16 0 28 2156 topology 2242 2932 -> 15 0 29 2156 topology 2175 2933 -> 16 0 29 2156 topology 2177 2933 -> 15 0 29 2156 topology 2229 2934 -> 16 0 29 2156 topology 2231 2934 -> 15 0 29 2156 topology 2187 2935 -> 16 0 29 2156 topology 2188 2935 -> 15 0 29 2156 topology 2208 2936 -> 16 0 29 2156 topology 2210 2936 -> 15 0 28 2243 topology 2269 2937 +> 15 0 29 2156 topology 2241 2880 +> 16 0 29 2156 topology 2242 2880 +> 15 0 30 2156 topology 2157 2881 +> 16 0 30 2156 topology 2159 2881 +> 15 0 30 2156 topology 2157 2882 +> 16 0 30 2156 topology 2158 2882 +> 15 0 30 2156 topology 2160 2883 +> 16 0 30 2156 topology 2162 2883 +> 15 0 30 2156 topology 2160 2884 +> 16 0 30 2156 topology 2161 2884 +> 15 0 30 2156 topology 2163 2885 +> 16 0 30 2156 topology 2165 2885 +> 15 0 30 2156 topology 2163 2886 +> 16 0 30 2156 topology 2164 2886 +> 15 0 30 2156 topology 2166 2887 +> 16 0 30 2156 topology 2168 2887 +> 15 0 30 2156 topology 2166 2888 +> 16 0 30 2156 topology 2167 2888 +> 15 0 30 2156 topology 2169 2889 +> 16 0 30 2156 topology 2171 2889 +> 15 0 30 2156 topology 2169 2890 +> 16 0 30 2156 topology 2170 2890 +> 15 0 30 2156 topology 2172 2891 +> 16 0 30 2156 topology 2174 2891 +> 15 0 30 2156 topology 2172 2892 +> 16 0 30 2156 topology 2173 2892 +> 15 0 30 2156 topology 2175 2893 +> 16 0 30 2156 topology 2177 2893 +> 15 0 30 2156 topology 2175 2894 +> 16 0 30 2156 topology 2176 2894 +> 15 0 30 2156 topology 2178 2895 +> 16 0 30 2156 topology 2180 2895 +> 15 0 30 2156 topology 2178 2896 +> 16 0 30 2156 topology 2179 2896 +> 15 0 30 2156 topology 2181 2897 +> 16 0 30 2156 topology 2183 2897 +> 15 0 30 2156 topology 2181 2898 +> 16 0 30 2156 topology 2182 2898 +> 15 0 30 2156 topology 2184 2899 +> 16 0 30 2156 topology 2186 2899 +> 15 0 30 2156 topology 2184 2900 +> 16 0 30 2156 topology 2185 2900 +> 15 0 30 2156 topology 2187 2901 +> 16 0 30 2156 topology 2189 2901 +> 15 0 30 2156 topology 2187 2902 +> 16 0 30 2156 topology 2188 2902 +> 15 0 30 2156 topology 2190 2903 +> 16 0 30 2156 topology 2192 2903 +> 15 0 30 2156 topology 2190 2904 +> 16 0 30 2156 topology 2191 2904 +> 15 0 30 2156 topology 2193 2905 +> 16 0 30 2156 topology 2195 2905 +> 15 0 30 2156 topology 2193 2906 +> 16 0 30 2156 topology 2194 2906 +> 15 0 30 2156 topology 2196 2907 +> 16 0 30 2156 topology 2198 2907 +> 15 0 30 2156 topology 2196 2908 +> 16 0 30 2156 topology 2197 2908 +> 15 0 30 2156 topology 2199 2909 +> 16 0 30 2156 topology 2201 2909 +> 15 0 30 2156 topology 2199 2910 +> 16 0 30 2156 topology 2200 2910 +> 15 0 30 2156 topology 2202 2911 +> 16 0 30 2156 topology 2204 2911 +> 15 0 30 2156 topology 2202 2912 +> 16 0 30 2156 topology 2203 2912 +> 15 0 30 2156 topology 2205 2913 +> 16 0 30 2156 topology 2207 2913 +> 15 0 30 2156 topology 2205 2914 +> 16 0 30 2156 topology 2206 2914 +> 15 0 30 2156 topology 2208 2915 +> 16 0 30 2156 topology 2210 2915 +> 15 0 30 2156 topology 2208 2916 +> 16 0 30 2156 topology 2209 2916 +> 15 0 30 2156 topology 2211 2917 +> 16 0 30 2156 topology 2213 2917 +> 15 0 30 2156 topology 2211 2918 +> 16 0 30 2156 topology 2212 2918 +> 15 0 30 2156 topology 2214 2919 +> 16 0 30 2156 topology 2216 2919 +> 15 0 30 2156 topology 2214 2920 +> 16 0 30 2156 topology 2215 2920 +> 15 0 30 2156 topology 2217 2921 +> 16 0 30 2156 topology 2219 2921 +> 15 0 30 2156 topology 2217 2922 +> 16 0 30 2156 topology 2218 2922 +> 15 0 30 2156 topology 2220 2923 +> 16 0 30 2156 topology 2222 2923 +> 15 0 30 2156 topology 2220 2924 +> 16 0 30 2156 topology 2221 2924 +> 15 0 30 2156 topology 2223 2925 +> 16 0 30 2156 topology 2225 2925 +> 15 0 30 2156 topology 2223 2926 +> 16 0 30 2156 topology 2224 2926 +> 15 0 30 2156 topology 2226 2927 +> 16 0 30 2156 topology 2228 2927 +> 15 0 30 2156 topology 2226 2928 +> 16 0 30 2156 topology 2227 2928 +> 15 0 30 2156 topology 2229 2929 +> 16 0 30 2156 topology 2231 2929 +> 15 0 30 2156 topology 2229 2930 +> 16 0 30 2156 topology 2230 2930 +> 15 0 30 2156 topology 2232 2931 +> 16 0 30 2156 topology 2234 2931 +> 15 0 30 2156 topology 2232 2932 +> 16 0 30 2156 topology 2233 2932 +> 15 0 30 2156 topology 2235 2933 +> 16 0 30 2156 topology 2237 2933 +> 15 0 30 2156 topology 2235 2934 +> 16 0 30 2156 topology 2236 2934 +> 15 0 30 2156 topology 2238 2935 +> 16 0 30 2156 topology 2240 2935 +> 15 0 30 2156 topology 2238 2936 +> 16 0 30 2156 topology 2239 2936 +> 15 0 28 2243 topology 2246 2937 > 16 0 28 2243 topology 2341 2937 -> 15 0 28 2243 topology 2299 2938 +> 15 0 28 2243 topology 2245 2938 > 16 0 28 2243 topology 2341 2938 -> 15 0 29 2243 topology 2259 2939 -> 16 0 29 2243 topology 2261 2939 -> 15 0 29 2243 topology 2313 2940 -> 16 0 29 2243 topology 2315 2940 -> 15 0 28 2243 topology 2329 2941 +> 15 0 28 2243 topology 2249 2939 +> 16 0 28 2243 topology 2341 2939 +> 15 0 28 2243 topology 2248 2940 +> 16 0 28 2243 topology 2341 2940 +> 15 0 28 2243 topology 2252 2941 > 16 0 28 2243 topology 2341 2941 -> 15 0 29 2243 topology 2271 2942 -> 16 0 29 2243 topology 2272 2942 -> 15 0 29 2243 topology 2292 2943 -> 16 0 29 2243 topology 2294 2943 -> 15 0 29 2243 topology 2250 2944 -> 16 0 29 2243 topology 2251 2944 -> 15 0 29 2243 topology 2304 2945 -> 16 0 29 2243 topology 2305 2945 -> 15 0 29 2243 topology 2325 2946 -> 16 0 29 2243 topology 2327 2946 -> 15 0 28 2243 topology 2276 2947 +> 15 0 28 2243 topology 2251 2942 +> 16 0 28 2243 topology 2341 2942 +> 15 0 28 2243 topology 2255 2943 +> 16 0 28 2243 topology 2341 2943 +> 15 0 28 2243 topology 2254 2944 +> 16 0 28 2243 topology 2341 2944 +> 15 0 28 2243 topology 2258 2945 +> 16 0 28 2243 topology 2341 2945 +> 15 0 28 2243 topology 2257 2946 +> 16 0 28 2243 topology 2341 2946 +> 15 0 28 2243 topology 2261 2947 > 16 0 28 2243 topology 2341 2947 -> 15 0 28 2243 topology 2252 2948 +> 15 0 28 2243 topology 2260 2948 > 16 0 28 2243 topology 2341 2948 -> 15 0 29 2243 topology 2283 2949 -> 16 0 29 2243 topology 2284 2949 -> 15 0 29 2243 topology 2337 2950 -> 16 0 29 2243 topology 2338 2950 -> 15 0 28 2243 topology 2336 2951 +> 15 0 28 2243 topology 2264 2949 +> 16 0 28 2243 topology 2341 2949 +> 15 0 28 2243 topology 2263 2950 +> 16 0 28 2243 topology 2341 2950 +> 15 0 28 2243 topology 2267 2951 > 16 0 28 2243 topology 2341 2951 -> 15 0 28 2243 topology 2312 2952 +> 15 0 28 2243 topology 2266 2952 > 16 0 28 2243 topology 2341 2952 -> 15 0 28 2243 topology 2288 2953 +> 15 0 28 2243 topology 2270 2953 > 16 0 28 2243 topology 2341 2953 -> 15 0 29 2243 topology 2262 2954 -> 16 0 29 2243 topology 2263 2954 -> 15 0 28 2243 topology 2264 2955 +> 15 0 28 2243 topology 2269 2954 +> 16 0 28 2243 topology 2341 2954 +> 15 0 28 2243 topology 2273 2955 > 16 0 28 2243 topology 2341 2955 -> 15 0 29 2243 topology 2316 2956 -> 16 0 29 2243 topology 2317 2956 -> 15 0 28 2243 topology 2324 2957 +> 15 0 28 2243 topology 2272 2956 +> 16 0 28 2243 topology 2341 2956 +> 15 0 28 2243 topology 2276 2957 > 16 0 28 2243 topology 2341 2957 -> 15 0 28 2243 topology 2300 2958 +> 15 0 28 2243 topology 2275 2958 > 16 0 28 2243 topology 2341 2958 -> 15 0 29 2243 topology 2295 2959 -> 16 0 29 2243 topology 2296 2959 -> 15 0 29 2243 topology 2244 2960 -> 16 0 29 2243 topology 2246 2960 -> 15 0 28 2243 topology 2272 2961 +> 15 0 28 2243 topology 2279 2959 +> 16 0 28 2243 topology 2341 2959 +> 15 0 28 2243 topology 2278 2960 +> 16 0 28 2243 topology 2341 2960 +> 15 0 28 2243 topology 2282 2961 > 16 0 28 2243 topology 2341 2961 -> 15 0 28 2243 topology 2302 2962 +> 15 0 28 2243 topology 2281 2962 > 16 0 28 2243 topology 2341 2962 -> 15 0 29 2243 topology 2328 2963 -> 16 0 29 2243 topology 2329 2963 -> 15 0 28 2243 topology 2332 2964 +> 15 0 28 2243 topology 2285 2963 +> 16 0 28 2243 topology 2341 2963 +> 15 0 28 2243 topology 2284 2964 > 16 0 28 2243 topology 2341 2964 -> 15 0 28 2243 topology 2254 2965 +> 15 0 28 2243 topology 2288 2965 > 16 0 28 2243 topology 2341 2965 -> 15 0 29 2243 topology 2277 2966 -> 16 0 29 2243 topology 2279 2966 -> 15 0 28 2243 topology 2284 2967 +> 15 0 28 2243 topology 2287 2966 +> 16 0 28 2243 topology 2341 2966 +> 15 0 28 2243 topology 2291 2967 > 16 0 28 2243 topology 2341 2967 -> 15 0 29 2243 topology 2331 2968 -> 16 0 29 2243 topology 2333 2968 -> 15 0 28 2243 topology 2314 2969 +> 15 0 28 2243 topology 2290 2968 +> 16 0 28 2243 topology 2341 2968 +> 15 0 28 2243 topology 2294 2969 > 16 0 28 2243 topology 2341 2969 -> 15 0 28 2243 topology 2266 2970 +> 15 0 28 2243 topology 2293 2970 > 16 0 28 2243 topology 2341 2970 -> 15 0 29 2243 topology 2256 2971 -> 16 0 29 2243 topology 2258 2971 +> 15 0 28 2243 topology 2297 2971 +> 16 0 28 2243 topology 2341 2971 > 15 0 28 2243 topology 2296 2972 > 16 0 28 2243 topology 2341 2972 -> 15 0 29 2243 topology 2310 2973 -> 16 0 29 2243 topology 2312 2973 -> 15 0 28 2243 topology 2326 2974 +> 15 0 28 2243 topology 2300 2973 +> 16 0 28 2243 topology 2341 2973 +> 15 0 28 2243 topology 2299 2974 > 16 0 28 2243 topology 2341 2974 -> 15 0 29 2243 topology 2289 2975 -> 16 0 29 2243 topology 2291 2975 -> 15 0 29 2243 topology 2274 2976 -> 16 0 29 2243 topology 2275 2976 -> 15 0 29 2243 topology 2268 2977 -> 16 0 29 2243 topology 2270 2977 -> 15 0 29 2243 topology 2322 2978 -> 16 0 29 2243 topology 2324 2978 -> 15 0 29 2243 topology 2253 2979 -> 16 0 29 2243 topology 2254 2979 -> 15 0 29 2243 topology 2307 2980 -> 16 0 29 2243 topology 2308 2980 -> 15 0 28 2243 topology 2303 2981 +> 15 0 28 2243 topology 2303 2975 +> 16 0 28 2243 topology 2341 2975 +> 15 0 28 2243 topology 2302 2976 +> 16 0 28 2243 topology 2341 2976 +> 15 0 28 2243 topology 2306 2977 +> 16 0 28 2243 topology 2341 2977 +> 15 0 28 2243 topology 2305 2978 +> 16 0 28 2243 topology 2341 2978 +> 15 0 28 2243 topology 2309 2979 +> 16 0 28 2243 topology 2341 2979 +> 15 0 28 2243 topology 2308 2980 +> 16 0 28 2243 topology 2341 2980 +> 15 0 28 2243 topology 2312 2981 > 16 0 28 2243 topology 2341 2981 -> 15 0 28 2243 topology 2279 2982 +> 15 0 28 2243 topology 2311 2982 > 16 0 28 2243 topology 2341 2982 -> 15 0 28 2243 topology 2255 2983 +> 15 0 28 2243 topology 2315 2983 > 16 0 28 2243 topology 2341 2983 -> 15 0 29 2243 topology 2286 2984 -> 16 0 29 2243 topology 2287 2984 -> 15 0 28 2243 topology 2339 2985 +> 15 0 28 2243 topology 2314 2984 +> 16 0 28 2243 topology 2341 2984 +> 15 0 28 2243 topology 2318 2985 > 16 0 28 2243 topology 2341 2985 -> 15 0 28 2243 topology 2315 2986 +> 15 0 28 2243 topology 2317 2986 > 16 0 28 2243 topology 2341 2986 -> 15 0 28 2243 topology 2291 2987 +> 15 0 28 2243 topology 2321 2987 > 16 0 28 2243 topology 2341 2987 -> 15 0 28 2243 topology 2267 2988 +> 15 0 28 2243 topology 2320 2988 > 16 0 28 2243 topology 2341 2988 -> 15 0 29 2243 topology 2265 2989 -> 16 0 29 2243 topology 2266 2989 -> 15 0 29 2243 topology 2319 2990 -> 16 0 29 2243 topology 2320 2990 +> 15 0 28 2243 topology 2324 2989 +> 16 0 28 2243 topology 2341 2989 +> 15 0 28 2243 topology 2323 2990 +> 16 0 28 2243 topology 2341 2990 > 15 0 28 2243 topology 2327 2991 > 16 0 28 2243 topology 2341 2991 -> 15 0 29 2243 topology 2298 2992 -> 16 0 29 2243 topology 2299 2992 -> 15 0 28 2243 topology 2251 2993 +> 15 0 28 2243 topology 2326 2992 +> 16 0 28 2243 topology 2341 2992 +> 15 0 28 2243 topology 2330 2993 > 16 0 28 2243 topology 2341 2993 -> 15 0 29 2243 topology 2274 2994 -> 16 0 29 2243 topology 2276 2994 -> 15 0 28 2243 topology 2281 2995 +> 15 0 28 2243 topology 2329 2994 +> 16 0 28 2243 topology 2341 2994 +> 15 0 28 2243 topology 2333 2995 > 16 0 28 2243 topology 2341 2995 -> 15 0 28 2243 topology 2311 2996 +> 15 0 28 2243 topology 2332 2996 > 16 0 28 2243 topology 2341 2996 -> 15 0 29 2243 topology 2253 2997 -> 16 0 29 2243 topology 2255 2997 -> 15 0 28 2243 topology 2263 2998 +> 15 0 28 2243 topology 2336 2997 +> 16 0 28 2243 topology 2341 2997 +> 15 0 28 2243 topology 2335 2998 > 16 0 28 2243 topology 2341 2998 -> 15 0 29 2243 topology 2307 2999 -> 16 0 29 2243 topology 2309 2999 -> 15 0 30 2243 topology 2340 3000 -> 16 0 30 2243 topology 2341 3000 -> 15 0 28 2243 topology 2293 3001 -> 16 0 28 2243 topology 2341 3001 -> 15 0 28 2243 topology 2323 3002 -> 16 0 28 2243 topology 2341 3002 -> 15 0 29 2243 topology 2286 3003 -> 16 0 29 2243 topology 2288 3003 -> 15 0 29 2243 topology 2244 3004 -> 16 0 29 2243 topology 2245 3004 -> 15 0 29 2243 topology 2265 3005 -> 16 0 29 2243 topology 2267 3005 -> 15 0 29 2243 topology 2319 3006 -> 16 0 29 2243 topology 2321 3006 -> 15 0 29 2243 topology 2277 3007 -> 16 0 29 2243 topology 2278 3007 -> 15 0 29 2243 topology 2331 3008 -> 16 0 29 2243 topology 2332 3008 -> 15 0 29 2243 topology 2298 3009 -> 16 0 29 2243 topology 2300 3009 -> 15 0 28 2243 topology 2246 3010 -> 16 0 28 2243 topology 2341 3010 -> 15 0 29 2243 topology 2256 3011 -> 16 0 29 2243 topology 2257 3011 -> 15 0 28 2243 topology 2306 3012 -> 16 0 28 2243 topology 2341 3012 -> 15 0 29 2243 topology 2310 3013 -> 16 0 29 2243 topology 2311 3013 -> 15 0 28 2243 topology 2282 3014 -> 16 0 28 2243 topology 2341 3014 -> 15 0 28 2243 topology 2258 3015 -> 16 0 28 2243 topology 2341 3015 -> 15 0 29 2243 topology 2289 3016 -> 16 0 29 2243 topology 2290 3016 -> 15 0 28 2243 topology 2318 3017 -> 16 0 28 2243 topology 2341 3017 -> 15 0 28 2243 topology 2294 3018 -> 16 0 28 2243 topology 2341 3018 -> 15 0 28 2243 topology 2270 3019 -> 16 0 28 2243 topology 2341 3019 -> 15 0 29 2243 topology 2268 3020 -> 16 0 29 2243 topology 2269 3020 -> 15 0 29 2243 topology 2322 3021 -> 16 0 29 2243 topology 2323 3021 -> 15 0 28 2243 topology 2330 3022 -> 16 0 28 2243 topology 2341 3022 -> 15 0 29 2243 topology 2271 3023 -> 16 0 29 2243 topology 2273 3023 -> 15 0 28 2243 topology 2248 3024 -> 16 0 28 2243 topology 2341 3024 -> 15 0 28 2243 topology 2278 3025 -> 16 0 28 2243 topology 2341 3025 -> 15 0 28 2243 topology 2308 3026 -> 16 0 28 2243 topology 2341 3026 -> 15 0 29 2243 topology 2250 3027 -> 16 0 29 2243 topology 2252 3027 -> 15 0 29 2243 topology 2304 3028 -> 16 0 29 2243 topology 2306 3028 -> 15 0 28 2243 topology 2338 3029 -> 16 0 28 2243 topology 2341 3029 -> 15 0 28 2243 topology 2260 3030 -> 16 0 28 2243 topology 2341 3030 -> 15 0 28 2243 topology 2290 3031 -> 16 0 28 2243 topology 2341 3031 -> 15 0 28 2243 topology 2320 3032 -> 16 0 28 2243 topology 2341 3032 -> 15 0 29 2243 topology 2283 3033 -> 16 0 29 2243 topology 2285 3033 -> 15 0 29 2243 topology 2337 3034 -> 16 0 29 2243 topology 2339 3034 -> 15 0 29 2243 topology 2262 3035 -> 16 0 29 2243 topology 2264 3035 -> 15 0 29 2243 topology 2316 3036 -> 16 0 29 2243 topology 2318 3036 -> 15 0 29 2243 topology 2247 3037 -> 16 0 29 2243 topology 2248 3037 -> 15 0 29 2243 topology 2301 3038 -> 16 0 29 2243 topology 2302 3038 -> 15 0 29 2243 topology 2295 3039 -> 16 0 29 2243 topology 2297 3039 -> 15 0 28 2243 topology 2273 3040 -> 16 0 28 2243 topology 2341 3040 -> 15 0 29 2243 topology 2280 3041 -> 16 0 29 2243 topology 2281 3041 -> 15 0 29 2243 topology 2334 3042 -> 16 0 29 2243 topology 2335 3042 -> 15 0 28 2243 topology 2249 3043 -> 16 0 28 2243 topology 2341 3043 -> 15 0 29 2243 topology 2328 3044 -> 16 0 29 2243 topology 2330 3044 -> 15 0 28 2243 topology 2333 3045 -> 16 0 28 2243 topology 2341 3045 -> 15 0 28 2243 topology 2309 3046 -> 16 0 28 2243 topology 2341 3046 -> 15 0 29 2243 topology 2259 3047 -> 16 0 29 2243 topology 2260 3047 -> 15 0 28 2243 topology 2285 3048 -> 16 0 28 2243 topology 2341 3048 -> 15 0 29 2243 topology 2313 3049 -> 16 0 29 2243 topology 2314 3049 -> 15 0 28 2243 topology 2261 3050 -> 16 0 28 2243 topology 2341 3050 -> 15 0 28 2243 topology 2321 3051 -> 16 0 28 2243 topology 2341 3051 -> 15 0 29 2243 topology 2292 3052 -> 16 0 29 2243 topology 2293 3052 -> 15 0 28 2243 topology 2297 3053 -> 16 0 28 2243 topology 2341 3053 -> 15 0 29 2243 topology 2325 3054 -> 16 0 29 2243 topology 2326 3054 -> 15 0 28 2243 topology 2245 3055 -> 16 0 28 2243 topology 2341 3055 -> 15 0 28 2243 topology 2275 3056 -> 16 0 28 2243 topology 2341 3056 -> 15 0 29 2243 topology 2247 3057 -> 16 0 29 2243 topology 2249 3057 -> 15 0 29 2243 topology 2301 3058 -> 16 0 29 2243 topology 2303 3058 -> 15 0 28 2243 topology 2305 3059 -> 16 0 28 2243 topology 2341 3059 -> 15 0 28 2243 topology 2335 3060 -> 16 0 28 2243 topology 2341 3060 -> 15 0 28 2243 topology 2257 3061 -> 16 0 28 2243 topology 2341 3061 -> 15 0 28 2243 topology 2287 3062 -> 16 0 28 2243 topology 2341 3062 -> 15 0 29 2243 topology 2280 3063 -> 16 0 29 2243 topology 2282 3063 -> 15 0 28 2243 topology 2317 3064 -> 16 0 28 2243 topology 2341 3064 -> 15 0 29 2243 topology 2334 3065 -> 16 0 29 2243 topology 2336 3065 +> 15 0 28 2243 topology 2339 2999 +> 16 0 28 2243 topology 2341 2999 +> 15 0 28 2243 topology 2338 3000 +> 16 0 28 2243 topology 2341 3000 +> 15 0 29 2243 topology 2340 3001 +> 16 0 29 2243 topology 2341 3001 +> 15 0 30 2243 topology 2244 3002 +> 16 0 30 2243 topology 2246 3002 +> 15 0 30 2243 topology 2244 3003 +> 16 0 30 2243 topology 2245 3003 +> 15 0 30 2243 topology 2247 3004 +> 16 0 30 2243 topology 2249 3004 +> 15 0 30 2243 topology 2247 3005 +> 16 0 30 2243 topology 2248 3005 +> 15 0 30 2243 topology 2250 3006 +> 16 0 30 2243 topology 2252 3006 +> 15 0 30 2243 topology 2250 3007 +> 16 0 30 2243 topology 2251 3007 +> 15 0 30 2243 topology 2253 3008 +> 16 0 30 2243 topology 2255 3008 +> 15 0 30 2243 topology 2253 3009 +> 16 0 30 2243 topology 2254 3009 +> 15 0 30 2243 topology 2256 3010 +> 16 0 30 2243 topology 2258 3010 +> 15 0 30 2243 topology 2256 3011 +> 16 0 30 2243 topology 2257 3011 +> 15 0 30 2243 topology 2259 3012 +> 16 0 30 2243 topology 2261 3012 +> 15 0 30 2243 topology 2259 3013 +> 16 0 30 2243 topology 2260 3013 +> 15 0 30 2243 topology 2262 3014 +> 16 0 30 2243 topology 2264 3014 +> 15 0 30 2243 topology 2262 3015 +> 16 0 30 2243 topology 2263 3015 +> 15 0 30 2243 topology 2265 3016 +> 16 0 30 2243 topology 2267 3016 +> 15 0 30 2243 topology 2265 3017 +> 16 0 30 2243 topology 2266 3017 +> 15 0 30 2243 topology 2268 3018 +> 16 0 30 2243 topology 2270 3018 +> 15 0 30 2243 topology 2268 3019 +> 16 0 30 2243 topology 2269 3019 +> 15 0 30 2243 topology 2271 3020 +> 16 0 30 2243 topology 2273 3020 +> 15 0 30 2243 topology 2271 3021 +> 16 0 30 2243 topology 2272 3021 +> 15 0 30 2243 topology 2274 3022 +> 16 0 30 2243 topology 2276 3022 +> 15 0 30 2243 topology 2274 3023 +> 16 0 30 2243 topology 2275 3023 +> 15 0 30 2243 topology 2277 3024 +> 16 0 30 2243 topology 2279 3024 +> 15 0 30 2243 topology 2277 3025 +> 16 0 30 2243 topology 2278 3025 +> 15 0 30 2243 topology 2280 3026 +> 16 0 30 2243 topology 2282 3026 +> 15 0 30 2243 topology 2280 3027 +> 16 0 30 2243 topology 2281 3027 +> 15 0 30 2243 topology 2283 3028 +> 16 0 30 2243 topology 2285 3028 +> 15 0 30 2243 topology 2283 3029 +> 16 0 30 2243 topology 2284 3029 +> 15 0 30 2243 topology 2286 3030 +> 16 0 30 2243 topology 2288 3030 +> 15 0 30 2243 topology 2286 3031 +> 16 0 30 2243 topology 2287 3031 +> 15 0 30 2243 topology 2289 3032 +> 16 0 30 2243 topology 2291 3032 +> 15 0 30 2243 topology 2289 3033 +> 16 0 30 2243 topology 2290 3033 +> 15 0 30 2243 topology 2292 3034 +> 16 0 30 2243 topology 2294 3034 +> 15 0 30 2243 topology 2292 3035 +> 16 0 30 2243 topology 2293 3035 +> 15 0 30 2243 topology 2295 3036 +> 16 0 30 2243 topology 2297 3036 +> 15 0 30 2243 topology 2295 3037 +> 16 0 30 2243 topology 2296 3037 +> 15 0 30 2243 topology 2298 3038 +> 16 0 30 2243 topology 2300 3038 +> 15 0 30 2243 topology 2298 3039 +> 16 0 30 2243 topology 2299 3039 +> 15 0 30 2243 topology 2301 3040 +> 16 0 30 2243 topology 2303 3040 +> 15 0 30 2243 topology 2301 3041 +> 16 0 30 2243 topology 2302 3041 +> 15 0 30 2243 topology 2304 3042 +> 16 0 30 2243 topology 2306 3042 +> 15 0 30 2243 topology 2304 3043 +> 16 0 30 2243 topology 2305 3043 +> 15 0 30 2243 topology 2307 3044 +> 16 0 30 2243 topology 2309 3044 +> 15 0 30 2243 topology 2307 3045 +> 16 0 30 2243 topology 2308 3045 +> 15 0 30 2243 topology 2310 3046 +> 16 0 30 2243 topology 2312 3046 +> 15 0 30 2243 topology 2310 3047 +> 16 0 30 2243 topology 2311 3047 +> 15 0 30 2243 topology 2313 3048 +> 16 0 30 2243 topology 2315 3048 +> 15 0 30 2243 topology 2313 3049 +> 16 0 30 2243 topology 2314 3049 +> 15 0 30 2243 topology 2316 3050 +> 16 0 30 2243 topology 2318 3050 +> 15 0 30 2243 topology 2316 3051 +> 16 0 30 2243 topology 2317 3051 +> 15 0 30 2243 topology 2319 3052 +> 16 0 30 2243 topology 2321 3052 +> 15 0 30 2243 topology 2319 3053 +> 16 0 30 2243 topology 2320 3053 +> 15 0 30 2243 topology 2322 3054 +> 16 0 30 2243 topology 2324 3054 +> 15 0 30 2243 topology 2322 3055 +> 16 0 30 2243 topology 2323 3055 +> 15 0 30 2243 topology 2325 3056 +> 16 0 30 2243 topology 2327 3056 +> 15 0 30 2243 topology 2325 3057 +> 16 0 30 2243 topology 2326 3057 +> 15 0 30 2243 topology 2328 3058 +> 16 0 30 2243 topology 2330 3058 +> 15 0 30 2243 topology 2328 3059 +> 16 0 30 2243 topology 2329 3059 +> 15 0 30 2243 topology 2331 3060 +> 16 0 30 2243 topology 2333 3060 +> 15 0 30 2243 topology 2331 3061 +> 16 0 30 2243 topology 2332 3061 +> 15 0 30 2243 topology 2334 3062 +> 16 0 30 2243 topology 2336 3062 +> 15 0 30 2243 topology 2334 3063 +> 16 0 30 2243 topology 2335 3063 +> 15 0 30 2243 topology 2337 3064 +> 16 0 30 2243 topology 2339 3064 +> 15 0 30 2243 topology 2337 3065 +> 16 0 30 2243 topology 2338 3065 > 15 0 31 2056 topology 2344 3066 -> 16 0 31 2056 topology 2241 3066 +> 16 0 31 2056 topology 2343 3066 > 15 0 31 2056 topology 2344 3067 -> 16 0 31 2056 topology 2343 3067 -> 15 0 32 2056 topology 2154 3068 -> 16 0 32 2056 topology 2344 3068 -> 15 0 31 2056 topology 2344 3069 -> 16 0 31 2056 topology 2340 3069 -> 15 0 26 1606 topology 2055 3070 -> 16 0 26 1606 topology 2347 3070 -> 15 0 26 1606 topology 2345 3071 +> 16 0 31 2056 topology 2241 3067 +> 15 0 31 2056 topology 2344 3068 +> 16 0 31 2056 topology 2340 3068 +> 15 0 32 2056 topology 2154 3069 +> 16 0 32 2056 topology 2344 3069 +> 15 0 33 1606 topology 2345 3070 +> 16 0 33 1606 topology 2343 3070 +> 15 0 26 1606 topology 2055 3071 > 16 0 26 1606 topology 2347 3071 -> 15 0 21 1606 topology 2055 3072 -> 16 0 21 1606 topology 2345 3072 -> 15 0 33 1606 topology 2053 3073 -> 16 0 33 1606 topology 2055 3073 -> 15 0 34 1606 topology 2345 3074 -> 16 0 34 1606 topology 2343 3074 -> 15 0 29 2351 topology 2367 3075 -> 16 0 29 2351 topology 2368 3075 -> 15 0 29 2351 topology 2370 3076 -> 16 0 29 2351 topology 2371 3076 -> 15 0 29 2351 topology 2397 3077 -> 16 0 29 2351 topology 2398 3077 -> 15 0 29 2351 topology 2451 3078 -> 16 0 29 2351 topology 2452 3078 -> 15 0 29 2351 topology 2373 3079 -> 16 0 29 2351 topology 2374 3079 -> 15 0 28 2351 topology 2362 3080 +> 15 0 26 1606 topology 2345 3072 +> 16 0 26 1606 topology 2347 3072 +> 15 0 34 1606 topology 2053 3073 +> 16 0 34 1606 topology 2055 3073 +> 15 0 20 1606 topology 2055 3074 +> 16 0 20 1606 topology 2345 3074 +> 15 0 28 2351 topology 2381 3075 +> 16 0 28 2351 topology 2461 3075 +> 15 0 28 2351 topology 2380 3076 +> 16 0 28 2351 topology 2461 3076 +> 15 0 28 2351 topology 2384 3077 +> 16 0 28 2351 topology 2461 3077 +> 15 0 28 2351 topology 2383 3078 +> 16 0 28 2351 topology 2461 3078 +> 15 0 28 2351 topology 2387 3079 +> 16 0 28 2351 topology 2461 3079 +> 15 0 28 2351 topology 2386 3080 > 16 0 28 2351 topology 2461 3080 -> 15 0 29 2351 topology 2376 3081 -> 16 0 29 2351 topology 2377 3081 -> 15 0 29 2351 topology 2430 3082 -> 16 0 29 2351 topology 2431 3082 -> 15 0 28 2351 topology 2384 3083 +> 15 0 28 2351 topology 2390 3081 +> 16 0 28 2351 topology 2461 3081 +> 15 0 28 2351 topology 2389 3082 +> 16 0 28 2351 topology 2461 3082 +> 15 0 28 2351 topology 2393 3083 > 16 0 28 2351 topology 2461 3083 -> 15 0 28 2351 topology 2444 3084 +> 15 0 28 2351 topology 2392 3084 > 16 0 28 2351 topology 2461 3084 -> 15 0 28 2351 topology 2374 3085 +> 15 0 28 2351 topology 2396 3085 > 16 0 28 2351 topology 2461 3085 -> 15 0 28 2351 topology 2420 3086 +> 15 0 28 2351 topology 2395 3086 > 16 0 28 2351 topology 2461 3086 -> 15 0 28 2351 topology 2396 3087 +> 15 0 28 2351 topology 2399 3087 > 16 0 28 2351 topology 2461 3087 -> 15 0 29 2351 topology 2385 3088 -> 16 0 29 2351 topology 2387 3088 -> 15 0 29 2351 topology 2439 3089 -> 16 0 29 2351 topology 2441 3089 -> 15 0 28 2351 topology 2456 3090 +> 15 0 28 2351 topology 2398 3088 +> 16 0 28 2351 topology 2461 3088 +> 15 0 28 2351 topology 2402 3089 +> 16 0 28 2351 topology 2461 3089 +> 15 0 28 2351 topology 2401 3090 > 16 0 28 2351 topology 2461 3090 -> 15 0 28 2351 topology 2432 3091 +> 15 0 28 2351 topology 2405 3091 > 16 0 28 2351 topology 2461 3091 -> 15 0 28 2351 topology 2408 3092 +> 15 0 28 2351 topology 2404 3092 > 16 0 28 2351 topology 2461 3092 -> 15 0 29 2351 topology 2418 3093 -> 16 0 29 2351 topology 2420 3093 -> 15 0 28 2351 topology 2380 3094 +> 15 0 28 2351 topology 2408 3093 +> 16 0 28 2351 topology 2461 3093 +> 15 0 28 2351 topology 2407 3094 > 16 0 28 2351 topology 2461 3094 -> 15 0 28 2351 topology 2410 3095 +> 15 0 28 2351 topology 2354 3095 > 16 0 28 2351 topology 2461 3095 -> 15 0 29 2351 topology 2397 3096 -> 16 0 29 2351 topology 2399 3096 -> 15 0 28 2351 topology 2440 3097 +> 15 0 28 2351 topology 2353 3096 +> 16 0 28 2351 topology 2461 3096 +> 15 0 28 2351 topology 2411 3097 > 16 0 28 2351 topology 2461 3097 -> 15 0 29 2351 topology 2451 3098 -> 16 0 29 2351 topology 2453 3098 -> 15 0 28 2351 topology 2392 3099 +> 15 0 28 2351 topology 2410 3098 +> 16 0 28 2351 topology 2461 3098 +> 15 0 28 2351 topology 2414 3099 > 16 0 28 2351 topology 2461 3099 -> 15 0 29 2351 topology 2409 3100 -> 16 0 29 2351 topology 2410 3100 -> 15 0 28 2351 topology 2422 3101 +> 15 0 28 2351 topology 2413 3100 +> 16 0 28 2351 topology 2461 3100 +> 15 0 28 2351 topology 2417 3101 > 16 0 28 2351 topology 2461 3101 -> 15 0 28 2351 topology 2363 3102 +> 15 0 28 2351 topology 2416 3102 > 16 0 28 2351 topology 2461 3102 -> 15 0 29 2351 topology 2430 3103 -> 16 0 29 2351 topology 2432 3103 -> 15 0 28 2351 topology 2452 3104 +> 15 0 28 2351 topology 2420 3103 +> 16 0 28 2351 topology 2461 3103 +> 15 0 28 2351 topology 2419 3104 > 16 0 28 2351 topology 2461 3104 -> 15 0 28 2351 topology 2404 3105 +> 15 0 28 2351 topology 2423 3105 > 16 0 28 2351 topology 2461 3105 -> 15 0 29 2351 topology 2388 3106 -> 16 0 29 2351 topology 2389 3106 -> 15 0 28 2351 topology 2434 3107 +> 15 0 28 2351 topology 2422 3106 +> 16 0 28 2351 topology 2461 3106 +> 15 0 28 2351 topology 2426 3107 > 16 0 28 2351 topology 2461 3107 -> 15 0 29 2351 topology 2442 3108 -> 16 0 29 2351 topology 2443 3108 -> 15 0 28 2351 topology 2375 3109 +> 15 0 28 2351 topology 2425 3108 +> 16 0 28 2351 topology 2461 3108 +> 15 0 28 2351 topology 2429 3109 > 16 0 28 2351 topology 2461 3109 -> 15 0 29 2351 topology 2421 3110 -> 16 0 29 2351 topology 2422 3110 -> 15 0 29 2351 topology 2400 3111 -> 16 0 29 2351 topology 2401 3111 -> 15 0 29 2351 topology 2454 3112 -> 16 0 29 2351 topology 2455 3112 -> 15 0 28 2351 topology 2359 3113 +> 15 0 28 2351 topology 2428 3110 +> 16 0 28 2351 topology 2461 3110 +> 15 0 28 2351 topology 2432 3111 +> 16 0 28 2351 topology 2461 3111 +> 15 0 28 2351 topology 2431 3112 +> 16 0 28 2351 topology 2461 3112 +> 15 0 28 2351 topology 2435 3113 > 16 0 28 2351 topology 2461 3113 -> 15 0 28 2351 topology 2411 3114 +> 15 0 28 2351 topology 2434 3114 > 16 0 28 2351 topology 2461 3114 -> 15 0 28 2351 topology 2387 3115 +> 15 0 28 2351 topology 2438 3115 > 16 0 28 2351 topology 2461 3115 -> 15 0 29 2351 topology 2433 3116 -> 16 0 29 2351 topology 2434 3116 -> 15 0 29 2351 topology 2352 3117 -> 16 0 29 2351 topology 2354 3117 -> 15 0 28 2351 topology 2371 3118 +> 15 0 28 2351 topology 2437 3116 +> 16 0 28 2351 topology 2461 3116 +> 15 0 28 2351 topology 2357 3117 +> 16 0 28 2351 topology 2461 3117 +> 15 0 28 2351 topology 2356 3118 > 16 0 28 2351 topology 2461 3118 -> 15 0 28 2351 topology 2447 3119 +> 15 0 28 2351 topology 2441 3119 > 16 0 28 2351 topology 2461 3119 -> 15 0 29 2351 topology 2382 3120 -> 16 0 29 2351 topology 2384 3120 -> 15 0 28 2351 topology 2423 3121 +> 15 0 28 2351 topology 2440 3120 +> 16 0 28 2351 topology 2461 3120 +> 15 0 28 2351 topology 2444 3121 > 16 0 28 2351 topology 2461 3121 -> 15 0 28 2351 topology 2399 3122 +> 15 0 28 2351 topology 2443 3122 > 16 0 28 2351 topology 2461 3122 -> 15 0 30 2351 topology 2460 3123 -> 16 0 30 2351 topology 2461 3123 -> 15 0 29 2351 topology 2358 3124 -> 16 0 29 2351 topology 2360 3124 -> 15 0 28 2351 topology 2459 3125 +> 15 0 28 2351 topology 2447 3123 +> 16 0 28 2351 topology 2461 3123 +> 15 0 28 2351 topology 2446 3124 +> 16 0 28 2351 topology 2461 3124 +> 15 0 28 2351 topology 2450 3125 > 16 0 28 2351 topology 2461 3125 -> 15 0 29 2351 topology 2415 3126 -> 16 0 29 2351 topology 2417 3126 -> 15 0 28 2351 topology 2435 3127 +> 15 0 28 2351 topology 2449 3126 +> 16 0 28 2351 topology 2461 3126 +> 15 0 28 2351 topology 2453 3127 > 16 0 28 2351 topology 2461 3127 -> 15 0 29 2351 topology 2364 3128 -> 16 0 29 2351 topology 2366 3128 -> 15 0 29 2351 topology 2394 3129 -> 16 0 29 2351 topology 2396 3129 -> 15 0 29 2351 topology 2448 3130 -> 16 0 29 2351 topology 2450 3130 -> 15 0 29 2351 topology 2370 3131 -> 16 0 29 2351 topology 2372 3131 -> 15 0 28 2351 topology 2354 3132 +> 15 0 28 2351 topology 2452 3128 +> 16 0 28 2351 topology 2461 3128 +> 15 0 28 2351 topology 2456 3129 +> 16 0 28 2351 topology 2461 3129 +> 15 0 28 2351 topology 2455 3130 +> 16 0 28 2351 topology 2461 3130 +> 15 0 28 2351 topology 2459 3131 +> 16 0 28 2351 topology 2461 3131 +> 15 0 28 2351 topology 2458 3132 > 16 0 28 2351 topology 2461 3132 -> 15 0 29 2351 topology 2379 3133 -> 16 0 29 2351 topology 2380 3133 -> 15 0 28 2351 topology 2389 3134 +> 15 0 28 2351 topology 2360 3133 +> 16 0 28 2351 topology 2461 3133 +> 15 0 28 2351 topology 2359 3134 > 16 0 28 2351 topology 2461 3134 -> 15 0 28 2351 topology 2419 3135 +> 15 0 28 2351 topology 2363 3135 > 16 0 28 2351 topology 2461 3135 -> 15 0 29 2351 topology 2427 3136 -> 16 0 29 2351 topology 2429 3136 -> 15 0 28 2351 topology 2449 3137 +> 15 0 28 2351 topology 2362 3136 +> 16 0 28 2351 topology 2461 3136 +> 15 0 28 2351 topology 2366 3137 > 16 0 28 2351 topology 2461 3137 -> 15 0 29 2351 topology 2376 3138 -> 16 0 29 2351 topology 2378 3138 -> 15 0 28 2351 topology 2366 3139 +> 15 0 28 2351 topology 2365 3138 +> 16 0 28 2351 topology 2461 3138 +> 15 0 28 2351 topology 2369 3139 > 16 0 28 2351 topology 2461 3139 -> 15 0 28 2351 topology 2401 3140 +> 15 0 28 2351 topology 2368 3140 > 16 0 28 2351 topology 2461 3140 -> 15 0 29 2351 topology 2412 3141 -> 16 0 29 2351 topology 2413 3141 -> 15 0 29 2351 topology 2406 3142 -> 16 0 29 2351 topology 2408 3142 -> 15 0 28 2351 topology 2431 3143 +> 15 0 28 2351 topology 2372 3141 +> 16 0 28 2351 topology 2461 3141 +> 15 0 28 2351 topology 2371 3142 +> 16 0 28 2351 topology 2461 3142 +> 15 0 28 2351 topology 2375 3143 > 16 0 28 2351 topology 2461 3143 -> 15 0 28 2351 topology 2378 3144 +> 15 0 28 2351 topology 2374 3144 > 16 0 28 2351 topology 2461 3144 -> 15 0 29 2351 topology 2391 3145 -> 16 0 29 2351 topology 2392 3145 -> 15 0 29 2351 topology 2445 3146 -> 16 0 29 2351 topology 2446 3146 -> 15 0 29 2351 topology 2424 3147 -> 16 0 29 2351 topology 2425 3147 -> 15 0 28 2351 topology 2356 3148 -> 16 0 28 2351 topology 2461 3148 -> 15 0 29 2351 topology 2403 3149 -> 16 0 29 2351 topology 2404 3149 -> 15 0 29 2351 topology 2457 3150 -> 16 0 29 2351 topology 2458 3150 -> 15 0 28 2351 topology 2368 3151 -> 16 0 28 2351 topology 2461 3151 -> 15 0 28 2351 topology 2414 3152 -> 16 0 28 2351 topology 2461 3152 -> 15 0 29 2351 topology 2379 3153 -> 16 0 29 2351 topology 2381 3153 -> 15 0 28 2351 topology 2390 3154 -> 16 0 28 2351 topology 2461 3154 -> 15 0 29 2351 topology 2436 3155 -> 16 0 29 2351 topology 2437 3155 -> 15 0 28 2351 topology 2450 3156 -> 16 0 28 2351 topology 2461 3156 -> 15 0 28 2351 topology 2426 3157 -> 16 0 28 2351 topology 2461 3157 -> 15 0 28 2351 topology 2402 3158 -> 16 0 28 2351 topology 2461 3158 -> 15 0 29 2351 topology 2412 3159 -> 16 0 29 2351 topology 2414 3159 -> 15 0 28 2351 topology 2438 3160 -> 16 0 28 2351 topology 2461 3160 -> 15 0 29 2351 topology 2391 3161 -> 16 0 29 2351 topology 2393 3161 -> 15 0 29 2351 topology 2445 3162 -> 16 0 29 2351 topology 2447 3162 -> 15 0 28 2351 topology 2386 3163 -> 16 0 28 2351 topology 2461 3163 -> 15 0 29 2351 topology 2424 3164 -> 16 0 29 2351 topology 2426 3164 -> 15 0 28 2351 topology 2416 3165 -> 16 0 28 2351 topology 2461 3165 -> 15 0 28 2351 topology 2357 3166 -> 16 0 28 2351 topology 2461 3166 -> 15 0 28 2351 topology 2446 3167 -> 16 0 28 2351 topology 2461 3167 -> 15 0 29 2351 topology 2382 3168 -> 16 0 29 2351 topology 2383 3168 -> 15 0 28 2351 topology 2398 3169 -> 16 0 28 2351 topology 2461 3169 -> 15 0 29 2351 topology 2403 3170 -> 16 0 29 2351 topology 2405 3170 -> 15 0 29 2351 topology 2457 3171 -> 16 0 29 2351 topology 2459 3171 -> 15 0 28 2351 topology 2428 3172 -> 16 0 28 2351 topology 2461 3172 -> 15 0 28 2351 topology 2369 3173 -> 16 0 28 2351 topology 2461 3173 -> 15 0 28 2351 topology 2458 3174 -> 16 0 28 2351 topology 2461 3174 -> 15 0 29 2351 topology 2415 3175 -> 16 0 29 2351 topology 2416 3175 -> 15 0 29 2351 topology 2436 3176 -> 16 0 29 2351 topology 2438 3176 -> 15 0 29 2351 topology 2394 3177 -> 16 0 29 2351 topology 2395 3177 -> 15 0 29 2351 topology 2448 3178 -> 16 0 29 2351 topology 2449 3178 -> 15 0 28 2351 topology 2353 3179 -> 16 0 28 2351 topology 2461 3179 -> 15 0 29 2351 topology 2427 3180 -> 16 0 29 2351 topology 2428 3180 -> 15 0 28 2351 topology 2381 3181 -> 16 0 28 2351 topology 2461 3181 -> 15 0 28 2351 topology 2365 3182 -> 16 0 28 2351 topology 2461 3182 -> 15 0 29 2351 topology 2406 3183 -> 16 0 29 2351 topology 2407 3183 -> 15 0 28 2351 topology 2441 3184 -> 16 0 28 2351 topology 2461 3184 -> 15 0 28 2351 topology 2417 3185 -> 16 0 28 2351 topology 2461 3185 -> 15 0 28 2351 topology 2393 3186 -> 16 0 28 2351 topology 2461 3186 -> 15 0 29 2351 topology 2355 3187 -> 16 0 29 2351 topology 2357 3187 -> 15 0 28 2351 topology 2377 3188 -> 16 0 28 2351 topology 2461 3188 -> 15 0 29 2351 topology 2409 3189 -> 16 0 29 2351 topology 2411 3189 -> 15 0 28 2351 topology 2453 3190 -> 16 0 28 2351 topology 2461 3190 -> 15 0 28 2351 topology 2429 3191 -> 16 0 28 2351 topology 2461 3191 -> 15 0 28 2351 topology 2405 3192 -> 16 0 28 2351 topology 2461 3192 -> 15 0 29 2351 topology 2361 3193 -> 16 0 29 2351 topology 2363 3193 -> 15 0 29 2351 topology 2388 3194 -> 16 0 29 2351 topology 2390 3194 -> 15 0 29 2351 topology 2442 3195 -> 16 0 29 2351 topology 2444 3195 -> 15 0 29 2351 topology 2367 3196 -> 16 0 29 2351 topology 2369 3196 -> 15 0 29 2351 topology 2421 3197 -> 16 0 29 2351 topology 2423 3197 -> 15 0 28 2351 topology 2383 3198 -> 16 0 28 2351 topology 2461 3198 -> 15 0 28 2351 topology 2413 3199 -> 16 0 28 2351 topology 2461 3199 -> 15 0 29 2351 topology 2352 3200 -> 16 0 29 2351 topology 2353 3200 -> 15 0 28 2351 topology 2443 3201 -> 16 0 28 2351 topology 2461 3201 -> 15 0 29 2351 topology 2373 3202 -> 16 0 29 2351 topology 2375 3202 -> 15 0 29 2351 topology 2400 3203 -> 16 0 29 2351 topology 2402 3203 -> 15 0 29 2351 topology 2454 3204 -> 16 0 29 2351 topology 2456 3204 -> 15 0 29 2351 topology 2355 3205 -> 16 0 29 2351 topology 2356 3205 -> 15 0 28 2351 topology 2360 3206 -> 16 0 28 2351 topology 2461 3206 -> 15 0 28 2351 topology 2395 3207 -> 16 0 28 2351 topology 2461 3207 -> 15 0 28 2351 topology 2425 3208 -> 16 0 28 2351 topology 2461 3208 -> 15 0 29 2351 topology 2358 3209 -> 16 0 29 2351 topology 2359 3209 -> 15 0 29 2351 topology 2385 3210 -> 16 0 29 2351 topology 2386 3210 -> 15 0 29 2351 topology 2439 3211 -> 16 0 29 2351 topology 2440 3211 -> 15 0 28 2351 topology 2455 3212 -> 16 0 28 2351 topology 2461 3212 -> 15 0 29 2351 topology 2433 3213 -> 16 0 29 2351 topology 2435 3213 -> 15 0 29 2351 topology 2361 3214 -> 16 0 29 2351 topology 2362 3214 -> 15 0 28 2351 topology 2372 3215 -> 16 0 28 2351 topology 2461 3215 -> 15 0 28 2351 topology 2407 3216 -> 16 0 28 2351 topology 2461 3216 -> 15 0 28 2351 topology 2437 3217 -> 16 0 28 2351 topology 2461 3217 -> 15 0 29 2351 topology 2364 3218 -> 16 0 29 2351 topology 2365 3218 -> 15 0 29 2351 topology 2418 3219 -> 16 0 29 2351 topology 2419 3219 -> 15 0 28 2462 topology 2521 3220 +> 15 0 28 2351 topology 2378 3145 +> 16 0 28 2351 topology 2461 3145 +> 15 0 28 2351 topology 2377 3146 +> 16 0 28 2351 topology 2461 3146 +> 15 0 29 2351 topology 2460 3147 +> 16 0 29 2351 topology 2461 3147 +> 15 0 30 2351 topology 2379 3148 +> 16 0 30 2351 topology 2381 3148 +> 15 0 30 2351 topology 2379 3149 +> 16 0 30 2351 topology 2380 3149 +> 15 0 30 2351 topology 2382 3150 +> 16 0 30 2351 topology 2384 3150 +> 15 0 30 2351 topology 2382 3151 +> 16 0 30 2351 topology 2383 3151 +> 15 0 30 2351 topology 2385 3152 +> 16 0 30 2351 topology 2387 3152 +> 15 0 30 2351 topology 2385 3153 +> 16 0 30 2351 topology 2386 3153 +> 15 0 30 2351 topology 2388 3154 +> 16 0 30 2351 topology 2390 3154 +> 15 0 30 2351 topology 2388 3155 +> 16 0 30 2351 topology 2389 3155 +> 15 0 30 2351 topology 2391 3156 +> 16 0 30 2351 topology 2393 3156 +> 15 0 30 2351 topology 2391 3157 +> 16 0 30 2351 topology 2392 3157 +> 15 0 30 2351 topology 2394 3158 +> 16 0 30 2351 topology 2396 3158 +> 15 0 30 2351 topology 2394 3159 +> 16 0 30 2351 topology 2395 3159 +> 15 0 30 2351 topology 2397 3160 +> 16 0 30 2351 topology 2399 3160 +> 15 0 30 2351 topology 2397 3161 +> 16 0 30 2351 topology 2398 3161 +> 15 0 30 2351 topology 2400 3162 +> 16 0 30 2351 topology 2402 3162 +> 15 0 30 2351 topology 2400 3163 +> 16 0 30 2351 topology 2401 3163 +> 15 0 30 2351 topology 2403 3164 +> 16 0 30 2351 topology 2405 3164 +> 15 0 30 2351 topology 2403 3165 +> 16 0 30 2351 topology 2404 3165 +> 15 0 30 2351 topology 2406 3166 +> 16 0 30 2351 topology 2408 3166 +> 15 0 30 2351 topology 2406 3167 +> 16 0 30 2351 topology 2407 3167 +> 15 0 30 2351 topology 2352 3168 +> 16 0 30 2351 topology 2354 3168 +> 15 0 30 2351 topology 2352 3169 +> 16 0 30 2351 topology 2353 3169 +> 15 0 30 2351 topology 2409 3170 +> 16 0 30 2351 topology 2411 3170 +> 15 0 30 2351 topology 2409 3171 +> 16 0 30 2351 topology 2410 3171 +> 15 0 30 2351 topology 2412 3172 +> 16 0 30 2351 topology 2414 3172 +> 15 0 30 2351 topology 2412 3173 +> 16 0 30 2351 topology 2413 3173 +> 15 0 30 2351 topology 2415 3174 +> 16 0 30 2351 topology 2417 3174 +> 15 0 30 2351 topology 2415 3175 +> 16 0 30 2351 topology 2416 3175 +> 15 0 30 2351 topology 2418 3176 +> 16 0 30 2351 topology 2420 3176 +> 15 0 30 2351 topology 2418 3177 +> 16 0 30 2351 topology 2419 3177 +> 15 0 30 2351 topology 2421 3178 +> 16 0 30 2351 topology 2423 3178 +> 15 0 30 2351 topology 2421 3179 +> 16 0 30 2351 topology 2422 3179 +> 15 0 30 2351 topology 2424 3180 +> 16 0 30 2351 topology 2426 3180 +> 15 0 30 2351 topology 2424 3181 +> 16 0 30 2351 topology 2425 3181 +> 15 0 30 2351 topology 2427 3182 +> 16 0 30 2351 topology 2429 3182 +> 15 0 30 2351 topology 2427 3183 +> 16 0 30 2351 topology 2428 3183 +> 15 0 30 2351 topology 2430 3184 +> 16 0 30 2351 topology 2432 3184 +> 15 0 30 2351 topology 2430 3185 +> 16 0 30 2351 topology 2431 3185 +> 15 0 30 2351 topology 2433 3186 +> 16 0 30 2351 topology 2435 3186 +> 15 0 30 2351 topology 2433 3187 +> 16 0 30 2351 topology 2434 3187 +> 15 0 30 2351 topology 2436 3188 +> 16 0 30 2351 topology 2438 3188 +> 15 0 30 2351 topology 2436 3189 +> 16 0 30 2351 topology 2437 3189 +> 15 0 30 2351 topology 2355 3190 +> 16 0 30 2351 topology 2357 3190 +> 15 0 30 2351 topology 2355 3191 +> 16 0 30 2351 topology 2356 3191 +> 15 0 30 2351 topology 2439 3192 +> 16 0 30 2351 topology 2441 3192 +> 15 0 30 2351 topology 2439 3193 +> 16 0 30 2351 topology 2440 3193 +> 15 0 30 2351 topology 2442 3194 +> 16 0 30 2351 topology 2444 3194 +> 15 0 30 2351 topology 2442 3195 +> 16 0 30 2351 topology 2443 3195 +> 15 0 30 2351 topology 2445 3196 +> 16 0 30 2351 topology 2447 3196 +> 15 0 30 2351 topology 2445 3197 +> 16 0 30 2351 topology 2446 3197 +> 15 0 30 2351 topology 2448 3198 +> 16 0 30 2351 topology 2450 3198 +> 15 0 30 2351 topology 2448 3199 +> 16 0 30 2351 topology 2449 3199 +> 15 0 30 2351 topology 2451 3200 +> 16 0 30 2351 topology 2453 3200 +> 15 0 30 2351 topology 2451 3201 +> 16 0 30 2351 topology 2452 3201 +> 15 0 30 2351 topology 2454 3202 +> 16 0 30 2351 topology 2456 3202 +> 15 0 30 2351 topology 2454 3203 +> 16 0 30 2351 topology 2455 3203 +> 15 0 30 2351 topology 2457 3204 +> 16 0 30 2351 topology 2459 3204 +> 15 0 30 2351 topology 2457 3205 +> 16 0 30 2351 topology 2458 3205 +> 15 0 30 2351 topology 2358 3206 +> 16 0 30 2351 topology 2360 3206 +> 15 0 30 2351 topology 2358 3207 +> 16 0 30 2351 topology 2359 3207 +> 15 0 30 2351 topology 2361 3208 +> 16 0 30 2351 topology 2363 3208 +> 15 0 30 2351 topology 2361 3209 +> 16 0 30 2351 topology 2362 3209 +> 15 0 30 2351 topology 2364 3210 +> 16 0 30 2351 topology 2366 3210 +> 15 0 30 2351 topology 2364 3211 +> 16 0 30 2351 topology 2365 3211 +> 15 0 30 2351 topology 2367 3212 +> 16 0 30 2351 topology 2369 3212 +> 15 0 30 2351 topology 2367 3213 +> 16 0 30 2351 topology 2368 3213 +> 15 0 30 2351 topology 2370 3214 +> 16 0 30 2351 topology 2372 3214 +> 15 0 30 2351 topology 2370 3215 +> 16 0 30 2351 topology 2371 3215 +> 15 0 30 2351 topology 2373 3216 +> 16 0 30 2351 topology 2375 3216 +> 15 0 30 2351 topology 2373 3217 +> 16 0 30 2351 topology 2374 3217 +> 15 0 30 2351 topology 2376 3218 +> 16 0 30 2351 topology 2378 3218 +> 15 0 30 2351 topology 2376 3219 +> 16 0 30 2351 topology 2377 3219 +> 15 0 28 2462 topology 2465 3220 > 16 0 28 2462 topology 2572 3220 -> 15 0 28 2462 topology 2551 3221 +> 15 0 28 2462 topology 2464 3221 > 16 0 28 2462 topology 2572 3221 -> 15 0 29 2462 topology 2505 3222 -> 16 0 29 2462 topology 2506 3222 -> 15 0 29 2462 topology 2499 3223 -> 16 0 29 2462 topology 2501 3223 -> 15 0 29 2462 topology 2553 3224 -> 16 0 29 2462 topology 2555 3224 -> 15 0 29 2462 topology 2484 3225 -> 16 0 29 2462 topology 2485 3225 -> 15 0 29 2462 topology 2538 3226 -> 16 0 29 2462 topology 2539 3226 -> 15 0 29 2462 topology 2463 3227 -> 16 0 29 2462 topology 2464 3227 -> 15 0 29 2462 topology 2517 3228 -> 16 0 29 2462 topology 2518 3228 -> 15 0 28 2462 topology 2504 3229 +> 15 0 28 2462 topology 2468 3222 +> 16 0 28 2462 topology 2572 3222 +> 15 0 28 2462 topology 2467 3223 +> 16 0 28 2462 topology 2572 3223 +> 15 0 28 2462 topology 2471 3224 +> 16 0 28 2462 topology 2572 3224 +> 15 0 28 2462 topology 2470 3225 +> 16 0 28 2462 topology 2572 3225 +> 15 0 28 2462 topology 2474 3226 +> 16 0 28 2462 topology 2572 3226 +> 15 0 28 2462 topology 2473 3227 +> 16 0 28 2462 topology 2572 3227 +> 15 0 28 2462 topology 2477 3228 +> 16 0 28 2462 topology 2572 3228 +> 15 0 28 2462 topology 2476 3229 > 16 0 28 2462 topology 2572 3229 > 15 0 28 2462 topology 2480 3230 > 16 0 28 2462 topology 2572 3230 -> 15 0 29 2462 topology 2496 3231 -> 16 0 29 2462 topology 2497 3231 -> 15 0 29 2462 topology 2550 3232 -> 16 0 29 2462 topology 2551 3232 -> 15 0 28 2462 topology 2564 3233 +> 15 0 28 2462 topology 2479 3231 +> 16 0 28 2462 topology 2572 3231 +> 15 0 28 2462 topology 2483 3232 +> 16 0 28 2462 topology 2572 3232 +> 15 0 28 2462 topology 2482 3233 > 16 0 28 2462 topology 2572 3233 -> 15 0 28 2462 topology 2540 3234 +> 15 0 28 2462 topology 2486 3234 > 16 0 28 2462 topology 2572 3234 -> 15 0 29 2462 topology 2472 3235 -> 16 0 29 2462 topology 2474 3235 -> 15 0 28 2462 topology 2516 3236 +> 15 0 28 2462 topology 2485 3235 +> 16 0 28 2462 topology 2572 3235 +> 15 0 28 2462 topology 2489 3236 > 16 0 28 2462 topology 2572 3236 -> 15 0 28 2462 topology 2492 3237 +> 15 0 28 2462 topology 2488 3237 > 16 0 28 2462 topology 2572 3237 -> 15 0 29 2462 topology 2529 3238 -> 16 0 29 2462 topology 2530 3238 -> 15 0 28 2462 topology 2468 3239 +> 15 0 28 2462 topology 2492 3238 +> 16 0 28 2462 topology 2572 3238 +> 15 0 28 2462 topology 2491 3239 > 16 0 28 2462 topology 2572 3239 -> 15 0 28 2462 topology 2552 3240 +> 15 0 28 2462 topology 2495 3240 > 16 0 28 2462 topology 2572 3240 -> 15 0 29 2462 topology 2505 3241 -> 16 0 29 2462 topology 2507 3241 -> 15 0 28 2462 topology 2528 3242 +> 15 0 28 2462 topology 2494 3241 +> 16 0 28 2462 topology 2572 3241 +> 15 0 28 2462 topology 2498 3242 > 16 0 28 2462 topology 2572 3242 -> 15 0 29 2462 topology 2484 3243 -> 16 0 29 2462 topology 2486 3243 -> 15 0 29 2462 topology 2538 3244 -> 16 0 29 2462 topology 2540 3244 -> 15 0 28 2462 topology 2476 3245 +> 15 0 28 2462 topology 2497 3243 +> 16 0 28 2462 topology 2572 3243 +> 15 0 28 2462 topology 2501 3244 +> 16 0 28 2462 topology 2572 3244 +> 15 0 28 2462 topology 2500 3245 > 16 0 28 2462 topology 2572 3245 -> 15 0 28 2462 topology 2506 3246 +> 15 0 28 2462 topology 2504 3246 > 16 0 28 2462 topology 2572 3246 -> 15 0 28 2462 topology 2536 3247 +> 15 0 28 2462 topology 2503 3247 > 16 0 28 2462 topology 2572 3247 -> 15 0 29 2462 topology 2463 3248 -> 16 0 29 2462 topology 2465 3248 -> 15 0 29 2462 topology 2517 3249 -> 16 0 29 2462 topology 2519 3249 -> 15 0 28 2462 topology 2566 3250 +> 15 0 28 2462 topology 2507 3248 +> 16 0 28 2462 topology 2572 3248 +> 15 0 28 2462 topology 2506 3249 +> 16 0 28 2462 topology 2572 3249 +> 15 0 28 2462 topology 2510 3250 > 16 0 28 2462 topology 2572 3250 -> 15 0 28 2462 topology 2488 3251 +> 15 0 28 2462 topology 2509 3251 > 16 0 28 2462 topology 2572 3251 -> 15 0 28 2462 topology 2518 3252 +> 15 0 28 2462 topology 2513 3252 > 16 0 28 2462 topology 2572 3252 -> 15 0 29 2462 topology 2475 3253 -> 16 0 29 2462 topology 2476 3253 -> 15 0 28 2462 topology 2548 3254 +> 15 0 28 2462 topology 2512 3253 +> 16 0 28 2462 topology 2572 3253 +> 15 0 28 2462 topology 2516 3254 > 16 0 28 2462 topology 2572 3254 -> 15 0 28 2462 topology 2470 3255 +> 15 0 28 2462 topology 2515 3255 > 16 0 28 2462 topology 2572 3255 -> 15 0 29 2462 topology 2496 3256 -> 16 0 29 2462 topology 2498 3256 -> 15 0 29 2462 topology 2550 3257 -> 16 0 29 2462 topology 2552 3257 -> 15 0 28 2462 topology 2500 3258 +> 15 0 28 2462 topology 2519 3256 +> 16 0 28 2462 topology 2572 3256 +> 15 0 28 2462 topology 2518 3257 +> 16 0 28 2462 topology 2572 3257 +> 15 0 28 2462 topology 2522 3258 > 16 0 28 2462 topology 2572 3258 -> 15 0 28 2462 topology 2530 3259 +> 15 0 28 2462 topology 2521 3259 > 16 0 28 2462 topology 2572 3259 -> 15 0 29 2462 topology 2508 3260 -> 16 0 29 2462 topology 2509 3260 -> 15 0 28 2462 topology 2560 3261 +> 15 0 28 2462 topology 2525 3260 +> 16 0 28 2462 topology 2572 3260 +> 15 0 28 2462 topology 2524 3261 > 16 0 28 2462 topology 2572 3261 -> 15 0 29 2462 topology 2562 3262 -> 16 0 29 2462 topology 2563 3262 -> 15 0 29 2462 topology 2529 3263 -> 16 0 29 2462 topology 2531 3263 -> 15 0 29 2462 topology 2487 3264 -> 16 0 29 2462 topology 2488 3264 -> 15 0 29 2462 topology 2541 3265 -> 16 0 29 2462 topology 2542 3265 -> 15 0 29 2462 topology 2466 3266 -> 16 0 29 2462 topology 2467 3266 -> 15 0 29 2462 topology 2520 3267 -> 16 0 29 2462 topology 2521 3267 -> 15 0 28 2462 topology 2507 3268 +> 15 0 28 2462 topology 2528 3262 +> 16 0 28 2462 topology 2572 3262 +> 15 0 28 2462 topology 2527 3263 +> 16 0 28 2462 topology 2572 3263 +> 15 0 28 2462 topology 2531 3264 +> 16 0 28 2462 topology 2572 3264 +> 15 0 28 2462 topology 2530 3265 +> 16 0 28 2462 topology 2572 3265 +> 15 0 28 2462 topology 2534 3266 +> 16 0 28 2462 topology 2572 3266 +> 15 0 28 2462 topology 2533 3267 +> 16 0 28 2462 topology 2572 3267 +> 15 0 28 2462 topology 2537 3268 > 16 0 28 2462 topology 2572 3268 -> 15 0 28 2462 topology 2483 3269 +> 15 0 28 2462 topology 2536 3269 > 16 0 28 2462 topology 2572 3269 -> 15 0 29 2462 topology 2499 3270 -> 16 0 29 2462 topology 2500 3270 -> 15 0 29 2462 topology 2553 3271 -> 16 0 29 2462 topology 2554 3271 -> 15 0 28 2462 topology 2567 3272 +> 15 0 28 2462 topology 2540 3270 +> 16 0 28 2462 topology 2572 3270 +> 15 0 28 2462 topology 2539 3271 +> 16 0 28 2462 topology 2572 3271 +> 15 0 28 2462 topology 2543 3272 > 16 0 28 2462 topology 2572 3272 -> 15 0 28 2462 topology 2543 3273 +> 15 0 28 2462 topology 2542 3273 > 16 0 28 2462 topology 2572 3273 -> 15 0 28 2462 topology 2519 3274 +> 15 0 28 2462 topology 2546 3274 > 16 0 28 2462 topology 2572 3274 -> 15 0 28 2462 topology 2495 3275 +> 15 0 28 2462 topology 2545 3275 > 16 0 28 2462 topology 2572 3275 -> 15 0 29 2462 topology 2502 3276 -> 16 0 29 2462 topology 2504 3276 -> 15 0 28 2462 topology 2471 3277 +> 15 0 28 2462 topology 2549 3276 +> 16 0 28 2462 topology 2572 3276 +> 15 0 28 2462 topology 2548 3277 > 16 0 28 2462 topology 2572 3277 -> 15 0 28 2462 topology 2555 3278 +> 15 0 28 2462 topology 2552 3278 > 16 0 28 2462 topology 2572 3278 -> 15 0 28 2462 topology 2531 3279 +> 15 0 28 2462 topology 2551 3279 > 16 0 28 2462 topology 2572 3279 -> 15 0 29 2462 topology 2481 3280 -> 16 0 29 2462 topology 2483 3280 -> 15 0 29 2462 topology 2535 3281 -> 16 0 29 2462 topology 2537 3281 -> 15 0 28 2462 topology 2473 3282 +> 15 0 28 2462 topology 2555 3280 +> 16 0 28 2462 topology 2572 3280 +> 15 0 28 2462 topology 2554 3281 +> 16 0 28 2462 topology 2572 3281 +> 15 0 28 2462 topology 2558 3282 > 16 0 28 2462 topology 2572 3282 -> 15 0 28 2462 topology 2503 3283 +> 15 0 28 2462 topology 2557 3283 > 16 0 28 2462 topology 2572 3283 -> 15 0 29 2462 topology 2514 3284 -> 16 0 29 2462 topology 2516 3284 -> 15 0 28 2462 topology 2533 3285 +> 15 0 28 2462 topology 2561 3284 +> 16 0 28 2462 topology 2572 3284 +> 15 0 28 2462 topology 2560 3285 > 16 0 28 2462 topology 2572 3285 -> 15 0 29 2462 topology 2568 3286 -> 16 0 29 2462 topology 2570 3286 +> 15 0 28 2462 topology 2564 3286 +> 16 0 28 2462 topology 2572 3286 > 15 0 28 2462 topology 2563 3287 > 16 0 28 2462 topology 2572 3287 -> 15 0 28 2462 topology 2485 3288 +> 15 0 28 2462 topology 2567 3288 > 16 0 28 2462 topology 2572 3288 -> 15 0 28 2462 topology 2515 3289 +> 15 0 28 2462 topology 2566 3289 > 16 0 28 2462 topology 2572 3289 -> 15 0 29 2462 topology 2493 3290 -> 16 0 29 2462 topology 2495 3290 -> 15 0 28 2462 topology 2545 3291 +> 15 0 28 2462 topology 2570 3290 +> 16 0 28 2462 topology 2572 3290 +> 15 0 28 2462 topology 2569 3291 > 16 0 28 2462 topology 2572 3291 -> 15 0 29 2462 topology 2547 3292 -> 16 0 29 2462 topology 2549 3292 -> 15 0 28 2462 topology 2467 3293 -> 16 0 28 2462 topology 2572 3293 -> 15 0 28 2462 topology 2497 3294 -> 16 0 28 2462 topology 2572 3294 -> 15 0 29 2462 topology 2478 3295 -> 16 0 29 2462 topology 2479 3295 -> 15 0 28 2462 topology 2527 3296 -> 16 0 28 2462 topology 2572 3296 -> 15 0 29 2462 topology 2532 3297 -> 16 0 29 2462 topology 2533 3297 -> 15 0 29 2462 topology 2526 3298 -> 16 0 29 2462 topology 2528 3298 -> 15 0 28 2462 topology 2557 3299 -> 16 0 28 2462 topology 2572 3299 -> 15 0 29 2462 topology 2511 3300 -> 16 0 29 2462 topology 2512 3300 -> 15 0 29 2462 topology 2565 3301 -> 16 0 29 2462 topology 2566 3301 -> 15 0 29 2462 topology 2559 3302 -> 16 0 29 2462 topology 2561 3302 -> 15 0 29 2462 topology 2490 3303 -> 16 0 29 2462 topology 2491 3303 -> 15 0 29 2462 topology 2544 3304 -> 16 0 29 2462 topology 2545 3304 -> 15 0 28 2462 topology 2474 3305 -> 16 0 28 2462 topology 2572 3305 -> 15 0 29 2462 topology 2469 3306 -> 16 0 29 2462 topology 2470 3306 -> 15 0 29 2462 topology 2523 3307 -> 16 0 29 2462 topology 2524 3307 -> 15 0 28 2462 topology 2534 3308 -> 16 0 28 2462 topology 2572 3308 -> 15 0 28 2462 topology 2510 3309 -> 16 0 28 2462 topology 2572 3309 -> 15 0 30 2462 topology 2571 3310 -> 16 0 30 2462 topology 2572 3310 -> 15 0 28 2462 topology 2486 3311 -> 16 0 28 2462 topology 2572 3311 -> 15 0 28 2462 topology 2570 3312 -> 16 0 28 2462 topology 2572 3312 -> 15 0 28 2462 topology 2546 3313 -> 16 0 28 2462 topology 2572 3313 -> 15 0 29 2462 topology 2556 3314 -> 16 0 29 2462 topology 2557 3314 -> 15 0 28 2462 topology 2522 3315 -> 16 0 28 2462 topology 2572 3315 -> 15 0 28 2462 topology 2498 3316 -> 16 0 28 2462 topology 2572 3316 -> 15 0 29 2462 topology 2478 3317 -> 16 0 29 2462 topology 2480 3317 -> 15 0 29 2462 topology 2532 3318 -> 16 0 29 2462 topology 2534 3318 -> 15 0 28 2462 topology 2558 3319 -> 16 0 28 2462 topology 2572 3319 -> 15 0 29 2462 topology 2511 3320 -> 16 0 29 2462 topology 2513 3320 -> 15 0 29 2462 topology 2565 3321 -> 16 0 29 2462 topology 2567 3321 -> 15 0 28 2462 topology 2482 3322 -> 16 0 28 2462 topology 2572 3322 -> 15 0 29 2462 topology 2490 3323 -> 16 0 29 2462 topology 2492 3323 -> 15 0 28 2462 topology 2512 3324 -> 16 0 28 2462 topology 2572 3324 -> 15 0 29 2462 topology 2544 3325 -> 16 0 29 2462 topology 2546 3325 -> 15 0 28 2462 topology 2542 3326 -> 16 0 28 2462 topology 2572 3326 -> 15 0 28 2462 topology 2464 3327 -> 16 0 28 2462 topology 2572 3327 -> 15 0 28 2462 topology 2494 3328 -> 16 0 28 2462 topology 2572 3328 -> 15 0 29 2462 topology 2502 3329 -> 16 0 29 2462 topology 2503 3329 -> 15 0 29 2462 topology 2469 3330 -> 16 0 29 2462 topology 2471 3330 -> 15 0 28 2462 topology 2524 3331 -> 16 0 28 2462 topology 2572 3331 -> 15 0 29 2462 topology 2523 3332 -> 16 0 29 2462 topology 2525 3332 -> 15 0 28 2462 topology 2554 3333 -> 16 0 28 2462 topology 2572 3333 -> 15 0 29 2462 topology 2481 3334 -> 16 0 29 2462 topology 2482 3334 -> 15 0 29 2462 topology 2535 3335 -> 16 0 29 2462 topology 2536 3335 -> 15 0 29 2462 topology 2556 3336 -> 16 0 29 2462 topology 2558 3336 -> 15 0 29 2462 topology 2514 3337 -> 16 0 29 2462 topology 2515 3337 -> 15 0 29 2462 topology 2568 3338 -> 16 0 29 2462 topology 2569 3338 -> 15 0 29 2462 topology 2493 3339 -> 16 0 29 2462 topology 2494 3339 -> 15 0 29 2462 topology 2547 3340 -> 16 0 29 2462 topology 2548 3340 -> 15 0 28 2462 topology 2477 3341 -> 16 0 28 2462 topology 2572 3341 -> 15 0 28 2462 topology 2537 3342 -> 16 0 28 2462 topology 2572 3342 -> 15 0 28 2462 topology 2513 3343 -> 16 0 28 2462 topology 2572 3343 -> 15 0 29 2462 topology 2526 3344 -> 16 0 29 2462 topology 2527 3344 -> 15 0 28 2462 topology 2489 3345 -> 16 0 28 2462 topology 2572 3345 -> 15 0 28 2462 topology 2465 3346 -> 16 0 28 2462 topology 2572 3346 -> 15 0 29 2462 topology 2475 3347 -> 16 0 29 2462 topology 2477 3347 -> 15 0 28 2462 topology 2549 3348 -> 16 0 28 2462 topology 2572 3348 -> 15 0 28 2462 topology 2525 3349 -> 16 0 28 2462 topology 2572 3349 -> 15 0 29 2462 topology 2559 3350 -> 16 0 29 2462 topology 2560 3350 -> 15 0 28 2462 topology 2501 3351 -> 16 0 28 2462 topology 2572 3351 -> 15 0 29 2462 topology 2508 3352 -> 16 0 29 2462 topology 2510 3352 -> 15 0 28 2462 topology 2561 3353 -> 16 0 28 2462 topology 2572 3353 -> 15 0 29 2462 topology 2562 3354 -> 16 0 29 2462 topology 2564 3354 -> 15 0 28 2462 topology 2479 3355 -> 16 0 28 2462 topology 2572 3355 -> 15 0 29 2462 topology 2487 3356 -> 16 0 29 2462 topology 2489 3356 -> 15 0 29 2462 topology 2541 3357 -> 16 0 29 2462 topology 2543 3357 -> 15 0 28 2462 topology 2509 3358 -> 16 0 28 2462 topology 2572 3358 -> 15 0 28 2462 topology 2539 3359 -> 16 0 28 2462 topology 2572 3359 -> 15 0 29 2462 topology 2472 3360 -> 16 0 29 2462 topology 2473 3360 -> 15 0 28 2462 topology 2569 3361 -> 16 0 28 2462 topology 2572 3361 -> 15 0 29 2462 topology 2466 3362 -> 16 0 29 2462 topology 2468 3362 -> 15 0 28 2462 topology 2491 3363 -> 16 0 28 2462 topology 2572 3363 -> 15 0 29 2462 topology 2520 3364 -> 16 0 29 2462 topology 2522 3364 -> 15 0 28 2573 topology 2672 3365 +> 15 0 29 2462 topology 2571 3292 +> 16 0 29 2462 topology 2572 3292 +> 15 0 30 2462 topology 2463 3293 +> 16 0 30 2462 topology 2465 3293 +> 15 0 30 2462 topology 2463 3294 +> 16 0 30 2462 topology 2464 3294 +> 15 0 30 2462 topology 2466 3295 +> 16 0 30 2462 topology 2468 3295 +> 15 0 30 2462 topology 2466 3296 +> 16 0 30 2462 topology 2467 3296 +> 15 0 30 2462 topology 2469 3297 +> 16 0 30 2462 topology 2471 3297 +> 15 0 30 2462 topology 2469 3298 +> 16 0 30 2462 topology 2470 3298 +> 15 0 30 2462 topology 2472 3299 +> 16 0 30 2462 topology 2474 3299 +> 15 0 30 2462 topology 2472 3300 +> 16 0 30 2462 topology 2473 3300 +> 15 0 30 2462 topology 2475 3301 +> 16 0 30 2462 topology 2477 3301 +> 15 0 30 2462 topology 2475 3302 +> 16 0 30 2462 topology 2476 3302 +> 15 0 30 2462 topology 2478 3303 +> 16 0 30 2462 topology 2480 3303 +> 15 0 30 2462 topology 2478 3304 +> 16 0 30 2462 topology 2479 3304 +> 15 0 30 2462 topology 2481 3305 +> 16 0 30 2462 topology 2483 3305 +> 15 0 30 2462 topology 2481 3306 +> 16 0 30 2462 topology 2482 3306 +> 15 0 30 2462 topology 2484 3307 +> 16 0 30 2462 topology 2486 3307 +> 15 0 30 2462 topology 2484 3308 +> 16 0 30 2462 topology 2485 3308 +> 15 0 30 2462 topology 2487 3309 +> 16 0 30 2462 topology 2489 3309 +> 15 0 30 2462 topology 2487 3310 +> 16 0 30 2462 topology 2488 3310 +> 15 0 30 2462 topology 2490 3311 +> 16 0 30 2462 topology 2492 3311 +> 15 0 30 2462 topology 2490 3312 +> 16 0 30 2462 topology 2491 3312 +> 15 0 30 2462 topology 2493 3313 +> 16 0 30 2462 topology 2495 3313 +> 15 0 30 2462 topology 2493 3314 +> 16 0 30 2462 topology 2494 3314 +> 15 0 30 2462 topology 2496 3315 +> 16 0 30 2462 topology 2498 3315 +> 15 0 30 2462 topology 2496 3316 +> 16 0 30 2462 topology 2497 3316 +> 15 0 30 2462 topology 2499 3317 +> 16 0 30 2462 topology 2501 3317 +> 15 0 30 2462 topology 2499 3318 +> 16 0 30 2462 topology 2500 3318 +> 15 0 30 2462 topology 2502 3319 +> 16 0 30 2462 topology 2504 3319 +> 15 0 30 2462 topology 2502 3320 +> 16 0 30 2462 topology 2503 3320 +> 15 0 30 2462 topology 2505 3321 +> 16 0 30 2462 topology 2507 3321 +> 15 0 30 2462 topology 2505 3322 +> 16 0 30 2462 topology 2506 3322 +> 15 0 30 2462 topology 2508 3323 +> 16 0 30 2462 topology 2510 3323 +> 15 0 30 2462 topology 2508 3324 +> 16 0 30 2462 topology 2509 3324 +> 15 0 30 2462 topology 2511 3325 +> 16 0 30 2462 topology 2513 3325 +> 15 0 30 2462 topology 2511 3326 +> 16 0 30 2462 topology 2512 3326 +> 15 0 30 2462 topology 2514 3327 +> 16 0 30 2462 topology 2516 3327 +> 15 0 30 2462 topology 2514 3328 +> 16 0 30 2462 topology 2515 3328 +> 15 0 30 2462 topology 2517 3329 +> 16 0 30 2462 topology 2519 3329 +> 15 0 30 2462 topology 2517 3330 +> 16 0 30 2462 topology 2518 3330 +> 15 0 30 2462 topology 2520 3331 +> 16 0 30 2462 topology 2522 3331 +> 15 0 30 2462 topology 2520 3332 +> 16 0 30 2462 topology 2521 3332 +> 15 0 30 2462 topology 2523 3333 +> 16 0 30 2462 topology 2525 3333 +> 15 0 30 2462 topology 2523 3334 +> 16 0 30 2462 topology 2524 3334 +> 15 0 30 2462 topology 2526 3335 +> 16 0 30 2462 topology 2528 3335 +> 15 0 30 2462 topology 2526 3336 +> 16 0 30 2462 topology 2527 3336 +> 15 0 30 2462 topology 2529 3337 +> 16 0 30 2462 topology 2531 3337 +> 15 0 30 2462 topology 2529 3338 +> 16 0 30 2462 topology 2530 3338 +> 15 0 30 2462 topology 2532 3339 +> 16 0 30 2462 topology 2534 3339 +> 15 0 30 2462 topology 2532 3340 +> 16 0 30 2462 topology 2533 3340 +> 15 0 30 2462 topology 2535 3341 +> 16 0 30 2462 topology 2537 3341 +> 15 0 30 2462 topology 2535 3342 +> 16 0 30 2462 topology 2536 3342 +> 15 0 30 2462 topology 2538 3343 +> 16 0 30 2462 topology 2540 3343 +> 15 0 30 2462 topology 2538 3344 +> 16 0 30 2462 topology 2539 3344 +> 15 0 30 2462 topology 2541 3345 +> 16 0 30 2462 topology 2543 3345 +> 15 0 30 2462 topology 2541 3346 +> 16 0 30 2462 topology 2542 3346 +> 15 0 30 2462 topology 2544 3347 +> 16 0 30 2462 topology 2546 3347 +> 15 0 30 2462 topology 2544 3348 +> 16 0 30 2462 topology 2545 3348 +> 15 0 30 2462 topology 2547 3349 +> 16 0 30 2462 topology 2549 3349 +> 15 0 30 2462 topology 2547 3350 +> 16 0 30 2462 topology 2548 3350 +> 15 0 30 2462 topology 2550 3351 +> 16 0 30 2462 topology 2552 3351 +> 15 0 30 2462 topology 2550 3352 +> 16 0 30 2462 topology 2551 3352 +> 15 0 30 2462 topology 2553 3353 +> 16 0 30 2462 topology 2555 3353 +> 15 0 30 2462 topology 2553 3354 +> 16 0 30 2462 topology 2554 3354 +> 15 0 30 2462 topology 2556 3355 +> 16 0 30 2462 topology 2558 3355 +> 15 0 30 2462 topology 2556 3356 +> 16 0 30 2462 topology 2557 3356 +> 15 0 30 2462 topology 2559 3357 +> 16 0 30 2462 topology 2561 3357 +> 15 0 30 2462 topology 2559 3358 +> 16 0 30 2462 topology 2560 3358 +> 15 0 30 2462 topology 2562 3359 +> 16 0 30 2462 topology 2564 3359 +> 15 0 30 2462 topology 2562 3360 +> 16 0 30 2462 topology 2563 3360 +> 15 0 30 2462 topology 2565 3361 +> 16 0 30 2462 topology 2567 3361 +> 15 0 30 2462 topology 2565 3362 +> 16 0 30 2462 topology 2566 3362 +> 15 0 30 2462 topology 2568 3363 +> 16 0 30 2462 topology 2570 3363 +> 15 0 30 2462 topology 2568 3364 +> 16 0 30 2462 topology 2569 3364 +> 15 0 28 2573 topology 2657 3365 > 16 0 28 2573 topology 2683 3365 -> 15 0 28 2573 topology 2575 3366 +> 15 0 28 2573 topology 2656 3366 > 16 0 28 2573 topology 2683 3366 -> 15 0 28 2573 topology 2605 3367 +> 15 0 28 2573 topology 2660 3367 > 16 0 28 2573 topology 2683 3367 -> 15 0 29 2573 topology 2607 3368 -> 16 0 29 2573 topology 2609 3368 -> 15 0 28 2573 topology 2635 3369 +> 15 0 28 2573 topology 2659 3368 +> 16 0 28 2573 topology 2683 3368 +> 15 0 28 2573 topology 2663 3369 > 16 0 28 2573 topology 2683 3369 -> 15 0 29 2573 topology 2670 3370 -> 16 0 29 2573 topology 2671 3370 -> 15 0 28 2573 topology 2587 3371 +> 15 0 28 2573 topology 2662 3370 +> 16 0 28 2573 topology 2683 3370 +> 15 0 28 2573 topology 2666 3371 > 16 0 28 2573 topology 2683 3371 -> 15 0 29 2573 topology 2586 3372 -> 16 0 29 2573 topology 2588 3372 -> 15 0 28 2573 topology 2617 3373 +> 15 0 28 2573 topology 2665 3372 +> 16 0 28 2573 topology 2683 3372 +> 15 0 28 2573 topology 2669 3373 > 16 0 28 2573 topology 2683 3373 -> 15 0 29 2573 topology 2640 3374 -> 16 0 29 2573 topology 2642 3374 -> 15 0 28 2573 topology 2647 3375 +> 15 0 28 2573 topology 2668 3374 +> 16 0 28 2573 topology 2683 3374 +> 15 0 28 2573 topology 2672 3375 > 16 0 28 2573 topology 2683 3375 -> 15 0 29 2573 topology 2676 3376 -> 16 0 29 2573 topology 2677 3376 -> 15 0 28 2573 topology 2656 3377 +> 15 0 28 2573 topology 2671 3376 +> 16 0 28 2573 topology 2683 3376 +> 15 0 28 2573 topology 2675 3377 > 16 0 28 2573 topology 2683 3377 -> 15 0 29 2573 topology 2625 3378 -> 16 0 29 2573 topology 2626 3378 -> 15 0 29 2573 topology 2619 3379 -> 16 0 29 2573 topology 2621 3379 -> 15 0 28 2573 topology 2668 3380 +> 15 0 28 2573 topology 2674 3378 +> 16 0 28 2573 topology 2683 3378 +> 15 0 28 2573 topology 2678 3379 +> 16 0 28 2573 topology 2683 3379 +> 15 0 28 2573 topology 2677 3380 > 16 0 28 2573 topology 2683 3380 -> 15 0 29 2573 topology 2604 3381 -> 16 0 29 2573 topology 2605 3381 -> 15 0 29 2573 topology 2652 3382 -> 16 0 29 2573 topology 2654 3382 -> 15 0 28 2573 topology 2680 3383 +> 15 0 28 2573 topology 2681 3381 +> 16 0 28 2573 topology 2683 3381 +> 15 0 28 2573 topology 2680 3382 +> 16 0 28 2573 topology 2683 3382 +> 15 0 28 2573 topology 2576 3383 > 16 0 28 2573 topology 2683 3383 -> 15 0 29 2573 topology 2583 3384 -> 16 0 29 2573 topology 2584 3384 -> 15 0 29 2573 topology 2637 3385 -> 16 0 29 2573 topology 2638 3385 -> 15 0 28 2573 topology 2600 3386 +> 15 0 28 2573 topology 2575 3384 +> 16 0 28 2573 topology 2683 3384 +> 15 0 28 2573 topology 2579 3385 +> 16 0 28 2573 topology 2683 3385 +> 15 0 28 2573 topology 2578 3386 > 16 0 28 2573 topology 2683 3386 -> 15 0 28 2573 topology 2576 3387 +> 15 0 28 2573 topology 2582 3387 > 16 0 28 2573 topology 2683 3387 -> 15 0 29 2573 topology 2616 3388 -> 16 0 29 2573 topology 2617 3388 -> 15 0 28 2573 topology 2636 3389 +> 15 0 28 2573 topology 2581 3388 +> 16 0 28 2573 topology 2683 3388 +> 15 0 28 2573 topology 2585 3389 > 16 0 28 2573 topology 2683 3389 -> 15 0 28 2573 topology 2612 3390 +> 15 0 28 2573 topology 2584 3390 > 16 0 28 2573 topology 2683 3390 > 15 0 28 2573 topology 2588 3391 > 16 0 28 2573 topology 2683 3391 -> 15 0 29 2573 topology 2649 3392 -> 16 0 29 2573 topology 2650 3392 -> 15 0 28 2573 topology 2648 3393 +> 15 0 28 2573 topology 2587 3392 +> 16 0 28 2573 topology 2683 3392 +> 15 0 28 2573 topology 2591 3393 > 16 0 28 2573 topology 2683 3393 -> 15 0 28 2573 topology 2624 3394 +> 15 0 28 2573 topology 2590 3394 > 16 0 28 2573 topology 2683 3394 -> 15 0 29 2573 topology 2625 3395 -> 16 0 29 2573 topology 2627 3395 -> 15 0 28 2573 topology 2663 3396 +> 15 0 28 2573 topology 2594 3395 +> 16 0 28 2573 topology 2683 3395 +> 15 0 28 2573 topology 2593 3396 > 16 0 28 2573 topology 2683 3396 -> 15 0 29 2573 topology 2604 3397 -> 16 0 29 2573 topology 2606 3397 -> 15 0 28 2573 topology 2602 3398 +> 15 0 28 2573 topology 2597 3397 +> 16 0 28 2573 topology 2683 3397 +> 15 0 28 2573 topology 2596 3398 > 16 0 28 2573 topology 2683 3398 -> 15 0 28 2573 topology 2675 3399 +> 15 0 28 2573 topology 2600 3399 > 16 0 28 2573 topology 2683 3399 -> 15 0 28 2573 topology 2632 3400 +> 15 0 28 2573 topology 2599 3400 > 16 0 28 2573 topology 2683 3400 -> 15 0 28 2573 topology 2584 3401 +> 15 0 28 2573 topology 2603 3401 > 16 0 28 2573 topology 2683 3401 -> 15 0 29 2573 topology 2583 3402 -> 16 0 29 2573 topology 2585 3402 -> 15 0 29 2573 topology 2637 3403 -> 16 0 29 2573 topology 2639 3403 -> 15 0 28 2573 topology 2614 3404 +> 15 0 28 2573 topology 2602 3402 +> 16 0 28 2573 topology 2683 3402 +> 15 0 28 2573 topology 2606 3403 +> 16 0 28 2573 topology 2683 3403 +> 15 0 28 2573 topology 2605 3404 > 16 0 28 2573 topology 2683 3404 -> 15 0 28 2573 topology 2644 3405 +> 15 0 28 2573 topology 2609 3405 > 16 0 28 2573 topology 2683 3405 -> 15 0 29 2573 topology 2595 3406 -> 16 0 29 2573 topology 2596 3406 -> 15 0 29 2573 topology 2616 3407 -> 16 0 29 2573 topology 2618 3407 -> 15 0 29 2573 topology 2574 3408 -> 16 0 29 2573 topology 2575 3408 -> 15 0 29 2573 topology 2628 3409 -> 16 0 29 2573 topology 2629 3409 -> 15 0 28 2573 topology 2665 3410 +> 15 0 28 2573 topology 2608 3406 +> 16 0 28 2573 topology 2683 3406 +> 15 0 28 2573 topology 2612 3407 +> 16 0 28 2573 topology 2683 3407 +> 15 0 28 2573 topology 2611 3408 +> 16 0 28 2573 topology 2683 3408 +> 15 0 28 2573 topology 2615 3409 +> 16 0 28 2573 topology 2683 3409 +> 15 0 28 2573 topology 2614 3410 > 16 0 28 2573 topology 2683 3410 -> 15 0 29 2573 topology 2649 3411 -> 16 0 29 2573 topology 2651 3411 -> 15 0 29 2573 topology 2655 3412 -> 16 0 29 2573 topology 2657 3412 -> 15 0 29 2573 topology 2658 3413 -> 16 0 29 2573 topology 2660 3413 -> 15 0 29 2573 topology 2607 3414 -> 16 0 29 2573 topology 2608 3414 -> 15 0 28 2573 topology 2677 3415 +> 15 0 28 2573 topology 2618 3411 +> 16 0 28 2573 topology 2683 3411 +> 15 0 28 2573 topology 2617 3412 +> 16 0 28 2573 topology 2683 3412 +> 15 0 28 2573 topology 2621 3413 +> 16 0 28 2573 topology 2683 3413 +> 15 0 28 2573 topology 2620 3414 +> 16 0 28 2573 topology 2683 3414 +> 15 0 28 2573 topology 2624 3415 > 16 0 28 2573 topology 2683 3415 -> 15 0 29 2573 topology 2661 3416 -> 16 0 29 2573 topology 2663 3416 -> 15 0 29 2573 topology 2664 3417 -> 16 0 29 2573 topology 2666 3417 -> 15 0 29 2573 topology 2586 3418 -> 16 0 29 2573 topology 2587 3418 -> 15 0 28 2573 topology 2627 3419 +> 15 0 28 2573 topology 2623 3416 +> 16 0 28 2573 topology 2683 3416 +> 15 0 28 2573 topology 2627 3417 +> 16 0 28 2573 topology 2683 3417 +> 15 0 28 2573 topology 2626 3418 +> 16 0 28 2573 topology 2683 3418 +> 15 0 28 2573 topology 2630 3419 > 16 0 28 2573 topology 2683 3419 -> 15 0 29 2573 topology 2640 3420 -> 16 0 29 2573 topology 2641 3420 -> 15 0 28 2573 topology 2603 3421 +> 15 0 28 2573 topology 2629 3420 +> 16 0 28 2573 topology 2683 3420 +> 15 0 28 2573 topology 2633 3421 > 16 0 28 2573 topology 2683 3421 -> 15 0 29 2573 topology 2667 3422 -> 16 0 29 2573 topology 2669 3422 -> 15 0 28 2573 topology 2579 3423 +> 15 0 28 2573 topology 2632 3422 +> 16 0 28 2573 topology 2683 3422 +> 15 0 28 2573 topology 2636 3423 > 16 0 28 2573 topology 2683 3423 -> 15 0 29 2573 topology 2670 3424 -> 16 0 29 2573 topology 2672 3424 -> 15 0 29 2573 topology 2619 3425 -> 16 0 29 2573 topology 2620 3425 -> 15 0 28 2573 topology 2639 3426 +> 15 0 28 2573 topology 2635 3424 +> 16 0 28 2573 topology 2683 3424 +> 15 0 28 2573 topology 2639 3425 +> 16 0 28 2573 topology 2683 3425 +> 15 0 28 2573 topology 2638 3426 > 16 0 28 2573 topology 2683 3426 -> 15 0 28 2573 topology 2615 3427 +> 15 0 28 2573 topology 2642 3427 > 16 0 28 2573 topology 2683 3427 -> 15 0 29 2573 topology 2673 3428 -> 16 0 29 2573 topology 2675 3428 -> 15 0 28 2573 topology 2591 3429 +> 15 0 28 2573 topology 2641 3428 +> 16 0 28 2573 topology 2683 3428 +> 15 0 28 2573 topology 2645 3429 > 16 0 28 2573 topology 2683 3429 -> 15 0 29 2573 topology 2655 3430 -> 16 0 29 2573 topology 2656 3430 -> 15 0 29 2573 topology 2676 3431 -> 16 0 29 2573 topology 2678 3431 -> 15 0 28 2573 topology 2651 3432 +> 15 0 28 2573 topology 2644 3430 +> 16 0 28 2573 topology 2683 3430 +> 15 0 28 2573 topology 2648 3431 +> 16 0 28 2573 topology 2683 3431 +> 15 0 28 2573 topology 2647 3432 > 16 0 28 2573 topology 2683 3432 -> 15 0 29 2573 topology 2652 3433 -> 16 0 29 2573 topology 2653 3433 -> 15 0 29 2573 topology 2679 3434 -> 16 0 29 2573 topology 2681 3434 -> 15 0 29 2573 topology 2661 3435 -> 16 0 29 2573 topology 2662 3435 -> 15 0 29 2573 topology 2601 3436 -> 16 0 29 2573 topology 2603 3436 -> 15 0 28 2573 topology 2666 3437 -> 16 0 28 2573 topology 2683 3437 -> 15 0 28 2573 topology 2599 3438 -> 16 0 28 2573 topology 2683 3438 -> 15 0 28 2573 topology 2629 3439 -> 16 0 28 2573 topology 2683 3439 -> 15 0 29 2573 topology 2667 3440 -> 16 0 29 2573 topology 2668 3440 -> 15 0 29 2573 topology 2580 3441 -> 16 0 29 2573 topology 2582 3441 -> 15 0 29 2573 topology 2634 3442 -> 16 0 29 2573 topology 2636 3442 -> 15 0 28 2573 topology 2678 3443 -> 16 0 28 2573 topology 2683 3443 -> 15 0 28 2573 topology 2581 3444 -> 16 0 28 2573 topology 2683 3444 -> 15 0 28 2573 topology 2611 3445 -> 16 0 28 2573 topology 2683 3445 -> 15 0 28 2573 topology 2641 3446 -> 16 0 28 2573 topology 2683 3446 -> 15 0 29 2573 topology 2673 3447 -> 16 0 29 2573 topology 2674 3447 -> 15 0 29 2573 topology 2613 3448 -> 16 0 29 2573 topology 2615 3448 -> 15 0 28 2573 topology 2593 3449 -> 16 0 28 2573 topology 2683 3449 -> 15 0 28 2573 topology 2623 3450 -> 16 0 28 2573 topology 2683 3450 -> 15 0 29 2573 topology 2598 3451 -> 16 0 29 2573 topology 2599 3451 -> 15 0 28 2573 topology 2653 3452 -> 16 0 28 2573 topology 2683 3452 -> 15 0 29 2573 topology 2679 3453 -> 16 0 29 2573 topology 2680 3453 -> 15 0 29 2573 topology 2592 3454 -> 16 0 29 2573 topology 2594 3454 -> 15 0 29 2573 topology 2646 3455 -> 16 0 29 2573 topology 2648 3455 -> 15 0 28 2573 topology 2662 3456 -> 16 0 28 2573 topology 2683 3456 -> 15 0 29 2573 topology 2577 3457 -> 16 0 29 2573 topology 2578 3457 -> 15 0 29 2573 topology 2631 3458 -> 16 0 29 2573 topology 2632 3458 -> 15 0 28 2573 topology 2674 3459 -> 16 0 28 2573 topology 2683 3459 -> 15 0 29 2573 topology 2610 3460 -> 16 0 29 2573 topology 2611 3460 -> 15 0 28 2573 topology 2630 3461 -> 16 0 28 2573 topology 2683 3461 -> 15 0 29 2573 topology 2589 3462 -> 16 0 29 2573 topology 2590 3462 -> 15 0 28 2573 topology 2606 3463 -> 16 0 28 2573 topology 2683 3463 -> 15 0 29 2573 topology 2643 3464 -> 16 0 29 2573 topology 2644 3464 -> 15 0 28 2573 topology 2582 3465 -> 16 0 28 2573 topology 2683 3465 -> 15 0 28 2573 topology 2642 3466 -> 16 0 28 2573 topology 2683 3466 -> 15 0 28 2573 topology 2618 3467 -> 16 0 28 2573 topology 2683 3467 -> 15 0 29 2573 topology 2622 3468 -> 16 0 29 2573 topology 2623 3468 -> 15 0 28 2573 topology 2594 3469 -> 16 0 28 2573 topology 2683 3469 -> 15 0 28 2573 topology 2657 3470 -> 16 0 28 2573 topology 2683 3470 -> 15 0 29 2573 topology 2598 3471 -> 16 0 29 2573 topology 2600 3471 -> 15 0 28 2573 topology 2654 3472 -> 16 0 28 2573 topology 2683 3472 -> 15 0 28 2573 topology 2596 3473 -> 16 0 28 2573 topology 2683 3473 -> 15 0 28 2573 topology 2669 3474 -> 16 0 28 2573 topology 2683 3474 -> 15 0 29 2573 topology 2577 3475 -> 16 0 29 2573 topology 2579 3475 -> 15 0 28 2573 topology 2626 3476 -> 16 0 28 2573 topology 2683 3476 -> 15 0 29 2573 topology 2631 3477 -> 16 0 29 2573 topology 2633 3477 -> 15 0 28 2573 topology 2578 3478 -> 16 0 28 2573 topology 2683 3478 -> 15 0 28 2573 topology 2608 3479 -> 16 0 28 2573 topology 2683 3479 -> 15 0 28 2573 topology 2681 3480 -> 16 0 28 2573 topology 2683 3480 -> 15 0 29 2573 topology 2610 3481 -> 16 0 29 2573 topology 2612 3481 -> 15 0 28 2573 topology 2638 3482 -> 16 0 28 2573 topology 2683 3482 -> 15 0 28 2573 topology 2590 3483 -> 16 0 28 2573 topology 2683 3483 -> 15 0 28 2573 topology 2620 3484 -> 16 0 28 2573 topology 2683 3484 -> 15 0 29 2573 topology 2589 3485 -> 16 0 29 2573 topology 2591 3485 -> 15 0 29 2573 topology 2643 3486 -> 16 0 29 2573 topology 2645 3486 -> 15 0 28 2573 topology 2650 3487 -> 16 0 28 2573 topology 2683 3487 -> 15 0 28 2573 topology 2659 3488 -> 16 0 28 2573 topology 2683 3488 -> 15 0 29 2573 topology 2601 3489 -> 16 0 29 2573 topology 2602 3489 -> 15 0 29 2573 topology 2622 3490 -> 16 0 29 2573 topology 2624 3490 -> 15 0 28 2573 topology 2671 3491 -> 16 0 28 2573 topology 2683 3491 -> 15 0 29 2573 topology 2580 3492 -> 16 0 29 2573 topology 2581 3492 -> 15 0 29 2573 topology 2634 3493 -> 16 0 29 2573 topology 2635 3493 -> 15 0 30 2573 topology 2682 3494 -> 16 0 30 2573 topology 2683 3494 -> 15 0 28 2573 topology 2597 3495 -> 16 0 28 2573 topology 2683 3495 -> 15 0 29 2573 topology 2613 3496 -> 16 0 29 2573 topology 2614 3496 -> 15 0 28 2573 topology 2633 3497 -> 16 0 28 2573 topology 2683 3497 -> 15 0 28 2573 topology 2609 3498 -> 16 0 28 2573 topology 2683 3498 -> 15 0 28 2573 topology 2585 3499 -> 16 0 28 2573 topology 2683 3499 -> 15 0 29 2573 topology 2592 3500 -> 16 0 29 2573 topology 2593 3500 -> 15 0 29 2573 topology 2646 3501 -> 16 0 29 2573 topology 2647 3501 -> 15 0 28 2573 topology 2645 3502 -> 16 0 28 2573 topology 2683 3502 -> 15 0 29 2573 topology 2595 3503 -> 16 0 29 2573 topology 2597 3503 -> 15 0 28 2573 topology 2621 3504 -> 16 0 28 2573 topology 2683 3504 -> 15 0 29 2573 topology 2658 3505 -> 16 0 29 2573 topology 2659 3505 -> 15 0 28 2573 topology 2660 3506 -> 16 0 28 2573 topology 2683 3506 -> 15 0 29 2573 topology 2574 3507 -> 16 0 29 2573 topology 2576 3507 -> 15 0 29 2573 topology 2628 3508 -> 16 0 29 2573 topology 2630 3508 -> 15 0 29 2573 topology 2664 3509 -> 16 0 29 2573 topology 2665 3509 -> 15 0 28 2684 topology 2750 3510 +> 15 0 28 2573 topology 2651 3433 +> 16 0 28 2573 topology 2683 3433 +> 15 0 28 2573 topology 2650 3434 +> 16 0 28 2573 topology 2683 3434 +> 15 0 28 2573 topology 2654 3435 +> 16 0 28 2573 topology 2683 3435 +> 15 0 28 2573 topology 2653 3436 +> 16 0 28 2573 topology 2683 3436 +> 15 0 29 2573 topology 2682 3437 +> 16 0 29 2573 topology 2683 3437 +> 15 0 30 2573 topology 2655 3438 +> 16 0 30 2573 topology 2657 3438 +> 15 0 30 2573 topology 2655 3439 +> 16 0 30 2573 topology 2656 3439 +> 15 0 30 2573 topology 2658 3440 +> 16 0 30 2573 topology 2660 3440 +> 15 0 30 2573 topology 2658 3441 +> 16 0 30 2573 topology 2659 3441 +> 15 0 30 2573 topology 2661 3442 +> 16 0 30 2573 topology 2663 3442 +> 15 0 30 2573 topology 2661 3443 +> 16 0 30 2573 topology 2662 3443 +> 15 0 30 2573 topology 2664 3444 +> 16 0 30 2573 topology 2666 3444 +> 15 0 30 2573 topology 2664 3445 +> 16 0 30 2573 topology 2665 3445 +> 15 0 30 2573 topology 2667 3446 +> 16 0 30 2573 topology 2669 3446 +> 15 0 30 2573 topology 2667 3447 +> 16 0 30 2573 topology 2668 3447 +> 15 0 30 2573 topology 2670 3448 +> 16 0 30 2573 topology 2672 3448 +> 15 0 30 2573 topology 2670 3449 +> 16 0 30 2573 topology 2671 3449 +> 15 0 30 2573 topology 2673 3450 +> 16 0 30 2573 topology 2675 3450 +> 15 0 30 2573 topology 2673 3451 +> 16 0 30 2573 topology 2674 3451 +> 15 0 30 2573 topology 2676 3452 +> 16 0 30 2573 topology 2678 3452 +> 15 0 30 2573 topology 2676 3453 +> 16 0 30 2573 topology 2677 3453 +> 15 0 30 2573 topology 2679 3454 +> 16 0 30 2573 topology 2681 3454 +> 15 0 30 2573 topology 2679 3455 +> 16 0 30 2573 topology 2680 3455 +> 15 0 30 2573 topology 2574 3456 +> 16 0 30 2573 topology 2576 3456 +> 15 0 30 2573 topology 2574 3457 +> 16 0 30 2573 topology 2575 3457 +> 15 0 30 2573 topology 2577 3458 +> 16 0 30 2573 topology 2579 3458 +> 15 0 30 2573 topology 2577 3459 +> 16 0 30 2573 topology 2578 3459 +> 15 0 30 2573 topology 2580 3460 +> 16 0 30 2573 topology 2582 3460 +> 15 0 30 2573 topology 2580 3461 +> 16 0 30 2573 topology 2581 3461 +> 15 0 30 2573 topology 2583 3462 +> 16 0 30 2573 topology 2585 3462 +> 15 0 30 2573 topology 2583 3463 +> 16 0 30 2573 topology 2584 3463 +> 15 0 30 2573 topology 2586 3464 +> 16 0 30 2573 topology 2588 3464 +> 15 0 30 2573 topology 2586 3465 +> 16 0 30 2573 topology 2587 3465 +> 15 0 30 2573 topology 2589 3466 +> 16 0 30 2573 topology 2591 3466 +> 15 0 30 2573 topology 2589 3467 +> 16 0 30 2573 topology 2590 3467 +> 15 0 30 2573 topology 2592 3468 +> 16 0 30 2573 topology 2594 3468 +> 15 0 30 2573 topology 2592 3469 +> 16 0 30 2573 topology 2593 3469 +> 15 0 30 2573 topology 2595 3470 +> 16 0 30 2573 topology 2597 3470 +> 15 0 30 2573 topology 2595 3471 +> 16 0 30 2573 topology 2596 3471 +> 15 0 30 2573 topology 2598 3472 +> 16 0 30 2573 topology 2600 3472 +> 15 0 30 2573 topology 2598 3473 +> 16 0 30 2573 topology 2599 3473 +> 15 0 30 2573 topology 2601 3474 +> 16 0 30 2573 topology 2603 3474 +> 15 0 30 2573 topology 2601 3475 +> 16 0 30 2573 topology 2602 3475 +> 15 0 30 2573 topology 2604 3476 +> 16 0 30 2573 topology 2606 3476 +> 15 0 30 2573 topology 2604 3477 +> 16 0 30 2573 topology 2605 3477 +> 15 0 30 2573 topology 2607 3478 +> 16 0 30 2573 topology 2609 3478 +> 15 0 30 2573 topology 2607 3479 +> 16 0 30 2573 topology 2608 3479 +> 15 0 30 2573 topology 2610 3480 +> 16 0 30 2573 topology 2612 3480 +> 15 0 30 2573 topology 2610 3481 +> 16 0 30 2573 topology 2611 3481 +> 15 0 30 2573 topology 2613 3482 +> 16 0 30 2573 topology 2615 3482 +> 15 0 30 2573 topology 2613 3483 +> 16 0 30 2573 topology 2614 3483 +> 15 0 30 2573 topology 2616 3484 +> 16 0 30 2573 topology 2618 3484 +> 15 0 30 2573 topology 2616 3485 +> 16 0 30 2573 topology 2617 3485 +> 15 0 30 2573 topology 2619 3486 +> 16 0 30 2573 topology 2621 3486 +> 15 0 30 2573 topology 2619 3487 +> 16 0 30 2573 topology 2620 3487 +> 15 0 30 2573 topology 2622 3488 +> 16 0 30 2573 topology 2624 3488 +> 15 0 30 2573 topology 2622 3489 +> 16 0 30 2573 topology 2623 3489 +> 15 0 30 2573 topology 2625 3490 +> 16 0 30 2573 topology 2627 3490 +> 15 0 30 2573 topology 2625 3491 +> 16 0 30 2573 topology 2626 3491 +> 15 0 30 2573 topology 2628 3492 +> 16 0 30 2573 topology 2630 3492 +> 15 0 30 2573 topology 2628 3493 +> 16 0 30 2573 topology 2629 3493 +> 15 0 30 2573 topology 2631 3494 +> 16 0 30 2573 topology 2633 3494 +> 15 0 30 2573 topology 2631 3495 +> 16 0 30 2573 topology 2632 3495 +> 15 0 30 2573 topology 2634 3496 +> 16 0 30 2573 topology 2636 3496 +> 15 0 30 2573 topology 2634 3497 +> 16 0 30 2573 topology 2635 3497 +> 15 0 30 2573 topology 2637 3498 +> 16 0 30 2573 topology 2639 3498 +> 15 0 30 2573 topology 2637 3499 +> 16 0 30 2573 topology 2638 3499 +> 15 0 30 2573 topology 2640 3500 +> 16 0 30 2573 topology 2642 3500 +> 15 0 30 2573 topology 2640 3501 +> 16 0 30 2573 topology 2641 3501 +> 15 0 30 2573 topology 2643 3502 +> 16 0 30 2573 topology 2645 3502 +> 15 0 30 2573 topology 2643 3503 +> 16 0 30 2573 topology 2644 3503 +> 15 0 30 2573 topology 2646 3504 +> 16 0 30 2573 topology 2648 3504 +> 15 0 30 2573 topology 2646 3505 +> 16 0 30 2573 topology 2647 3505 +> 15 0 30 2573 topology 2649 3506 +> 16 0 30 2573 topology 2651 3506 +> 15 0 30 2573 topology 2649 3507 +> 16 0 30 2573 topology 2650 3507 +> 15 0 30 2573 topology 2652 3508 +> 16 0 30 2573 topology 2654 3508 +> 15 0 30 2573 topology 2652 3509 +> 16 0 30 2573 topology 2653 3509 +> 15 0 28 2684 topology 2687 3510 > 16 0 28 2684 topology 2794 3510 -> 15 0 28 2684 topology 2726 3511 +> 15 0 28 2684 topology 2686 3511 > 16 0 28 2684 topology 2794 3511 -> 15 0 28 2684 topology 2702 3512 +> 15 0 28 2684 topology 2690 3512 > 16 0 28 2684 topology 2794 3512 -> 15 0 28 2684 topology 2786 3513 +> 15 0 28 2684 topology 2689 3513 > 16 0 28 2684 topology 2794 3513 -> 15 0 28 2684 topology 2762 3514 +> 15 0 28 2684 topology 2693 3514 > 16 0 28 2684 topology 2794 3514 -> 15 0 28 2684 topology 2738 3515 +> 15 0 28 2684 topology 2692 3515 > 16 0 28 2684 topology 2794 3515 -> 15 0 28 2684 topology 2714 3516 +> 15 0 28 2684 topology 2696 3516 > 16 0 28 2684 topology 2794 3516 -> 15 0 28 2684 topology 2774 3517 +> 15 0 28 2684 topology 2695 3517 > 16 0 28 2684 topology 2794 3517 -> 15 0 28 2684 topology 2698 3518 +> 15 0 28 2684 topology 2699 3518 > 16 0 28 2684 topology 2794 3518 -> 15 0 29 2684 topology 2688 3519 -> 16 0 29 2684 topology 2690 3519 -> 15 0 28 2684 topology 2728 3520 +> 15 0 28 2684 topology 2698 3519 +> 16 0 28 2684 topology 2794 3519 +> 15 0 28 2684 topology 2702 3520 > 16 0 28 2684 topology 2794 3520 -> 15 0 28 2684 topology 2758 3521 +> 15 0 28 2684 topology 2701 3521 > 16 0 28 2684 topology 2794 3521 -> 15 0 29 2684 topology 2691 3522 -> 16 0 29 2684 topology 2693 3522 -> 15 0 28 2684 topology 2788 3523 +> 15 0 28 2684 topology 2705 3522 +> 16 0 28 2684 topology 2794 3522 +> 15 0 28 2684 topology 2704 3523 > 16 0 28 2684 topology 2794 3523 -> 15 0 28 2684 topology 2710 3524 +> 15 0 28 2684 topology 2708 3524 > 16 0 28 2684 topology 2794 3524 -> 15 0 29 2684 topology 2694 3525 -> 16 0 29 2684 topology 2696 3525 -> 15 0 28 2684 topology 2740 3526 +> 15 0 28 2684 topology 2707 3525 +> 16 0 28 2684 topology 2794 3525 +> 15 0 28 2684 topology 2711 3526 > 16 0 28 2684 topology 2794 3526 -> 15 0 29 2684 topology 2748 3527 -> 16 0 29 2684 topology 2750 3527 -> 15 0 30 2684 topology 2793 3528 -> 16 0 30 2684 topology 2794 3528 -> 15 0 28 2684 topology 2770 3529 +> 15 0 28 2684 topology 2710 3527 +> 16 0 28 2684 topology 2794 3527 +> 15 0 28 2684 topology 2714 3528 +> 16 0 28 2684 topology 2794 3528 +> 15 0 28 2684 topology 2713 3529 > 16 0 28 2684 topology 2794 3529 -> 15 0 29 2684 topology 2697 3530 -> 16 0 29 2684 topology 2699 3530 -> 15 0 29 2684 topology 2751 3531 -> 16 0 29 2684 topology 2753 3531 -> 15 0 29 2684 topology 2700 3532 -> 16 0 29 2684 topology 2702 3532 -> 15 0 29 2684 topology 2754 3533 -> 16 0 29 2684 topology 2756 3533 -> 15 0 29 2684 topology 2703 3534 -> 16 0 29 2684 topology 2705 3534 -> 15 0 29 2684 topology 2757 3535 -> 16 0 29 2684 topology 2759 3535 -> 15 0 29 2684 topology 2706 3536 -> 16 0 29 2684 topology 2708 3536 -> 15 0 29 2684 topology 2760 3537 -> 16 0 29 2684 topology 2762 3537 -> 15 0 29 2684 topology 2688 3538 -> 16 0 29 2684 topology 2689 3538 -> 15 0 29 2684 topology 2709 3539 -> 16 0 29 2684 topology 2711 3539 -> 15 0 29 2684 topology 2763 3540 -> 16 0 29 2684 topology 2765 3540 -> 15 0 29 2684 topology 2718 3541 -> 16 0 29 2684 topology 2719 3541 -> 15 0 28 2684 topology 2693 3542 +> 15 0 28 2684 topology 2717 3530 +> 16 0 28 2684 topology 2794 3530 +> 15 0 28 2684 topology 2716 3531 +> 16 0 28 2684 topology 2794 3531 +> 15 0 28 2684 topology 2720 3532 +> 16 0 28 2684 topology 2794 3532 +> 15 0 28 2684 topology 2719 3533 +> 16 0 28 2684 topology 2794 3533 +> 15 0 28 2684 topology 2723 3534 +> 16 0 28 2684 topology 2794 3534 +> 15 0 28 2684 topology 2722 3535 +> 16 0 28 2684 topology 2794 3535 +> 15 0 28 2684 topology 2726 3536 +> 16 0 28 2684 topology 2794 3536 +> 15 0 28 2684 topology 2725 3537 +> 16 0 28 2684 topology 2794 3537 +> 15 0 28 2684 topology 2729 3538 +> 16 0 28 2684 topology 2794 3538 +> 15 0 28 2684 topology 2728 3539 +> 16 0 28 2684 topology 2794 3539 +> 15 0 28 2684 topology 2732 3540 +> 16 0 28 2684 topology 2794 3540 +> 15 0 28 2684 topology 2731 3541 +> 16 0 28 2684 topology 2794 3541 +> 15 0 28 2684 topology 2735 3542 > 16 0 28 2684 topology 2794 3542 -> 15 0 29 2684 topology 2712 3543 -> 16 0 29 2684 topology 2714 3543 -> 15 0 29 2684 topology 2766 3544 -> 16 0 29 2684 topology 2768 3544 -> 15 0 29 2684 topology 2694 3545 -> 16 0 29 2684 topology 2695 3545 -> 15 0 29 2684 topology 2748 3546 -> 16 0 29 2684 topology 2749 3546 -> 15 0 29 2684 topology 2715 3547 -> 16 0 29 2684 topology 2717 3547 -> 15 0 28 2684 topology 2753 3548 +> 15 0 28 2684 topology 2734 3543 +> 16 0 28 2684 topology 2794 3543 +> 15 0 28 2684 topology 2738 3544 +> 16 0 28 2684 topology 2794 3544 +> 15 0 28 2684 topology 2737 3545 +> 16 0 28 2684 topology 2794 3545 +> 15 0 28 2684 topology 2741 3546 +> 16 0 28 2684 topology 2794 3546 +> 15 0 28 2684 topology 2740 3547 +> 16 0 28 2684 topology 2794 3547 +> 15 0 28 2684 topology 2744 3548 > 16 0 28 2684 topology 2794 3548 -> 15 0 29 2684 topology 2769 3549 -> 16 0 29 2684 topology 2771 3549 -> 15 0 29 2684 topology 2724 3550 -> 16 0 29 2684 topology 2725 3550 -> 15 0 28 2684 topology 2729 3551 +> 15 0 28 2684 topology 2743 3549 +> 16 0 28 2684 topology 2794 3549 +> 15 0 28 2684 topology 2747 3550 +> 16 0 28 2684 topology 2794 3550 +> 15 0 28 2684 topology 2746 3551 > 16 0 28 2684 topology 2794 3551 -> 15 0 29 2684 topology 2778 3552 -> 16 0 29 2684 topology 2779 3552 -> 15 0 28 2684 topology 2705 3553 +> 15 0 28 2684 topology 2750 3552 +> 16 0 28 2684 topology 2794 3552 +> 15 0 28 2684 topology 2749 3553 > 16 0 28 2684 topology 2794 3553 -> 15 0 29 2684 topology 2772 3554 -> 16 0 29 2684 topology 2774 3554 -> 15 0 29 2684 topology 2700 3555 -> 16 0 29 2684 topology 2701 3555 -> 15 0 29 2684 topology 2754 3556 -> 16 0 29 2684 topology 2755 3556 -> 15 0 28 2684 topology 2789 3557 +> 15 0 28 2684 topology 2753 3554 +> 16 0 28 2684 topology 2794 3554 +> 15 0 28 2684 topology 2752 3555 +> 16 0 28 2684 topology 2794 3555 +> 15 0 28 2684 topology 2756 3556 +> 16 0 28 2684 topology 2794 3556 +> 15 0 28 2684 topology 2755 3557 > 16 0 28 2684 topology 2794 3557 -> 15 0 28 2684 topology 2765 3558 +> 15 0 28 2684 topology 2759 3558 > 16 0 28 2684 topology 2794 3558 -> 15 0 29 2684 topology 2775 3559 -> 16 0 29 2684 topology 2777 3559 -> 15 0 29 2684 topology 2730 3560 -> 16 0 29 2684 topology 2731 3560 -> 15 0 28 2684 topology 2741 3561 +> 15 0 28 2684 topology 2758 3559 +> 16 0 28 2684 topology 2794 3559 +> 15 0 28 2684 topology 2762 3560 +> 16 0 28 2684 topology 2794 3560 +> 15 0 28 2684 topology 2761 3561 > 16 0 28 2684 topology 2794 3561 -> 15 0 29 2684 topology 2784 3562 -> 16 0 29 2684 topology 2785 3562 -> 15 0 28 2684 topology 2717 3563 +> 15 0 28 2684 topology 2765 3562 +> 16 0 28 2684 topology 2794 3562 +> 15 0 28 2684 topology 2764 3563 > 16 0 28 2684 topology 2794 3563 -> 15 0 29 2684 topology 2706 3564 -> 16 0 29 2684 topology 2707 3564 -> 15 0 29 2684 topology 2760 3565 -> 16 0 29 2684 topology 2761 3565 -> 15 0 28 2684 topology 2777 3566 +> 15 0 28 2684 topology 2768 3564 +> 16 0 28 2684 topology 2794 3564 +> 15 0 28 2684 topology 2767 3565 +> 16 0 28 2684 topology 2794 3565 +> 15 0 28 2684 topology 2771 3566 > 16 0 28 2684 topology 2794 3566 -> 15 0 29 2684 topology 2736 3567 -> 16 0 29 2684 topology 2737 3567 -> 15 0 29 2684 topology 2790 3568 -> 16 0 29 2684 topology 2791 3568 -> 15 0 29 2684 topology 2712 3569 -> 16 0 29 2684 topology 2713 3569 -> 15 0 29 2684 topology 2766 3570 -> 16 0 29 2684 topology 2767 3570 -> 15 0 28 2684 topology 2695 3571 +> 15 0 28 2684 topology 2770 3567 +> 16 0 28 2684 topology 2794 3567 +> 15 0 28 2684 topology 2774 3568 +> 16 0 28 2684 topology 2794 3568 +> 15 0 28 2684 topology 2773 3569 +> 16 0 28 2684 topology 2794 3569 +> 15 0 28 2684 topology 2777 3570 +> 16 0 28 2684 topology 2794 3570 +> 15 0 28 2684 topology 2776 3571 > 16 0 28 2684 topology 2794 3571 -> 15 0 28 2684 topology 2725 3572 +> 15 0 28 2684 topology 2780 3572 > 16 0 28 2684 topology 2794 3572 -> 15 0 29 2684 topology 2742 3573 -> 16 0 29 2684 topology 2743 3573 -> 15 0 28 2684 topology 2755 3574 +> 15 0 28 2684 topology 2779 3573 +> 16 0 28 2684 topology 2794 3573 +> 15 0 28 2684 topology 2783 3574 > 16 0 28 2684 topology 2794 3574 -> 15 0 29 2684 topology 2772 3575 -> 16 0 29 2684 topology 2773 3575 -> 15 0 28 2684 topology 2785 3576 +> 15 0 28 2684 topology 2782 3575 +> 16 0 28 2684 topology 2794 3575 +> 15 0 28 2684 topology 2786 3576 > 16 0 28 2684 topology 2794 3576 -> 15 0 28 2684 topology 2707 3577 +> 15 0 28 2684 topology 2785 3577 > 16 0 28 2684 topology 2794 3577 -> 15 0 28 2684 topology 2737 3578 +> 15 0 28 2684 topology 2789 3578 > 16 0 28 2684 topology 2794 3578 -> 15 0 28 2684 topology 2767 3579 +> 15 0 28 2684 topology 2788 3579 > 16 0 28 2684 topology 2794 3579 -> 15 0 28 2684 topology 2720 3580 +> 15 0 28 2684 topology 2792 3580 > 16 0 28 2684 topology 2794 3580 -> 15 0 28 2684 topology 2696 3581 +> 15 0 28 2684 topology 2791 3581 > 16 0 28 2684 topology 2794 3581 -> 15 0 28 2684 topology 2780 3582 -> 16 0 28 2684 topology 2794 3582 -> 15 0 28 2684 topology 2756 3583 -> 16 0 28 2684 topology 2794 3583 -> 15 0 28 2684 topology 2732 3584 -> 16 0 28 2684 topology 2794 3584 -> 15 0 28 2684 topology 2708 3585 -> 16 0 28 2684 topology 2794 3585 -> 15 0 28 2684 topology 2792 3586 -> 16 0 28 2684 topology 2794 3586 -> 15 0 28 2684 topology 2768 3587 -> 16 0 28 2684 topology 2794 3587 -> 15 0 28 2684 topology 2744 3588 -> 16 0 28 2684 topology 2794 3588 -> 15 0 28 2684 topology 2692 3589 -> 16 0 28 2684 topology 2794 3589 -> 15 0 28 2684 topology 2722 3590 -> 16 0 28 2684 topology 2794 3590 -> 15 0 28 2684 topology 2752 3591 -> 16 0 28 2684 topology 2794 3591 -> 15 0 28 2684 topology 2782 3592 -> 16 0 28 2684 topology 2794 3592 -> 15 0 28 2684 topology 2704 3593 -> 16 0 28 2684 topology 2794 3593 -> 15 0 29 2684 topology 2718 3594 -> 16 0 29 2684 topology 2720 3594 -> 15 0 28 2684 topology 2734 3595 -> 16 0 28 2684 topology 2794 3595 -> 15 0 28 2684 topology 2764 3596 -> 16 0 28 2684 topology 2794 3596 -> 15 0 28 2684 topology 2686 3597 -> 16 0 28 2684 topology 2794 3597 -> 15 0 29 2684 topology 2721 3598 -> 16 0 29 2684 topology 2723 3598 -> 15 0 28 2684 topology 2716 3599 -> 16 0 28 2684 topology 2794 3599 -> 15 0 29 2684 topology 2724 3600 -> 16 0 29 2684 topology 2726 3600 -> 15 0 28 2684 topology 2746 3601 -> 16 0 28 2684 topology 2794 3601 -> 15 0 29 2684 topology 2778 3602 -> 16 0 29 2684 topology 2780 3602 -> 15 0 28 2684 topology 2776 3603 -> 16 0 28 2684 topology 2794 3603 -> 15 0 29 2684 topology 2727 3604 -> 16 0 29 2684 topology 2729 3604 -> 15 0 29 2684 topology 2781 3605 -> 16 0 29 2684 topology 2783 3605 -> 15 0 29 2684 topology 2730 3606 -> 16 0 29 2684 topology 2732 3606 -> 15 0 29 2684 topology 2784 3607 -> 16 0 29 2684 topology 2786 3607 -> 15 0 29 2684 topology 2733 3608 -> 16 0 29 2684 topology 2735 3608 -> 15 0 29 2684 topology 2787 3609 -> 16 0 29 2684 topology 2789 3609 -> 15 0 29 2684 topology 2736 3610 -> 16 0 29 2684 topology 2738 3610 -> 15 0 29 2684 topology 2790 3611 -> 16 0 29 2684 topology 2792 3611 -> 15 0 29 2684 topology 2691 3612 -> 16 0 29 2684 topology 2692 3612 -> 15 0 29 2684 topology 2685 3613 -> 16 0 29 2684 topology 2687 3613 -> 15 0 29 2684 topology 2739 3614 -> 16 0 29 2684 topology 2741 3614 -> 15 0 29 2684 topology 2721 3615 -> 16 0 29 2684 topology 2722 3615 -> 15 0 28 2684 topology 2723 3616 -> 16 0 28 2684 topology 2794 3616 -> 15 0 28 2684 topology 2699 3617 -> 16 0 28 2684 topology 2794 3617 -> 15 0 29 2684 topology 2742 3618 -> 16 0 29 2684 topology 2744 3618 -> 15 0 29 2684 topology 2697 3619 -> 16 0 29 2684 topology 2698 3619 -> 15 0 29 2684 topology 2751 3620 -> 16 0 29 2684 topology 2752 3620 -> 15 0 28 2684 topology 2783 3621 -> 16 0 28 2684 topology 2794 3621 -> 15 0 29 2684 topology 2745 3622 -> 16 0 29 2684 topology 2747 3622 -> 15 0 28 2684 topology 2759 3623 -> 16 0 28 2684 topology 2794 3623 -> 15 0 29 2684 topology 2727 3624 -> 16 0 29 2684 topology 2728 3624 -> 15 0 28 2684 topology 2735 3625 -> 16 0 28 2684 topology 2794 3625 -> 15 0 29 2684 topology 2781 3626 -> 16 0 29 2684 topology 2782 3626 -> 15 0 28 2684 topology 2711 3627 -> 16 0 28 2684 topology 2794 3627 -> 15 0 28 2684 topology 2687 3628 -> 16 0 28 2684 topology 2794 3628 -> 15 0 29 2684 topology 2703 3629 -> 16 0 29 2684 topology 2704 3629 -> 15 0 29 2684 topology 2757 3630 -> 16 0 29 2684 topology 2758 3630 -> 15 0 28 2684 topology 2771 3631 -> 16 0 28 2684 topology 2794 3631 -> 15 0 29 2684 topology 2733 3632 -> 16 0 29 2684 topology 2734 3632 -> 15 0 28 2684 topology 2747 3633 -> 16 0 28 2684 topology 2794 3633 -> 15 0 29 2684 topology 2787 3634 -> 16 0 29 2684 topology 2788 3634 -> 15 0 29 2684 topology 2709 3635 -> 16 0 29 2684 topology 2710 3635 -> 15 0 29 2684 topology 2763 3636 -> 16 0 29 2684 topology 2764 3636 -> 15 0 28 2684 topology 2689 3637 -> 16 0 28 2684 topology 2794 3637 -> 15 0 29 2684 topology 2685 3638 -> 16 0 29 2684 topology 2686 3638 -> 15 0 28 2684 topology 2719 3639 -> 16 0 28 2684 topology 2794 3639 -> 15 0 29 2684 topology 2739 3640 -> 16 0 29 2684 topology 2740 3640 -> 15 0 28 2684 topology 2749 3641 -> 16 0 28 2684 topology 2794 3641 -> 15 0 29 2684 topology 2715 3642 -> 16 0 29 2684 topology 2716 3642 -> 15 0 29 2684 topology 2769 3643 -> 16 0 29 2684 topology 2770 3643 -> 15 0 28 2684 topology 2779 3644 -> 16 0 28 2684 topology 2794 3644 -> 15 0 28 2684 topology 2701 3645 -> 16 0 28 2684 topology 2794 3645 -> 15 0 28 2684 topology 2731 3646 -> 16 0 28 2684 topology 2794 3646 -> 15 0 29 2684 topology 2745 3647 -> 16 0 29 2684 topology 2746 3647 -> 15 0 28 2684 topology 2761 3648 -> 16 0 28 2684 topology 2794 3648 -> 15 0 29 2684 topology 2775 3649 -> 16 0 29 2684 topology 2776 3649 -> 15 0 28 2684 topology 2791 3650 -> 16 0 28 2684 topology 2794 3650 -> 15 0 28 2684 topology 2713 3651 -> 16 0 28 2684 topology 2794 3651 -> 15 0 28 2684 topology 2743 3652 -> 16 0 28 2684 topology 2794 3652 -> 15 0 28 2684 topology 2773 3653 -> 16 0 28 2684 topology 2794 3653 -> 15 0 28 2684 topology 2690 3654 -> 16 0 28 2684 topology 2794 3654 -> 15 0 29 2795 topology 2796 3655 -> 16 0 29 2795 topology 2798 3655 -> 15 0 29 2795 topology 2850 3656 -> 16 0 29 2795 topology 2852 3656 -> 15 0 29 2795 topology 2799 3657 -> 16 0 29 2795 topology 2801 3657 -> 15 0 29 2795 topology 2853 3658 -> 16 0 29 2795 topology 2855 3658 -> 15 0 29 2795 topology 2802 3659 -> 16 0 29 2795 topology 2804 3659 -> 15 0 29 2795 topology 2856 3660 -> 16 0 29 2795 topology 2858 3660 -> 15 0 29 2795 topology 2811 3661 -> 16 0 29 2795 topology 2812 3661 -> 15 0 28 2795 topology 2816 3662 +> 15 0 29 2684 topology 2793 3582 +> 16 0 29 2684 topology 2794 3582 +> 15 0 30 2684 topology 2685 3583 +> 16 0 30 2684 topology 2687 3583 +> 15 0 30 2684 topology 2685 3584 +> 16 0 30 2684 topology 2686 3584 +> 15 0 30 2684 topology 2688 3585 +> 16 0 30 2684 topology 2690 3585 +> 15 0 30 2684 topology 2688 3586 +> 16 0 30 2684 topology 2689 3586 +> 15 0 30 2684 topology 2691 3587 +> 16 0 30 2684 topology 2693 3587 +> 15 0 30 2684 topology 2691 3588 +> 16 0 30 2684 topology 2692 3588 +> 15 0 30 2684 topology 2694 3589 +> 16 0 30 2684 topology 2696 3589 +> 15 0 30 2684 topology 2694 3590 +> 16 0 30 2684 topology 2695 3590 +> 15 0 30 2684 topology 2697 3591 +> 16 0 30 2684 topology 2699 3591 +> 15 0 30 2684 topology 2697 3592 +> 16 0 30 2684 topology 2698 3592 +> 15 0 30 2684 topology 2700 3593 +> 16 0 30 2684 topology 2702 3593 +> 15 0 30 2684 topology 2700 3594 +> 16 0 30 2684 topology 2701 3594 +> 15 0 30 2684 topology 2703 3595 +> 16 0 30 2684 topology 2705 3595 +> 15 0 30 2684 topology 2703 3596 +> 16 0 30 2684 topology 2704 3596 +> 15 0 30 2684 topology 2706 3597 +> 16 0 30 2684 topology 2708 3597 +> 15 0 30 2684 topology 2706 3598 +> 16 0 30 2684 topology 2707 3598 +> 15 0 30 2684 topology 2709 3599 +> 16 0 30 2684 topology 2711 3599 +> 15 0 30 2684 topology 2709 3600 +> 16 0 30 2684 topology 2710 3600 +> 15 0 30 2684 topology 2712 3601 +> 16 0 30 2684 topology 2714 3601 +> 15 0 30 2684 topology 2712 3602 +> 16 0 30 2684 topology 2713 3602 +> 15 0 30 2684 topology 2715 3603 +> 16 0 30 2684 topology 2717 3603 +> 15 0 30 2684 topology 2715 3604 +> 16 0 30 2684 topology 2716 3604 +> 15 0 30 2684 topology 2718 3605 +> 16 0 30 2684 topology 2720 3605 +> 15 0 30 2684 topology 2718 3606 +> 16 0 30 2684 topology 2719 3606 +> 15 0 30 2684 topology 2721 3607 +> 16 0 30 2684 topology 2723 3607 +> 15 0 30 2684 topology 2721 3608 +> 16 0 30 2684 topology 2722 3608 +> 15 0 30 2684 topology 2724 3609 +> 16 0 30 2684 topology 2726 3609 +> 15 0 30 2684 topology 2724 3610 +> 16 0 30 2684 topology 2725 3610 +> 15 0 30 2684 topology 2727 3611 +> 16 0 30 2684 topology 2729 3611 +> 15 0 30 2684 topology 2727 3612 +> 16 0 30 2684 topology 2728 3612 +> 15 0 30 2684 topology 2730 3613 +> 16 0 30 2684 topology 2732 3613 +> 15 0 30 2684 topology 2730 3614 +> 16 0 30 2684 topology 2731 3614 +> 15 0 30 2684 topology 2733 3615 +> 16 0 30 2684 topology 2735 3615 +> 15 0 30 2684 topology 2733 3616 +> 16 0 30 2684 topology 2734 3616 +> 15 0 30 2684 topology 2736 3617 +> 16 0 30 2684 topology 2738 3617 +> 15 0 30 2684 topology 2736 3618 +> 16 0 30 2684 topology 2737 3618 +> 15 0 30 2684 topology 2739 3619 +> 16 0 30 2684 topology 2741 3619 +> 15 0 30 2684 topology 2739 3620 +> 16 0 30 2684 topology 2740 3620 +> 15 0 30 2684 topology 2742 3621 +> 16 0 30 2684 topology 2744 3621 +> 15 0 30 2684 topology 2742 3622 +> 16 0 30 2684 topology 2743 3622 +> 15 0 30 2684 topology 2745 3623 +> 16 0 30 2684 topology 2747 3623 +> 15 0 30 2684 topology 2745 3624 +> 16 0 30 2684 topology 2746 3624 +> 15 0 30 2684 topology 2748 3625 +> 16 0 30 2684 topology 2750 3625 +> 15 0 30 2684 topology 2748 3626 +> 16 0 30 2684 topology 2749 3626 +> 15 0 30 2684 topology 2751 3627 +> 16 0 30 2684 topology 2753 3627 +> 15 0 30 2684 topology 2751 3628 +> 16 0 30 2684 topology 2752 3628 +> 15 0 30 2684 topology 2754 3629 +> 16 0 30 2684 topology 2756 3629 +> 15 0 30 2684 topology 2754 3630 +> 16 0 30 2684 topology 2755 3630 +> 15 0 30 2684 topology 2757 3631 +> 16 0 30 2684 topology 2759 3631 +> 15 0 30 2684 topology 2757 3632 +> 16 0 30 2684 topology 2758 3632 +> 15 0 30 2684 topology 2760 3633 +> 16 0 30 2684 topology 2762 3633 +> 15 0 30 2684 topology 2760 3634 +> 16 0 30 2684 topology 2761 3634 +> 15 0 30 2684 topology 2763 3635 +> 16 0 30 2684 topology 2765 3635 +> 15 0 30 2684 topology 2763 3636 +> 16 0 30 2684 topology 2764 3636 +> 15 0 30 2684 topology 2766 3637 +> 16 0 30 2684 topology 2768 3637 +> 15 0 30 2684 topology 2766 3638 +> 16 0 30 2684 topology 2767 3638 +> 15 0 30 2684 topology 2769 3639 +> 16 0 30 2684 topology 2771 3639 +> 15 0 30 2684 topology 2769 3640 +> 16 0 30 2684 topology 2770 3640 +> 15 0 30 2684 topology 2772 3641 +> 16 0 30 2684 topology 2774 3641 +> 15 0 30 2684 topology 2772 3642 +> 16 0 30 2684 topology 2773 3642 +> 15 0 30 2684 topology 2775 3643 +> 16 0 30 2684 topology 2777 3643 +> 15 0 30 2684 topology 2775 3644 +> 16 0 30 2684 topology 2776 3644 +> 15 0 30 2684 topology 2778 3645 +> 16 0 30 2684 topology 2780 3645 +> 15 0 30 2684 topology 2778 3646 +> 16 0 30 2684 topology 2779 3646 +> 15 0 30 2684 topology 2781 3647 +> 16 0 30 2684 topology 2783 3647 +> 15 0 30 2684 topology 2781 3648 +> 16 0 30 2684 topology 2782 3648 +> 15 0 30 2684 topology 2784 3649 +> 16 0 30 2684 topology 2786 3649 +> 15 0 30 2684 topology 2784 3650 +> 16 0 30 2684 topology 2785 3650 +> 15 0 30 2684 topology 2787 3651 +> 16 0 30 2684 topology 2789 3651 +> 15 0 30 2684 topology 2787 3652 +> 16 0 30 2684 topology 2788 3652 +> 15 0 30 2684 topology 2790 3653 +> 16 0 30 2684 topology 2792 3653 +> 15 0 30 2684 topology 2790 3654 +> 16 0 30 2684 topology 2791 3654 +> 15 0 28 2795 topology 2798 3655 +> 16 0 28 2795 topology 2905 3655 +> 15 0 28 2795 topology 2797 3656 +> 16 0 28 2795 topology 2905 3656 +> 15 0 28 2795 topology 2801 3657 +> 16 0 28 2795 topology 2905 3657 +> 15 0 28 2795 topology 2800 3658 +> 16 0 28 2795 topology 2905 3658 +> 15 0 28 2795 topology 2804 3659 +> 16 0 28 2795 topology 2905 3659 +> 15 0 28 2795 topology 2803 3660 +> 16 0 28 2795 topology 2905 3660 +> 15 0 28 2795 topology 2807 3661 +> 16 0 28 2795 topology 2905 3661 +> 15 0 28 2795 topology 2806 3662 > 16 0 28 2795 topology 2905 3662 -> 15 0 29 2795 topology 2805 3663 -> 16 0 29 2795 topology 2807 3663 -> 15 0 29 2795 topology 2859 3664 -> 16 0 29 2795 topology 2861 3664 -> 15 0 29 2795 topology 2841 3665 -> 16 0 29 2795 topology 2842 3665 -> 15 0 28 2795 topology 2876 3666 +> 15 0 28 2795 topology 2810 3663 +> 16 0 28 2795 topology 2905 3663 +> 15 0 28 2795 topology 2809 3664 +> 16 0 28 2795 topology 2905 3664 +> 15 0 28 2795 topology 2813 3665 +> 16 0 28 2795 topology 2905 3665 +> 15 0 28 2795 topology 2812 3666 > 16 0 28 2795 topology 2905 3666 -> 15 0 29 2795 topology 2808 3667 -> 16 0 29 2795 topology 2810 3667 -> 15 0 28 2795 topology 2852 3668 +> 15 0 28 2795 topology 2816 3667 +> 16 0 28 2795 topology 2905 3667 +> 15 0 28 2795 topology 2815 3668 > 16 0 28 2795 topology 2905 3668 -> 15 0 29 2795 topology 2862 3669 -> 16 0 29 2795 topology 2864 3669 -> 15 0 29 2795 topology 2817 3670 -> 16 0 29 2795 topology 2818 3670 -> 15 0 28 2795 topology 2828 3671 +> 15 0 28 2795 topology 2819 3669 +> 16 0 28 2795 topology 2905 3669 +> 15 0 28 2795 topology 2818 3670 +> 16 0 28 2795 topology 2905 3670 +> 15 0 28 2795 topology 2822 3671 > 16 0 28 2795 topology 2905 3671 -> 15 0 29 2795 topology 2871 3672 -> 16 0 29 2795 topology 2872 3672 -> 15 0 28 2795 topology 2804 3673 +> 15 0 28 2795 topology 2821 3672 +> 16 0 28 2795 topology 2905 3672 +> 15 0 28 2795 topology 2825 3673 > 16 0 28 2795 topology 2905 3673 -> 15 0 29 2795 topology 2865 3674 -> 16 0 29 2795 topology 2867 3674 -> 15 0 29 2795 topology 2847 3675 -> 16 0 29 2795 topology 2848 3675 -> 15 0 28 2795 topology 2888 3676 +> 15 0 28 2795 topology 2824 3674 +> 16 0 28 2795 topology 2905 3674 +> 15 0 28 2795 topology 2828 3675 +> 16 0 28 2795 topology 2905 3675 +> 15 0 28 2795 topology 2827 3676 > 16 0 28 2795 topology 2905 3676 -> 15 0 29 2795 topology 2901 3677 -> 16 0 29 2795 topology 2902 3677 -> 15 0 28 2795 topology 2864 3678 +> 15 0 28 2795 topology 2831 3677 +> 16 0 28 2795 topology 2905 3677 +> 15 0 28 2795 topology 2830 3678 > 16 0 28 2795 topology 2905 3678 -> 15 0 29 2795 topology 2868 3679 -> 16 0 29 2795 topology 2870 3679 -> 15 0 29 2795 topology 2823 3680 -> 16 0 29 2795 topology 2824 3680 -> 15 0 28 2795 topology 2840 3681 +> 15 0 28 2795 topology 2834 3679 +> 16 0 28 2795 topology 2905 3679 +> 15 0 28 2795 topology 2833 3680 +> 16 0 28 2795 topology 2905 3680 +> 15 0 28 2795 topology 2837 3681 > 16 0 28 2795 topology 2905 3681 -> 15 0 29 2795 topology 2877 3682 -> 16 0 29 2795 topology 2878 3682 -> 15 0 29 2795 topology 2799 3683 -> 16 0 29 2795 topology 2800 3683 -> 15 0 29 2795 topology 2853 3684 -> 16 0 29 2795 topology 2854 3684 -> 15 0 28 2795 topology 2900 3685 +> 15 0 28 2795 topology 2836 3682 +> 16 0 28 2795 topology 2905 3682 +> 15 0 28 2795 topology 2840 3683 +> 16 0 28 2795 topology 2905 3683 +> 15 0 28 2795 topology 2839 3684 +> 16 0 28 2795 topology 2905 3684 +> 15 0 28 2795 topology 2843 3685 > 16 0 28 2795 topology 2905 3685 -> 15 0 29 2795 topology 2829 3686 -> 16 0 29 2795 topology 2830 3686 -> 15 0 29 2795 topology 2883 3687 -> 16 0 29 2795 topology 2884 3687 -> 15 0 29 2795 topology 2805 3688 -> 16 0 29 2795 topology 2806 3688 -> 15 0 28 2795 topology 2818 3689 +> 15 0 28 2795 topology 2842 3686 +> 16 0 28 2795 topology 2905 3686 +> 15 0 28 2795 topology 2846 3687 +> 16 0 28 2795 topology 2905 3687 +> 15 0 28 2795 topology 2845 3688 +> 16 0 28 2795 topology 2905 3688 +> 15 0 28 2795 topology 2849 3689 > 16 0 28 2795 topology 2905 3689 -> 15 0 29 2795 topology 2859 3690 -> 16 0 29 2795 topology 2860 3690 -> 15 0 28 2795 topology 2848 3691 +> 15 0 28 2795 topology 2848 3690 +> 16 0 28 2795 topology 2905 3690 +> 15 0 28 2795 topology 2852 3691 > 16 0 28 2795 topology 2905 3691 -> 15 0 29 2795 topology 2835 3692 -> 16 0 29 2795 topology 2836 3692 -> 15 0 28 2795 topology 2878 3693 +> 15 0 28 2795 topology 2851 3692 +> 16 0 28 2795 topology 2905 3692 +> 15 0 28 2795 topology 2855 3693 > 16 0 28 2795 topology 2905 3693 -> 15 0 29 2795 topology 2889 3694 -> 16 0 29 2795 topology 2890 3694 -> 15 0 28 2795 topology 2800 3695 +> 15 0 28 2795 topology 2854 3694 +> 16 0 28 2795 topology 2905 3694 +> 15 0 28 2795 topology 2858 3695 > 16 0 28 2795 topology 2905 3695 -> 15 0 28 2795 topology 2830 3696 +> 15 0 28 2795 topology 2857 3696 > 16 0 28 2795 topology 2905 3696 -> 15 0 29 2795 topology 2865 3697 -> 16 0 29 2795 topology 2866 3697 +> 15 0 28 2795 topology 2861 3697 +> 16 0 28 2795 topology 2905 3697 > 15 0 28 2795 topology 2860 3698 > 16 0 28 2795 topology 2905 3698 -> 15 0 28 2795 topology 2890 3699 +> 15 0 28 2795 topology 2864 3699 > 16 0 28 2795 topology 2905 3699 -> 15 0 29 2795 topology 2895 3700 -> 16 0 29 2795 topology 2896 3700 -> 15 0 28 2795 topology 2843 3701 +> 15 0 28 2795 topology 2863 3700 +> 16 0 28 2795 topology 2905 3700 +> 15 0 28 2795 topology 2867 3701 > 16 0 28 2795 topology 2905 3701 -> 15 0 28 2795 topology 2819 3702 +> 15 0 28 2795 topology 2866 3702 > 16 0 28 2795 topology 2905 3702 -> 15 0 28 2795 topology 2903 3703 +> 15 0 28 2795 topology 2870 3703 > 16 0 28 2795 topology 2905 3703 -> 15 0 28 2795 topology 2879 3704 +> 15 0 28 2795 topology 2869 3704 > 16 0 28 2795 topology 2905 3704 -> 15 0 28 2795 topology 2855 3705 +> 15 0 28 2795 topology 2873 3705 > 16 0 28 2795 topology 2905 3705 -> 15 0 28 2795 topology 2831 3706 +> 15 0 28 2795 topology 2872 3706 > 16 0 28 2795 topology 2905 3706 -> 15 0 28 2795 topology 2807 3707 +> 15 0 28 2795 topology 2876 3707 > 16 0 28 2795 topology 2905 3707 -> 15 0 28 2795 topology 2891 3708 +> 15 0 28 2795 topology 2875 3708 > 16 0 28 2795 topology 2905 3708 -> 15 0 28 2795 topology 2867 3709 +> 15 0 28 2795 topology 2879 3709 > 16 0 28 2795 topology 2905 3709 -> 15 0 28 2795 topology 2815 3710 +> 15 0 28 2795 topology 2878 3710 > 16 0 28 2795 topology 2905 3710 -> 15 0 28 2795 topology 2845 3711 +> 15 0 28 2795 topology 2882 3711 > 16 0 28 2795 topology 2905 3711 -> 15 0 28 2795 topology 2875 3712 +> 15 0 28 2795 topology 2881 3712 > 16 0 28 2795 topology 2905 3712 -> 15 0 28 2795 topology 2797 3713 +> 15 0 28 2795 topology 2885 3713 > 16 0 28 2795 topology 2905 3713 -> 15 0 30 2795 topology 2904 3714 -> 16 0 30 2795 topology 2905 3714 -> 15 0 28 2795 topology 2827 3715 +> 15 0 28 2795 topology 2884 3714 +> 16 0 28 2795 topology 2905 3714 +> 15 0 28 2795 topology 2888 3715 > 16 0 28 2795 topology 2905 3715 -> 15 0 28 2795 topology 2857 3716 +> 15 0 28 2795 topology 2887 3716 > 16 0 28 2795 topology 2905 3716 -> 15 0 29 2795 topology 2811 3717 -> 16 0 29 2795 topology 2813 3717 -> 15 0 28 2795 topology 2887 3718 +> 15 0 28 2795 topology 2891 3717 +> 16 0 28 2795 topology 2905 3717 +> 15 0 28 2795 topology 2890 3718 > 16 0 28 2795 topology 2905 3718 -> 15 0 28 2795 topology 2809 3719 +> 15 0 28 2795 topology 2894 3719 > 16 0 28 2795 topology 2905 3719 -> 15 0 29 2795 topology 2814 3720 -> 16 0 29 2795 topology 2816 3720 -> 15 0 28 2795 topology 2839 3721 +> 15 0 28 2795 topology 2893 3720 +> 16 0 28 2795 topology 2905 3720 +> 15 0 28 2795 topology 2897 3721 > 16 0 28 2795 topology 2905 3721 -> 15 0 28 2795 topology 2869 3722 +> 15 0 28 2795 topology 2896 3722 > 16 0 28 2795 topology 2905 3722 -> 15 0 29 2795 topology 2817 3723 -> 16 0 29 2795 topology 2819 3723 -> 15 0 29 2795 topology 2871 3724 -> 16 0 29 2795 topology 2873 3724 -> 15 0 28 2795 topology 2899 3725 +> 15 0 28 2795 topology 2900 3723 +> 16 0 28 2795 topology 2905 3723 +> 15 0 28 2795 topology 2899 3724 +> 16 0 28 2795 topology 2905 3724 +> 15 0 28 2795 topology 2903 3725 > 16 0 28 2795 topology 2905 3725 -> 15 0 29 2795 topology 2820 3726 -> 16 0 29 2795 topology 2822 3726 -> 15 0 29 2795 topology 2874 3727 -> 16 0 29 2795 topology 2876 3727 -> 15 0 29 2795 topology 2823 3728 -> 16 0 29 2795 topology 2825 3728 -> 15 0 29 2795 topology 2877 3729 -> 16 0 29 2795 topology 2879 3729 -> 15 0 29 2795 topology 2826 3730 -> 16 0 29 2795 topology 2828 3730 -> 15 0 29 2795 topology 2880 3731 -> 16 0 29 2795 topology 2882 3731 -> 15 0 29 2795 topology 2829 3732 -> 16 0 29 2795 topology 2831 3732 -> 15 0 29 2795 topology 2883 3733 -> 16 0 29 2795 topology 2885 3733 -> 15 0 29 2795 topology 2832 3734 -> 16 0 29 2795 topology 2834 3734 -> 15 0 28 2795 topology 2846 3735 -> 16 0 28 2795 topology 2905 3735 -> 15 0 29 2795 topology 2886 3736 -> 16 0 29 2795 topology 2888 3736 -> 15 0 29 2795 topology 2814 3737 -> 16 0 29 2795 topology 2815 3737 -> 15 0 28 2795 topology 2822 3738 -> 16 0 28 2795 topology 2905 3738 -> 15 0 28 2795 topology 2798 3739 -> 16 0 28 2795 topology 2905 3739 -> 15 0 29 2795 topology 2835 3740 -> 16 0 29 2795 topology 2837 3740 -> 15 0 29 2795 topology 2889 3741 -> 16 0 29 2795 topology 2891 3741 -> 15 0 29 2795 topology 2844 3742 -> 16 0 29 2795 topology 2845 3742 -> 15 0 28 2795 topology 2882 3743 -> 16 0 28 2795 topology 2905 3743 -> 15 0 29 2795 topology 2838 3744 -> 16 0 29 2795 topology 2840 3744 -> 15 0 28 2795 topology 2858 3745 -> 16 0 28 2795 topology 2905 3745 -> 15 0 29 2795 topology 2892 3746 -> 16 0 29 2795 topology 2894 3746 -> 15 0 29 2795 topology 2820 3747 -> 16 0 29 2795 topology 2821 3747 -> 15 0 28 2795 topology 2834 3748 -> 16 0 28 2795 topology 2905 3748 -> 15 0 29 2795 topology 2874 3749 -> 16 0 29 2795 topology 2875 3749 -> 15 0 28 2795 topology 2810 3750 -> 16 0 28 2795 topology 2905 3750 -> 15 0 29 2795 topology 2895 3751 -> 16 0 29 2795 topology 2897 3751 -> 15 0 29 2795 topology 2796 3752 -> 16 0 29 2795 topology 2797 3752 -> 15 0 29 2795 topology 2850 3753 -> 16 0 29 2795 topology 2851 3753 -> 15 0 28 2795 topology 2894 3754 -> 16 0 28 2795 topology 2905 3754 -> 15 0 28 2795 topology 2870 3755 -> 16 0 28 2795 topology 2905 3755 -> 15 0 29 2795 topology 2898 3756 -> 16 0 29 2795 topology 2900 3756 -> 15 0 29 2795 topology 2826 3757 -> 16 0 29 2795 topology 2827 3757 -> 15 0 29 2795 topology 2880 3758 -> 16 0 29 2795 topology 2881 3758 -> 15 0 29 2795 topology 2802 3759 -> 16 0 29 2795 topology 2803 3759 -> 15 0 28 2795 topology 2812 3760 -> 16 0 28 2795 topology 2905 3760 -> 15 0 29 2795 topology 2856 3761 -> 16 0 29 2795 topology 2857 3761 -> 15 0 28 2795 topology 2842 3762 -> 16 0 28 2795 topology 2905 3762 -> 15 0 29 2795 topology 2832 3763 -> 16 0 29 2795 topology 2833 3763 -> 15 0 28 2795 topology 2872 3764 -> 16 0 28 2795 topology 2905 3764 -> 15 0 29 2795 topology 2886 3765 -> 16 0 29 2795 topology 2887 3765 -> 15 0 28 2795 topology 2902 3766 -> 16 0 28 2795 topology 2905 3766 -> 15 0 29 2795 topology 2808 3767 -> 16 0 29 2795 topology 2809 3767 -> 15 0 28 2795 topology 2824 3768 -> 16 0 28 2795 topology 2905 3768 -> 15 0 29 2795 topology 2862 3769 -> 16 0 29 2795 topology 2863 3769 -> 15 0 28 2795 topology 2854 3770 -> 16 0 28 2795 topology 2905 3770 -> 15 0 29 2795 topology 2838 3771 -> 16 0 29 2795 topology 2839 3771 -> 15 0 28 2795 topology 2884 3772 -> 16 0 28 2795 topology 2905 3772 -> 15 0 29 2795 topology 2892 3773 -> 16 0 29 2795 topology 2893 3773 -> 15 0 28 2795 topology 2806 3774 -> 16 0 28 2795 topology 2905 3774 -> 15 0 28 2795 topology 2836 3775 -> 16 0 28 2795 topology 2905 3775 -> 15 0 29 2795 topology 2868 3776 -> 16 0 29 2795 topology 2869 3776 -> 15 0 28 2795 topology 2866 3777 -> 16 0 28 2795 topology 2905 3777 -> 15 0 28 2795 topology 2896 3778 -> 16 0 28 2795 topology 2905 3778 -> 15 0 29 2795 topology 2898 3779 -> 16 0 29 2795 topology 2899 3779 -> 15 0 28 2795 topology 2813 3780 -> 16 0 28 2795 topology 2905 3780 -> 15 0 28 2795 topology 2873 3781 -> 16 0 28 2795 topology 2905 3781 -> 15 0 28 2795 topology 2849 3782 -> 16 0 28 2795 topology 2905 3782 -> 15 0 28 2795 topology 2825 3783 -> 16 0 28 2795 topology 2905 3783 -> 15 0 28 2795 topology 2801 3784 -> 16 0 28 2795 topology 2905 3784 -> 15 0 28 2795 topology 2885 3785 -> 16 0 28 2795 topology 2905 3785 -> 15 0 28 2795 topology 2861 3786 -> 16 0 28 2795 topology 2905 3786 -> 15 0 28 2795 topology 2837 3787 -> 16 0 28 2795 topology 2905 3787 -> 15 0 28 2795 topology 2897 3788 -> 16 0 28 2795 topology 2905 3788 -> 15 0 28 2795 topology 2821 3789 -> 16 0 28 2795 topology 2905 3789 -> 15 0 28 2795 topology 2851 3790 -> 16 0 28 2795 topology 2905 3790 -> 15 0 28 2795 topology 2881 3791 -> 16 0 28 2795 topology 2905 3791 -> 15 0 28 2795 topology 2803 3792 -> 16 0 28 2795 topology 2905 3792 -> 15 0 28 2795 topology 2833 3793 -> 16 0 28 2795 topology 2905 3793 -> 15 0 28 2795 topology 2863 3794 -> 16 0 28 2795 topology 2905 3794 -> 15 0 29 2795 topology 2841 3795 -> 16 0 29 2795 topology 2843 3795 -> 15 0 28 2795 topology 2893 3796 -> 16 0 28 2795 topology 2905 3796 -> 15 0 29 2795 topology 2844 3797 -> 16 0 29 2795 topology 2846 3797 -> 15 0 29 2795 topology 2847 3798 -> 16 0 29 2795 topology 2849 3798 -> 15 0 29 2795 topology 2901 3799 -> 16 0 29 2795 topology 2903 3799 -> 15 0 28 2906 topology 2933 3800 +> 15 0 28 2795 topology 2902 3726 +> 16 0 28 2795 topology 2905 3726 +> 15 0 29 2795 topology 2904 3727 +> 16 0 29 2795 topology 2905 3727 +> 15 0 30 2795 topology 2796 3728 +> 16 0 30 2795 topology 2798 3728 +> 15 0 30 2795 topology 2796 3729 +> 16 0 30 2795 topology 2797 3729 +> 15 0 30 2795 topology 2799 3730 +> 16 0 30 2795 topology 2801 3730 +> 15 0 30 2795 topology 2799 3731 +> 16 0 30 2795 topology 2800 3731 +> 15 0 30 2795 topology 2802 3732 +> 16 0 30 2795 topology 2804 3732 +> 15 0 30 2795 topology 2802 3733 +> 16 0 30 2795 topology 2803 3733 +> 15 0 30 2795 topology 2805 3734 +> 16 0 30 2795 topology 2807 3734 +> 15 0 30 2795 topology 2805 3735 +> 16 0 30 2795 topology 2806 3735 +> 15 0 30 2795 topology 2808 3736 +> 16 0 30 2795 topology 2810 3736 +> 15 0 30 2795 topology 2808 3737 +> 16 0 30 2795 topology 2809 3737 +> 15 0 30 2795 topology 2811 3738 +> 16 0 30 2795 topology 2813 3738 +> 15 0 30 2795 topology 2811 3739 +> 16 0 30 2795 topology 2812 3739 +> 15 0 30 2795 topology 2814 3740 +> 16 0 30 2795 topology 2816 3740 +> 15 0 30 2795 topology 2814 3741 +> 16 0 30 2795 topology 2815 3741 +> 15 0 30 2795 topology 2817 3742 +> 16 0 30 2795 topology 2819 3742 +> 15 0 30 2795 topology 2817 3743 +> 16 0 30 2795 topology 2818 3743 +> 15 0 30 2795 topology 2820 3744 +> 16 0 30 2795 topology 2822 3744 +> 15 0 30 2795 topology 2820 3745 +> 16 0 30 2795 topology 2821 3745 +> 15 0 30 2795 topology 2823 3746 +> 16 0 30 2795 topology 2825 3746 +> 15 0 30 2795 topology 2823 3747 +> 16 0 30 2795 topology 2824 3747 +> 15 0 30 2795 topology 2826 3748 +> 16 0 30 2795 topology 2828 3748 +> 15 0 30 2795 topology 2826 3749 +> 16 0 30 2795 topology 2827 3749 +> 15 0 30 2795 topology 2829 3750 +> 16 0 30 2795 topology 2831 3750 +> 15 0 30 2795 topology 2829 3751 +> 16 0 30 2795 topology 2830 3751 +> 15 0 30 2795 topology 2832 3752 +> 16 0 30 2795 topology 2834 3752 +> 15 0 30 2795 topology 2832 3753 +> 16 0 30 2795 topology 2833 3753 +> 15 0 30 2795 topology 2835 3754 +> 16 0 30 2795 topology 2837 3754 +> 15 0 30 2795 topology 2835 3755 +> 16 0 30 2795 topology 2836 3755 +> 15 0 30 2795 topology 2838 3756 +> 16 0 30 2795 topology 2840 3756 +> 15 0 30 2795 topology 2838 3757 +> 16 0 30 2795 topology 2839 3757 +> 15 0 30 2795 topology 2841 3758 +> 16 0 30 2795 topology 2843 3758 +> 15 0 30 2795 topology 2841 3759 +> 16 0 30 2795 topology 2842 3759 +> 15 0 30 2795 topology 2844 3760 +> 16 0 30 2795 topology 2846 3760 +> 15 0 30 2795 topology 2844 3761 +> 16 0 30 2795 topology 2845 3761 +> 15 0 30 2795 topology 2847 3762 +> 16 0 30 2795 topology 2849 3762 +> 15 0 30 2795 topology 2847 3763 +> 16 0 30 2795 topology 2848 3763 +> 15 0 30 2795 topology 2850 3764 +> 16 0 30 2795 topology 2852 3764 +> 15 0 30 2795 topology 2850 3765 +> 16 0 30 2795 topology 2851 3765 +> 15 0 30 2795 topology 2853 3766 +> 16 0 30 2795 topology 2855 3766 +> 15 0 30 2795 topology 2853 3767 +> 16 0 30 2795 topology 2854 3767 +> 15 0 30 2795 topology 2856 3768 +> 16 0 30 2795 topology 2858 3768 +> 15 0 30 2795 topology 2856 3769 +> 16 0 30 2795 topology 2857 3769 +> 15 0 30 2795 topology 2859 3770 +> 16 0 30 2795 topology 2861 3770 +> 15 0 30 2795 topology 2859 3771 +> 16 0 30 2795 topology 2860 3771 +> 15 0 30 2795 topology 2862 3772 +> 16 0 30 2795 topology 2864 3772 +> 15 0 30 2795 topology 2862 3773 +> 16 0 30 2795 topology 2863 3773 +> 15 0 30 2795 topology 2865 3774 +> 16 0 30 2795 topology 2867 3774 +> 15 0 30 2795 topology 2865 3775 +> 16 0 30 2795 topology 2866 3775 +> 15 0 30 2795 topology 2868 3776 +> 16 0 30 2795 topology 2870 3776 +> 15 0 30 2795 topology 2868 3777 +> 16 0 30 2795 topology 2869 3777 +> 15 0 30 2795 topology 2871 3778 +> 16 0 30 2795 topology 2873 3778 +> 15 0 30 2795 topology 2871 3779 +> 16 0 30 2795 topology 2872 3779 +> 15 0 30 2795 topology 2874 3780 +> 16 0 30 2795 topology 2876 3780 +> 15 0 30 2795 topology 2874 3781 +> 16 0 30 2795 topology 2875 3781 +> 15 0 30 2795 topology 2877 3782 +> 16 0 30 2795 topology 2879 3782 +> 15 0 30 2795 topology 2877 3783 +> 16 0 30 2795 topology 2878 3783 +> 15 0 30 2795 topology 2880 3784 +> 16 0 30 2795 topology 2882 3784 +> 15 0 30 2795 topology 2880 3785 +> 16 0 30 2795 topology 2881 3785 +> 15 0 30 2795 topology 2883 3786 +> 16 0 30 2795 topology 2885 3786 +> 15 0 30 2795 topology 2883 3787 +> 16 0 30 2795 topology 2884 3787 +> 15 0 30 2795 topology 2886 3788 +> 16 0 30 2795 topology 2888 3788 +> 15 0 30 2795 topology 2886 3789 +> 16 0 30 2795 topology 2887 3789 +> 15 0 30 2795 topology 2889 3790 +> 16 0 30 2795 topology 2891 3790 +> 15 0 30 2795 topology 2889 3791 +> 16 0 30 2795 topology 2890 3791 +> 15 0 30 2795 topology 2892 3792 +> 16 0 30 2795 topology 2894 3792 +> 15 0 30 2795 topology 2892 3793 +> 16 0 30 2795 topology 2893 3793 +> 15 0 30 2795 topology 2895 3794 +> 16 0 30 2795 topology 2897 3794 +> 15 0 30 2795 topology 2895 3795 +> 16 0 30 2795 topology 2896 3795 +> 15 0 30 2795 topology 2898 3796 +> 16 0 30 2795 topology 2900 3796 +> 15 0 30 2795 topology 2898 3797 +> 16 0 30 2795 topology 2899 3797 +> 15 0 30 2795 topology 2901 3798 +> 16 0 30 2795 topology 2903 3798 +> 15 0 30 2795 topology 2901 3799 +> 16 0 30 2795 topology 2902 3799 +> 15 0 28 2906 topology 2909 3800 > 16 0 28 2906 topology 2980 3800 -> 15 0 28 2906 topology 2969 3801 +> 15 0 28 2906 topology 2908 3801 > 16 0 28 2906 topology 2980 3801 -> 15 0 28 2906 topology 2945 3802 +> 15 0 28 2906 topology 2912 3802 > 16 0 28 2906 topology 2980 3802 -> 15 0 28 2906 topology 2957 3803 +> 15 0 28 2906 topology 2911 3803 > 16 0 28 2906 topology 2980 3803 -> 15 0 28 2906 topology 2918 3804 +> 15 0 28 2906 topology 2915 3804 > 16 0 28 2906 topology 2980 3804 -> 15 0 29 2906 topology 2928 3805 -> 16 0 29 2906 topology 2930 3805 -> 15 0 28 2906 topology 2935 3806 +> 15 0 28 2906 topology 2914 3805 +> 16 0 28 2906 topology 2980 3805 +> 15 0 28 2906 topology 2918 3806 > 16 0 28 2906 topology 2980 3806 -> 15 0 28 2906 topology 2965 3807 +> 15 0 28 2906 topology 2917 3807 > 16 0 28 2906 topology 2980 3807 -> 15 0 29 2906 topology 2931 3808 -> 16 0 29 2906 topology 2933 3808 -> 15 0 29 2906 topology 2934 3809 -> 16 0 29 2906 topology 2936 3809 -> 15 0 28 2906 topology 2947 3810 +> 15 0 28 2906 topology 2921 3808 +> 16 0 28 2906 topology 2980 3808 +> 15 0 28 2906 topology 2920 3809 +> 16 0 28 2906 topology 2980 3809 +> 15 0 28 2906 topology 2924 3810 > 16 0 28 2906 topology 2980 3810 -> 15 0 28 2906 topology 2977 3811 +> 15 0 28 2906 topology 2923 3811 > 16 0 28 2906 topology 2980 3811 -> 15 0 29 2906 topology 2937 3812 -> 16 0 29 2906 topology 2939 3812 -> 15 0 29 2906 topology 2940 3813 -> 16 0 29 2906 topology 2942 3813 -> 15 0 29 2906 topology 2943 3814 -> 16 0 29 2906 topology 2945 3814 -> 15 0 28 2906 topology 2914 3815 +> 15 0 28 2906 topology 2927 3812 +> 16 0 28 2906 topology 2980 3812 +> 15 0 28 2906 topology 2926 3813 +> 16 0 28 2906 topology 2980 3813 +> 15 0 28 2906 topology 2930 3814 +> 16 0 28 2906 topology 2980 3814 +> 15 0 28 2906 topology 2929 3815 > 16 0 28 2906 topology 2980 3815 -> 15 0 29 2906 topology 2946 3816 -> 16 0 29 2906 topology 2948 3816 -> 15 0 29 2906 topology 2928 3817 -> 16 0 29 2906 topology 2929 3817 -> 15 0 29 2906 topology 2949 3818 -> 16 0 29 2906 topology 2951 3818 -> 15 0 28 2906 topology 2926 3819 +> 15 0 28 2906 topology 2933 3816 +> 16 0 28 2906 topology 2980 3816 +> 15 0 28 2906 topology 2932 3817 +> 16 0 28 2906 topology 2980 3817 +> 15 0 28 2906 topology 2936 3818 +> 16 0 28 2906 topology 2980 3818 +> 15 0 28 2906 topology 2935 3819 > 16 0 28 2906 topology 2980 3819 -> 15 0 29 2906 topology 2958 3820 -> 16 0 29 2906 topology 2959 3820 -> 15 0 29 2906 topology 2952 3821 -> 16 0 29 2906 topology 2954 3821 -> 15 0 29 2906 topology 2934 3822 -> 16 0 29 2906 topology 2935 3822 -> 15 0 29 2906 topology 2955 3823 -> 16 0 29 2906 topology 2957 3823 -> 15 0 28 2906 topology 2960 3824 +> 15 0 28 2906 topology 2939 3820 +> 16 0 28 2906 topology 2980 3820 +> 15 0 28 2906 topology 2938 3821 +> 16 0 28 2906 topology 2980 3821 +> 15 0 28 2906 topology 2942 3822 +> 16 0 28 2906 topology 2980 3822 +> 15 0 28 2906 topology 2941 3823 +> 16 0 28 2906 topology 2980 3823 +> 15 0 28 2906 topology 2945 3824 > 16 0 28 2906 topology 2980 3824 -> 15 0 28 2906 topology 2936 3825 +> 15 0 28 2906 topology 2944 3825 > 16 0 28 2906 topology 2980 3825 -> 15 0 29 2906 topology 2964 3826 -> 16 0 29 2906 topology 2965 3826 -> 15 0 29 2906 topology 2940 3827 -> 16 0 29 2906 topology 2941 3827 -> 15 0 28 2906 topology 2972 3828 +> 15 0 28 2906 topology 2948 3826 +> 16 0 28 2906 topology 2980 3826 +> 15 0 28 2906 topology 2947 3827 +> 16 0 28 2906 topology 2980 3827 +> 15 0 28 2906 topology 2951 3828 > 16 0 28 2906 topology 2980 3828 -> 15 0 28 2906 topology 2948 3829 +> 15 0 28 2906 topology 2950 3829 > 16 0 28 2906 topology 2980 3829 -> 15 0 29 2906 topology 2970 3830 -> 16 0 29 2906 topology 2971 3830 -> 15 0 29 2906 topology 2946 3831 -> 16 0 29 2906 topology 2947 3831 -> 15 0 29 2906 topology 2976 3832 -> 16 0 29 2906 topology 2977 3832 -> 15 0 28 2906 topology 2909 3833 +> 15 0 28 2906 topology 2954 3830 +> 16 0 28 2906 topology 2980 3830 +> 15 0 28 2906 topology 2953 3831 +> 16 0 28 2906 topology 2980 3831 +> 15 0 28 2906 topology 2957 3832 +> 16 0 28 2906 topology 2980 3832 +> 15 0 28 2906 topology 2956 3833 > 16 0 28 2906 topology 2980 3833 -> 15 0 29 2906 topology 2952 3834 -> 16 0 29 2906 topology 2953 3834 -> 15 0 28 2906 topology 2932 3835 +> 15 0 28 2906 topology 2960 3834 +> 16 0 28 2906 topology 2980 3834 +> 15 0 28 2906 topology 2959 3835 > 16 0 28 2906 topology 2980 3835 -> 15 0 28 2906 topology 2921 3836 +> 15 0 28 2906 topology 2963 3836 > 16 0 28 2906 topology 2980 3836 > 15 0 28 2906 topology 2962 3837 > 16 0 28 2906 topology 2980 3837 -> 15 0 29 2906 topology 2907 3838 -> 16 0 29 2906 topology 2908 3838 -> 15 0 28 2906 topology 2944 3839 +> 15 0 28 2906 topology 2966 3838 +> 16 0 28 2906 topology 2980 3838 +> 15 0 28 2906 topology 2965 3839 > 16 0 28 2906 topology 2980 3839 -> 15 0 28 2906 topology 2974 3840 +> 15 0 28 2906 topology 2969 3840 > 16 0 28 2906 topology 2980 3840 -> 15 0 29 2906 topology 2913 3841 -> 16 0 29 2906 topology 2914 3841 -> 15 0 28 2906 topology 2956 3842 +> 15 0 28 2906 topology 2968 3841 +> 16 0 28 2906 topology 2980 3841 +> 15 0 28 2906 topology 2972 3842 > 16 0 28 2906 topology 2980 3842 -> 15 0 28 2906 topology 2911 3843 +> 15 0 28 2906 topology 2971 3843 > 16 0 28 2906 topology 2980 3843 -> 15 0 29 2906 topology 2919 3844 -> 16 0 29 2906 topology 2920 3844 -> 15 0 28 2906 topology 2923 3845 +> 15 0 28 2906 topology 2975 3844 +> 16 0 28 2906 topology 2980 3844 +> 15 0 28 2906 topology 2974 3845 > 16 0 28 2906 topology 2980 3845 -> 15 0 29 2906 topology 2925 3846 -> 16 0 29 2906 topology 2926 3846 -> 15 0 28 2906 topology 2963 3847 +> 15 0 28 2906 topology 2978 3846 +> 16 0 28 2906 topology 2980 3846 +> 15 0 28 2906 topology 2977 3847 > 16 0 28 2906 topology 2980 3847 -> 15 0 28 2906 topology 2939 3848 -> 16 0 28 2906 topology 2980 3848 -> 15 0 28 2906 topology 2975 3849 -> 16 0 28 2906 topology 2980 3849 -> 15 0 28 2906 topology 2951 3850 -> 16 0 28 2906 topology 2980 3850 -> 15 0 28 2906 topology 2912 3851 -> 16 0 28 2906 topology 2980 3851 -> 15 0 28 2906 topology 2929 3852 -> 16 0 28 2906 topology 2980 3852 -> 15 0 28 2906 topology 2959 3853 -> 16 0 28 2906 topology 2980 3853 -> 15 0 28 2906 topology 2924 3854 -> 16 0 28 2906 topology 2980 3854 -> 15 0 28 2906 topology 2941 3855 -> 16 0 28 2906 topology 2980 3855 -> 15 0 29 2906 topology 2958 3856 -> 16 0 29 2906 topology 2960 3856 -> 15 0 28 2906 topology 2971 3857 -> 16 0 28 2906 topology 2980 3857 -> 15 0 29 2906 topology 2961 3858 -> 16 0 29 2906 topology 2963 3858 -> 15 0 28 2906 topology 2953 3859 -> 16 0 28 2906 topology 2980 3859 -> 15 0 29 2906 topology 2964 3860 -> 16 0 29 2906 topology 2966 3860 -> 15 0 30 2906 topology 2979 3861 -> 16 0 30 2906 topology 2980 3861 -> 15 0 29 2906 topology 2967 3862 -> 16 0 29 2906 topology 2969 3862 -> 15 0 28 2906 topology 2908 3863 -> 16 0 28 2906 topology 2980 3863 -> 15 0 29 2906 topology 2970 3864 -> 16 0 29 2906 topology 2972 3864 -> 15 0 29 2906 topology 2973 3865 -> 16 0 29 2906 topology 2975 3865 -> 15 0 28 2906 topology 2920 3866 -> 16 0 28 2906 topology 2980 3866 -> 15 0 29 2906 topology 2976 3867 -> 16 0 29 2906 topology 2978 3867 -> 15 0 29 2906 topology 2931 3868 -> 16 0 29 2906 topology 2932 3868 -> 15 0 28 2906 topology 2930 3869 -> 16 0 28 2906 topology 2980 3869 -> 15 0 29 2906 topology 2961 3870 -> 16 0 29 2906 topology 2962 3870 -> 15 0 29 2906 topology 2937 3871 -> 16 0 29 2906 topology 2938 3871 -> 15 0 28 2906 topology 2966 3872 -> 16 0 28 2906 topology 2980 3872 -> 15 0 28 2906 topology 2942 3873 -> 16 0 28 2906 topology 2980 3873 -> 15 0 29 2906 topology 2967 3874 -> 16 0 29 2906 topology 2968 3874 -> 15 0 29 2906 topology 2907 3875 -> 16 0 29 2906 topology 2909 3875 -> 15 0 29 2906 topology 2943 3876 -> 16 0 29 2906 topology 2944 3876 -> 15 0 29 2906 topology 2910 3877 -> 16 0 29 2906 topology 2912 3877 -> 15 0 28 2906 topology 2978 3878 -> 16 0 28 2906 topology 2980 3878 -> 15 0 28 2906 topology 2954 3879 -> 16 0 28 2906 topology 2980 3879 -> 15 0 29 2906 topology 2973 3880 -> 16 0 29 2906 topology 2974 3880 -> 15 0 29 2906 topology 2913 3881 -> 16 0 29 2906 topology 2915 3881 -> 15 0 29 2906 topology 2949 3882 -> 16 0 29 2906 topology 2950 3882 -> 15 0 29 2906 topology 2916 3883 -> 16 0 29 2906 topology 2918 3883 -> 15 0 28 2906 topology 2915 3884 -> 16 0 28 2906 topology 2980 3884 -> 15 0 29 2906 topology 2919 3885 -> 16 0 29 2906 topology 2921 3885 -> 15 0 29 2906 topology 2955 3886 -> 16 0 29 2906 topology 2956 3886 -> 15 0 29 2906 topology 2922 3887 -> 16 0 29 2906 topology 2924 3887 -> 15 0 28 2906 topology 2938 3888 -> 16 0 28 2906 topology 2980 3888 -> 15 0 29 2906 topology 2925 3889 -> 16 0 29 2906 topology 2927 3889 -> 15 0 28 2906 topology 2927 3890 -> 16 0 28 2906 topology 2980 3890 -> 15 0 28 2906 topology 2968 3891 -> 16 0 28 2906 topology 2980 3891 -> 15 0 29 2906 topology 2910 3892 -> 16 0 29 2906 topology 2911 3892 -> 15 0 28 2906 topology 2950 3893 -> 16 0 28 2906 topology 2980 3893 -> 15 0 29 2906 topology 2916 3894 -> 16 0 29 2906 topology 2917 3894 -> 15 0 28 2906 topology 2917 3895 -> 16 0 28 2906 topology 2980 3895 -> 15 0 29 2906 topology 2922 3896 -> 16 0 29 2906 topology 2923 3896 -> 15 0 29 2981 topology 3033 3897 -> 16 0 29 2981 topology 3035 3897 -> 15 0 29 2981 topology 3087 3898 -> 16 0 29 2981 topology 3089 3898 -> 15 0 29 2981 topology 2982 3899 -> 16 0 29 2981 topology 2984 3899 -> 15 0 29 2981 topology 3036 3900 -> 16 0 29 2981 topology 3038 3900 -> 15 0 29 2981 topology 2991 3901 -> 16 0 29 2981 topology 2992 3901 -> 15 0 29 2981 topology 2985 3902 -> 16 0 29 2981 topology 2987 3902 -> 15 0 29 2981 topology 3039 3903 -> 16 0 29 2981 topology 3041 3903 -> 15 0 29 2981 topology 3021 3904 -> 16 0 29 2981 topology 3022 3904 -> 15 0 29 2981 topology 2988 3905 -> 16 0 29 2981 topology 2990 3905 -> 15 0 29 2981 topology 3042 3906 -> 16 0 29 2981 topology 3044 3906 -> 15 0 29 2981 topology 2997 3907 -> 16 0 29 2981 topology 2998 3907 -> 15 0 28 2981 topology 3023 3908 +> 15 0 29 2906 topology 2979 3848 +> 16 0 29 2906 topology 2980 3848 +> 15 0 30 2906 topology 2907 3849 +> 16 0 30 2906 topology 2909 3849 +> 15 0 30 2906 topology 2907 3850 +> 16 0 30 2906 topology 2908 3850 +> 15 0 30 2906 topology 2910 3851 +> 16 0 30 2906 topology 2912 3851 +> 15 0 30 2906 topology 2910 3852 +> 16 0 30 2906 topology 2911 3852 +> 15 0 30 2906 topology 2913 3853 +> 16 0 30 2906 topology 2915 3853 +> 15 0 30 2906 topology 2913 3854 +> 16 0 30 2906 topology 2914 3854 +> 15 0 30 2906 topology 2916 3855 +> 16 0 30 2906 topology 2918 3855 +> 15 0 30 2906 topology 2916 3856 +> 16 0 30 2906 topology 2917 3856 +> 15 0 30 2906 topology 2919 3857 +> 16 0 30 2906 topology 2921 3857 +> 15 0 30 2906 topology 2919 3858 +> 16 0 30 2906 topology 2920 3858 +> 15 0 30 2906 topology 2922 3859 +> 16 0 30 2906 topology 2924 3859 +> 15 0 30 2906 topology 2922 3860 +> 16 0 30 2906 topology 2923 3860 +> 15 0 30 2906 topology 2925 3861 +> 16 0 30 2906 topology 2927 3861 +> 15 0 30 2906 topology 2925 3862 +> 16 0 30 2906 topology 2926 3862 +> 15 0 30 2906 topology 2928 3863 +> 16 0 30 2906 topology 2930 3863 +> 15 0 30 2906 topology 2928 3864 +> 16 0 30 2906 topology 2929 3864 +> 15 0 30 2906 topology 2931 3865 +> 16 0 30 2906 topology 2933 3865 +> 15 0 30 2906 topology 2931 3866 +> 16 0 30 2906 topology 2932 3866 +> 15 0 30 2906 topology 2934 3867 +> 16 0 30 2906 topology 2936 3867 +> 15 0 30 2906 topology 2934 3868 +> 16 0 30 2906 topology 2935 3868 +> 15 0 30 2906 topology 2937 3869 +> 16 0 30 2906 topology 2939 3869 +> 15 0 30 2906 topology 2937 3870 +> 16 0 30 2906 topology 2938 3870 +> 15 0 30 2906 topology 2940 3871 +> 16 0 30 2906 topology 2942 3871 +> 15 0 30 2906 topology 2940 3872 +> 16 0 30 2906 topology 2941 3872 +> 15 0 30 2906 topology 2943 3873 +> 16 0 30 2906 topology 2945 3873 +> 15 0 30 2906 topology 2943 3874 +> 16 0 30 2906 topology 2944 3874 +> 15 0 30 2906 topology 2946 3875 +> 16 0 30 2906 topology 2948 3875 +> 15 0 30 2906 topology 2946 3876 +> 16 0 30 2906 topology 2947 3876 +> 15 0 30 2906 topology 2949 3877 +> 16 0 30 2906 topology 2951 3877 +> 15 0 30 2906 topology 2949 3878 +> 16 0 30 2906 topology 2950 3878 +> 15 0 30 2906 topology 2952 3879 +> 16 0 30 2906 topology 2954 3879 +> 15 0 30 2906 topology 2952 3880 +> 16 0 30 2906 topology 2953 3880 +> 15 0 30 2906 topology 2955 3881 +> 16 0 30 2906 topology 2957 3881 +> 15 0 30 2906 topology 2955 3882 +> 16 0 30 2906 topology 2956 3882 +> 15 0 30 2906 topology 2958 3883 +> 16 0 30 2906 topology 2960 3883 +> 15 0 30 2906 topology 2958 3884 +> 16 0 30 2906 topology 2959 3884 +> 15 0 30 2906 topology 2961 3885 +> 16 0 30 2906 topology 2963 3885 +> 15 0 30 2906 topology 2961 3886 +> 16 0 30 2906 topology 2962 3886 +> 15 0 30 2906 topology 2964 3887 +> 16 0 30 2906 topology 2966 3887 +> 15 0 30 2906 topology 2964 3888 +> 16 0 30 2906 topology 2965 3888 +> 15 0 30 2906 topology 2967 3889 +> 16 0 30 2906 topology 2969 3889 +> 15 0 30 2906 topology 2967 3890 +> 16 0 30 2906 topology 2968 3890 +> 15 0 30 2906 topology 2970 3891 +> 16 0 30 2906 topology 2972 3891 +> 15 0 30 2906 topology 2970 3892 +> 16 0 30 2906 topology 2971 3892 +> 15 0 30 2906 topology 2973 3893 +> 16 0 30 2906 topology 2975 3893 +> 15 0 30 2906 topology 2973 3894 +> 16 0 30 2906 topology 2974 3894 +> 15 0 30 2906 topology 2976 3895 +> 16 0 30 2906 topology 2978 3895 +> 15 0 30 2906 topology 2976 3896 +> 16 0 30 2906 topology 2977 3896 +> 15 0 28 2981 topology 2984 3897 +> 16 0 28 2981 topology 3091 3897 +> 15 0 28 2981 topology 2983 3898 +> 16 0 28 2981 topology 3091 3898 +> 15 0 28 2981 topology 2987 3899 +> 16 0 28 2981 topology 3091 3899 +> 15 0 28 2981 topology 2986 3900 +> 16 0 28 2981 topology 3091 3900 +> 15 0 28 2981 topology 2990 3901 +> 16 0 28 2981 topology 3091 3901 +> 15 0 28 2981 topology 2989 3902 +> 16 0 28 2981 topology 3091 3902 +> 15 0 28 2981 topology 2993 3903 +> 16 0 28 2981 topology 3091 3903 +> 15 0 28 2981 topology 2992 3904 +> 16 0 28 2981 topology 3091 3904 +> 15 0 28 2981 topology 2996 3905 +> 16 0 28 2981 topology 3091 3905 +> 15 0 28 2981 topology 2995 3906 +> 16 0 28 2981 topology 3091 3906 +> 15 0 28 2981 topology 2999 3907 +> 16 0 28 2981 topology 3091 3907 +> 15 0 28 2981 topology 2998 3908 > 16 0 28 2981 topology 3091 3908 -> 15 0 29 2981 topology 3051 3909 -> 16 0 29 2981 topology 3052 3909 -> 15 0 28 2981 topology 2999 3910 +> 15 0 28 2981 topology 3002 3909 +> 16 0 28 2981 topology 3091 3909 +> 15 0 28 2981 topology 3001 3910 > 16 0 28 2981 topology 3091 3910 -> 15 0 29 2981 topology 3045 3911 -> 16 0 29 2981 topology 3047 3911 -> 15 0 29 2981 topology 3027 3912 -> 16 0 29 2981 topology 3028 3912 -> 15 0 29 2981 topology 3081 3913 -> 16 0 29 2981 topology 3082 3913 -> 15 0 28 2981 topology 3083 3914 +> 15 0 28 2981 topology 3005 3911 +> 16 0 28 2981 topology 3091 3911 +> 15 0 28 2981 topology 3004 3912 +> 16 0 28 2981 topology 3091 3912 +> 15 0 28 2981 topology 3008 3913 +> 16 0 28 2981 topology 3091 3913 +> 15 0 28 2981 topology 3007 3914 > 16 0 28 2981 topology 3091 3914 -> 15 0 29 2981 topology 3048 3915 -> 16 0 29 2981 topology 3050 3915 -> 15 0 28 2981 topology 3059 3916 +> 15 0 28 2981 topology 3011 3915 +> 16 0 28 2981 topology 3091 3915 +> 15 0 28 2981 topology 3010 3916 > 16 0 28 2981 topology 3091 3916 -> 15 0 29 2981 topology 3003 3917 -> 16 0 29 2981 topology 3004 3917 -> 15 0 28 2981 topology 3035 3918 +> 15 0 28 2981 topology 3014 3917 +> 16 0 28 2981 topology 3091 3917 +> 15 0 28 2981 topology 3013 3918 > 16 0 28 2981 topology 3091 3918 -> 15 0 29 2981 topology 3057 3919 -> 16 0 29 2981 topology 3058 3919 -> 15 0 28 2981 topology 3011 3920 +> 15 0 28 2981 topology 3017 3919 +> 16 0 28 2981 topology 3091 3919 +> 15 0 28 2981 topology 3016 3920 > 16 0 28 2981 topology 3091 3920 -> 15 0 28 2981 topology 2987 3921 +> 15 0 28 2981 topology 3020 3921 > 16 0 28 2981 topology 3091 3921 -> 15 0 29 2981 topology 3033 3922 -> 16 0 29 2981 topology 3034 3922 -> 15 0 29 2981 topology 3087 3923 -> 16 0 29 2981 topology 3088 3923 -> 15 0 28 2981 topology 3071 3924 +> 15 0 28 2981 topology 3019 3922 +> 16 0 28 2981 topology 3091 3922 +> 15 0 28 2981 topology 3023 3923 +> 16 0 28 2981 topology 3091 3923 +> 15 0 28 2981 topology 3022 3924 > 16 0 28 2981 topology 3091 3924 -> 15 0 29 2981 topology 3009 3925 -> 16 0 29 2981 topology 3010 3925 -> 15 0 28 2981 topology 3047 3926 +> 15 0 28 2981 topology 3026 3925 +> 16 0 28 2981 topology 3091 3925 +> 15 0 28 2981 topology 3025 3926 > 16 0 28 2981 topology 3091 3926 -> 15 0 29 2981 topology 3063 3927 -> 16 0 29 2981 topology 3064 3927 -> 15 0 29 2981 topology 2985 3928 -> 16 0 29 2981 topology 2986 3928 -> 15 0 29 2981 topology 3039 3929 -> 16 0 29 2981 topology 3040 3929 -> 15 0 29 2981 topology 3015 3930 -> 16 0 29 2981 topology 3016 3930 -> 15 0 29 2981 topology 3069 3931 -> 16 0 29 2981 topology 3070 3931 -> 15 0 28 2981 topology 2995 3932 +> 15 0 28 2981 topology 3029 3927 +> 16 0 28 2981 topology 3091 3927 +> 15 0 28 2981 topology 3028 3928 +> 16 0 28 2981 topology 3091 3928 +> 15 0 28 2981 topology 3032 3929 +> 16 0 28 2981 topology 3091 3929 +> 15 0 28 2981 topology 3031 3930 +> 16 0 28 2981 topology 3091 3930 +> 15 0 28 2981 topology 3035 3931 +> 16 0 28 2981 topology 3091 3931 +> 15 0 28 2981 topology 3034 3932 > 16 0 28 2981 topology 3091 3932 -> 15 0 28 2981 topology 3025 3933 +> 15 0 28 2981 topology 3038 3933 > 16 0 28 2981 topology 3091 3933 -> 15 0 29 2981 topology 3045 3934 -> 16 0 29 2981 topology 3046 3934 -> 15 0 28 2981 topology 3055 3935 +> 15 0 28 2981 topology 3037 3934 +> 16 0 28 2981 topology 3091 3934 +> 15 0 28 2981 topology 3041 3935 > 16 0 28 2981 topology 3091 3935 -> 15 0 29 2981 topology 3075 3936 -> 16 0 29 2981 topology 3076 3936 -> 15 0 28 2981 topology 3085 3937 +> 15 0 28 2981 topology 3040 3936 +> 16 0 28 2981 topology 3091 3936 +> 15 0 28 2981 topology 3044 3937 > 16 0 28 2981 topology 3091 3937 -> 15 0 28 2981 topology 3007 3938 +> 15 0 28 2981 topology 3043 3938 > 16 0 28 2981 topology 3091 3938 -> 15 0 28 2981 topology 3037 3939 +> 15 0 28 2981 topology 3047 3939 > 16 0 28 2981 topology 3091 3939 -> 15 0 28 2981 topology 3067 3940 +> 15 0 28 2981 topology 3046 3940 > 16 0 28 2981 topology 3091 3940 -> 15 0 28 2981 topology 2989 3941 +> 15 0 28 2981 topology 3050 3941 > 16 0 28 2981 topology 3091 3941 -> 15 0 28 2981 topology 3019 3942 +> 15 0 28 2981 topology 3049 3942 > 16 0 28 2981 topology 3091 3942 -> 15 0 28 2981 topology 3049 3943 +> 15 0 28 2981 topology 3053 3943 > 16 0 28 2981 topology 3091 3943 -> 15 0 28 2981 topology 3079 3944 +> 15 0 28 2981 topology 3052 3944 > 16 0 28 2981 topology 3091 3944 -> 15 0 28 2981 topology 3026 3945 +> 15 0 28 2981 topology 3056 3945 > 16 0 28 2981 topology 3091 3945 -> 15 0 28 2981 topology 3002 3946 +> 15 0 28 2981 topology 3055 3946 > 16 0 28 2981 topology 3091 3946 -> 15 0 28 2981 topology 3086 3947 +> 15 0 28 2981 topology 3059 3947 > 16 0 28 2981 topology 3091 3947 -> 15 0 28 2981 topology 3062 3948 +> 15 0 28 2981 topology 3058 3948 > 16 0 28 2981 topology 3091 3948 -> 15 0 28 2981 topology 3038 3949 +> 15 0 28 2981 topology 3062 3949 > 16 0 28 2981 topology 3091 3949 -> 15 0 28 2981 topology 3014 3950 +> 15 0 28 2981 topology 3061 3950 > 16 0 28 2981 topology 3091 3950 -> 15 0 28 2981 topology 2990 3951 +> 15 0 28 2981 topology 3065 3951 > 16 0 28 2981 topology 3091 3951 -> 15 0 28 2981 topology 3074 3952 +> 15 0 28 2981 topology 3064 3952 > 16 0 28 2981 topology 3091 3952 -> 15 0 28 2981 topology 3050 3953 +> 15 0 28 2981 topology 3068 3953 > 16 0 28 2981 topology 3091 3953 -> 15 0 28 2981 topology 2992 3954 +> 15 0 28 2981 topology 3067 3954 > 16 0 28 2981 topology 3091 3954 -> 15 0 28 2981 topology 3022 3955 +> 15 0 28 2981 topology 3071 3955 > 16 0 28 2981 topology 3091 3955 -> 15 0 28 2981 topology 3052 3956 +> 15 0 28 2981 topology 3070 3956 > 16 0 28 2981 topology 3091 3956 -> 15 0 29 2981 topology 2991 3957 -> 16 0 29 2981 topology 2993 3957 -> 15 0 28 2981 topology 3082 3958 +> 15 0 28 2981 topology 3074 3957 +> 16 0 28 2981 topology 3091 3957 +> 15 0 28 2981 topology 3073 3958 > 16 0 28 2981 topology 3091 3958 -> 15 0 28 2981 topology 3004 3959 +> 15 0 28 2981 topology 3077 3959 > 16 0 28 2981 topology 3091 3959 -> 15 0 29 2981 topology 2994 3960 -> 16 0 29 2981 topology 2996 3960 -> 15 0 28 2981 topology 3034 3961 +> 15 0 28 2981 topology 3076 3960 +> 16 0 28 2981 topology 3091 3960 +> 15 0 28 2981 topology 3080 3961 > 16 0 28 2981 topology 3091 3961 -> 15 0 28 2981 topology 3064 3962 +> 15 0 28 2981 topology 3079 3962 > 16 0 28 2981 topology 3091 3962 -> 15 0 28 2981 topology 2986 3963 +> 15 0 28 2981 topology 3083 3963 > 16 0 28 2981 topology 3091 3963 -> 15 0 29 2981 topology 2997 3964 -> 16 0 29 2981 topology 2999 3964 -> 15 0 29 2981 topology 3051 3965 -> 16 0 29 2981 topology 3053 3965 -> 15 0 28 2981 topology 3016 3966 +> 15 0 28 2981 topology 3082 3964 +> 16 0 28 2981 topology 3091 3964 +> 15 0 28 2981 topology 3086 3965 +> 16 0 28 2981 topology 3091 3965 +> 15 0 28 2981 topology 3085 3966 > 16 0 28 2981 topology 3091 3966 -> 15 0 29 2981 topology 3000 3967 -> 16 0 29 2981 topology 3002 3967 -> 15 0 28 2981 topology 3046 3968 +> 15 0 28 2981 topology 3089 3967 +> 16 0 28 2981 topology 3091 3967 +> 15 0 28 2981 topology 3088 3968 > 16 0 28 2981 topology 3091 3968 -> 15 0 29 2981 topology 3054 3969 -> 16 0 29 2981 topology 3056 3969 -> 15 0 28 2981 topology 3076 3970 -> 16 0 28 2981 topology 3091 3970 -> 15 0 29 2981 topology 3003 3971 -> 16 0 29 2981 topology 3005 3971 -> 15 0 29 2981 topology 3057 3972 -> 16 0 29 2981 topology 3059 3972 -> 15 0 29 2981 topology 3006 3973 -> 16 0 29 2981 topology 3008 3973 -> 15 0 29 2981 topology 3060 3974 -> 16 0 29 2981 topology 3062 3974 -> 15 0 29 2981 topology 3009 3975 -> 16 0 29 2981 topology 3011 3975 -> 15 0 29 2981 topology 3063 3976 -> 16 0 29 2981 topology 3065 3976 -> 15 0 29 2981 topology 3012 3977 -> 16 0 29 2981 topology 3014 3977 -> 15 0 29 2981 topology 3066 3978 -> 16 0 29 2981 topology 3068 3978 -> 15 0 29 2981 topology 2994 3979 -> 16 0 29 2981 topology 2995 3979 -> 15 0 28 2981 topology 2993 3980 -> 16 0 28 2981 topology 3091 3980 -> 15 0 29 2981 topology 3015 3981 -> 16 0 29 2981 topology 3017 3981 -> 15 0 29 2981 topology 3069 3982 -> 16 0 29 2981 topology 3071 3982 -> 15 0 29 2981 topology 3024 3983 -> 16 0 29 2981 topology 3025 3983 -> 15 0 29 2981 topology 3018 3984 -> 16 0 29 2981 topology 3020 3984 -> 15 0 28 2981 topology 3053 3985 -> 16 0 28 2981 topology 3091 3985 -> 15 0 29 2981 topology 3072 3986 -> 16 0 29 2981 topology 3074 3986 -> 15 0 29 2981 topology 3000 3987 -> 16 0 29 2981 topology 3001 3987 -> 15 0 28 2981 topology 3029 3988 -> 16 0 28 2981 topology 3091 3988 -> 15 0 29 2981 topology 3054 3989 -> 16 0 29 2981 topology 3055 3989 -> 15 0 28 2981 topology 3005 3990 -> 16 0 28 2981 topology 3091 3990 -> 15 0 29 2981 topology 3075 3991 -> 16 0 29 2981 topology 3077 3991 -> 15 0 29 2981 topology 3030 3992 -> 16 0 29 2981 topology 3031 3992 -> 15 0 29 2981 topology 3084 3993 -> 16 0 29 2981 topology 3085 3993 -> 15 0 28 2981 topology 3089 3994 -> 16 0 28 2981 topology 3091 3994 -> 15 0 28 2981 topology 3065 3995 -> 16 0 28 2981 topology 3091 3995 -> 15 0 29 2981 topology 3078 3996 -> 16 0 29 2981 topology 3080 3996 -> 15 0 29 2981 topology 3006 3997 -> 16 0 29 2981 topology 3007 3997 -> 15 0 28 2981 topology 3041 3998 -> 16 0 28 2981 topology 3091 3998 -> 15 0 29 2981 topology 3060 3999 -> 16 0 29 2981 topology 3061 3999 -> 15 0 28 2981 topology 3017 4000 -> 16 0 28 2981 topology 3091 4000 -> 15 0 29 2981 topology 2982 4001 -> 16 0 29 2981 topology 2983 4001 -> 15 0 29 2981 topology 3036 4002 -> 16 0 29 2981 topology 3037 4002 -> 15 0 28 2981 topology 3077 4003 -> 16 0 28 2981 topology 3091 4003 -> 15 0 29 2981 topology 3012 4004 -> 16 0 29 2981 topology 3013 4004 -> 15 0 29 2981 topology 3066 4005 -> 16 0 29 2981 topology 3067 4005 -> 15 0 29 2981 topology 2988 4006 -> 16 0 29 2981 topology 2989 4006 -> 15 0 29 2981 topology 3042 4007 -> 16 0 29 2981 topology 3043 4007 -> 15 0 29 2981 topology 3018 4008 -> 16 0 29 2981 topology 3019 4008 -> 15 0 29 2981 topology 3072 4009 -> 16 0 29 2981 topology 3073 4009 -> 15 0 28 2981 topology 3001 4010 -> 16 0 28 2981 topology 3091 4010 -> 15 0 28 2981 topology 3031 4011 -> 16 0 28 2981 topology 3091 4011 -> 15 0 29 2981 topology 3048 4012 -> 16 0 29 2981 topology 3049 4012 -> 15 0 28 2981 topology 3061 4013 -> 16 0 28 2981 topology 3091 4013 -> 15 0 28 2981 topology 2983 4014 -> 16 0 28 2981 topology 3091 4014 -> 15 0 29 2981 topology 3078 4015 -> 16 0 29 2981 topology 3079 4015 -> 15 0 28 2981 topology 3013 4016 -> 16 0 28 2981 topology 3091 4016 -> 15 0 28 2981 topology 3043 4017 -> 16 0 28 2981 topology 3091 4017 -> 15 0 28 2981 topology 3073 4018 -> 16 0 28 2981 topology 3091 4018 -> 15 0 28 2981 topology 2996 4019 -> 16 0 28 2981 topology 3091 4019 -> 15 0 28 2981 topology 3056 4020 -> 16 0 28 2981 topology 3091 4020 -> 15 0 28 2981 topology 3032 4021 -> 16 0 28 2981 topology 3091 4021 -> 15 0 28 2981 topology 3008 4022 -> 16 0 28 2981 topology 3091 4022 -> 15 0 28 2981 topology 2984 4023 -> 16 0 28 2981 topology 3091 4023 -> 15 0 28 2981 topology 3068 4024 -> 16 0 28 2981 topology 3091 4024 -> 15 0 28 2981 topology 3044 4025 -> 16 0 28 2981 topology 3091 4025 -> 15 0 28 2981 topology 3020 4026 -> 16 0 28 2981 topology 3091 4026 -> 15 0 28 2981 topology 3080 4027 -> 16 0 28 2981 topology 3091 4027 -> 15 0 28 2981 topology 2998 4028 -> 16 0 28 2981 topology 3091 4028 -> 15 0 28 2981 topology 3028 4029 -> 16 0 28 2981 topology 3091 4029 -> 15 0 28 2981 topology 3058 4030 -> 16 0 28 2981 topology 3091 4030 -> 15 0 29 2981 topology 3021 4031 -> 16 0 29 2981 topology 3023 4031 -> 15 0 28 2981 topology 3088 4032 -> 16 0 28 2981 topology 3091 4032 -> 15 0 28 2981 topology 3010 4033 -> 16 0 28 2981 topology 3091 4033 -> 15 0 30 2981 topology 3090 4034 -> 16 0 30 2981 topology 3091 4034 -> 15 0 29 2981 topology 3024 4035 -> 16 0 29 2981 topology 3026 4035 -> 15 0 28 2981 topology 3040 4036 -> 16 0 28 2981 topology 3091 4036 -> 15 0 28 2981 topology 3070 4037 -> 16 0 28 2981 topology 3091 4037 -> 15 0 29 2981 topology 3027 4038 -> 16 0 29 2981 topology 3029 4038 -> 15 0 29 2981 topology 3081 4039 -> 16 0 29 2981 topology 3083 4039 -> 15 0 29 2981 topology 3030 4040 -> 16 0 29 2981 topology 3032 4040 -> 15 0 29 2981 topology 3084 4041 -> 16 0 29 2981 topology 3086 4041 -> 15 0 28 3092 topology 3190 4042 +> 15 0 29 2981 topology 3090 3969 +> 16 0 29 2981 topology 3091 3969 +> 15 0 30 2981 topology 2982 3970 +> 16 0 30 2981 topology 2984 3970 +> 15 0 30 2981 topology 2982 3971 +> 16 0 30 2981 topology 2983 3971 +> 15 0 30 2981 topology 2985 3972 +> 16 0 30 2981 topology 2987 3972 +> 15 0 30 2981 topology 2985 3973 +> 16 0 30 2981 topology 2986 3973 +> 15 0 30 2981 topology 2988 3974 +> 16 0 30 2981 topology 2990 3974 +> 15 0 30 2981 topology 2988 3975 +> 16 0 30 2981 topology 2989 3975 +> 15 0 30 2981 topology 2991 3976 +> 16 0 30 2981 topology 2993 3976 +> 15 0 30 2981 topology 2991 3977 +> 16 0 30 2981 topology 2992 3977 +> 15 0 30 2981 topology 2994 3978 +> 16 0 30 2981 topology 2996 3978 +> 15 0 30 2981 topology 2994 3979 +> 16 0 30 2981 topology 2995 3979 +> 15 0 30 2981 topology 2997 3980 +> 16 0 30 2981 topology 2999 3980 +> 15 0 30 2981 topology 2997 3981 +> 16 0 30 2981 topology 2998 3981 +> 15 0 30 2981 topology 3000 3982 +> 16 0 30 2981 topology 3002 3982 +> 15 0 30 2981 topology 3000 3983 +> 16 0 30 2981 topology 3001 3983 +> 15 0 30 2981 topology 3003 3984 +> 16 0 30 2981 topology 3005 3984 +> 15 0 30 2981 topology 3003 3985 +> 16 0 30 2981 topology 3004 3985 +> 15 0 30 2981 topology 3006 3986 +> 16 0 30 2981 topology 3008 3986 +> 15 0 30 2981 topology 3006 3987 +> 16 0 30 2981 topology 3007 3987 +> 15 0 30 2981 topology 3009 3988 +> 16 0 30 2981 topology 3011 3988 +> 15 0 30 2981 topology 3009 3989 +> 16 0 30 2981 topology 3010 3989 +> 15 0 30 2981 topology 3012 3990 +> 16 0 30 2981 topology 3014 3990 +> 15 0 30 2981 topology 3012 3991 +> 16 0 30 2981 topology 3013 3991 +> 15 0 30 2981 topology 3015 3992 +> 16 0 30 2981 topology 3017 3992 +> 15 0 30 2981 topology 3015 3993 +> 16 0 30 2981 topology 3016 3993 +> 15 0 30 2981 topology 3018 3994 +> 16 0 30 2981 topology 3020 3994 +> 15 0 30 2981 topology 3018 3995 +> 16 0 30 2981 topology 3019 3995 +> 15 0 30 2981 topology 3021 3996 +> 16 0 30 2981 topology 3023 3996 +> 15 0 30 2981 topology 3021 3997 +> 16 0 30 2981 topology 3022 3997 +> 15 0 30 2981 topology 3024 3998 +> 16 0 30 2981 topology 3026 3998 +> 15 0 30 2981 topology 3024 3999 +> 16 0 30 2981 topology 3025 3999 +> 15 0 30 2981 topology 3027 4000 +> 16 0 30 2981 topology 3029 4000 +> 15 0 30 2981 topology 3027 4001 +> 16 0 30 2981 topology 3028 4001 +> 15 0 30 2981 topology 3030 4002 +> 16 0 30 2981 topology 3032 4002 +> 15 0 30 2981 topology 3030 4003 +> 16 0 30 2981 topology 3031 4003 +> 15 0 30 2981 topology 3033 4004 +> 16 0 30 2981 topology 3035 4004 +> 15 0 30 2981 topology 3033 4005 +> 16 0 30 2981 topology 3034 4005 +> 15 0 30 2981 topology 3036 4006 +> 16 0 30 2981 topology 3038 4006 +> 15 0 30 2981 topology 3036 4007 +> 16 0 30 2981 topology 3037 4007 +> 15 0 30 2981 topology 3039 4008 +> 16 0 30 2981 topology 3041 4008 +> 15 0 30 2981 topology 3039 4009 +> 16 0 30 2981 topology 3040 4009 +> 15 0 30 2981 topology 3042 4010 +> 16 0 30 2981 topology 3044 4010 +> 15 0 30 2981 topology 3042 4011 +> 16 0 30 2981 topology 3043 4011 +> 15 0 30 2981 topology 3045 4012 +> 16 0 30 2981 topology 3047 4012 +> 15 0 30 2981 topology 3045 4013 +> 16 0 30 2981 topology 3046 4013 +> 15 0 30 2981 topology 3048 4014 +> 16 0 30 2981 topology 3050 4014 +> 15 0 30 2981 topology 3048 4015 +> 16 0 30 2981 topology 3049 4015 +> 15 0 30 2981 topology 3051 4016 +> 16 0 30 2981 topology 3053 4016 +> 15 0 30 2981 topology 3051 4017 +> 16 0 30 2981 topology 3052 4017 +> 15 0 30 2981 topology 3054 4018 +> 16 0 30 2981 topology 3056 4018 +> 15 0 30 2981 topology 3054 4019 +> 16 0 30 2981 topology 3055 4019 +> 15 0 30 2981 topology 3057 4020 +> 16 0 30 2981 topology 3059 4020 +> 15 0 30 2981 topology 3057 4021 +> 16 0 30 2981 topology 3058 4021 +> 15 0 30 2981 topology 3060 4022 +> 16 0 30 2981 topology 3062 4022 +> 15 0 30 2981 topology 3060 4023 +> 16 0 30 2981 topology 3061 4023 +> 15 0 30 2981 topology 3063 4024 +> 16 0 30 2981 topology 3065 4024 +> 15 0 30 2981 topology 3063 4025 +> 16 0 30 2981 topology 3064 4025 +> 15 0 30 2981 topology 3066 4026 +> 16 0 30 2981 topology 3068 4026 +> 15 0 30 2981 topology 3066 4027 +> 16 0 30 2981 topology 3067 4027 +> 15 0 30 2981 topology 3069 4028 +> 16 0 30 2981 topology 3071 4028 +> 15 0 30 2981 topology 3069 4029 +> 16 0 30 2981 topology 3070 4029 +> 15 0 30 2981 topology 3072 4030 +> 16 0 30 2981 topology 3074 4030 +> 15 0 30 2981 topology 3072 4031 +> 16 0 30 2981 topology 3073 4031 +> 15 0 30 2981 topology 3075 4032 +> 16 0 30 2981 topology 3077 4032 +> 15 0 30 2981 topology 3075 4033 +> 16 0 30 2981 topology 3076 4033 +> 15 0 30 2981 topology 3078 4034 +> 16 0 30 2981 topology 3080 4034 +> 15 0 30 2981 topology 3078 4035 +> 16 0 30 2981 topology 3079 4035 +> 15 0 30 2981 topology 3081 4036 +> 16 0 30 2981 topology 3083 4036 +> 15 0 30 2981 topology 3081 4037 +> 16 0 30 2981 topology 3082 4037 +> 15 0 30 2981 topology 3084 4038 +> 16 0 30 2981 topology 3086 4038 +> 15 0 30 2981 topology 3084 4039 +> 16 0 30 2981 topology 3085 4039 +> 15 0 30 2981 topology 3087 4040 +> 16 0 30 2981 topology 3089 4040 +> 15 0 30 2981 topology 3087 4041 +> 16 0 30 2981 topology 3088 4041 +> 15 0 28 3092 topology 3095 4042 > 16 0 28 3092 topology 3202 4042 -> 15 0 29 3092 topology 3198 4043 -> 16 0 29 3092 topology 3199 4043 -> 15 0 28 3092 topology 3112 4044 +> 15 0 28 3092 topology 3094 4043 +> 16 0 28 3092 topology 3202 4043 +> 15 0 28 3092 topology 3098 4044 > 16 0 28 3092 topology 3202 4044 -> 15 0 28 3092 topology 3142 4045 +> 15 0 28 3092 topology 3097 4045 > 16 0 28 3092 topology 3202 4045 -> 15 0 28 3092 topology 3172 4046 +> 15 0 28 3092 topology 3101 4046 > 16 0 28 3092 topology 3202 4046 -> 15 0 28 3092 topology 3149 4047 +> 15 0 28 3092 topology 3100 4047 > 16 0 28 3092 topology 3202 4047 -> 15 0 28 3092 topology 3125 4048 +> 15 0 28 3092 topology 3104 4048 > 16 0 28 3092 topology 3202 4048 -> 15 0 28 3092 topology 3101 4049 +> 15 0 28 3092 topology 3103 4049 > 16 0 28 3092 topology 3202 4049 -> 15 0 28 3092 topology 3185 4050 +> 15 0 28 3092 topology 3107 4050 > 16 0 28 3092 topology 3202 4050 -> 15 0 28 3092 topology 3161 4051 +> 15 0 28 3092 topology 3106 4051 > 16 0 28 3092 topology 3202 4051 -> 15 0 28 3092 topology 3137 4052 +> 15 0 28 3092 topology 3110 4052 > 16 0 28 3092 topology 3202 4052 -> 15 0 28 3092 topology 3113 4053 +> 15 0 28 3092 topology 3109 4053 > 16 0 28 3092 topology 3202 4053 -> 15 0 28 3092 topology 3197 4054 +> 15 0 28 3092 topology 3113 4054 > 16 0 28 3092 topology 3202 4054 -> 15 0 28 3092 topology 3173 4055 +> 15 0 28 3092 topology 3112 4055 > 16 0 28 3092 topology 3202 4055 -> 15 0 28 3092 topology 3115 4056 +> 15 0 28 3092 topology 3116 4056 > 16 0 28 3092 topology 3202 4056 -> 15 0 28 3092 topology 3145 4057 +> 15 0 28 3092 topology 3115 4057 > 16 0 28 3092 topology 3202 4057 -> 15 0 28 3092 topology 3175 4058 +> 15 0 28 3092 topology 3119 4058 > 16 0 28 3092 topology 3202 4058 -> 15 0 30 3092 topology 3201 4059 -> 16 0 30 3092 topology 3202 4059 -> 15 0 28 3092 topology 3097 4060 +> 15 0 28 3092 topology 3118 4059 +> 16 0 28 3092 topology 3202 4059 +> 15 0 28 3092 topology 3122 4060 > 16 0 28 3092 topology 3202 4060 -> 15 0 28 3092 topology 3127 4061 +> 15 0 28 3092 topology 3121 4061 > 16 0 28 3092 topology 3202 4061 -> 15 0 28 3092 topology 3157 4062 +> 15 0 28 3092 topology 3125 4062 > 16 0 28 3092 topology 3202 4062 -> 15 0 28 3092 topology 3187 4063 +> 15 0 28 3092 topology 3124 4063 > 16 0 28 3092 topology 3202 4063 -> 15 0 28 3092 topology 3109 4064 +> 15 0 28 3092 topology 3128 4064 > 16 0 28 3092 topology 3202 4064 -> 15 0 28 3092 topology 3139 4065 +> 15 0 28 3092 topology 3127 4065 > 16 0 28 3092 topology 3202 4065 -> 15 0 29 3092 topology 3144 4066 -> 16 0 29 3092 topology 3146 4066 -> 15 0 28 3092 topology 3169 4067 +> 15 0 28 3092 topology 3131 4066 +> 16 0 28 3092 topology 3202 4066 +> 15 0 28 3092 topology 3130 4067 > 16 0 28 3092 topology 3202 4067 -> 15 0 29 3092 topology 3093 4068 -> 16 0 29 3092 topology 3095 4068 -> 15 0 29 3092 topology 3147 4069 -> 16 0 29 3092 topology 3149 4069 -> 15 0 28 3092 topology 3199 4070 +> 15 0 28 3092 topology 3134 4068 +> 16 0 28 3092 topology 3202 4068 +> 15 0 28 3092 topology 3133 4069 +> 16 0 28 3092 topology 3202 4069 +> 15 0 28 3092 topology 3137 4070 > 16 0 28 3092 topology 3202 4070 -> 15 0 29 3092 topology 3096 4071 -> 16 0 29 3092 topology 3098 4071 -> 15 0 29 3092 topology 3150 4072 -> 16 0 29 3092 topology 3152 4072 -> 15 0 29 3092 topology 3099 4073 -> 16 0 29 3092 topology 3101 4073 -> 15 0 29 3092 topology 3153 4074 -> 16 0 29 3092 topology 3155 4074 -> 15 0 29 3092 topology 3102 4075 -> 16 0 29 3092 topology 3104 4075 -> 15 0 29 3092 topology 3156 4076 -> 16 0 29 3092 topology 3158 4076 -> 15 0 29 3092 topology 3105 4077 -> 16 0 29 3092 topology 3107 4077 -> 15 0 29 3092 topology 3159 4078 -> 16 0 29 3092 topology 3161 4078 -> 15 0 28 3092 topology 3116 4079 +> 15 0 28 3092 topology 3136 4071 +> 16 0 28 3092 topology 3202 4071 +> 15 0 28 3092 topology 3140 4072 +> 16 0 28 3092 topology 3202 4072 +> 15 0 28 3092 topology 3139 4073 +> 16 0 28 3092 topology 3202 4073 +> 15 0 28 3092 topology 3143 4074 +> 16 0 28 3092 topology 3202 4074 +> 15 0 28 3092 topology 3142 4075 +> 16 0 28 3092 topology 3202 4075 +> 15 0 28 3092 topology 3146 4076 +> 16 0 28 3092 topology 3202 4076 +> 15 0 28 3092 topology 3145 4077 +> 16 0 28 3092 topology 3202 4077 +> 15 0 28 3092 topology 3149 4078 +> 16 0 28 3092 topology 3202 4078 +> 15 0 28 3092 topology 3148 4079 > 16 0 28 3092 topology 3202 4079 -> 15 0 29 3092 topology 3108 4080 -> 16 0 29 3092 topology 3110 4080 -> 15 0 29 3092 topology 3162 4081 -> 16 0 29 3092 topology 3164 4081 -> 15 0 29 3092 topology 3117 4082 -> 16 0 29 3092 topology 3118 4082 -> 15 0 28 3092 topology 3176 4083 +> 15 0 28 3092 topology 3152 4080 +> 16 0 28 3092 topology 3202 4080 +> 15 0 28 3092 topology 3151 4081 +> 16 0 28 3092 topology 3202 4081 +> 15 0 28 3092 topology 3155 4082 +> 16 0 28 3092 topology 3202 4082 +> 15 0 28 3092 topology 3154 4083 > 16 0 28 3092 topology 3202 4083 -> 15 0 29 3092 topology 3111 4084 -> 16 0 29 3092 topology 3113 4084 -> 15 0 28 3092 topology 3152 4085 +> 15 0 28 3092 topology 3158 4084 +> 16 0 28 3092 topology 3202 4084 +> 15 0 28 3092 topology 3157 4085 > 16 0 28 3092 topology 3202 4085 -> 15 0 29 3092 topology 3165 4086 -> 16 0 29 3092 topology 3167 4086 -> 15 0 29 3092 topology 3093 4087 -> 16 0 29 3092 topology 3094 4087 -> 15 0 28 3092 topology 3128 4088 +> 15 0 28 3092 topology 3161 4086 +> 16 0 28 3092 topology 3202 4086 +> 15 0 28 3092 topology 3160 4087 +> 16 0 28 3092 topology 3202 4087 +> 15 0 28 3092 topology 3164 4088 > 16 0 28 3092 topology 3202 4088 -> 15 0 29 3092 topology 3147 4089 -> 16 0 29 3092 topology 3148 4089 -> 15 0 28 3092 topology 3104 4090 +> 15 0 28 3092 topology 3163 4089 +> 16 0 28 3092 topology 3202 4089 +> 15 0 28 3092 topology 3167 4090 > 16 0 28 3092 topology 3202 4090 -> 15 0 29 3092 topology 3168 4091 -> 16 0 29 3092 topology 3170 4091 -> 15 0 29 3092 topology 3123 4092 -> 16 0 29 3092 topology 3124 4092 -> 15 0 29 3092 topology 3177 4093 -> 16 0 29 3092 topology 3178 4093 -> 15 0 28 3092 topology 3188 4094 +> 15 0 28 3092 topology 3166 4091 +> 16 0 28 3092 topology 3202 4091 +> 15 0 28 3092 topology 3170 4092 +> 16 0 28 3092 topology 3202 4092 +> 15 0 28 3092 topology 3169 4093 +> 16 0 28 3092 topology 3202 4093 +> 15 0 28 3092 topology 3173 4094 > 16 0 28 3092 topology 3202 4094 -> 15 0 28 3092 topology 3164 4095 +> 15 0 28 3092 topology 3172 4095 > 16 0 28 3092 topology 3202 4095 -> 15 0 29 3092 topology 3171 4096 -> 16 0 29 3092 topology 3173 4096 -> 15 0 29 3092 topology 3099 4097 -> 16 0 29 3092 topology 3100 4097 -> 15 0 28 3092 topology 3140 4098 +> 15 0 28 3092 topology 3176 4096 +> 16 0 28 3092 topology 3202 4096 +> 15 0 28 3092 topology 3175 4097 +> 16 0 28 3092 topology 3202 4097 +> 15 0 28 3092 topology 3179 4098 > 16 0 28 3092 topology 3202 4098 -> 15 0 29 3092 topology 3153 4099 -> 16 0 29 3092 topology 3154 4099 -> 15 0 29 3092 topology 3129 4100 -> 16 0 29 3092 topology 3130 4100 -> 15 0 29 3092 topology 3183 4101 -> 16 0 29 3092 topology 3184 4101 -> 15 0 28 3092 topology 3200 4102 +> 15 0 28 3092 topology 3178 4099 +> 16 0 28 3092 topology 3202 4099 +> 15 0 28 3092 topology 3182 4100 +> 16 0 28 3092 topology 3202 4100 +> 15 0 28 3092 topology 3181 4101 +> 16 0 28 3092 topology 3202 4101 +> 15 0 28 3092 topology 3185 4102 > 16 0 28 3092 topology 3202 4102 -> 15 0 29 3092 topology 3105 4103 -> 16 0 29 3092 topology 3106 4103 -> 15 0 29 3092 topology 3159 4104 -> 16 0 29 3092 topology 3160 4104 -> 15 0 29 3092 topology 3135 4105 -> 16 0 29 3092 topology 3136 4105 -> 15 0 29 3092 topology 3189 4106 -> 16 0 29 3092 topology 3190 4106 -> 15 0 28 3092 topology 3094 4107 +> 15 0 28 3092 topology 3184 4103 +> 16 0 28 3092 topology 3202 4103 +> 15 0 28 3092 topology 3188 4104 +> 16 0 28 3092 topology 3202 4104 +> 15 0 28 3092 topology 3187 4105 +> 16 0 28 3092 topology 3202 4105 +> 15 0 28 3092 topology 3191 4106 +> 16 0 28 3092 topology 3202 4106 +> 15 0 28 3092 topology 3190 4107 > 16 0 28 3092 topology 3202 4107 -> 15 0 29 3092 topology 3111 4108 -> 16 0 29 3092 topology 3112 4108 -> 15 0 28 3092 topology 3124 4109 +> 15 0 28 3092 topology 3194 4108 +> 16 0 28 3092 topology 3202 4108 +> 15 0 28 3092 topology 3193 4109 > 16 0 28 3092 topology 3202 4109 -> 15 0 29 3092 topology 3165 4110 -> 16 0 29 3092 topology 3166 4110 -> 15 0 28 3092 topology 3154 4111 +> 15 0 28 3092 topology 3197 4110 +> 16 0 28 3092 topology 3202 4110 +> 15 0 28 3092 topology 3196 4111 > 16 0 28 3092 topology 3202 4111 -> 15 0 29 3092 topology 3141 4112 -> 16 0 29 3092 topology 3142 4112 -> 15 0 28 3092 topology 3184 4113 +> 15 0 28 3092 topology 3200 4112 +> 16 0 28 3092 topology 3202 4112 +> 15 0 28 3092 topology 3199 4113 > 16 0 28 3092 topology 3202 4113 -> 15 0 29 3092 topology 3195 4114 -> 16 0 29 3092 topology 3196 4114 -> 15 0 28 3092 topology 3106 4115 -> 16 0 28 3092 topology 3202 4115 -> 15 0 28 3092 topology 3136 4116 -> 16 0 28 3092 topology 3202 4116 -> 15 0 29 3092 topology 3171 4117 -> 16 0 29 3092 topology 3172 4117 -> 15 0 28 3092 topology 3166 4118 -> 16 0 28 3092 topology 3202 4118 -> 15 0 28 3092 topology 3196 4119 -> 16 0 28 3092 topology 3202 4119 -> 15 0 28 3092 topology 3119 4120 -> 16 0 28 3092 topology 3202 4120 -> 15 0 28 3092 topology 3095 4121 -> 16 0 28 3092 topology 3202 4121 -> 15 0 28 3092 topology 3179 4122 -> 16 0 28 3092 topology 3202 4122 -> 15 0 28 3092 topology 3155 4123 -> 16 0 28 3092 topology 3202 4123 -> 15 0 28 3092 topology 3131 4124 -> 16 0 28 3092 topology 3202 4124 -> 15 0 28 3092 topology 3107 4125 -> 16 0 28 3092 topology 3202 4125 -> 15 0 28 3092 topology 3191 4126 -> 16 0 28 3092 topology 3202 4126 -> 15 0 28 3092 topology 3167 4127 -> 16 0 28 3092 topology 3202 4127 -> 15 0 28 3092 topology 3143 4128 -> 16 0 28 3092 topology 3202 4128 -> 15 0 28 3092 topology 3121 4129 -> 16 0 28 3092 topology 3202 4129 -> 15 0 28 3092 topology 3151 4130 -> 16 0 28 3092 topology 3202 4130 -> 15 0 28 3092 topology 3181 4131 -> 16 0 28 3092 topology 3202 4131 -> 15 0 28 3092 topology 3103 4132 -> 16 0 28 3092 topology 3202 4132 -> 15 0 29 3092 topology 3114 4133 -> 16 0 29 3092 topology 3116 4133 -> 15 0 28 3092 topology 3133 4134 -> 16 0 28 3092 topology 3202 4134 -> 15 0 28 3092 topology 3163 4135 -> 16 0 28 3092 topology 3202 4135 -> 15 0 29 3092 topology 3117 4136 -> 16 0 29 3092 topology 3119 4136 -> 15 0 28 3092 topology 3193 4137 -> 16 0 28 3092 topology 3202 4137 -> 15 0 29 3092 topology 3120 4138 -> 16 0 29 3092 topology 3122 4138 -> 15 0 29 3092 topology 3174 4139 -> 16 0 29 3092 topology 3176 4139 -> 15 0 29 3092 topology 3123 4140 -> 16 0 29 3092 topology 3125 4140 -> 15 0 29 3092 topology 3177 4141 -> 16 0 29 3092 topology 3179 4141 -> 15 0 29 3092 topology 3126 4142 -> 16 0 29 3092 topology 3128 4142 -> 15 0 29 3092 topology 3180 4143 -> 16 0 29 3092 topology 3182 4143 -> 15 0 29 3092 topology 3129 4144 -> 16 0 29 3092 topology 3131 4144 -> 15 0 29 3092 topology 3183 4145 -> 16 0 29 3092 topology 3185 4145 -> 15 0 29 3092 topology 3132 4146 -> 16 0 29 3092 topology 3134 4146 -> 15 0 29 3092 topology 3186 4147 -> 16 0 29 3092 topology 3188 4147 -> 15 0 29 3092 topology 3114 4148 -> 16 0 29 3092 topology 3115 4148 -> 15 0 29 3092 topology 3135 4149 -> 16 0 29 3092 topology 3137 4149 -> 15 0 28 3092 topology 3146 4150 -> 16 0 28 3092 topology 3202 4150 -> 15 0 29 3092 topology 3189 4151 -> 16 0 29 3092 topology 3191 4151 -> 15 0 28 3092 topology 3122 4152 -> 16 0 28 3092 topology 3202 4152 -> 15 0 29 3092 topology 3144 4153 -> 16 0 29 3092 topology 3145 4153 -> 15 0 28 3092 topology 3098 4154 -> 16 0 28 3092 topology 3202 4154 -> 15 0 29 3092 topology 3138 4155 -> 16 0 29 3092 topology 3140 4155 -> 15 0 29 3092 topology 3192 4156 -> 16 0 29 3092 topology 3194 4156 -> 15 0 29 3092 topology 3120 4157 -> 16 0 29 3092 topology 3121 4157 -> 15 0 29 3092 topology 3174 4158 -> 16 0 29 3092 topology 3175 4158 -> 15 0 28 3092 topology 3182 4159 -> 16 0 28 3092 topology 3202 4159 -> 15 0 29 3092 topology 3141 4160 -> 16 0 29 3092 topology 3143 4160 -> 15 0 28 3092 topology 3158 4161 -> 16 0 28 3092 topology 3202 4161 -> 15 0 29 3092 topology 3195 4162 -> 16 0 29 3092 topology 3197 4162 -> 15 0 29 3092 topology 3096 4163 -> 16 0 29 3092 topology 3097 4163 -> 15 0 28 3092 topology 3134 4164 -> 16 0 28 3092 topology 3202 4164 -> 15 0 29 3092 topology 3150 4165 -> 16 0 29 3092 topology 3151 4165 -> 15 0 28 3092 topology 3110 4166 -> 16 0 28 3092 topology 3202 4166 -> 15 0 29 3092 topology 3198 4167 -> 16 0 29 3092 topology 3200 4167 -> 15 0 29 3092 topology 3126 4168 -> 16 0 29 3092 topology 3127 4168 -> 15 0 29 3092 topology 3180 4169 -> 16 0 29 3092 topology 3181 4169 -> 15 0 28 3092 topology 3194 4170 -> 16 0 28 3092 topology 3202 4170 -> 15 0 28 3092 topology 3170 4171 -> 16 0 28 3092 topology 3202 4171 -> 15 0 29 3092 topology 3102 4172 -> 16 0 29 3092 topology 3103 4172 -> 15 0 29 3092 topology 3156 4173 -> 16 0 29 3092 topology 3157 4173 -> 15 0 29 3092 topology 3132 4174 -> 16 0 29 3092 topology 3133 4174 -> 15 0 29 3092 topology 3186 4175 -> 16 0 29 3092 topology 3187 4175 -> 15 0 29 3092 topology 3108 4176 -> 16 0 29 3092 topology 3109 4176 -> 15 0 28 3092 topology 3118 4177 -> 16 0 28 3092 topology 3202 4177 -> 15 0 29 3092 topology 3162 4178 -> 16 0 29 3092 topology 3163 4178 -> 15 0 28 3092 topology 3148 4179 -> 16 0 28 3092 topology 3202 4179 -> 15 0 29 3092 topology 3138 4180 -> 16 0 29 3092 topology 3139 4180 -> 15 0 28 3092 topology 3178 4181 -> 16 0 28 3092 topology 3202 4181 -> 15 0 29 3092 topology 3192 4182 -> 16 0 29 3092 topology 3193 4182 -> 15 0 28 3092 topology 3100 4183 -> 16 0 28 3092 topology 3202 4183 -> 15 0 28 3092 topology 3130 4184 -> 16 0 28 3092 topology 3202 4184 -> 15 0 29 3092 topology 3168 4185 -> 16 0 29 3092 topology 3169 4185 -> 15 0 28 3092 topology 3160 4186 -> 16 0 28 3092 topology 3202 4186 -> 15 0 28 3203 topology 3242 4187 +> 15 0 29 3092 topology 3201 4114 +> 16 0 29 3092 topology 3202 4114 +> 15 0 30 3092 topology 3093 4115 +> 16 0 30 3092 topology 3095 4115 +> 15 0 30 3092 topology 3093 4116 +> 16 0 30 3092 topology 3094 4116 +> 15 0 30 3092 topology 3096 4117 +> 16 0 30 3092 topology 3098 4117 +> 15 0 30 3092 topology 3096 4118 +> 16 0 30 3092 topology 3097 4118 +> 15 0 30 3092 topology 3099 4119 +> 16 0 30 3092 topology 3101 4119 +> 15 0 30 3092 topology 3099 4120 +> 16 0 30 3092 topology 3100 4120 +> 15 0 30 3092 topology 3102 4121 +> 16 0 30 3092 topology 3104 4121 +> 15 0 30 3092 topology 3102 4122 +> 16 0 30 3092 topology 3103 4122 +> 15 0 30 3092 topology 3105 4123 +> 16 0 30 3092 topology 3107 4123 +> 15 0 30 3092 topology 3105 4124 +> 16 0 30 3092 topology 3106 4124 +> 15 0 30 3092 topology 3108 4125 +> 16 0 30 3092 topology 3110 4125 +> 15 0 30 3092 topology 3108 4126 +> 16 0 30 3092 topology 3109 4126 +> 15 0 30 3092 topology 3111 4127 +> 16 0 30 3092 topology 3113 4127 +> 15 0 30 3092 topology 3111 4128 +> 16 0 30 3092 topology 3112 4128 +> 15 0 30 3092 topology 3114 4129 +> 16 0 30 3092 topology 3116 4129 +> 15 0 30 3092 topology 3114 4130 +> 16 0 30 3092 topology 3115 4130 +> 15 0 30 3092 topology 3117 4131 +> 16 0 30 3092 topology 3119 4131 +> 15 0 30 3092 topology 3117 4132 +> 16 0 30 3092 topology 3118 4132 +> 15 0 30 3092 topology 3120 4133 +> 16 0 30 3092 topology 3122 4133 +> 15 0 30 3092 topology 3120 4134 +> 16 0 30 3092 topology 3121 4134 +> 15 0 30 3092 topology 3123 4135 +> 16 0 30 3092 topology 3125 4135 +> 15 0 30 3092 topology 3123 4136 +> 16 0 30 3092 topology 3124 4136 +> 15 0 30 3092 topology 3126 4137 +> 16 0 30 3092 topology 3128 4137 +> 15 0 30 3092 topology 3126 4138 +> 16 0 30 3092 topology 3127 4138 +> 15 0 30 3092 topology 3129 4139 +> 16 0 30 3092 topology 3131 4139 +> 15 0 30 3092 topology 3129 4140 +> 16 0 30 3092 topology 3130 4140 +> 15 0 30 3092 topology 3132 4141 +> 16 0 30 3092 topology 3134 4141 +> 15 0 30 3092 topology 3132 4142 +> 16 0 30 3092 topology 3133 4142 +> 15 0 30 3092 topology 3135 4143 +> 16 0 30 3092 topology 3137 4143 +> 15 0 30 3092 topology 3135 4144 +> 16 0 30 3092 topology 3136 4144 +> 15 0 30 3092 topology 3138 4145 +> 16 0 30 3092 topology 3140 4145 +> 15 0 30 3092 topology 3138 4146 +> 16 0 30 3092 topology 3139 4146 +> 15 0 30 3092 topology 3141 4147 +> 16 0 30 3092 topology 3143 4147 +> 15 0 30 3092 topology 3141 4148 +> 16 0 30 3092 topology 3142 4148 +> 15 0 30 3092 topology 3144 4149 +> 16 0 30 3092 topology 3146 4149 +> 15 0 30 3092 topology 3144 4150 +> 16 0 30 3092 topology 3145 4150 +> 15 0 30 3092 topology 3147 4151 +> 16 0 30 3092 topology 3149 4151 +> 15 0 30 3092 topology 3147 4152 +> 16 0 30 3092 topology 3148 4152 +> 15 0 30 3092 topology 3150 4153 +> 16 0 30 3092 topology 3152 4153 +> 15 0 30 3092 topology 3150 4154 +> 16 0 30 3092 topology 3151 4154 +> 15 0 30 3092 topology 3153 4155 +> 16 0 30 3092 topology 3155 4155 +> 15 0 30 3092 topology 3153 4156 +> 16 0 30 3092 topology 3154 4156 +> 15 0 30 3092 topology 3156 4157 +> 16 0 30 3092 topology 3158 4157 +> 15 0 30 3092 topology 3156 4158 +> 16 0 30 3092 topology 3157 4158 +> 15 0 30 3092 topology 3159 4159 +> 16 0 30 3092 topology 3161 4159 +> 15 0 30 3092 topology 3159 4160 +> 16 0 30 3092 topology 3160 4160 +> 15 0 30 3092 topology 3162 4161 +> 16 0 30 3092 topology 3164 4161 +> 15 0 30 3092 topology 3162 4162 +> 16 0 30 3092 topology 3163 4162 +> 15 0 30 3092 topology 3165 4163 +> 16 0 30 3092 topology 3167 4163 +> 15 0 30 3092 topology 3165 4164 +> 16 0 30 3092 topology 3166 4164 +> 15 0 30 3092 topology 3168 4165 +> 16 0 30 3092 topology 3170 4165 +> 15 0 30 3092 topology 3168 4166 +> 16 0 30 3092 topology 3169 4166 +> 15 0 30 3092 topology 3171 4167 +> 16 0 30 3092 topology 3173 4167 +> 15 0 30 3092 topology 3171 4168 +> 16 0 30 3092 topology 3172 4168 +> 15 0 30 3092 topology 3174 4169 +> 16 0 30 3092 topology 3176 4169 +> 15 0 30 3092 topology 3174 4170 +> 16 0 30 3092 topology 3175 4170 +> 15 0 30 3092 topology 3177 4171 +> 16 0 30 3092 topology 3179 4171 +> 15 0 30 3092 topology 3177 4172 +> 16 0 30 3092 topology 3178 4172 +> 15 0 30 3092 topology 3180 4173 +> 16 0 30 3092 topology 3182 4173 +> 15 0 30 3092 topology 3180 4174 +> 16 0 30 3092 topology 3181 4174 +> 15 0 30 3092 topology 3183 4175 +> 16 0 30 3092 topology 3185 4175 +> 15 0 30 3092 topology 3183 4176 +> 16 0 30 3092 topology 3184 4176 +> 15 0 30 3092 topology 3186 4177 +> 16 0 30 3092 topology 3188 4177 +> 15 0 30 3092 topology 3186 4178 +> 16 0 30 3092 topology 3187 4178 +> 15 0 30 3092 topology 3189 4179 +> 16 0 30 3092 topology 3191 4179 +> 15 0 30 3092 topology 3189 4180 +> 16 0 30 3092 topology 3190 4180 +> 15 0 30 3092 topology 3192 4181 +> 16 0 30 3092 topology 3194 4181 +> 15 0 30 3092 topology 3192 4182 +> 16 0 30 3092 topology 3193 4182 +> 15 0 30 3092 topology 3195 4183 +> 16 0 30 3092 topology 3197 4183 +> 15 0 30 3092 topology 3195 4184 +> 16 0 30 3092 topology 3196 4184 +> 15 0 30 3092 topology 3198 4185 +> 16 0 30 3092 topology 3200 4185 +> 15 0 30 3092 topology 3198 4186 +> 16 0 30 3092 topology 3199 4186 +> 15 0 28 3203 topology 3206 4187 > 16 0 28 3203 topology 3271 4187 -> 15 0 28 3203 topology 3254 4188 +> 15 0 28 3203 topology 3205 4188 > 16 0 28 3203 topology 3271 4188 -> 15 0 28 3203 topology 3266 4189 +> 15 0 28 3203 topology 3209 4189 > 16 0 28 3203 topology 3271 4189 -> 15 0 28 3203 topology 3215 4190 +> 15 0 28 3203 topology 3208 4190 > 16 0 28 3203 topology 3271 4190 -> 15 0 28 3203 topology 3238 4191 +> 15 0 28 3203 topology 3212 4191 > 16 0 28 3203 topology 3271 4191 -> 15 0 28 3203 topology 3227 4192 +> 15 0 28 3203 topology 3211 4192 > 16 0 28 3203 topology 3271 4192 -> 15 0 28 3203 topology 3268 4193 +> 15 0 28 3203 topology 3215 4193 > 16 0 28 3203 topology 3271 4193 -> 15 0 29 3203 topology 3237 4194 -> 16 0 29 3203 topology 3239 4194 -> 15 0 28 3203 topology 3250 4195 +> 15 0 28 3203 topology 3214 4194 +> 16 0 28 3203 topology 3271 4194 +> 15 0 28 3203 topology 3218 4195 > 16 0 28 3203 topology 3271 4195 -> 15 0 29 3203 topology 3240 4196 -> 16 0 29 3203 topology 3242 4196 -> 15 0 29 3203 topology 3243 4197 -> 16 0 29 3203 topology 3245 4197 -> 15 0 28 3203 topology 3262 4198 +> 15 0 28 3203 topology 3217 4196 +> 16 0 28 3203 topology 3271 4196 +> 15 0 28 3203 topology 3221 4197 +> 16 0 28 3203 topology 3271 4197 +> 15 0 28 3203 topology 3220 4198 > 16 0 28 3203 topology 3271 4198 -> 15 0 29 3203 topology 3246 4199 -> 16 0 29 3203 topology 3248 4199 -> 15 0 28 3203 topology 3217 4200 +> 15 0 28 3203 topology 3224 4199 +> 16 0 28 3203 topology 3271 4199 +> 15 0 28 3203 topology 3223 4200 > 16 0 28 3203 topology 3271 4200 -> 15 0 29 3203 topology 3249 4201 -> 16 0 29 3203 topology 3251 4201 -> 15 0 29 3203 topology 3252 4202 -> 16 0 29 3203 topology 3254 4202 -> 15 0 28 3203 topology 3229 4203 +> 15 0 28 3203 topology 3227 4201 +> 16 0 28 3203 topology 3271 4201 +> 15 0 28 3203 topology 3226 4202 +> 16 0 28 3203 topology 3271 4202 +> 15 0 28 3203 topology 3230 4203 > 16 0 28 3203 topology 3271 4203 -> 15 0 29 3203 topology 3255 4204 -> 16 0 29 3203 topology 3257 4204 -> 15 0 29 3203 topology 3237 4205 -> 16 0 29 3203 topology 3238 4205 -> 15 0 29 3203 topology 3258 4206 -> 16 0 29 3203 topology 3260 4206 -> 15 0 29 3203 topology 3267 4207 -> 16 0 29 3203 topology 3268 4207 -> 15 0 29 3203 topology 3261 4208 -> 16 0 29 3203 topology 3263 4208 -> 15 0 28 3203 topology 3269 4209 +> 15 0 28 3203 topology 3229 4204 +> 16 0 28 3203 topology 3271 4204 +> 15 0 28 3203 topology 3233 4205 +> 16 0 28 3203 topology 3271 4205 +> 15 0 28 3203 topology 3232 4206 +> 16 0 28 3203 topology 3271 4206 +> 15 0 28 3203 topology 3236 4207 +> 16 0 28 3203 topology 3271 4207 +> 15 0 28 3203 topology 3235 4208 +> 16 0 28 3203 topology 3271 4208 +> 15 0 28 3203 topology 3239 4209 > 16 0 28 3203 topology 3271 4209 -> 15 0 29 3203 topology 3243 4210 -> 16 0 29 3203 topology 3244 4210 -> 15 0 28 3203 topology 3245 4211 +> 15 0 28 3203 topology 3238 4210 +> 16 0 28 3203 topology 3271 4210 +> 15 0 28 3203 topology 3242 4211 > 16 0 28 3203 topology 3271 4211 -> 15 0 29 3203 topology 3264 4212 -> 16 0 29 3203 topology 3266 4212 -> 15 0 29 3203 topology 3249 4213 -> 16 0 29 3203 topology 3250 4213 -> 15 0 28 3203 topology 3257 4214 +> 15 0 28 3203 topology 3241 4212 +> 16 0 28 3203 topology 3271 4212 +> 15 0 28 3203 topology 3245 4213 +> 16 0 28 3203 topology 3271 4213 +> 15 0 28 3203 topology 3244 4214 > 16 0 28 3203 topology 3271 4214 -> 15 0 29 3203 topology 3255 4215 -> 16 0 29 3203 topology 3256 4215 -> 15 0 28 3203 topology 3218 4216 +> 15 0 28 3203 topology 3248 4215 +> 16 0 28 3203 topology 3271 4215 +> 15 0 28 3203 topology 3247 4216 > 16 0 28 3203 topology 3271 4216 -> 15 0 29 3203 topology 3261 4217 -> 16 0 29 3203 topology 3262 4217 -> 15 0 28 3203 topology 3230 4218 +> 15 0 28 3203 topology 3251 4217 +> 16 0 28 3203 topology 3271 4217 +> 15 0 28 3203 topology 3250 4218 > 16 0 28 3203 topology 3271 4218 -> 15 0 28 3203 topology 3206 4219 +> 15 0 28 3203 topology 3254 4219 > 16 0 28 3203 topology 3271 4219 -> 15 0 29 3203 topology 3210 4220 -> 16 0 29 3203 topology 3211 4220 -> 15 0 28 3203 topology 3247 4221 +> 15 0 28 3203 topology 3253 4220 +> 16 0 28 3203 topology 3271 4220 +> 15 0 28 3203 topology 3257 4221 > 16 0 28 3203 topology 3271 4221 -> 15 0 29 3203 topology 3204 4222 -> 16 0 29 3203 topology 3206 4222 -> 15 0 29 3203 topology 3216 4223 -> 16 0 29 3203 topology 3217 4223 +> 15 0 28 3203 topology 3256 4222 +> 16 0 28 3203 topology 3271 4222 +> 15 0 28 3203 topology 3260 4223 +> 16 0 28 3203 topology 3271 4223 > 15 0 28 3203 topology 3259 4224 > 16 0 28 3203 topology 3271 4224 -> 15 0 30 3203 topology 3270 4225 -> 16 0 30 3203 topology 3271 4225 -> 15 0 28 3203 topology 3214 4226 +> 15 0 28 3203 topology 3263 4225 +> 16 0 28 3203 topology 3271 4225 +> 15 0 28 3203 topology 3262 4226 > 16 0 28 3203 topology 3271 4226 -> 15 0 29 3203 topology 3222 4227 -> 16 0 29 3203 topology 3223 4227 -> 15 0 28 3203 topology 3226 4228 +> 15 0 28 3203 topology 3266 4227 +> 16 0 28 3203 topology 3271 4227 +> 15 0 28 3203 topology 3265 4228 > 16 0 28 3203 topology 3271 4228 -> 15 0 29 3203 topology 3228 4229 -> 16 0 29 3203 topology 3229 4229 -> 15 0 29 3203 topology 3204 4230 -> 16 0 29 3203 topology 3205 4230 -> 15 0 29 3203 topology 3234 4231 -> 16 0 29 3203 topology 3235 4231 -> 15 0 28 3203 topology 3248 4232 -> 16 0 28 3203 topology 3271 4232 -> 15 0 28 3203 topology 3260 4233 -> 16 0 28 3203 topology 3271 4233 -> 15 0 28 3203 topology 3209 4234 -> 16 0 28 3203 topology 3271 4234 -> 15 0 28 3203 topology 3221 4235 -> 16 0 28 3203 topology 3271 4235 -> 15 0 28 3203 topology 3244 4236 -> 16 0 28 3203 topology 3271 4236 -> 15 0 28 3203 topology 3233 4237 -> 16 0 28 3203 topology 3271 4237 -> 15 0 28 3203 topology 3256 4238 -> 16 0 28 3203 topology 3271 4238 -> 15 0 29 3203 topology 3267 4239 -> 16 0 29 3203 topology 3269 4239 -> 15 0 28 3203 topology 3211 4240 -> 16 0 28 3203 topology 3271 4240 -> 15 0 28 3203 topology 3223 4241 -> 16 0 28 3203 topology 3271 4241 -> 15 0 28 3203 topology 3205 4242 -> 16 0 28 3203 topology 3271 4242 -> 15 0 28 3203 topology 3235 4243 -> 16 0 28 3203 topology 3271 4243 -> 15 0 28 3203 topology 3239 4244 -> 16 0 28 3203 topology 3271 4244 -> 15 0 29 3203 topology 3240 4245 -> 16 0 29 3203 topology 3241 4245 -> 15 0 29 3203 topology 3207 4246 -> 16 0 29 3203 topology 3209 4246 -> 15 0 29 3203 topology 3210 4247 -> 16 0 29 3203 topology 3212 4247 -> 15 0 29 3203 topology 3246 4248 -> 16 0 29 3203 topology 3247 4248 -> 15 0 28 3203 topology 3251 4249 -> 16 0 28 3203 topology 3271 4249 -> 15 0 29 3203 topology 3213 4250 -> 16 0 29 3203 topology 3215 4250 -> 15 0 29 3203 topology 3216 4251 -> 16 0 29 3203 topology 3218 4251 -> 15 0 29 3203 topology 3252 4252 -> 16 0 29 3203 topology 3253 4252 -> 15 0 28 3203 topology 3263 4253 -> 16 0 28 3203 topology 3271 4253 -> 15 0 28 3203 topology 3212 4254 -> 16 0 28 3203 topology 3271 4254 -> 15 0 29 3203 topology 3219 4255 -> 16 0 29 3203 topology 3221 4255 -> 15 0 29 3203 topology 3222 4256 -> 16 0 29 3203 topology 3224 4256 -> 15 0 29 3203 topology 3258 4257 -> 16 0 29 3203 topology 3259 4257 -> 15 0 28 3203 topology 3224 4258 -> 16 0 28 3203 topology 3271 4258 -> 15 0 29 3203 topology 3225 4259 -> 16 0 29 3203 topology 3227 4259 -> 15 0 29 3203 topology 3207 4260 -> 16 0 29 3203 topology 3208 4260 -> 15 0 28 3203 topology 3241 4261 -> 16 0 28 3203 topology 3271 4261 -> 15 0 29 3203 topology 3228 4262 -> 16 0 29 3203 topology 3230 4262 -> 15 0 29 3203 topology 3264 4263 -> 16 0 29 3203 topology 3265 4263 -> 15 0 29 3203 topology 3231 4264 -> 16 0 29 3203 topology 3233 4264 -> 15 0 28 3203 topology 3236 4265 -> 16 0 28 3203 topology 3271 4265 -> 15 0 29 3203 topology 3213 4266 -> 16 0 29 3203 topology 3214 4266 -> 15 0 28 3203 topology 3253 4267 -> 16 0 28 3203 topology 3271 4267 -> 15 0 29 3203 topology 3234 4268 -> 16 0 29 3203 topology 3236 4268 -> 15 0 28 3203 topology 3208 4269 -> 16 0 28 3203 topology 3271 4269 -> 15 0 29 3203 topology 3219 4270 -> 16 0 29 3203 topology 3220 4270 -> 15 0 28 3203 topology 3265 4271 -> 16 0 28 3203 topology 3271 4271 -> 15 0 28 3203 topology 3220 4272 -> 16 0 28 3203 topology 3271 4272 -> 15 0 29 3203 topology 3225 4273 -> 16 0 29 3203 topology 3226 4273 -> 15 0 28 3203 topology 3232 4274 -> 16 0 28 3203 topology 3271 4274 -> 15 0 29 3203 topology 3231 4275 -> 16 0 29 3203 topology 3232 4275 -> 15 0 28 3272 topology 3281 4276 +> 15 0 28 3203 topology 3269 4229 +> 16 0 28 3203 topology 3271 4229 +> 15 0 28 3203 topology 3268 4230 +> 16 0 28 3203 topology 3271 4230 +> 15 0 29 3203 topology 3270 4231 +> 16 0 29 3203 topology 3271 4231 +> 15 0 30 3203 topology 3204 4232 +> 16 0 30 3203 topology 3206 4232 +> 15 0 30 3203 topology 3204 4233 +> 16 0 30 3203 topology 3205 4233 +> 15 0 30 3203 topology 3207 4234 +> 16 0 30 3203 topology 3209 4234 +> 15 0 30 3203 topology 3207 4235 +> 16 0 30 3203 topology 3208 4235 +> 15 0 30 3203 topology 3210 4236 +> 16 0 30 3203 topology 3212 4236 +> 15 0 30 3203 topology 3210 4237 +> 16 0 30 3203 topology 3211 4237 +> 15 0 30 3203 topology 3213 4238 +> 16 0 30 3203 topology 3215 4238 +> 15 0 30 3203 topology 3213 4239 +> 16 0 30 3203 topology 3214 4239 +> 15 0 30 3203 topology 3216 4240 +> 16 0 30 3203 topology 3218 4240 +> 15 0 30 3203 topology 3216 4241 +> 16 0 30 3203 topology 3217 4241 +> 15 0 30 3203 topology 3219 4242 +> 16 0 30 3203 topology 3221 4242 +> 15 0 30 3203 topology 3219 4243 +> 16 0 30 3203 topology 3220 4243 +> 15 0 30 3203 topology 3222 4244 +> 16 0 30 3203 topology 3224 4244 +> 15 0 30 3203 topology 3222 4245 +> 16 0 30 3203 topology 3223 4245 +> 15 0 30 3203 topology 3225 4246 +> 16 0 30 3203 topology 3227 4246 +> 15 0 30 3203 topology 3225 4247 +> 16 0 30 3203 topology 3226 4247 +> 15 0 30 3203 topology 3228 4248 +> 16 0 30 3203 topology 3230 4248 +> 15 0 30 3203 topology 3228 4249 +> 16 0 30 3203 topology 3229 4249 +> 15 0 30 3203 topology 3231 4250 +> 16 0 30 3203 topology 3233 4250 +> 15 0 30 3203 topology 3231 4251 +> 16 0 30 3203 topology 3232 4251 +> 15 0 30 3203 topology 3234 4252 +> 16 0 30 3203 topology 3236 4252 +> 15 0 30 3203 topology 3234 4253 +> 16 0 30 3203 topology 3235 4253 +> 15 0 30 3203 topology 3237 4254 +> 16 0 30 3203 topology 3239 4254 +> 15 0 30 3203 topology 3237 4255 +> 16 0 30 3203 topology 3238 4255 +> 15 0 30 3203 topology 3240 4256 +> 16 0 30 3203 topology 3242 4256 +> 15 0 30 3203 topology 3240 4257 +> 16 0 30 3203 topology 3241 4257 +> 15 0 30 3203 topology 3243 4258 +> 16 0 30 3203 topology 3245 4258 +> 15 0 30 3203 topology 3243 4259 +> 16 0 30 3203 topology 3244 4259 +> 15 0 30 3203 topology 3246 4260 +> 16 0 30 3203 topology 3248 4260 +> 15 0 30 3203 topology 3246 4261 +> 16 0 30 3203 topology 3247 4261 +> 15 0 30 3203 topology 3249 4262 +> 16 0 30 3203 topology 3251 4262 +> 15 0 30 3203 topology 3249 4263 +> 16 0 30 3203 topology 3250 4263 +> 15 0 30 3203 topology 3252 4264 +> 16 0 30 3203 topology 3254 4264 +> 15 0 30 3203 topology 3252 4265 +> 16 0 30 3203 topology 3253 4265 +> 15 0 30 3203 topology 3255 4266 +> 16 0 30 3203 topology 3257 4266 +> 15 0 30 3203 topology 3255 4267 +> 16 0 30 3203 topology 3256 4267 +> 15 0 30 3203 topology 3258 4268 +> 16 0 30 3203 topology 3260 4268 +> 15 0 30 3203 topology 3258 4269 +> 16 0 30 3203 topology 3259 4269 +> 15 0 30 3203 topology 3261 4270 +> 16 0 30 3203 topology 3263 4270 +> 15 0 30 3203 topology 3261 4271 +> 16 0 30 3203 topology 3262 4271 +> 15 0 30 3203 topology 3264 4272 +> 16 0 30 3203 topology 3266 4272 +> 15 0 30 3203 topology 3264 4273 +> 16 0 30 3203 topology 3265 4273 +> 15 0 30 3203 topology 3267 4274 +> 16 0 30 3203 topology 3269 4274 +> 15 0 30 3203 topology 3267 4275 +> 16 0 30 3203 topology 3268 4275 +> 15 0 28 3272 topology 3275 4276 > 16 0 28 3272 topology 3292 4276 -> 15 0 28 3272 topology 3277 4277 +> 15 0 28 3272 topology 3274 4277 > 16 0 28 3272 topology 3292 4277 -> 15 0 28 3272 topology 3289 4278 +> 15 0 28 3272 topology 3278 4278 > 16 0 28 3272 topology 3292 4278 -> 15 0 29 3272 topology 3273 4279 -> 16 0 29 3272 topology 3274 4279 -> 15 0 29 3272 topology 3279 4280 -> 16 0 29 3272 topology 3280 4280 -> 15 0 29 3272 topology 3285 4281 -> 16 0 29 3272 topology 3286 4281 +> 15 0 28 3272 topology 3277 4279 +> 16 0 28 3272 topology 3292 4279 +> 15 0 28 3272 topology 3281 4280 +> 16 0 28 3272 topology 3292 4280 +> 15 0 28 3272 topology 3280 4281 +> 16 0 28 3272 topology 3292 4281 > 15 0 28 3272 topology 3284 4282 > 16 0 28 3272 topology 3292 4282 -> 15 0 28 3272 topology 3274 4283 +> 15 0 28 3272 topology 3283 4283 > 16 0 28 3272 topology 3292 4283 -> 15 0 30 3272 topology 3291 4284 -> 16 0 30 3272 topology 3292 4284 +> 15 0 28 3272 topology 3287 4284 +> 16 0 28 3272 topology 3292 4284 > 15 0 28 3272 topology 3286 4285 > 16 0 28 3272 topology 3292 4285 -> 15 0 28 3272 topology 3275 4286 +> 15 0 28 3272 topology 3290 4286 > 16 0 28 3272 topology 3292 4286 -> 15 0 28 3272 topology 3287 4287 +> 15 0 28 3272 topology 3289 4287 > 16 0 28 3272 topology 3292 4287 -> 15 0 29 3272 topology 3273 4288 -> 16 0 29 3272 topology 3275 4288 -> 15 0 29 3272 topology 3276 4289 -> 16 0 29 3272 topology 3278 4289 -> 15 0 29 3272 topology 3279 4290 -> 16 0 29 3272 topology 3281 4290 -> 15 0 28 3272 topology 3283 4291 -> 16 0 28 3272 topology 3292 4291 -> 15 0 29 3272 topology 3282 4292 -> 16 0 29 3272 topology 3284 4292 -> 15 0 29 3272 topology 3285 4293 -> 16 0 29 3272 topology 3287 4293 -> 15 0 29 3272 topology 3288 4294 -> 16 0 29 3272 topology 3290 4294 -> 15 0 29 3272 topology 3276 4295 -> 16 0 29 3272 topology 3277 4295 -> 15 0 29 3272 topology 3282 4296 -> 16 0 29 3272 topology 3283 4296 -> 15 0 28 3272 topology 3278 4297 -> 16 0 28 3272 topology 3292 4297 -> 15 0 29 3272 topology 3288 4298 -> 16 0 29 3272 topology 3289 4298 -> 15 0 28 3272 topology 3290 4299 -> 16 0 28 3272 topology 3292 4299 -> 15 0 28 3272 topology 3280 4300 -> 16 0 28 3272 topology 3292 4300 -> 15 0 29 3293 topology 3294 4301 -> 16 0 29 3293 topology 3295 4301 -> 15 0 29 3293 topology 3300 4302 -> 16 0 29 3293 topology 3301 4302 -> 15 0 28 3293 topology 3302 4303 +> 15 0 29 3272 topology 3291 4288 +> 16 0 29 3272 topology 3292 4288 +> 15 0 30 3272 topology 3273 4289 +> 16 0 30 3272 topology 3275 4289 +> 15 0 30 3272 topology 3273 4290 +> 16 0 30 3272 topology 3274 4290 +> 15 0 30 3272 topology 3276 4291 +> 16 0 30 3272 topology 3278 4291 +> 15 0 30 3272 topology 3276 4292 +> 16 0 30 3272 topology 3277 4292 +> 15 0 30 3272 topology 3279 4293 +> 16 0 30 3272 topology 3281 4293 +> 15 0 30 3272 topology 3279 4294 +> 16 0 30 3272 topology 3280 4294 +> 15 0 30 3272 topology 3282 4295 +> 16 0 30 3272 topology 3284 4295 +> 15 0 30 3272 topology 3282 4296 +> 16 0 30 3272 topology 3283 4296 +> 15 0 30 3272 topology 3285 4297 +> 16 0 30 3272 topology 3287 4297 +> 15 0 30 3272 topology 3285 4298 +> 16 0 30 3272 topology 3286 4298 +> 15 0 30 3272 topology 3288 4299 +> 16 0 30 3272 topology 3290 4299 +> 15 0 30 3272 topology 3288 4300 +> 16 0 30 3272 topology 3289 4300 +> 15 0 28 3293 topology 3296 4301 +> 16 0 28 3293 topology 3313 4301 +> 15 0 28 3293 topology 3295 4302 +> 16 0 28 3293 topology 3313 4302 +> 15 0 28 3293 topology 3299 4303 > 16 0 28 3293 topology 3313 4303 -> 15 0 28 3293 topology 3304 4304 +> 15 0 28 3293 topology 3298 4304 > 16 0 28 3293 topology 3313 4304 -> 15 0 28 3293 topology 3298 4305 +> 15 0 28 3293 topology 3302 4305 > 16 0 28 3293 topology 3313 4305 -> 15 0 28 3293 topology 3305 4306 +> 15 0 28 3293 topology 3301 4306 > 16 0 28 3293 topology 3313 4306 -> 15 0 29 3293 topology 3303 4307 -> 16 0 29 3293 topology 3305 4307 -> 15 0 29 3293 topology 3306 4308 -> 16 0 29 3293 topology 3308 4308 -> 15 0 30 3293 topology 3312 4309 -> 16 0 30 3293 topology 3313 4309 -> 15 0 29 3293 topology 3309 4310 -> 16 0 29 3293 topology 3311 4310 -> 15 0 28 3293 topology 3295 4311 +> 15 0 28 3293 topology 3305 4307 +> 16 0 28 3293 topology 3313 4307 +> 15 0 28 3293 topology 3304 4308 +> 16 0 28 3293 topology 3313 4308 +> 15 0 28 3293 topology 3308 4309 +> 16 0 28 3293 topology 3313 4309 +> 15 0 28 3293 topology 3307 4310 +> 16 0 28 3293 topology 3313 4310 +> 15 0 28 3293 topology 3311 4311 > 16 0 28 3293 topology 3313 4311 -> 15 0 29 3293 topology 3303 4312 -> 16 0 29 3293 topology 3304 4312 -> 15 0 29 3293 topology 3309 4313 -> 16 0 29 3293 topology 3310 4313 -> 15 0 28 3293 topology 3308 4314 -> 16 0 28 3293 topology 3313 4314 -> 15 0 28 3293 topology 3296 4315 -> 16 0 28 3293 topology 3313 4315 -> 15 0 29 3293 topology 3297 4316 -> 16 0 29 3293 topology 3298 4316 -> 15 0 28 3293 topology 3310 4317 -> 16 0 28 3293 topology 3313 4317 -> 15 0 28 3293 topology 3311 4318 -> 16 0 28 3293 topology 3313 4318 -> 15 0 28 3293 topology 3299 4319 -> 16 0 28 3293 topology 3313 4319 -> 15 0 28 3293 topology 3307 4320 -> 16 0 28 3293 topology 3313 4320 -> 15 0 28 3293 topology 3301 4321 -> 16 0 28 3293 topology 3313 4321 -> 15 0 29 3293 topology 3294 4322 -> 16 0 29 3293 topology 3296 4322 -> 15 0 29 3293 topology 3297 4323 -> 16 0 29 3293 topology 3299 4323 -> 15 0 29 3293 topology 3306 4324 -> 16 0 29 3293 topology 3307 4324 -> 15 0 29 3293 topology 3300 4325 -> 16 0 29 3293 topology 3302 4325 +> 15 0 28 3293 topology 3310 4312 +> 16 0 28 3293 topology 3313 4312 +> 15 0 29 3293 topology 3312 4313 +> 16 0 29 3293 topology 3313 4313 +> 15 0 30 3293 topology 3294 4314 +> 16 0 30 3293 topology 3296 4314 +> 15 0 30 3293 topology 3294 4315 +> 16 0 30 3293 topology 3295 4315 +> 15 0 30 3293 topology 3297 4316 +> 16 0 30 3293 topology 3299 4316 +> 15 0 30 3293 topology 3297 4317 +> 16 0 30 3293 topology 3298 4317 +> 15 0 30 3293 topology 3300 4318 +> 16 0 30 3293 topology 3302 4318 +> 15 0 30 3293 topology 3300 4319 +> 16 0 30 3293 topology 3301 4319 +> 15 0 30 3293 topology 3303 4320 +> 16 0 30 3293 topology 3305 4320 +> 15 0 30 3293 topology 3303 4321 +> 16 0 30 3293 topology 3304 4321 +> 15 0 30 3293 topology 3306 4322 +> 16 0 30 3293 topology 3308 4322 +> 15 0 30 3293 topology 3306 4323 +> 16 0 30 3293 topology 3307 4323 +> 15 0 30 3293 topology 3309 4324 +> 16 0 30 3293 topology 3311 4324 +> 15 0 30 3293 topology 3309 4325 +> 16 0 30 3293 topology 3310 4325 > 15 0 31 2350 topology 3316 4326 -> 16 0 31 2350 topology 2793 4326 +> 16 0 31 2350 topology 3315 4326 > 15 0 31 2350 topology 3316 4327 -> 16 0 31 2350 topology 3201 4327 +> 16 0 31 2350 topology 2571 4327 > 15 0 31 2350 topology 3316 4328 -> 16 0 31 2350 topology 3312 4328 +> 16 0 31 2350 topology 2682 4328 > 15 0 31 2350 topology 3316 4329 -> 16 0 31 2350 topology 2904 4329 +> 16 0 31 2350 topology 2793 4329 > 15 0 31 2350 topology 3316 4330 -> 16 0 31 2350 topology 2571 4330 +> 16 0 31 2350 topology 2904 4330 > 15 0 31 2350 topology 3316 4331 -> 16 0 31 2350 topology 3315 4331 +> 16 0 31 2350 topology 2979 4331 > 15 0 31 2350 topology 3316 4332 -> 16 0 31 2350 topology 3270 4332 +> 16 0 31 2350 topology 3090 4332 > 15 0 31 2350 topology 3316 4333 -> 16 0 31 2350 topology 2979 4333 -> 15 0 32 2350 topology 2460 4334 -> 16 0 32 2350 topology 3316 4334 +> 16 0 31 2350 topology 3201 4333 +> 15 0 31 2350 topology 3316 4334 +> 16 0 31 2350 topology 3270 4334 > 15 0 31 2350 topology 3316 4335 -> 16 0 31 2350 topology 2682 4335 +> 16 0 31 2350 topology 3291 4335 > 15 0 31 2350 topology 3316 4336 -> 16 0 31 2350 topology 3090 4336 -> 15 0 31 2350 topology 3316 4337 -> 16 0 31 2350 topology 3291 4337 -> 15 0 23 3318 topology 3375 4338 +> 16 0 31 2350 topology 3312 4336 +> 15 0 32 2350 topology 2460 4337 +> 16 0 32 2350 topology 3316 4337 +> 15 0 23 3318 topology 3348 4338 > 16 0 23 3318 topology 3410 4338 -> 15 0 24 3318 topology 3385 4339 -> 16 0 24 3318 topology 3387 4339 -> 15 0 24 3318 topology 3361 4340 -> 16 0 24 3318 topology 3363 4340 -> 15 0 23 3318 topology 3347 4341 +> 15 0 23 3318 topology 3347 4339 +> 16 0 23 3318 topology 3410 4339 +> 15 0 23 3318 topology 3351 4340 +> 16 0 23 3318 topology 3410 4340 +> 15 0 23 3318 topology 3350 4341 > 16 0 23 3318 topology 3410 4341 -> 15 0 25 3318 topology 3409 4342 -> 16 0 25 3318 topology 3410 4342 -> 15 0 24 3318 topology 3337 4343 -> 16 0 24 3318 topology 3339 4343 -> 15 0 23 3318 topology 3377 4344 +> 15 0 23 3318 topology 3354 4342 +> 16 0 23 3318 topology 3410 4342 +> 15 0 23 3318 topology 3353 4343 +> 16 0 23 3318 topology 3410 4343 +> 15 0 23 3318 topology 3357 4344 > 16 0 23 3318 topology 3410 4344 -> 15 0 24 3318 topology 3391 4345 -> 16 0 24 3318 topology 3393 4345 -> 15 0 24 3318 topology 3346 4346 -> 16 0 24 3318 topology 3347 4346 -> 15 0 23 3318 topology 3407 4347 +> 15 0 23 3318 topology 3356 4345 +> 16 0 23 3318 topology 3410 4345 +> 15 0 23 3318 topology 3360 4346 +> 16 0 23 3318 topology 3410 4346 +> 15 0 23 3318 topology 3359 4347 > 16 0 23 3318 topology 3410 4347 -> 15 0 24 3318 topology 3367 4348 -> 16 0 24 3318 topology 3369 4348 -> 15 0 24 3318 topology 3349 4349 -> 16 0 24 3318 topology 3350 4349 -> 15 0 23 3318 topology 3359 4350 +> 15 0 23 3318 topology 3363 4348 +> 16 0 23 3318 topology 3410 4348 +> 15 0 23 3318 topology 3362 4349 +> 16 0 23 3318 topology 3410 4349 +> 15 0 23 3318 topology 3366 4350 > 16 0 23 3318 topology 3410 4350 -> 15 0 23 3318 topology 3389 4351 +> 15 0 23 3318 topology 3365 4351 > 16 0 23 3318 topology 3410 4351 -> 15 0 24 3318 topology 3397 4352 -> 16 0 24 3318 topology 3399 4352 -> 15 0 23 3318 topology 3330 4353 +> 15 0 23 3318 topology 3369 4352 +> 16 0 23 3318 topology 3410 4352 +> 15 0 23 3318 topology 3368 4353 > 16 0 23 3318 topology 3410 4353 -> 15 0 24 3318 topology 3352 4354 -> 16 0 24 3318 topology 3353 4354 -> 15 0 24 3318 topology 3406 4355 -> 16 0 24 3318 topology 3407 4355 -> 15 0 24 3318 topology 3373 4356 -> 16 0 24 3318 topology 3375 4356 -> 15 0 24 3318 topology 3328 4357 -> 16 0 24 3318 topology 3329 4357 -> 15 0 24 3318 topology 3355 4358 -> 16 0 24 3318 topology 3356 4358 -> 15 0 23 3318 topology 3371 4359 +> 15 0 23 3318 topology 3372 4354 +> 16 0 23 3318 topology 3410 4354 +> 15 0 23 3318 topology 3371 4355 +> 16 0 23 3318 topology 3410 4355 +> 15 0 23 3318 topology 3375 4356 +> 16 0 23 3318 topology 3410 4356 +> 15 0 23 3318 topology 3374 4357 +> 16 0 23 3318 topology 3410 4357 +> 15 0 23 3318 topology 3321 4358 +> 16 0 23 3318 topology 3410 4358 +> 15 0 23 3318 topology 3320 4359 > 16 0 23 3318 topology 3410 4359 -> 15 0 23 3318 topology 3401 4360 +> 15 0 23 3318 topology 3378 4360 > 16 0 23 3318 topology 3410 4360 -> 15 0 24 3318 topology 3403 4361 -> 16 0 24 3318 topology 3405 4361 -> 15 0 23 3318 topology 3342 4362 +> 15 0 23 3318 topology 3377 4361 +> 16 0 23 3318 topology 3410 4361 +> 15 0 23 3318 topology 3381 4362 > 16 0 23 3318 topology 3410 4362 -> 15 0 24 3318 topology 3358 4363 -> 16 0 24 3318 topology 3359 4363 -> 15 0 24 3318 topology 3361 4364 -> 16 0 24 3318 topology 3362 4364 -> 15 0 24 3318 topology 3364 4365 -> 16 0 24 3318 topology 3365 4365 -> 15 0 24 3318 topology 3340 4366 -> 16 0 24 3318 topology 3341 4366 -> 15 0 24 3318 topology 3367 4367 -> 16 0 24 3318 topology 3368 4367 -> 15 0 23 3318 topology 3326 4368 +> 15 0 23 3318 topology 3380 4363 +> 16 0 23 3318 topology 3410 4363 +> 15 0 23 3318 topology 3384 4364 +> 16 0 23 3318 topology 3410 4364 +> 15 0 23 3318 topology 3383 4365 +> 16 0 23 3318 topology 3410 4365 +> 15 0 23 3318 topology 3387 4366 +> 16 0 23 3318 topology 3410 4366 +> 15 0 23 3318 topology 3386 4367 +> 16 0 23 3318 topology 3410 4367 +> 15 0 23 3318 topology 3390 4368 > 16 0 23 3318 topology 3410 4368 -> 15 0 24 3318 topology 3370 4369 -> 16 0 24 3318 topology 3371 4369 -> 15 0 24 3318 topology 3373 4370 -> 16 0 24 3318 topology 3374 4370 -> 15 0 23 3318 topology 3378 4371 +> 15 0 23 3318 topology 3389 4369 +> 16 0 23 3318 topology 3410 4369 +> 15 0 23 3318 topology 3393 4370 +> 16 0 23 3318 topology 3410 4370 +> 15 0 23 3318 topology 3392 4371 > 16 0 23 3318 topology 3410 4371 -> 15 0 23 3318 topology 3354 4372 +> 15 0 23 3318 topology 3396 4372 > 16 0 23 3318 topology 3410 4372 -> 15 0 23 3318 topology 3338 4373 +> 15 0 23 3318 topology 3395 4373 > 16 0 23 3318 topology 3410 4373 -> 15 0 23 3318 topology 3390 4374 +> 15 0 23 3318 topology 3399 4374 > 16 0 23 3318 topology 3410 4374 -> 15 0 23 3318 topology 3366 4375 +> 15 0 23 3318 topology 3398 4375 > 16 0 23 3318 topology 3410 4375 -> 15 0 24 3318 topology 3328 4376 -> 16 0 24 3318 topology 3330 4376 -> 15 0 23 3318 topology 3402 4377 +> 15 0 23 3318 topology 3402 4376 +> 16 0 23 3318 topology 3410 4376 +> 15 0 23 3318 topology 3401 4377 > 16 0 23 3318 topology 3410 4377 -> 15 0 23 3318 topology 3321 4378 +> 15 0 23 3318 topology 3405 4378 > 16 0 23 3318 topology 3410 4378 -> 15 0 24 3318 topology 3340 4379 -> 16 0 24 3318 topology 3342 4379 -> 15 0 23 3318 topology 3356 4380 +> 15 0 23 3318 topology 3404 4379 +> 16 0 23 3318 topology 3410 4379 +> 15 0 23 3318 topology 3324 4380 > 16 0 23 3318 topology 3410 4380 -> 15 0 23 3318 topology 3386 4381 +> 15 0 23 3318 topology 3323 4381 > 16 0 23 3318 topology 3410 4381 -> 15 0 24 3318 topology 3325 4382 -> 16 0 24 3318 topology 3326 4382 -> 15 0 23 3318 topology 3333 4383 +> 15 0 23 3318 topology 3408 4382 +> 16 0 23 3318 topology 3410 4382 +> 15 0 23 3318 topology 3407 4383 > 16 0 23 3318 topology 3410 4383 -> 15 0 23 3318 topology 3368 4384 +> 15 0 23 3318 topology 3327 4384 > 16 0 23 3318 topology 3410 4384 -> 15 0 23 3318 topology 3398 4385 +> 15 0 23 3318 topology 3326 4385 > 16 0 23 3318 topology 3410 4385 -> 15 0 23 3318 topology 3345 4386 +> 15 0 23 3318 topology 3330 4386 > 16 0 23 3318 topology 3410 4386 -> 15 0 24 3318 topology 3337 4387 -> 16 0 24 3318 topology 3338 4387 -> 15 0 23 3318 topology 3323 4388 +> 15 0 23 3318 topology 3329 4387 +> 16 0 23 3318 topology 3410 4387 +> 15 0 23 3318 topology 3333 4388 > 16 0 23 3318 topology 3410 4388 -> 15 0 24 3318 topology 3319 4389 -> 16 0 24 3318 topology 3321 4389 -> 15 0 23 3318 topology 3335 4390 +> 15 0 23 3318 topology 3332 4389 +> 16 0 23 3318 topology 3410 4389 +> 15 0 23 3318 topology 3336 4390 > 16 0 23 3318 topology 3410 4390 -> 15 0 24 3318 topology 3346 4391 -> 16 0 24 3318 topology 3348 4391 -> 15 0 23 3318 topology 3381 4392 +> 15 0 23 3318 topology 3335 4391 +> 16 0 23 3318 topology 3410 4391 +> 15 0 23 3318 topology 3339 4392 > 16 0 23 3318 topology 3410 4392 -> 15 0 23 3318 topology 3357 4393 +> 15 0 23 3318 topology 3338 4393 > 16 0 23 3318 topology 3410 4393 -> 15 0 24 3318 topology 3376 4394 -> 16 0 24 3318 topology 3378 4394 -> 15 0 24 3318 topology 3352 4395 -> 16 0 24 3318 topology 3354 4395 -> 15 0 23 3318 topology 3393 4396 +> 15 0 23 3318 topology 3342 4394 +> 16 0 23 3318 topology 3410 4394 +> 15 0 23 3318 topology 3341 4395 +> 16 0 23 3318 topology 3410 4395 +> 15 0 23 3318 topology 3345 4396 > 16 0 23 3318 topology 3410 4396 -> 15 0 24 3318 topology 3406 4397 -> 16 0 24 3318 topology 3408 4397 -> 15 0 23 3318 topology 3369 4398 -> 16 0 23 3318 topology 3410 4398 -> 15 0 24 3318 topology 3382 4399 -> 16 0 24 3318 topology 3384 4399 -> 15 0 24 3318 topology 3331 4400 -> 16 0 24 3318 topology 3333 4400 -> 15 0 24 3318 topology 3358 4401 -> 16 0 24 3318 topology 3360 4401 -> 15 0 23 3318 topology 3405 4402 -> 16 0 23 3318 topology 3410 4402 -> 15 0 24 3318 topology 3388 4403 -> 16 0 24 3318 topology 3390 4403 -> 15 0 24 3318 topology 3364 4404 -> 16 0 24 3318 topology 3366 4404 -> 15 0 23 3318 topology 3353 4405 -> 16 0 23 3318 topology 3410 4405 -> 15 0 23 3318 topology 3383 4406 -> 16 0 23 3318 topology 3410 4406 -> 15 0 24 3318 topology 3394 4407 -> 16 0 24 3318 topology 3396 4407 -> 15 0 24 3318 topology 3322 4408 -> 16 0 24 3318 topology 3323 4408 -> 15 0 23 3318 topology 3324 4409 -> 16 0 23 3318 topology 3410 4409 -> 15 0 24 3318 topology 3376 4410 -> 16 0 24 3318 topology 3377 4410 -> 15 0 24 3318 topology 3343 4411 -> 16 0 24 3318 topology 3345 4411 -> 15 0 24 3318 topology 3370 4412 -> 16 0 24 3318 topology 3372 4412 -> 15 0 23 3318 topology 3365 4413 -> 16 0 23 3318 topology 3410 4413 -> 15 0 24 3318 topology 3379 4414 -> 16 0 24 3318 topology 3380 4414 -> 15 0 23 3318 topology 3395 4415 -> 16 0 23 3318 topology 3410 4415 -> 15 0 24 3318 topology 3400 4416 -> 16 0 24 3318 topology 3402 4416 -> 15 0 23 3318 topology 3336 4417 -> 16 0 23 3318 topology 3410 4417 -> 15 0 24 3318 topology 3382 4418 -> 16 0 24 3318 topology 3383 4418 -> 15 0 24 3318 topology 3385 4419 -> 16 0 24 3318 topology 3386 4419 -> 15 0 24 3318 topology 3334 4420 -> 16 0 24 3318 topology 3335 4420 -> 15 0 24 3318 topology 3388 4421 -> 16 0 24 3318 topology 3389 4421 -> 15 0 24 3318 topology 3391 4422 -> 16 0 24 3318 topology 3392 4422 -> 15 0 23 3318 topology 3320 4423 -> 16 0 23 3318 topology 3410 4423 -> 15 0 24 3318 topology 3394 4424 -> 16 0 24 3318 topology 3395 4424 -> 15 0 24 3318 topology 3397 4425 -> 16 0 24 3318 topology 3398 4425 -> 15 0 23 3318 topology 3348 4426 -> 16 0 23 3318 topology 3410 4426 -> 15 0 23 3318 topology 3332 4427 -> 16 0 23 3318 topology 3410 4427 -> 15 0 24 3318 topology 3400 4428 -> 16 0 24 3318 topology 3401 4428 -> 15 0 23 3318 topology 3408 4429 -> 16 0 23 3318 topology 3410 4429 -> 15 0 23 3318 topology 3384 4430 -> 16 0 23 3318 topology 3410 4430 -> 15 0 24 3318 topology 3403 4431 -> 16 0 24 3318 topology 3404 4431 -> 15 0 24 3318 topology 3322 4432 -> 16 0 24 3318 topology 3324 4432 -> 15 0 23 3318 topology 3360 4433 -> 16 0 23 3318 topology 3410 4433 -> 15 0 23 3318 topology 3344 4434 -> 16 0 23 3318 topology 3410 4434 -> 15 0 23 3318 topology 3396 4435 -> 16 0 23 3318 topology 3410 4435 -> 15 0 23 3318 topology 3372 4436 -> 16 0 23 3318 topology 3410 4436 -> 15 0 24 3318 topology 3334 4437 -> 16 0 24 3318 topology 3336 4437 -> 15 0 23 3318 topology 3350 4438 -> 16 0 23 3318 topology 3410 4438 -> 15 0 24 3318 topology 3319 4439 -> 16 0 24 3318 topology 3320 4439 -> 15 0 23 3318 topology 3380 4440 -> 16 0 23 3318 topology 3410 4440 -> 15 0 23 3318 topology 3327 4441 -> 16 0 23 3318 topology 3410 4441 -> 15 0 23 3318 topology 3362 4442 -> 16 0 23 3318 topology 3410 4442 -> 15 0 23 3318 topology 3392 4443 -> 16 0 23 3318 topology 3410 4443 -> 15 0 23 3318 topology 3339 4444 -> 16 0 23 3318 topology 3410 4444 -> 15 0 23 3318 topology 3374 4445 -> 16 0 23 3318 topology 3410 4445 -> 15 0 24 3318 topology 3331 4446 -> 16 0 24 3318 topology 3332 4446 -> 15 0 23 3318 topology 3404 4447 -> 16 0 23 3318 topology 3410 4447 -> 15 0 24 3318 topology 3343 4448 -> 16 0 24 3318 topology 3344 4448 -> 15 0 23 3318 topology 3329 4449 -> 16 0 23 3318 topology 3410 4449 -> 15 0 23 3318 topology 3351 4450 -> 16 0 23 3318 topology 3410 4450 -> 15 0 23 3318 topology 3341 4451 -> 16 0 23 3318 topology 3410 4451 -> 15 0 24 3318 topology 3349 4452 -> 16 0 24 3318 topology 3351 4452 -> 15 0 23 3318 topology 3387 4453 -> 16 0 23 3318 topology 3410 4453 -> 15 0 23 3318 topology 3363 4454 -> 16 0 23 3318 topology 3410 4454 -> 15 0 24 3318 topology 3325 4455 -> 16 0 24 3318 topology 3327 4455 -> 15 0 24 3318 topology 3379 4456 -> 16 0 24 3318 topology 3381 4456 -> 15 0 24 3318 topology 3355 4457 -> 16 0 24 3318 topology 3357 4457 -> 15 0 23 3318 topology 3399 4458 -> 16 0 23 3318 topology 3410 4458 +> 15 0 23 3318 topology 3344 4397 +> 16 0 23 3318 topology 3410 4397 +> 15 0 24 3318 topology 3409 4398 +> 16 0 24 3318 topology 3410 4398 +> 15 0 25 3318 topology 3346 4399 +> 16 0 25 3318 topology 3348 4399 +> 15 0 25 3318 topology 3346 4400 +> 16 0 25 3318 topology 3347 4400 +> 15 0 25 3318 topology 3349 4401 +> 16 0 25 3318 topology 3351 4401 +> 15 0 25 3318 topology 3349 4402 +> 16 0 25 3318 topology 3350 4402 +> 15 0 25 3318 topology 3352 4403 +> 16 0 25 3318 topology 3354 4403 +> 15 0 25 3318 topology 3352 4404 +> 16 0 25 3318 topology 3353 4404 +> 15 0 25 3318 topology 3355 4405 +> 16 0 25 3318 topology 3357 4405 +> 15 0 25 3318 topology 3355 4406 +> 16 0 25 3318 topology 3356 4406 +> 15 0 25 3318 topology 3358 4407 +> 16 0 25 3318 topology 3360 4407 +> 15 0 25 3318 topology 3358 4408 +> 16 0 25 3318 topology 3359 4408 +> 15 0 25 3318 topology 3361 4409 +> 16 0 25 3318 topology 3363 4409 +> 15 0 25 3318 topology 3361 4410 +> 16 0 25 3318 topology 3362 4410 +> 15 0 25 3318 topology 3364 4411 +> 16 0 25 3318 topology 3366 4411 +> 15 0 25 3318 topology 3364 4412 +> 16 0 25 3318 topology 3365 4412 +> 15 0 25 3318 topology 3367 4413 +> 16 0 25 3318 topology 3369 4413 +> 15 0 25 3318 topology 3367 4414 +> 16 0 25 3318 topology 3368 4414 +> 15 0 25 3318 topology 3370 4415 +> 16 0 25 3318 topology 3372 4415 +> 15 0 25 3318 topology 3370 4416 +> 16 0 25 3318 topology 3371 4416 +> 15 0 25 3318 topology 3373 4417 +> 16 0 25 3318 topology 3375 4417 +> 15 0 25 3318 topology 3373 4418 +> 16 0 25 3318 topology 3374 4418 +> 15 0 25 3318 topology 3319 4419 +> 16 0 25 3318 topology 3321 4419 +> 15 0 25 3318 topology 3319 4420 +> 16 0 25 3318 topology 3320 4420 +> 15 0 25 3318 topology 3376 4421 +> 16 0 25 3318 topology 3378 4421 +> 15 0 25 3318 topology 3376 4422 +> 16 0 25 3318 topology 3377 4422 +> 15 0 25 3318 topology 3379 4423 +> 16 0 25 3318 topology 3381 4423 +> 15 0 25 3318 topology 3379 4424 +> 16 0 25 3318 topology 3380 4424 +> 15 0 25 3318 topology 3382 4425 +> 16 0 25 3318 topology 3384 4425 +> 15 0 25 3318 topology 3382 4426 +> 16 0 25 3318 topology 3383 4426 +> 15 0 25 3318 topology 3385 4427 +> 16 0 25 3318 topology 3387 4427 +> 15 0 25 3318 topology 3385 4428 +> 16 0 25 3318 topology 3386 4428 +> 15 0 25 3318 topology 3388 4429 +> 16 0 25 3318 topology 3390 4429 +> 15 0 25 3318 topology 3388 4430 +> 16 0 25 3318 topology 3389 4430 +> 15 0 25 3318 topology 3391 4431 +> 16 0 25 3318 topology 3393 4431 +> 15 0 25 3318 topology 3391 4432 +> 16 0 25 3318 topology 3392 4432 +> 15 0 25 3318 topology 3394 4433 +> 16 0 25 3318 topology 3396 4433 +> 15 0 25 3318 topology 3394 4434 +> 16 0 25 3318 topology 3395 4434 +> 15 0 25 3318 topology 3397 4435 +> 16 0 25 3318 topology 3399 4435 +> 15 0 25 3318 topology 3397 4436 +> 16 0 25 3318 topology 3398 4436 +> 15 0 25 3318 topology 3400 4437 +> 16 0 25 3318 topology 3402 4437 +> 15 0 25 3318 topology 3400 4438 +> 16 0 25 3318 topology 3401 4438 +> 15 0 25 3318 topology 3403 4439 +> 16 0 25 3318 topology 3405 4439 +> 15 0 25 3318 topology 3403 4440 +> 16 0 25 3318 topology 3404 4440 +> 15 0 25 3318 topology 3322 4441 +> 16 0 25 3318 topology 3324 4441 +> 15 0 25 3318 topology 3322 4442 +> 16 0 25 3318 topology 3323 4442 +> 15 0 25 3318 topology 3406 4443 +> 16 0 25 3318 topology 3408 4443 +> 15 0 25 3318 topology 3406 4444 +> 16 0 25 3318 topology 3407 4444 +> 15 0 25 3318 topology 3325 4445 +> 16 0 25 3318 topology 3327 4445 +> 15 0 25 3318 topology 3325 4446 +> 16 0 25 3318 topology 3326 4446 +> 15 0 25 3318 topology 3328 4447 +> 16 0 25 3318 topology 3330 4447 +> 15 0 25 3318 topology 3328 4448 +> 16 0 25 3318 topology 3329 4448 +> 15 0 25 3318 topology 3331 4449 +> 16 0 25 3318 topology 3333 4449 +> 15 0 25 3318 topology 3331 4450 +> 16 0 25 3318 topology 3332 4450 +> 15 0 25 3318 topology 3334 4451 +> 16 0 25 3318 topology 3336 4451 +> 15 0 25 3318 topology 3334 4452 +> 16 0 25 3318 topology 3335 4452 +> 15 0 25 3318 topology 3337 4453 +> 16 0 25 3318 topology 3339 4453 +> 15 0 25 3318 topology 3337 4454 +> 16 0 25 3318 topology 3338 4454 +> 15 0 25 3318 topology 3340 4455 +> 16 0 25 3318 topology 3342 4455 +> 15 0 25 3318 topology 3340 4456 +> 16 0 25 3318 topology 3341 4456 +> 15 0 25 3318 topology 3343 4457 +> 16 0 25 3318 topology 3345 4457 +> 15 0 25 3318 topology 3343 4458 +> 16 0 25 3318 topology 3344 4458 > 15 0 26 2349 topology 3317 4459 > 16 0 26 2349 topology 3413 4459 > 15 0 26 2349 topology 3411 4460 -> 16 0 26 2349 topology 3409 4460 -> 15 0 21 2349 topology 3317 4461 -> 16 0 21 2349 topology 3411 4461 -> 15 0 33 2349 topology 3315 4462 -> 16 0 33 2349 topology 3317 4462 +> 16 0 26 2349 topology 3413 4460 +> 15 0 34 2349 topology 3315 4461 +> 16 0 34 2349 topology 3317 4461 +> 15 0 20 2349 topology 3317 4462 +> 16 0 20 2349 topology 3411 4462 > 15 0 26 2349 topology 3411 4463 -> 16 0 26 2349 topology 3413 4463 -> 15 0 24 3416 topology 3501 4464 -> 16 0 24 3416 topology 3502 4464 -> 15 0 24 3416 topology 3555 4465 -> 16 0 24 3416 topology 3556 4465 -> 15 0 24 3416 topology 3420 4466 -> 16 0 24 3416 topology 3422 4466 -> 15 0 24 3416 topology 3447 4467 -> 16 0 24 3416 topology 3449 4467 -> 15 0 23 3416 topology 3449 4468 +> 16 0 26 2349 topology 3409 4463 +> 15 0 23 3416 topology 3446 4464 +> 16 0 23 3416 topology 3610 4464 +> 15 0 23 3416 topology 3445 4465 +> 16 0 23 3416 topology 3610 4465 +> 15 0 23 3416 topology 3449 4466 +> 16 0 23 3416 topology 3610 4466 +> 15 0 23 3416 topology 3448 4467 +> 16 0 23 3416 topology 3610 4467 +> 15 0 23 3416 topology 3452 4468 > 16 0 23 3416 topology 3610 4468 -> 15 0 23 3416 topology 3433 4469 +> 15 0 23 3416 topology 3451 4469 > 16 0 23 3416 topology 3610 4469 -> 15 0 24 3416 topology 3558 4470 -> 16 0 24 3416 topology 3559 4470 -> 15 0 24 3416 topology 3477 4471 -> 16 0 24 3416 topology 3479 4471 -> 15 0 23 3416 topology 3509 4472 +> 15 0 23 3416 topology 3455 4470 +> 16 0 23 3416 topology 3610 4470 +> 15 0 23 3416 topology 3454 4471 +> 16 0 23 3416 topology 3610 4471 +> 15 0 23 3416 topology 3458 4472 > 16 0 23 3416 topology 3610 4472 -> 15 0 23 3416 topology 3485 4473 +> 15 0 23 3416 topology 3457 4473 > 16 0 23 3416 topology 3610 4473 -> 15 0 24 3416 topology 3561 4474 -> 16 0 24 3416 topology 3562 4474 -> 15 0 24 3416 topology 3453 4475 -> 16 0 24 3416 topology 3455 4475 -> 15 0 23 3416 topology 3461 4476 +> 15 0 23 3416 topology 3461 4474 +> 16 0 23 3416 topology 3610 4474 +> 15 0 23 3416 topology 3460 4475 +> 16 0 23 3416 topology 3610 4475 +> 15 0 23 3416 topology 3464 4476 > 16 0 23 3416 topology 3610 4476 -> 15 0 24 3416 topology 3507 4477 -> 16 0 24 3416 topology 3509 4477 -> 15 0 23 3416 topology 3569 4478 +> 15 0 23 3416 topology 3463 4477 +> 16 0 23 3416 topology 3610 4477 +> 15 0 23 3416 topology 3467 4478 > 16 0 23 3416 topology 3610 4478 -> 15 0 23 3416 topology 3545 4479 +> 15 0 23 3416 topology 3466 4479 > 16 0 23 3416 topology 3610 4479 -> 15 0 24 3416 topology 3483 4480 -> 16 0 24 3416 topology 3485 4480 -> 15 0 23 3416 topology 3521 4481 +> 15 0 23 3416 topology 3470 4480 +> 16 0 23 3416 topology 3610 4480 +> 15 0 23 3416 topology 3469 4481 > 16 0 23 3416 topology 3610 4481 -> 15 0 24 3416 topology 3537 4482 -> 16 0 24 3416 topology 3539 4482 -> 15 0 23 3416 topology 3497 4483 +> 15 0 23 3416 topology 3473 4482 +> 16 0 23 3416 topology 3610 4482 +> 15 0 23 3416 topology 3472 4483 > 16 0 23 3416 topology 3610 4483 -> 15 0 23 3416 topology 3605 4484 +> 15 0 23 3416 topology 3419 4484 > 16 0 23 3416 topology 3610 4484 -> 15 0 24 3416 topology 3432 4485 -> 16 0 24 3416 topology 3434 4485 -> 15 0 24 3416 topology 3459 4486 -> 16 0 24 3416 topology 3461 4486 -> 15 0 23 3416 topology 3473 4487 +> 15 0 23 3416 topology 3418 4485 +> 16 0 23 3416 topology 3610 4485 +> 15 0 23 3416 topology 3476 4486 +> 16 0 23 3416 topology 3610 4486 +> 15 0 23 3416 topology 3475 4487 > 16 0 23 3416 topology 3610 4487 -> 15 0 24 3416 topology 3513 4488 -> 16 0 24 3416 topology 3515 4488 -> 15 0 24 3416 topology 3567 4489 -> 16 0 24 3416 topology 3569 4489 -> 15 0 23 3416 topology 3581 4490 +> 15 0 23 3416 topology 3479 4488 +> 16 0 23 3416 topology 3610 4488 +> 15 0 23 3416 topology 3478 4489 +> 16 0 23 3416 topology 3610 4489 +> 15 0 23 3416 topology 3482 4490 > 16 0 23 3416 topology 3610 4490 -> 15 0 23 3416 topology 3557 4491 +> 15 0 23 3416 topology 3481 4491 > 16 0 23 3416 topology 3610 4491 -> 15 0 24 3416 topology 3489 4492 -> 16 0 24 3416 topology 3491 4492 -> 15 0 23 3416 topology 3533 4493 +> 15 0 23 3416 topology 3485 4492 +> 16 0 23 3416 topology 3610 4492 +> 15 0 23 3416 topology 3484 4493 > 16 0 23 3416 topology 3610 4493 -> 15 0 24 3416 topology 3543 4494 -> 16 0 24 3416 topology 3545 4494 -> 15 0 24 3416 topology 3597 4495 -> 16 0 24 3416 topology 3599 4495 -> 15 0 23 3416 topology 3445 4496 +> 15 0 23 3416 topology 3488 4494 +> 16 0 23 3416 topology 3610 4494 +> 15 0 23 3416 topology 3487 4495 +> 16 0 23 3416 topology 3610 4495 +> 15 0 23 3416 topology 3491 4496 > 16 0 23 3416 topology 3610 4496 -> 15 0 24 3416 topology 3465 4497 -> 16 0 24 3416 topology 3467 4497 -> 15 0 24 3416 topology 3519 4498 -> 16 0 24 3416 topology 3521 4498 -> 15 0 24 3416 topology 3573 4499 -> 16 0 24 3416 topology 3575 4499 -> 15 0 23 3416 topology 3593 4500 +> 15 0 23 3416 topology 3490 4497 +> 16 0 23 3416 topology 3610 4497 +> 15 0 23 3416 topology 3494 4498 +> 16 0 23 3416 topology 3610 4498 +> 15 0 23 3416 topology 3493 4499 +> 16 0 23 3416 topology 3610 4499 +> 15 0 23 3416 topology 3497 4500 > 16 0 23 3416 topology 3610 4500 -> 15 0 24 3416 topology 3420 4501 -> 16 0 24 3416 topology 3421 4501 -> 15 0 23 3416 topology 3475 4502 +> 15 0 23 3416 topology 3496 4501 +> 16 0 23 3416 topology 3610 4501 +> 15 0 23 3416 topology 3500 4502 > 16 0 23 3416 topology 3610 4502 -> 15 0 24 3416 topology 3495 4503 -> 16 0 24 3416 topology 3497 4503 -> 15 0 23 3416 topology 3505 4504 +> 15 0 23 3416 topology 3499 4503 +> 16 0 23 3416 topology 3610 4503 +> 15 0 23 3416 topology 3503 4504 > 16 0 23 3416 topology 3610 4504 -> 15 0 24 3416 topology 3549 4505 -> 16 0 24 3416 topology 3551 4505 -> 15 0 24 3416 topology 3603 4506 -> 16 0 24 3416 topology 3605 4506 -> 15 0 25 3416 topology 3609 4507 -> 16 0 25 3416 topology 3610 4507 -> 15 0 23 3416 topology 3535 4508 +> 15 0 23 3416 topology 3502 4505 +> 16 0 23 3416 topology 3610 4505 +> 15 0 23 3416 topology 3422 4506 +> 16 0 23 3416 topology 3610 4506 +> 15 0 23 3416 topology 3421 4507 +> 16 0 23 3416 topology 3610 4507 +> 15 0 23 3416 topology 3506 4508 > 16 0 23 3416 topology 3610 4508 -> 15 0 23 3416 topology 3422 4509 +> 15 0 23 3416 topology 3505 4509 > 16 0 23 3416 topology 3610 4509 -> 15 0 23 3416 topology 3457 4510 +> 15 0 23 3416 topology 3509 4510 > 16 0 23 3416 topology 3610 4510 -> 15 0 24 3416 topology 3471 4511 -> 16 0 24 3416 topology 3473 4511 -> 15 0 24 3416 topology 3525 4512 -> 16 0 24 3416 topology 3527 4512 -> 15 0 23 3416 topology 3565 4513 +> 15 0 23 3416 topology 3508 4511 +> 16 0 23 3416 topology 3610 4511 +> 15 0 23 3416 topology 3512 4512 +> 16 0 23 3416 topology 3610 4512 +> 15 0 23 3416 topology 3511 4513 > 16 0 23 3416 topology 3610 4513 -> 15 0 24 3416 topology 3579 4514 -> 16 0 24 3416 topology 3581 4514 -> 15 0 23 3416 topology 3487 4515 +> 15 0 23 3416 topology 3515 4514 +> 16 0 23 3416 topology 3610 4514 +> 15 0 23 3416 topology 3514 4515 > 16 0 23 3416 topology 3610 4515 -> 15 0 23 3416 topology 3595 4516 +> 15 0 23 3416 topology 3518 4516 > 16 0 23 3416 topology 3610 4516 -> 15 0 24 3416 topology 3501 4517 -> 16 0 24 3416 topology 3503 4517 -> 15 0 23 3416 topology 3517 4518 +> 15 0 23 3416 topology 3517 4517 +> 16 0 23 3416 topology 3610 4517 +> 15 0 23 3416 topology 3521 4518 > 16 0 23 3416 topology 3610 4518 -> 15 0 24 3416 topology 3555 4519 -> 16 0 24 3416 topology 3557 4519 -> 15 0 23 3416 topology 3547 4520 +> 15 0 23 3416 topology 3520 4519 +> 16 0 23 3416 topology 3610 4519 +> 15 0 23 3416 topology 3524 4520 > 16 0 23 3416 topology 3610 4520 -> 15 0 23 3416 topology 3434 4521 +> 15 0 23 3416 topology 3523 4521 > 16 0 23 3416 topology 3610 4521 -> 15 0 23 3416 topology 3469 4522 +> 15 0 23 3416 topology 3527 4522 > 16 0 23 3416 topology 3610 4522 -> 15 0 24 3416 topology 3531 4523 -> 16 0 24 3416 topology 3533 4523 -> 15 0 23 3416 topology 3577 4524 +> 15 0 23 3416 topology 3526 4523 +> 16 0 23 3416 topology 3610 4523 +> 15 0 23 3416 topology 3530 4524 > 16 0 23 3416 topology 3610 4524 -> 15 0 24 3416 topology 3585 4525 -> 16 0 24 3416 topology 3587 4525 -> 15 0 24 3416 topology 3432 4526 -> 16 0 24 3416 topology 3433 4526 -> 15 0 23 3416 topology 3499 4527 +> 15 0 23 3416 topology 3529 4525 +> 16 0 23 3416 topology 3610 4525 +> 15 0 23 3416 topology 3533 4526 +> 16 0 23 3416 topology 3610 4526 +> 15 0 23 3416 topology 3532 4527 > 16 0 23 3416 topology 3610 4527 -> 15 0 23 3416 topology 3607 4528 +> 15 0 23 3416 topology 3425 4528 > 16 0 23 3416 topology 3610 4528 -> 15 0 23 3416 topology 3529 4529 +> 15 0 23 3416 topology 3424 4529 > 16 0 23 3416 topology 3610 4529 -> 15 0 24 3416 topology 3561 4530 -> 16 0 24 3416 topology 3563 4530 -> 15 0 23 3416 topology 3559 4531 +> 15 0 23 3416 topology 3536 4530 +> 16 0 23 3416 topology 3610 4530 +> 15 0 23 3416 topology 3535 4531 > 16 0 23 3416 topology 3610 4531 -> 15 0 23 3416 topology 3589 4532 +> 15 0 23 3416 topology 3539 4532 > 16 0 23 3416 topology 3610 4532 -> 15 0 24 3416 topology 3591 4533 -> 16 0 24 3416 topology 3593 4533 -> 15 0 23 3416 topology 3418 4534 +> 15 0 23 3416 topology 3538 4533 +> 16 0 23 3416 topology 3610 4533 +> 15 0 23 3416 topology 3542 4534 > 16 0 23 3416 topology 3610 4534 -> 15 0 23 3416 topology 3430 4535 +> 15 0 23 3416 topology 3541 4535 > 16 0 23 3416 topology 3610 4535 -> 15 0 23 3416 topology 3476 4536 +> 15 0 23 3416 topology 3545 4536 > 16 0 23 3416 topology 3610 4536 -> 15 0 23 3416 topology 3452 4537 +> 15 0 23 3416 topology 3544 4537 > 16 0 23 3416 topology 3610 4537 -> 15 0 24 3416 topology 3423 4538 -> 16 0 24 3416 topology 3425 4538 -> 15 0 23 3416 topology 3536 4539 +> 15 0 23 3416 topology 3548 4538 +> 16 0 23 3416 topology 3610 4538 +> 15 0 23 3416 topology 3547 4539 > 16 0 23 3416 topology 3610 4539 -> 15 0 23 3416 topology 3512 4540 +> 15 0 23 3416 topology 3551 4540 > 16 0 23 3416 topology 3610 4540 -> 15 0 23 3416 topology 3442 4541 +> 15 0 23 3416 topology 3550 4541 > 16 0 23 3416 topology 3610 4541 -> 15 0 23 3416 topology 3488 4542 +> 15 0 23 3416 topology 3554 4542 > 16 0 23 3416 topology 3610 4542 -> 15 0 23 3416 topology 3596 4543 +> 15 0 23 3416 topology 3553 4543 > 16 0 23 3416 topology 3610 4543 -> 15 0 23 3416 topology 3464 4544 +> 15 0 23 3416 topology 3557 4544 > 16 0 23 3416 topology 3610 4544 -> 15 0 23 3416 topology 3572 4545 +> 15 0 23 3416 topology 3556 4545 > 16 0 23 3416 topology 3610 4545 -> 15 0 23 3416 topology 3548 4546 +> 15 0 23 3416 topology 3560 4546 > 16 0 23 3416 topology 3610 4546 -> 15 0 23 3416 topology 3524 4547 +> 15 0 23 3416 topology 3559 4547 > 16 0 23 3416 topology 3610 4547 -> 15 0 23 3416 topology 3500 4548 +> 15 0 23 3416 topology 3563 4548 > 16 0 23 3416 topology 3610 4548 -> 15 0 23 3416 topology 3608 4549 +> 15 0 23 3416 topology 3562 4549 > 16 0 23 3416 topology 3610 4549 -> 15 0 23 3416 topology 3584 4550 +> 15 0 23 3416 topology 3428 4550 > 16 0 23 3416 topology 3610 4550 -> 15 0 24 3416 topology 3435 4551 -> 16 0 24 3416 topology 3437 4551 -> 15 0 23 3416 topology 3560 4552 +> 15 0 23 3416 topology 3427 4551 +> 16 0 23 3416 topology 3610 4551 +> 15 0 23 3416 topology 3566 4552 > 16 0 23 3416 topology 3610 4552 -> 15 0 24 3416 topology 3417 4553 -> 16 0 24 3416 topology 3418 4553 -> 15 0 24 3416 topology 3444 4554 -> 16 0 24 3416 topology 3445 4554 -> 15 0 24 3416 topology 3447 4555 -> 16 0 24 3416 topology 3448 4555 -> 15 0 24 3416 topology 3450 4556 -> 16 0 24 3416 topology 3451 4556 -> 15 0 23 3416 topology 3454 4557 +> 15 0 23 3416 topology 3565 4553 +> 16 0 23 3416 topology 3610 4553 +> 15 0 23 3416 topology 3569 4554 +> 16 0 23 3416 topology 3610 4554 +> 15 0 23 3416 topology 3568 4555 +> 16 0 23 3416 topology 3610 4555 +> 15 0 23 3416 topology 3572 4556 +> 16 0 23 3416 topology 3610 4556 +> 15 0 23 3416 topology 3571 4557 > 16 0 23 3416 topology 3610 4557 -> 15 0 24 3416 topology 3504 4558 -> 16 0 24 3416 topology 3505 4558 -> 15 0 23 3416 topology 3484 4559 +> 15 0 23 3416 topology 3575 4558 +> 16 0 23 3416 topology 3610 4558 +> 15 0 23 3416 topology 3574 4559 > 16 0 23 3416 topology 3610 4559 -> 15 0 23 3416 topology 3425 4560 +> 15 0 23 3416 topology 3578 4560 > 16 0 23 3416 topology 3610 4560 -> 15 0 24 3416 topology 3453 4561 -> 16 0 24 3416 topology 3454 4561 -> 15 0 24 3416 topology 3507 4562 -> 16 0 24 3416 topology 3508 4562 -> 15 0 23 3416 topology 3514 4563 +> 15 0 23 3416 topology 3577 4561 +> 16 0 23 3416 topology 3610 4561 +> 15 0 23 3416 topology 3581 4562 +> 16 0 23 3416 topology 3610 4562 +> 15 0 23 3416 topology 3580 4563 > 16 0 23 3416 topology 3610 4563 -> 15 0 23 3416 topology 3544 4564 +> 15 0 23 3416 topology 3584 4564 > 16 0 23 3416 topology 3610 4564 -> 15 0 24 3416 topology 3429 4565 -> 16 0 24 3416 topology 3430 4565 -> 15 0 24 3416 topology 3456 4566 -> 16 0 24 3416 topology 3457 4566 -> 15 0 23 3416 topology 3466 4567 +> 15 0 23 3416 topology 3583 4565 +> 16 0 23 3416 topology 3610 4565 +> 15 0 23 3416 topology 3587 4566 +> 16 0 23 3416 topology 3610 4566 +> 15 0 23 3416 topology 3586 4567 > 16 0 23 3416 topology 3610 4567 -> 15 0 24 3416 topology 3510 4568 -> 16 0 24 3416 topology 3511 4568 -> 15 0 24 3416 topology 3564 4569 -> 16 0 24 3416 topology 3565 4569 -> 15 0 23 3416 topology 3574 4570 +> 15 0 23 3416 topology 3590 4568 +> 16 0 23 3416 topology 3610 4568 +> 15 0 23 3416 topology 3589 4569 +> 16 0 23 3416 topology 3610 4569 +> 15 0 23 3416 topology 3593 4570 > 16 0 23 3416 topology 3610 4570 -> 15 0 23 3416 topology 3496 4571 +> 15 0 23 3416 topology 3592 4571 > 16 0 23 3416 topology 3610 4571 -> 15 0 23 3416 topology 3604 4572 +> 15 0 23 3416 topology 3431 4572 > 16 0 23 3416 topology 3610 4572 -> 15 0 23 3416 topology 3437 4573 +> 15 0 23 3416 topology 3430 4573 > 16 0 23 3416 topology 3610 4573 -> 15 0 24 3416 topology 3459 4574 -> 16 0 24 3416 topology 3460 4574 -> 15 0 24 3416 topology 3513 4575 -> 16 0 24 3416 topology 3514 4575 -> 15 0 23 3416 topology 3526 4576 +> 15 0 23 3416 topology 3596 4574 +> 16 0 23 3416 topology 3610 4574 +> 15 0 23 3416 topology 3595 4575 +> 16 0 23 3416 topology 3610 4575 +> 15 0 23 3416 topology 3599 4576 > 16 0 23 3416 topology 3610 4576 -> 15 0 24 3416 topology 3567 4577 -> 16 0 24 3416 topology 3568 4577 -> 15 0 23 3416 topology 3556 4578 +> 15 0 23 3416 topology 3598 4577 +> 16 0 23 3416 topology 3610 4577 +> 15 0 23 3416 topology 3602 4578 > 16 0 23 3416 topology 3610 4578 -> 15 0 24 3416 topology 3462 4579 -> 16 0 24 3416 topology 3463 4579 -> 15 0 24 3416 topology 3516 4580 -> 16 0 24 3416 topology 3517 4580 -> 15 0 24 3416 topology 3570 4581 -> 16 0 24 3416 topology 3571 4581 -> 15 0 23 3416 topology 3586 4582 +> 15 0 23 3416 topology 3601 4579 +> 16 0 23 3416 topology 3610 4579 +> 15 0 23 3416 topology 3605 4580 +> 16 0 23 3416 topology 3610 4580 +> 15 0 23 3416 topology 3604 4581 +> 16 0 23 3416 topology 3610 4581 +> 15 0 23 3416 topology 3608 4582 > 16 0 23 3416 topology 3610 4582 -> 15 0 24 3416 topology 3465 4583 -> 16 0 24 3416 topology 3466 4583 -> 15 0 24 3416 topology 3519 4584 -> 16 0 24 3416 topology 3520 4584 -> 15 0 24 3416 topology 3573 4585 -> 16 0 24 3416 topology 3574 4585 -> 15 0 24 3416 topology 3441 4586 -> 16 0 24 3416 topology 3442 4586 -> 15 0 24 3416 topology 3468 4587 -> 16 0 24 3416 topology 3469 4587 -> 15 0 24 3416 topology 3522 4588 -> 16 0 24 3416 topology 3523 4588 -> 15 0 24 3416 topology 3576 4589 -> 16 0 24 3416 topology 3577 4589 -> 15 0 24 3416 topology 3471 4590 -> 16 0 24 3416 topology 3472 4590 -> 15 0 24 3416 topology 3525 4591 -> 16 0 24 3416 topology 3526 4591 -> 15 0 24 3416 topology 3579 4592 -> 16 0 24 3416 topology 3580 4592 -> 15 0 24 3416 topology 3444 4593 -> 16 0 24 3416 topology 3446 4593 -> 15 0 23 3416 topology 3427 4594 -> 16 0 23 3416 topology 3610 4594 -> 15 0 24 3416 topology 3528 4595 -> 16 0 24 3416 topology 3529 4595 -> 15 0 24 3416 topology 3582 4596 -> 16 0 24 3416 topology 3583 4596 -> 15 0 24 3416 topology 3474 4597 -> 16 0 24 3416 topology 3476 4597 -> 15 0 23 3416 topology 3479 4598 -> 16 0 23 3416 topology 3610 4598 -> 15 0 24 3416 topology 3531 4599 -> 16 0 24 3416 topology 3532 4599 -> 15 0 24 3416 topology 3585 4600 -> 16 0 24 3416 topology 3586 4600 -> 15 0 24 3416 topology 3450 4601 -> 16 0 24 3416 topology 3452 4601 -> 15 0 23 3416 topology 3455 4602 -> 16 0 23 3416 topology 3610 4602 -> 15 0 24 3416 topology 3504 4603 -> 16 0 24 3416 topology 3506 4603 -> 15 0 23 3416 topology 3439 4604 -> 16 0 23 3416 topology 3610 4604 -> 15 0 23 3416 topology 3539 4605 -> 16 0 23 3416 topology 3610 4605 -> 15 0 24 3416 topology 3588 4606 -> 16 0 24 3416 topology 3589 4606 -> 15 0 24 3416 topology 3426 4607 -> 16 0 24 3416 topology 3428 4607 -> 15 0 24 3416 topology 3480 4608 -> 16 0 24 3416 topology 3482 4608 -> 15 0 23 3416 topology 3515 4609 -> 16 0 23 3416 topology 3610 4609 -> 15 0 24 3416 topology 3534 4610 -> 16 0 24 3416 topology 3536 4610 -> 15 0 23 3416 topology 3491 4611 -> 16 0 23 3416 topology 3610 4611 -> 15 0 24 3416 topology 3591 4612 -> 16 0 24 3416 topology 3592 4612 -> 15 0 23 3416 topology 3599 4613 -> 16 0 23 3416 topology 3610 4613 -> 15 0 24 3416 topology 3456 4614 -> 16 0 24 3416 topology 3458 4614 -> 15 0 23 3416 topology 3467 4615 -> 16 0 23 3416 topology 3610 4615 -> 15 0 24 3416 topology 3510 4616 -> 16 0 24 3416 topology 3512 4616 -> 15 0 24 3416 topology 3564 4617 -> 16 0 24 3416 topology 3566 4617 -> 15 0 23 3416 topology 3575 4618 -> 16 0 23 3416 topology 3610 4618 -> 15 0 23 3416 topology 3551 4619 -> 16 0 23 3416 topology 3610 4619 -> 15 0 24 3416 topology 3486 4620 -> 16 0 24 3416 topology 3488 4620 -> 15 0 23 3416 topology 3527 4621 -> 16 0 23 3416 topology 3610 4621 -> 15 0 24 3416 topology 3540 4622 -> 16 0 24 3416 topology 3542 4622 -> 15 0 24 3416 topology 3594 4623 -> 16 0 24 3416 topology 3596 4623 -> 15 0 23 3416 topology 3503 4624 -> 16 0 23 3416 topology 3610 4624 -> 15 0 24 3416 topology 3462 4625 -> 16 0 24 3416 topology 3464 4625 -> 15 0 24 3416 topology 3516 4626 -> 16 0 24 3416 topology 3518 4626 -> 15 0 24 3416 topology 3570 4627 -> 16 0 24 3416 topology 3572 4627 -> 15 0 23 3416 topology 3587 4628 -> 16 0 23 3416 topology 3610 4628 -> 15 0 23 3416 topology 3563 4629 -> 16 0 23 3416 topology 3610 4629 -> 15 0 24 3416 topology 3438 4630 -> 16 0 24 3416 topology 3440 4630 -> 15 0 24 3416 topology 3492 4631 -> 16 0 24 3416 topology 3494 4631 -> 15 0 24 3416 topology 3546 4632 -> 16 0 24 3416 topology 3548 4632 -> 15 0 24 3416 topology 3600 4633 -> 16 0 24 3416 topology 3602 4633 -> 15 0 23 3416 topology 3451 4634 -> 16 0 23 3416 topology 3610 4634 -> 15 0 24 3416 topology 3468 4635 -> 16 0 24 3416 topology 3470 4635 -> 15 0 24 3416 topology 3522 4636 -> 16 0 24 3416 topology 3524 4636 -> 15 0 24 3416 topology 3576 4637 -> 16 0 24 3416 topology 3578 4637 -> 15 0 23 3416 topology 3481 4638 -> 16 0 23 3416 topology 3610 4638 -> 15 0 24 3416 topology 3498 4639 -> 16 0 24 3416 topology 3500 4639 -> 15 0 23 3416 topology 3511 4640 -> 16 0 23 3416 topology 3610 4640 -> 15 0 24 3416 topology 3552 4641 -> 16 0 24 3416 topology 3554 4641 -> 15 0 24 3416 topology 3606 4642 -> 16 0 24 3416 topology 3608 4642 -> 15 0 24 3416 topology 3426 4643 -> 16 0 24 3416 topology 3427 4643 -> 15 0 23 3416 topology 3541 4644 -> 16 0 23 3416 topology 3610 4644 -> 15 0 23 3416 topology 3428 4645 -> 16 0 23 3416 topology 3610 4645 -> 15 0 23 3416 topology 3463 4646 -> 16 0 23 3416 topology 3610 4646 -> 15 0 24 3416 topology 3528 4647 -> 16 0 24 3416 topology 3530 4647 -> 15 0 23 3416 topology 3571 4648 -> 16 0 23 3416 topology 3610 4648 -> 15 0 24 3416 topology 3582 4649 -> 16 0 24 3416 topology 3584 4649 -> 15 0 23 3416 topology 3493 4650 -> 16 0 23 3416 topology 3610 4650 -> 15 0 23 3416 topology 3601 4651 -> 16 0 23 3416 topology 3610 4651 -> 15 0 23 3416 topology 3523 4652 -> 16 0 23 3416 topology 3610 4652 -> 15 0 24 3416 topology 3558 4653 -> 16 0 24 3416 topology 3560 4653 -> 15 0 23 3416 topology 3553 4654 -> 16 0 23 3416 topology 3610 4654 -> 15 0 23 3416 topology 3440 4655 -> 16 0 23 3416 topology 3610 4655 -> 15 0 23 3416 topology 3583 4656 -> 16 0 23 3416 topology 3610 4656 -> 15 0 24 3416 topology 3588 4657 -> 16 0 24 3416 topology 3590 4657 -> 15 0 24 3416 topology 3438 4658 -> 16 0 24 3416 topology 3439 4658 -> 15 0 24 3416 topology 3417 4659 -> 16 0 24 3416 topology 3419 4659 -> 15 0 23 3416 topology 3424 4660 -> 16 0 23 3416 topology 3610 4660 -> 15 0 23 3416 topology 3446 4661 -> 16 0 23 3416 topology 3610 4661 -> 15 0 23 3416 topology 3506 4662 -> 16 0 23 3416 topology 3610 4662 -> 15 0 23 3416 topology 3436 4663 -> 16 0 23 3416 topology 3610 4663 -> 15 0 23 3416 topology 3482 4664 -> 16 0 23 3416 topology 3610 4664 -> 15 0 23 3416 topology 3458 4665 -> 16 0 23 3416 topology 3610 4665 -> 15 0 23 3416 topology 3566 4666 -> 16 0 23 3416 topology 3610 4666 -> 15 0 23 3416 topology 3542 4667 -> 16 0 23 3416 topology 3610 4667 -> 15 0 23 3416 topology 3518 4668 -> 16 0 23 3416 topology 3610 4668 -> 15 0 24 3416 topology 3429 4669 -> 16 0 24 3416 topology 3431 4669 -> 15 0 23 3416 topology 3494 4670 -> 16 0 23 3416 topology 3610 4670 -> 15 0 23 3416 topology 3602 4671 -> 16 0 23 3416 topology 3610 4671 -> 15 0 23 3416 topology 3470 4672 -> 16 0 23 3416 topology 3610 4672 -> 15 0 23 3416 topology 3578 4673 -> 16 0 23 3416 topology 3610 4673 -> 15 0 23 3416 topology 3554 4674 -> 16 0 23 3416 topology 3610 4674 -> 15 0 23 3416 topology 3530 4675 -> 16 0 23 3416 topology 3610 4675 -> 15 0 23 3416 topology 3590 4676 -> 16 0 23 3416 topology 3610 4676 -> 15 0 23 3416 topology 3448 4677 -> 16 0 23 3416 topology 3610 4677 -> 15 0 24 3416 topology 3474 4678 -> 16 0 24 3416 topology 3475 4678 -> 15 0 24 3416 topology 3441 4679 -> 16 0 24 3416 topology 3443 4679 -> 15 0 23 3416 topology 3478 4680 -> 16 0 23 3416 topology 3610 4680 -> 15 0 23 3416 topology 3419 4681 -> 16 0 23 3416 topology 3610 4681 -> 15 0 24 3416 topology 3423 4682 -> 16 0 24 3416 topology 3424 4682 -> 15 0 24 3416 topology 3477 4683 -> 16 0 24 3416 topology 3478 4683 -> 15 0 23 3416 topology 3508 4684 -> 16 0 23 3416 topology 3610 4684 -> 15 0 23 3416 topology 3538 4685 -> 16 0 23 3416 topology 3610 4685 -> 15 0 23 3416 topology 3460 4686 -> 16 0 23 3416 topology 3610 4686 -> 15 0 24 3416 topology 3480 4687 -> 16 0 24 3416 topology 3481 4687 -> 15 0 24 3416 topology 3534 4688 -> 16 0 24 3416 topology 3535 4688 -> 15 0 23 3416 topology 3568 4689 -> 16 0 23 3416 topology 3610 4689 -> 15 0 23 3416 topology 3490 4690 -> 16 0 23 3416 topology 3610 4690 -> 15 0 23 3416 topology 3598 4691 -> 16 0 23 3416 topology 3610 4691 -> 15 0 23 3416 topology 3431 4692 -> 16 0 23 3416 topology 3610 4692 -> 15 0 24 3416 topology 3483 4693 -> 16 0 24 3416 topology 3484 4693 -> 15 0 23 3416 topology 3520 4694 -> 16 0 23 3416 topology 3610 4694 -> 15 0 24 3416 topology 3537 4695 -> 16 0 24 3416 topology 3538 4695 -> 15 0 23 3416 topology 3550 4696 -> 16 0 23 3416 topology 3610 4696 -> 15 0 23 3416 topology 3472 4697 -> 16 0 23 3416 topology 3610 4697 -> 15 0 24 3416 topology 3486 4698 -> 16 0 24 3416 topology 3487 4698 -> 15 0 24 3416 topology 3540 4699 -> 16 0 24 3416 topology 3541 4699 -> 15 0 23 3416 topology 3580 4700 -> 16 0 23 3416 topology 3610 4700 -> 15 0 24 3416 topology 3594 4701 -> 16 0 24 3416 topology 3595 4701 -> 15 0 23 3416 topology 3502 4702 -> 16 0 23 3416 topology 3610 4702 -> 15 0 24 3416 topology 3435 4703 -> 16 0 24 3416 topology 3436 4703 -> 15 0 23 3416 topology 3443 4704 -> 16 0 23 3416 topology 3610 4704 -> 15 0 24 3416 topology 3489 4705 -> 16 0 24 3416 topology 3490 4705 -> 15 0 23 3416 topology 3532 4706 -> 16 0 23 3416 topology 3610 4706 -> 15 0 24 3416 topology 3543 4707 -> 16 0 24 3416 topology 3544 4707 -> 15 0 24 3416 topology 3597 4708 -> 16 0 24 3416 topology 3598 4708 -> 15 0 23 3416 topology 3562 4709 -> 16 0 23 3416 topology 3610 4709 -> 15 0 24 3416 topology 3492 4710 -> 16 0 24 3416 topology 3493 4710 -> 15 0 24 3416 topology 3546 4711 -> 16 0 24 3416 topology 3547 4711 -> 15 0 23 3416 topology 3592 4712 -> 16 0 23 3416 topology 3610 4712 -> 15 0 24 3416 topology 3600 4713 -> 16 0 24 3416 topology 3601 4713 -> 15 0 24 3416 topology 3495 4714 -> 16 0 24 3416 topology 3496 4714 -> 15 0 24 3416 topology 3549 4715 -> 16 0 24 3416 topology 3550 4715 -> 15 0 24 3416 topology 3603 4716 -> 16 0 24 3416 topology 3604 4716 -> 15 0 23 3416 topology 3421 4717 -> 16 0 23 3416 topology 3610 4717 -> 15 0 24 3416 topology 3498 4718 -> 16 0 24 3416 topology 3499 4718 -> 15 0 24 3416 topology 3552 4719 -> 16 0 24 3416 topology 3553 4719 -> 15 0 24 3416 topology 3606 4720 -> 16 0 24 3416 topology 3607 4720 -> 15 0 24 3612 topology 3664 4721 -> 16 0 24 3612 topology 3666 4721 -> 15 0 23 3612 topology 3674 4722 +> 15 0 23 3416 topology 3607 4583 +> 16 0 23 3416 topology 3610 4583 +> 15 0 23 3416 topology 3434 4584 +> 16 0 23 3416 topology 3610 4584 +> 15 0 23 3416 topology 3433 4585 +> 16 0 23 3416 topology 3610 4585 +> 15 0 23 3416 topology 3437 4586 +> 16 0 23 3416 topology 3610 4586 +> 15 0 23 3416 topology 3436 4587 +> 16 0 23 3416 topology 3610 4587 +> 15 0 23 3416 topology 3440 4588 +> 16 0 23 3416 topology 3610 4588 +> 15 0 23 3416 topology 3439 4589 +> 16 0 23 3416 topology 3610 4589 +> 15 0 23 3416 topology 3443 4590 +> 16 0 23 3416 topology 3610 4590 +> 15 0 23 3416 topology 3442 4591 +> 16 0 23 3416 topology 3610 4591 +> 15 0 24 3416 topology 3609 4592 +> 16 0 24 3416 topology 3610 4592 +> 15 0 25 3416 topology 3444 4593 +> 16 0 25 3416 topology 3446 4593 +> 15 0 25 3416 topology 3444 4594 +> 16 0 25 3416 topology 3445 4594 +> 15 0 25 3416 topology 3447 4595 +> 16 0 25 3416 topology 3449 4595 +> 15 0 25 3416 topology 3447 4596 +> 16 0 25 3416 topology 3448 4596 +> 15 0 25 3416 topology 3450 4597 +> 16 0 25 3416 topology 3452 4597 +> 15 0 25 3416 topology 3450 4598 +> 16 0 25 3416 topology 3451 4598 +> 15 0 25 3416 topology 3453 4599 +> 16 0 25 3416 topology 3455 4599 +> 15 0 25 3416 topology 3453 4600 +> 16 0 25 3416 topology 3454 4600 +> 15 0 25 3416 topology 3456 4601 +> 16 0 25 3416 topology 3458 4601 +> 15 0 25 3416 topology 3456 4602 +> 16 0 25 3416 topology 3457 4602 +> 15 0 25 3416 topology 3459 4603 +> 16 0 25 3416 topology 3461 4603 +> 15 0 25 3416 topology 3459 4604 +> 16 0 25 3416 topology 3460 4604 +> 15 0 25 3416 topology 3462 4605 +> 16 0 25 3416 topology 3464 4605 +> 15 0 25 3416 topology 3462 4606 +> 16 0 25 3416 topology 3463 4606 +> 15 0 25 3416 topology 3465 4607 +> 16 0 25 3416 topology 3467 4607 +> 15 0 25 3416 topology 3465 4608 +> 16 0 25 3416 topology 3466 4608 +> 15 0 25 3416 topology 3468 4609 +> 16 0 25 3416 topology 3470 4609 +> 15 0 25 3416 topology 3468 4610 +> 16 0 25 3416 topology 3469 4610 +> 15 0 25 3416 topology 3471 4611 +> 16 0 25 3416 topology 3473 4611 +> 15 0 25 3416 topology 3471 4612 +> 16 0 25 3416 topology 3472 4612 +> 15 0 25 3416 topology 3417 4613 +> 16 0 25 3416 topology 3419 4613 +> 15 0 25 3416 topology 3417 4614 +> 16 0 25 3416 topology 3418 4614 +> 15 0 25 3416 topology 3474 4615 +> 16 0 25 3416 topology 3476 4615 +> 15 0 25 3416 topology 3474 4616 +> 16 0 25 3416 topology 3475 4616 +> 15 0 25 3416 topology 3477 4617 +> 16 0 25 3416 topology 3479 4617 +> 15 0 25 3416 topology 3477 4618 +> 16 0 25 3416 topology 3478 4618 +> 15 0 25 3416 topology 3480 4619 +> 16 0 25 3416 topology 3482 4619 +> 15 0 25 3416 topology 3480 4620 +> 16 0 25 3416 topology 3481 4620 +> 15 0 25 3416 topology 3483 4621 +> 16 0 25 3416 topology 3485 4621 +> 15 0 25 3416 topology 3483 4622 +> 16 0 25 3416 topology 3484 4622 +> 15 0 25 3416 topology 3486 4623 +> 16 0 25 3416 topology 3488 4623 +> 15 0 25 3416 topology 3486 4624 +> 16 0 25 3416 topology 3487 4624 +> 15 0 25 3416 topology 3489 4625 +> 16 0 25 3416 topology 3491 4625 +> 15 0 25 3416 topology 3489 4626 +> 16 0 25 3416 topology 3490 4626 +> 15 0 25 3416 topology 3492 4627 +> 16 0 25 3416 topology 3494 4627 +> 15 0 25 3416 topology 3492 4628 +> 16 0 25 3416 topology 3493 4628 +> 15 0 25 3416 topology 3495 4629 +> 16 0 25 3416 topology 3497 4629 +> 15 0 25 3416 topology 3495 4630 +> 16 0 25 3416 topology 3496 4630 +> 15 0 25 3416 topology 3498 4631 +> 16 0 25 3416 topology 3500 4631 +> 15 0 25 3416 topology 3498 4632 +> 16 0 25 3416 topology 3499 4632 +> 15 0 25 3416 topology 3501 4633 +> 16 0 25 3416 topology 3503 4633 +> 15 0 25 3416 topology 3501 4634 +> 16 0 25 3416 topology 3502 4634 +> 15 0 25 3416 topology 3420 4635 +> 16 0 25 3416 topology 3422 4635 +> 15 0 25 3416 topology 3420 4636 +> 16 0 25 3416 topology 3421 4636 +> 15 0 25 3416 topology 3504 4637 +> 16 0 25 3416 topology 3506 4637 +> 15 0 25 3416 topology 3504 4638 +> 16 0 25 3416 topology 3505 4638 +> 15 0 25 3416 topology 3507 4639 +> 16 0 25 3416 topology 3509 4639 +> 15 0 25 3416 topology 3507 4640 +> 16 0 25 3416 topology 3508 4640 +> 15 0 25 3416 topology 3510 4641 +> 16 0 25 3416 topology 3512 4641 +> 15 0 25 3416 topology 3510 4642 +> 16 0 25 3416 topology 3511 4642 +> 15 0 25 3416 topology 3513 4643 +> 16 0 25 3416 topology 3515 4643 +> 15 0 25 3416 topology 3513 4644 +> 16 0 25 3416 topology 3514 4644 +> 15 0 25 3416 topology 3516 4645 +> 16 0 25 3416 topology 3518 4645 +> 15 0 25 3416 topology 3516 4646 +> 16 0 25 3416 topology 3517 4646 +> 15 0 25 3416 topology 3519 4647 +> 16 0 25 3416 topology 3521 4647 +> 15 0 25 3416 topology 3519 4648 +> 16 0 25 3416 topology 3520 4648 +> 15 0 25 3416 topology 3522 4649 +> 16 0 25 3416 topology 3524 4649 +> 15 0 25 3416 topology 3522 4650 +> 16 0 25 3416 topology 3523 4650 +> 15 0 25 3416 topology 3525 4651 +> 16 0 25 3416 topology 3527 4651 +> 15 0 25 3416 topology 3525 4652 +> 16 0 25 3416 topology 3526 4652 +> 15 0 25 3416 topology 3528 4653 +> 16 0 25 3416 topology 3530 4653 +> 15 0 25 3416 topology 3528 4654 +> 16 0 25 3416 topology 3529 4654 +> 15 0 25 3416 topology 3531 4655 +> 16 0 25 3416 topology 3533 4655 +> 15 0 25 3416 topology 3531 4656 +> 16 0 25 3416 topology 3532 4656 +> 15 0 25 3416 topology 3423 4657 +> 16 0 25 3416 topology 3425 4657 +> 15 0 25 3416 topology 3423 4658 +> 16 0 25 3416 topology 3424 4658 +> 15 0 25 3416 topology 3534 4659 +> 16 0 25 3416 topology 3536 4659 +> 15 0 25 3416 topology 3534 4660 +> 16 0 25 3416 topology 3535 4660 +> 15 0 25 3416 topology 3537 4661 +> 16 0 25 3416 topology 3539 4661 +> 15 0 25 3416 topology 3537 4662 +> 16 0 25 3416 topology 3538 4662 +> 15 0 25 3416 topology 3540 4663 +> 16 0 25 3416 topology 3542 4663 +> 15 0 25 3416 topology 3540 4664 +> 16 0 25 3416 topology 3541 4664 +> 15 0 25 3416 topology 3543 4665 +> 16 0 25 3416 topology 3545 4665 +> 15 0 25 3416 topology 3543 4666 +> 16 0 25 3416 topology 3544 4666 +> 15 0 25 3416 topology 3546 4667 +> 16 0 25 3416 topology 3548 4667 +> 15 0 25 3416 topology 3546 4668 +> 16 0 25 3416 topology 3547 4668 +> 15 0 25 3416 topology 3549 4669 +> 16 0 25 3416 topology 3551 4669 +> 15 0 25 3416 topology 3549 4670 +> 16 0 25 3416 topology 3550 4670 +> 15 0 25 3416 topology 3552 4671 +> 16 0 25 3416 topology 3554 4671 +> 15 0 25 3416 topology 3552 4672 +> 16 0 25 3416 topology 3553 4672 +> 15 0 25 3416 topology 3555 4673 +> 16 0 25 3416 topology 3557 4673 +> 15 0 25 3416 topology 3555 4674 +> 16 0 25 3416 topology 3556 4674 +> 15 0 25 3416 topology 3558 4675 +> 16 0 25 3416 topology 3560 4675 +> 15 0 25 3416 topology 3558 4676 +> 16 0 25 3416 topology 3559 4676 +> 15 0 25 3416 topology 3561 4677 +> 16 0 25 3416 topology 3563 4677 +> 15 0 25 3416 topology 3561 4678 +> 16 0 25 3416 topology 3562 4678 +> 15 0 25 3416 topology 3426 4679 +> 16 0 25 3416 topology 3428 4679 +> 15 0 25 3416 topology 3426 4680 +> 16 0 25 3416 topology 3427 4680 +> 15 0 25 3416 topology 3564 4681 +> 16 0 25 3416 topology 3566 4681 +> 15 0 25 3416 topology 3564 4682 +> 16 0 25 3416 topology 3565 4682 +> 15 0 25 3416 topology 3567 4683 +> 16 0 25 3416 topology 3569 4683 +> 15 0 25 3416 topology 3567 4684 +> 16 0 25 3416 topology 3568 4684 +> 15 0 25 3416 topology 3570 4685 +> 16 0 25 3416 topology 3572 4685 +> 15 0 25 3416 topology 3570 4686 +> 16 0 25 3416 topology 3571 4686 +> 15 0 25 3416 topology 3573 4687 +> 16 0 25 3416 topology 3575 4687 +> 15 0 25 3416 topology 3573 4688 +> 16 0 25 3416 topology 3574 4688 +> 15 0 25 3416 topology 3576 4689 +> 16 0 25 3416 topology 3578 4689 +> 15 0 25 3416 topology 3576 4690 +> 16 0 25 3416 topology 3577 4690 +> 15 0 25 3416 topology 3579 4691 +> 16 0 25 3416 topology 3581 4691 +> 15 0 25 3416 topology 3579 4692 +> 16 0 25 3416 topology 3580 4692 +> 15 0 25 3416 topology 3582 4693 +> 16 0 25 3416 topology 3584 4693 +> 15 0 25 3416 topology 3582 4694 +> 16 0 25 3416 topology 3583 4694 +> 15 0 25 3416 topology 3585 4695 +> 16 0 25 3416 topology 3587 4695 +> 15 0 25 3416 topology 3585 4696 +> 16 0 25 3416 topology 3586 4696 +> 15 0 25 3416 topology 3588 4697 +> 16 0 25 3416 topology 3590 4697 +> 15 0 25 3416 topology 3588 4698 +> 16 0 25 3416 topology 3589 4698 +> 15 0 25 3416 topology 3591 4699 +> 16 0 25 3416 topology 3593 4699 +> 15 0 25 3416 topology 3591 4700 +> 16 0 25 3416 topology 3592 4700 +> 15 0 25 3416 topology 3429 4701 +> 16 0 25 3416 topology 3431 4701 +> 15 0 25 3416 topology 3429 4702 +> 16 0 25 3416 topology 3430 4702 +> 15 0 25 3416 topology 3594 4703 +> 16 0 25 3416 topology 3596 4703 +> 15 0 25 3416 topology 3594 4704 +> 16 0 25 3416 topology 3595 4704 +> 15 0 25 3416 topology 3597 4705 +> 16 0 25 3416 topology 3599 4705 +> 15 0 25 3416 topology 3597 4706 +> 16 0 25 3416 topology 3598 4706 +> 15 0 25 3416 topology 3600 4707 +> 16 0 25 3416 topology 3602 4707 +> 15 0 25 3416 topology 3600 4708 +> 16 0 25 3416 topology 3601 4708 +> 15 0 25 3416 topology 3603 4709 +> 16 0 25 3416 topology 3605 4709 +> 15 0 25 3416 topology 3603 4710 +> 16 0 25 3416 topology 3604 4710 +> 15 0 25 3416 topology 3606 4711 +> 16 0 25 3416 topology 3608 4711 +> 15 0 25 3416 topology 3606 4712 +> 16 0 25 3416 topology 3607 4712 +> 15 0 25 3416 topology 3432 4713 +> 16 0 25 3416 topology 3434 4713 +> 15 0 25 3416 topology 3432 4714 +> 16 0 25 3416 topology 3433 4714 +> 15 0 25 3416 topology 3435 4715 +> 16 0 25 3416 topology 3437 4715 +> 15 0 25 3416 topology 3435 4716 +> 16 0 25 3416 topology 3436 4716 +> 15 0 25 3416 topology 3438 4717 +> 16 0 25 3416 topology 3440 4717 +> 15 0 25 3416 topology 3438 4718 +> 16 0 25 3416 topology 3439 4718 +> 15 0 25 3416 topology 3441 4719 +> 16 0 25 3416 topology 3443 4719 +> 15 0 25 3416 topology 3441 4720 +> 16 0 25 3416 topology 3442 4720 +> 15 0 23 3612 topology 3642 4721 +> 16 0 23 3612 topology 3713 4721 +> 15 0 23 3612 topology 3641 4722 > 16 0 23 3612 topology 3713 4722 -> 15 0 23 3612 topology 3615 4723 +> 15 0 23 3612 topology 3645 4723 > 16 0 23 3612 topology 3713 4723 -> 15 0 24 3612 topology 3619 4724 -> 16 0 24 3612 topology 3620 4724 -> 15 0 24 3612 topology 3673 4725 -> 16 0 24 3612 topology 3674 4725 -> 15 0 23 3612 topology 3704 4726 +> 15 0 23 3612 topology 3644 4724 +> 16 0 23 3612 topology 3713 4724 +> 15 0 23 3612 topology 3648 4725 +> 16 0 23 3612 topology 3713 4725 +> 15 0 23 3612 topology 3647 4726 > 16 0 23 3612 topology 3713 4726 -> 15 0 24 3612 topology 3622 4727 -> 16 0 24 3612 topology 3623 4727 -> 15 0 23 3612 topology 3656 4728 +> 15 0 23 3612 topology 3651 4727 +> 16 0 23 3612 topology 3713 4727 +> 15 0 23 3612 topology 3650 4728 > 16 0 23 3612 topology 3713 4728 -> 15 0 23 3612 topology 3686 4729 +> 15 0 23 3612 topology 3654 4729 > 16 0 23 3612 topology 3713 4729 -> 15 0 24 3612 topology 3697 4730 -> 16 0 24 3612 topology 3699 4730 -> 15 0 24 3612 topology 3625 4731 -> 16 0 24 3612 topology 3626 4731 -> 15 0 23 3612 topology 3627 4732 +> 15 0 23 3612 topology 3653 4730 +> 16 0 23 3612 topology 3713 4730 +> 15 0 23 3612 topology 3657 4731 +> 16 0 23 3612 topology 3713 4731 +> 15 0 23 3612 topology 3656 4732 > 16 0 23 3612 topology 3713 4732 -> 15 0 24 3612 topology 3652 4733 -> 16 0 24 3612 topology 3653 4733 -> 15 0 24 3612 topology 3706 4734 -> 16 0 24 3612 topology 3707 4734 -> 15 0 24 3612 topology 3628 4735 -> 16 0 24 3612 topology 3629 4735 -> 15 0 23 3612 topology 3668 4736 +> 15 0 23 3612 topology 3660 4733 +> 16 0 23 3612 topology 3713 4733 +> 15 0 23 3612 topology 3659 4734 +> 16 0 23 3612 topology 3713 4734 +> 15 0 23 3612 topology 3663 4735 +> 16 0 23 3612 topology 3713 4735 +> 15 0 23 3612 topology 3662 4736 > 16 0 23 3612 topology 3713 4736 -> 15 0 23 3612 topology 3698 4737 +> 15 0 23 3612 topology 3666 4737 > 16 0 23 3612 topology 3713 4737 -> 15 0 24 3612 topology 3631 4738 -> 16 0 24 3612 topology 3632 4738 -> 15 0 23 3612 topology 3639 4739 +> 15 0 23 3612 topology 3665 4738 +> 16 0 23 3612 topology 3713 4738 +> 15 0 23 3612 topology 3669 4739 > 16 0 23 3612 topology 3713 4739 -> 15 0 24 3612 topology 3685 4740 -> 16 0 24 3612 topology 3686 4740 -> 15 0 24 3612 topology 3634 4741 -> 16 0 24 3612 topology 3635 4741 -> 15 0 24 3612 topology 3637 4742 -> 16 0 24 3612 topology 3638 4742 -> 15 0 24 3612 topology 3664 4743 -> 16 0 24 3612 topology 3665 4743 -> 15 0 23 3612 topology 3617 4744 +> 15 0 23 3612 topology 3668 4740 +> 16 0 23 3612 topology 3713 4740 +> 15 0 23 3612 topology 3615 4741 +> 16 0 23 3612 topology 3713 4741 +> 15 0 23 3612 topology 3614 4742 +> 16 0 23 3612 topology 3713 4742 +> 15 0 23 3612 topology 3672 4743 +> 16 0 23 3612 topology 3713 4743 +> 15 0 23 3612 topology 3671 4744 > 16 0 23 3612 topology 3713 4744 -> 15 0 24 3612 topology 3613 4745 -> 16 0 24 3612 topology 3615 4745 -> 15 0 24 3612 topology 3697 4746 -> 16 0 24 3612 topology 3698 4746 -> 15 0 23 3612 topology 3645 4747 +> 15 0 23 3612 topology 3675 4745 +> 16 0 23 3612 topology 3713 4745 +> 15 0 23 3612 topology 3674 4746 +> 16 0 23 3612 topology 3713 4746 +> 15 0 23 3612 topology 3678 4747 > 16 0 23 3612 topology 3713 4747 -> 15 0 24 3612 topology 3670 4748 -> 16 0 24 3612 topology 3672 4748 -> 15 0 23 3612 topology 3629 4749 +> 15 0 23 3612 topology 3677 4748 +> 16 0 23 3612 topology 3713 4748 +> 15 0 23 3612 topology 3681 4749 > 16 0 23 3612 topology 3713 4749 -> 15 0 24 3612 topology 3619 4750 -> 16 0 24 3612 topology 3621 4750 -> 15 0 23 3612 topology 3705 4751 +> 15 0 23 3612 topology 3680 4750 +> 16 0 23 3612 topology 3713 4750 +> 15 0 23 3612 topology 3684 4751 > 16 0 23 3612 topology 3713 4751 -> 15 0 23 3612 topology 3681 4752 +> 15 0 23 3612 topology 3683 4752 > 16 0 23 3612 topology 3713 4752 -> 15 0 24 3612 topology 3649 4753 -> 16 0 24 3612 topology 3651 4753 -> 15 0 23 3612 topology 3657 4754 +> 15 0 23 3612 topology 3687 4753 +> 16 0 23 3612 topology 3713 4753 +> 15 0 23 3612 topology 3686 4754 > 16 0 23 3612 topology 3713 4754 -> 15 0 24 3612 topology 3703 4755 -> 16 0 24 3612 topology 3705 4755 -> 15 0 24 3612 topology 3625 4756 -> 16 0 24 3612 topology 3627 4756 +> 15 0 23 3612 topology 3690 4755 +> 16 0 23 3612 topology 3713 4755 +> 15 0 23 3612 topology 3689 4756 +> 16 0 23 3612 topology 3713 4756 > 15 0 23 3612 topology 3693 4757 > 16 0 23 3612 topology 3713 4757 -> 15 0 23 3612 topology 3669 4758 +> 15 0 23 3612 topology 3692 4758 > 16 0 23 3612 topology 3713 4758 -> 15 0 24 3612 topology 3682 4759 -> 16 0 24 3612 topology 3684 4759 -> 15 0 24 3612 topology 3631 4760 -> 16 0 24 3612 topology 3633 4760 -> 15 0 23 3612 topology 3641 4761 +> 15 0 23 3612 topology 3696 4759 +> 16 0 23 3612 topology 3713 4759 +> 15 0 23 3612 topology 3695 4760 +> 16 0 23 3612 topology 3713 4760 +> 15 0 23 3612 topology 3699 4761 > 16 0 23 3612 topology 3713 4761 -> 15 0 24 3612 topology 3661 4762 -> 16 0 24 3612 topology 3663 4762 -> 15 0 24 3612 topology 3643 4763 -> 16 0 24 3612 topology 3644 4763 -> 15 0 23 3612 topology 3671 4764 +> 15 0 23 3612 topology 3698 4762 +> 16 0 23 3612 topology 3713 4762 +> 15 0 23 3612 topology 3618 4763 +> 16 0 23 3612 topology 3713 4763 +> 15 0 23 3612 topology 3617 4764 > 16 0 23 3612 topology 3713 4764 -> 15 0 24 3612 topology 3637 4765 -> 16 0 24 3612 topology 3639 4765 +> 15 0 23 3612 topology 3702 4765 +> 16 0 23 3612 topology 3713 4765 > 15 0 23 3612 topology 3701 4766 > 16 0 23 3612 topology 3713 4766 -> 15 0 23 3612 topology 3618 4767 +> 15 0 23 3612 topology 3705 4767 > 16 0 23 3612 topology 3713 4767 -> 15 0 23 3612 topology 3653 4768 +> 15 0 23 3612 topology 3704 4768 > 16 0 23 3612 topology 3713 4768 -> 15 0 24 3612 topology 3694 4769 -> 16 0 24 3612 topology 3696 4769 -> 15 0 24 3612 topology 3676 4770 -> 16 0 24 3612 topology 3677 4770 -> 15 0 23 3612 topology 3683 4771 +> 15 0 23 3612 topology 3708 4769 +> 16 0 23 3612 topology 3713 4769 +> 15 0 23 3612 topology 3707 4770 +> 16 0 23 3612 topology 3713 4770 +> 15 0 23 3612 topology 3711 4771 > 16 0 23 3612 topology 3713 4771 -> 15 0 23 3612 topology 3630 4772 +> 15 0 23 3612 topology 3710 4772 > 16 0 23 3612 topology 3713 4772 -> 15 0 23 3612 topology 3665 4773 +> 15 0 23 3612 topology 3621 4773 > 16 0 23 3612 topology 3713 4773 -> 15 0 24 3612 topology 3655 4774 -> 16 0 24 3612 topology 3656 4774 -> 15 0 23 3612 topology 3695 4775 +> 15 0 23 3612 topology 3620 4774 +> 16 0 23 3612 topology 3713 4774 +> 15 0 23 3612 topology 3624 4775 > 16 0 23 3612 topology 3713 4775 -> 15 0 24 3612 topology 3709 4776 -> 16 0 24 3612 topology 3710 4776 -> 15 0 25 3612 topology 3712 4777 -> 16 0 25 3612 topology 3713 4777 -> 15 0 24 3612 topology 3688 4778 -> 16 0 24 3612 topology 3689 4778 -> 15 0 23 3612 topology 3614 4779 +> 15 0 23 3612 topology 3623 4776 +> 16 0 23 3612 topology 3713 4776 +> 15 0 23 3612 topology 3627 4777 +> 16 0 23 3612 topology 3713 4777 +> 15 0 23 3612 topology 3626 4778 +> 16 0 23 3612 topology 3713 4778 +> 15 0 23 3612 topology 3630 4779 > 16 0 23 3612 topology 3713 4779 -> 15 0 24 3612 topology 3667 4780 -> 16 0 24 3612 topology 3668 4780 -> 15 0 23 3612 topology 3626 4781 +> 15 0 23 3612 topology 3629 4780 +> 16 0 23 3612 topology 3713 4780 +> 15 0 23 3612 topology 3633 4781 > 16 0 23 3612 topology 3713 4781 -> 15 0 23 3612 topology 3672 4782 +> 15 0 23 3612 topology 3632 4782 > 16 0 23 3612 topology 3713 4782 -> 15 0 23 3612 topology 3648 4783 +> 15 0 23 3612 topology 3636 4783 > 16 0 23 3612 topology 3713 4783 -> 15 0 24 3612 topology 3646 4784 -> 16 0 24 3612 topology 3648 4784 -> 15 0 24 3612 topology 3700 4785 -> 16 0 24 3612 topology 3702 4785 -> 15 0 23 3612 topology 3708 4786 +> 15 0 23 3612 topology 3635 4784 +> 16 0 23 3612 topology 3713 4784 +> 15 0 23 3612 topology 3639 4785 +> 16 0 23 3612 topology 3713 4785 +> 15 0 23 3612 topology 3638 4786 > 16 0 23 3612 topology 3713 4786 -> 15 0 23 3612 topology 3638 4787 -> 16 0 23 3612 topology 3713 4787 -> 15 0 23 3612 topology 3684 4788 -> 16 0 23 3612 topology 3713 4788 -> 15 0 23 3612 topology 3660 4789 -> 16 0 23 3612 topology 3713 4789 -> 15 0 24 3612 topology 3679 4790 -> 16 0 24 3612 topology 3681 4790 -> 15 0 23 3612 topology 3696 4791 -> 16 0 23 3612 topology 3713 4791 -> 15 0 24 3612 topology 3658 4792 -> 16 0 24 3612 topology 3660 4792 -> 15 0 24 3612 topology 3691 4793 -> 16 0 24 3612 topology 3693 4793 -> 15 0 24 3612 topology 3646 4794 -> 16 0 24 3612 topology 3647 4794 -> 15 0 23 3612 topology 3650 4795 -> 16 0 23 3612 topology 3713 4795 -> 15 0 24 3612 topology 3700 4796 -> 16 0 24 3612 topology 3701 4796 -> 15 0 23 3612 topology 3680 4797 -> 16 0 23 3612 topology 3713 4797 -> 15 0 23 3612 topology 3621 4798 -> 16 0 23 3612 topology 3713 4798 -> 15 0 23 3612 topology 3710 4799 -> 16 0 23 3612 topology 3713 4799 -> 15 0 23 3612 topology 3662 4800 -> 16 0 23 3612 topology 3713 4800 -> 15 0 24 3612 topology 3679 4801 -> 16 0 24 3612 topology 3680 4801 -> 15 0 23 3612 topology 3692 4802 -> 16 0 23 3612 topology 3713 4802 -> 15 0 23 3612 topology 3633 4803 -> 16 0 23 3612 topology 3713 4803 -> 15 0 24 3612 topology 3658 4804 -> 16 0 24 3612 topology 3659 4804 -> 15 0 24 3612 topology 3691 4805 -> 16 0 24 3612 topology 3692 4805 -> 15 0 23 3612 topology 3623 4806 -> 16 0 23 3612 topology 3713 4806 -> 15 0 24 3612 topology 3616 4807 -> 16 0 24 3612 topology 3618 4807 -> 15 0 24 3612 topology 3643 4808 -> 16 0 24 3612 topology 3645 4808 -> 15 0 23 3612 topology 3675 4809 -> 16 0 23 3612 topology 3713 4809 -> 15 0 23 3612 topology 3651 4810 -> 16 0 23 3612 topology 3713 4810 -> 15 0 23 3612 topology 3635 4811 -> 16 0 23 3612 topology 3713 4811 -> 15 0 24 3612 topology 3622 4812 -> 16 0 24 3612 topology 3624 4812 -> 15 0 24 3612 topology 3676 4813 -> 16 0 24 3612 topology 3678 4813 -> 15 0 23 3612 topology 3711 4814 -> 16 0 23 3612 topology 3713 4814 -> 15 0 23 3612 topology 3687 4815 -> 16 0 23 3612 topology 3713 4815 -> 15 0 23 3612 topology 3663 4816 -> 16 0 23 3612 topology 3713 4816 -> 15 0 24 3612 topology 3628 4817 -> 16 0 24 3612 topology 3630 4817 -> 15 0 24 3612 topology 3655 4818 -> 16 0 24 3612 topology 3657 4818 -> 15 0 24 3612 topology 3709 4819 -> 16 0 24 3612 topology 3711 4819 -> 15 0 23 3612 topology 3699 4820 -> 16 0 23 3612 topology 3713 4820 -> 15 0 24 3612 topology 3634 4821 -> 16 0 24 3612 topology 3636 4821 -> 15 0 24 3612 topology 3688 4822 -> 16 0 24 3612 topology 3690 4822 -> 15 0 24 3612 topology 3670 4823 -> 16 0 24 3612 topology 3671 4823 -> 15 0 23 3612 topology 3647 4824 -> 16 0 23 3612 topology 3713 4824 -> 15 0 23 3612 topology 3677 4825 -> 16 0 23 3612 topology 3713 4825 -> 15 0 24 3612 topology 3667 4826 -> 16 0 24 3612 topology 3669 4826 -> 15 0 23 3612 topology 3707 4827 -> 16 0 23 3612 topology 3713 4827 -> 15 0 24 3612 topology 3649 4828 -> 16 0 24 3612 topology 3650 4828 -> 15 0 24 3612 topology 3703 4829 -> 16 0 24 3612 topology 3704 4829 -> 15 0 23 3612 topology 3624 4830 -> 16 0 23 3612 topology 3713 4830 -> 15 0 23 3612 topology 3659 4831 -> 16 0 23 3612 topology 3713 4831 -> 15 0 23 3612 topology 3689 4832 -> 16 0 23 3612 topology 3713 4832 -> 15 0 24 3612 topology 3682 4833 -> 16 0 24 3612 topology 3683 4833 -> 15 0 23 3612 topology 3636 4834 -> 16 0 23 3612 topology 3713 4834 -> 15 0 24 3612 topology 3661 4835 -> 16 0 24 3612 topology 3662 4835 -> 15 0 24 3612 topology 3694 4836 -> 16 0 24 3612 topology 3695 4836 -> 15 0 23 3612 topology 3620 4837 -> 16 0 23 3612 topology 3713 4837 -> 15 0 24 3612 topology 3640 4838 -> 16 0 24 3612 topology 3642 4838 -> 15 0 23 3612 topology 3642 4839 -> 16 0 23 3612 topology 3713 4839 -> 15 0 23 3612 topology 3702 4840 -> 16 0 23 3612 topology 3713 4840 -> 15 0 23 3612 topology 3632 4841 -> 16 0 23 3612 topology 3713 4841 -> 15 0 24 3612 topology 3673 4842 -> 16 0 24 3612 topology 3675 4842 -> 15 0 23 3612 topology 3678 4843 -> 16 0 23 3612 topology 3713 4843 -> 15 0 23 3612 topology 3654 4844 -> 16 0 23 3612 topology 3713 4844 -> 15 0 24 3612 topology 3652 4845 -> 16 0 24 3612 topology 3654 4845 -> 15 0 23 3612 topology 3690 4846 -> 16 0 23 3612 topology 3713 4846 -> 15 0 24 3612 topology 3706 4847 -> 16 0 24 3612 topology 3708 4847 -> 15 0 23 3612 topology 3666 4848 -> 16 0 23 3612 topology 3713 4848 -> 15 0 24 3612 topology 3685 4849 -> 16 0 24 3612 topology 3687 4849 -> 15 0 24 3612 topology 3613 4850 -> 16 0 24 3612 topology 3614 4850 -> 15 0 24 3612 topology 3640 4851 -> 16 0 24 3612 topology 3641 4851 -> 15 0 24 3612 topology 3616 4852 -> 16 0 24 3612 topology 3617 4852 -> 15 0 23 3612 topology 3644 4853 -> 16 0 23 3612 topology 3713 4853 -> 15 0 23 3715 topology 3721 4854 +> 15 0 24 3612 topology 3712 4787 +> 16 0 24 3612 topology 3713 4787 +> 15 0 25 3612 topology 3640 4788 +> 16 0 25 3612 topology 3642 4788 +> 15 0 25 3612 topology 3640 4789 +> 16 0 25 3612 topology 3641 4789 +> 15 0 25 3612 topology 3643 4790 +> 16 0 25 3612 topology 3645 4790 +> 15 0 25 3612 topology 3643 4791 +> 16 0 25 3612 topology 3644 4791 +> 15 0 25 3612 topology 3646 4792 +> 16 0 25 3612 topology 3648 4792 +> 15 0 25 3612 topology 3646 4793 +> 16 0 25 3612 topology 3647 4793 +> 15 0 25 3612 topology 3649 4794 +> 16 0 25 3612 topology 3651 4794 +> 15 0 25 3612 topology 3649 4795 +> 16 0 25 3612 topology 3650 4795 +> 15 0 25 3612 topology 3652 4796 +> 16 0 25 3612 topology 3654 4796 +> 15 0 25 3612 topology 3652 4797 +> 16 0 25 3612 topology 3653 4797 +> 15 0 25 3612 topology 3655 4798 +> 16 0 25 3612 topology 3657 4798 +> 15 0 25 3612 topology 3655 4799 +> 16 0 25 3612 topology 3656 4799 +> 15 0 25 3612 topology 3658 4800 +> 16 0 25 3612 topology 3660 4800 +> 15 0 25 3612 topology 3658 4801 +> 16 0 25 3612 topology 3659 4801 +> 15 0 25 3612 topology 3661 4802 +> 16 0 25 3612 topology 3663 4802 +> 15 0 25 3612 topology 3661 4803 +> 16 0 25 3612 topology 3662 4803 +> 15 0 25 3612 topology 3664 4804 +> 16 0 25 3612 topology 3666 4804 +> 15 0 25 3612 topology 3664 4805 +> 16 0 25 3612 topology 3665 4805 +> 15 0 25 3612 topology 3667 4806 +> 16 0 25 3612 topology 3669 4806 +> 15 0 25 3612 topology 3667 4807 +> 16 0 25 3612 topology 3668 4807 +> 15 0 25 3612 topology 3613 4808 +> 16 0 25 3612 topology 3615 4808 +> 15 0 25 3612 topology 3613 4809 +> 16 0 25 3612 topology 3614 4809 +> 15 0 25 3612 topology 3670 4810 +> 16 0 25 3612 topology 3672 4810 +> 15 0 25 3612 topology 3670 4811 +> 16 0 25 3612 topology 3671 4811 +> 15 0 25 3612 topology 3673 4812 +> 16 0 25 3612 topology 3675 4812 +> 15 0 25 3612 topology 3673 4813 +> 16 0 25 3612 topology 3674 4813 +> 15 0 25 3612 topology 3676 4814 +> 16 0 25 3612 topology 3678 4814 +> 15 0 25 3612 topology 3676 4815 +> 16 0 25 3612 topology 3677 4815 +> 15 0 25 3612 topology 3679 4816 +> 16 0 25 3612 topology 3681 4816 +> 15 0 25 3612 topology 3679 4817 +> 16 0 25 3612 topology 3680 4817 +> 15 0 25 3612 topology 3682 4818 +> 16 0 25 3612 topology 3684 4818 +> 15 0 25 3612 topology 3682 4819 +> 16 0 25 3612 topology 3683 4819 +> 15 0 25 3612 topology 3685 4820 +> 16 0 25 3612 topology 3687 4820 +> 15 0 25 3612 topology 3685 4821 +> 16 0 25 3612 topology 3686 4821 +> 15 0 25 3612 topology 3688 4822 +> 16 0 25 3612 topology 3690 4822 +> 15 0 25 3612 topology 3688 4823 +> 16 0 25 3612 topology 3689 4823 +> 15 0 25 3612 topology 3691 4824 +> 16 0 25 3612 topology 3693 4824 +> 15 0 25 3612 topology 3691 4825 +> 16 0 25 3612 topology 3692 4825 +> 15 0 25 3612 topology 3694 4826 +> 16 0 25 3612 topology 3696 4826 +> 15 0 25 3612 topology 3694 4827 +> 16 0 25 3612 topology 3695 4827 +> 15 0 25 3612 topology 3697 4828 +> 16 0 25 3612 topology 3699 4828 +> 15 0 25 3612 topology 3697 4829 +> 16 0 25 3612 topology 3698 4829 +> 15 0 25 3612 topology 3616 4830 +> 16 0 25 3612 topology 3618 4830 +> 15 0 25 3612 topology 3616 4831 +> 16 0 25 3612 topology 3617 4831 +> 15 0 25 3612 topology 3700 4832 +> 16 0 25 3612 topology 3702 4832 +> 15 0 25 3612 topology 3700 4833 +> 16 0 25 3612 topology 3701 4833 +> 15 0 25 3612 topology 3703 4834 +> 16 0 25 3612 topology 3705 4834 +> 15 0 25 3612 topology 3703 4835 +> 16 0 25 3612 topology 3704 4835 +> 15 0 25 3612 topology 3706 4836 +> 16 0 25 3612 topology 3708 4836 +> 15 0 25 3612 topology 3706 4837 +> 16 0 25 3612 topology 3707 4837 +> 15 0 25 3612 topology 3709 4838 +> 16 0 25 3612 topology 3711 4838 +> 15 0 25 3612 topology 3709 4839 +> 16 0 25 3612 topology 3710 4839 +> 15 0 25 3612 topology 3619 4840 +> 16 0 25 3612 topology 3621 4840 +> 15 0 25 3612 topology 3619 4841 +> 16 0 25 3612 topology 3620 4841 +> 15 0 25 3612 topology 3622 4842 +> 16 0 25 3612 topology 3624 4842 +> 15 0 25 3612 topology 3622 4843 +> 16 0 25 3612 topology 3623 4843 +> 15 0 25 3612 topology 3625 4844 +> 16 0 25 3612 topology 3627 4844 +> 15 0 25 3612 topology 3625 4845 +> 16 0 25 3612 topology 3626 4845 +> 15 0 25 3612 topology 3628 4846 +> 16 0 25 3612 topology 3630 4846 +> 15 0 25 3612 topology 3628 4847 +> 16 0 25 3612 topology 3629 4847 +> 15 0 25 3612 topology 3631 4848 +> 16 0 25 3612 topology 3633 4848 +> 15 0 25 3612 topology 3631 4849 +> 16 0 25 3612 topology 3632 4849 +> 15 0 25 3612 topology 3634 4850 +> 16 0 25 3612 topology 3636 4850 +> 15 0 25 3612 topology 3634 4851 +> 16 0 25 3612 topology 3635 4851 +> 15 0 25 3612 topology 3637 4852 +> 16 0 25 3612 topology 3639 4852 +> 15 0 25 3612 topology 3637 4853 +> 16 0 25 3612 topology 3638 4853 +> 15 0 23 3715 topology 3745 4854 > 16 0 23 3715 topology 3792 4854 -> 15 0 24 3715 topology 3779 4855 -> 16 0 24 3715 topology 3780 4855 -> 15 0 23 3715 topology 3762 4856 +> 15 0 23 3715 topology 3744 4855 +> 16 0 23 3715 topology 3792 4855 +> 15 0 23 3715 topology 3748 4856 > 16 0 23 3715 topology 3792 4856 -> 15 0 24 3715 topology 3782 4857 -> 16 0 24 3715 topology 3783 4857 -> 15 0 23 3715 topology 3733 4858 +> 15 0 23 3715 topology 3747 4857 +> 16 0 23 3715 topology 3792 4857 +> 15 0 23 3715 topology 3751 4858 > 16 0 23 3715 topology 3792 4858 -> 15 0 24 3715 topology 3731 4859 -> 16 0 24 3715 topology 3732 4859 -> 15 0 24 3715 topology 3785 4860 -> 16 0 24 3715 topology 3786 4860 -> 15 0 24 3715 topology 3788 4861 -> 16 0 24 3715 topology 3789 4861 -> 15 0 23 3715 topology 3717 4862 +> 15 0 23 3715 topology 3750 4859 +> 16 0 23 3715 topology 3792 4859 +> 15 0 23 3715 topology 3754 4860 +> 16 0 23 3715 topology 3792 4860 +> 15 0 23 3715 topology 3753 4861 +> 16 0 23 3715 topology 3792 4861 +> 15 0 23 3715 topology 3757 4862 > 16 0 23 3715 topology 3792 4862 -> 15 0 24 3715 topology 3716 4863 -> 16 0 24 3715 topology 3718 4863 -> 15 0 24 3715 topology 3743 4864 -> 16 0 24 3715 topology 3745 4864 -> 15 0 23 3715 topology 3745 4865 +> 15 0 23 3715 topology 3756 4863 +> 16 0 23 3715 topology 3792 4863 +> 15 0 23 3715 topology 3760 4864 +> 16 0 23 3715 topology 3792 4864 +> 15 0 23 3715 topology 3759 4865 > 16 0 23 3715 topology 3792 4865 -> 15 0 23 3715 topology 3729 4866 +> 15 0 23 3715 topology 3763 4866 > 16 0 23 3715 topology 3792 4866 -> 15 0 24 3715 topology 3773 4867 -> 16 0 24 3715 topology 3775 4867 -> 15 0 24 3715 topology 3749 4868 -> 16 0 24 3715 topology 3751 4868 -> 15 0 23 3715 topology 3781 4869 +> 15 0 23 3715 topology 3762 4867 +> 16 0 23 3715 topology 3792 4867 +> 15 0 23 3715 topology 3766 4868 +> 16 0 23 3715 topology 3792 4868 +> 15 0 23 3715 topology 3765 4869 > 16 0 23 3715 topology 3792 4869 -> 15 0 23 3715 topology 3757 4870 +> 15 0 23 3715 topology 3769 4870 > 16 0 23 3715 topology 3792 4870 -> 15 0 23 3715 topology 3741 4871 +> 15 0 23 3715 topology 3768 4871 > 16 0 23 3715 topology 3792 4871 -> 15 0 24 3715 topology 3779 4872 -> 16 0 24 3715 topology 3781 4872 -> 15 0 24 3715 topology 3728 4873 -> 16 0 24 3715 topology 3730 4873 -> 15 0 24 3715 topology 3755 4874 -> 16 0 24 3715 topology 3757 4874 -> 15 0 23 3715 topology 3769 4875 +> 15 0 23 3715 topology 3772 4872 +> 16 0 23 3715 topology 3792 4872 +> 15 0 23 3715 topology 3771 4873 +> 16 0 23 3715 topology 3792 4873 +> 15 0 23 3715 topology 3718 4874 +> 16 0 23 3715 topology 3792 4874 +> 15 0 23 3715 topology 3717 4875 > 16 0 23 3715 topology 3792 4875 -> 15 0 24 3715 topology 3785 4876 -> 16 0 24 3715 topology 3787 4876 -> 15 0 24 3715 topology 3761 4877 -> 16 0 24 3715 topology 3763 4877 -> 15 0 24 3715 topology 3716 4878 -> 16 0 24 3715 topology 3717 4878 -> 15 0 23 3715 topology 3747 4879 +> 15 0 23 3715 topology 3775 4876 +> 16 0 23 3715 topology 3792 4876 +> 15 0 23 3715 topology 3774 4877 +> 16 0 23 3715 topology 3792 4877 +> 15 0 23 3715 topology 3778 4878 +> 16 0 23 3715 topology 3792 4878 +> 15 0 23 3715 topology 3777 4879 > 16 0 23 3715 topology 3792 4879 -> 15 0 24 3715 topology 3740 4880 -> 16 0 24 3715 topology 3742 4880 -> 15 0 24 3715 topology 3767 4881 -> 16 0 24 3715 topology 3769 4881 -> 15 0 23 3715 topology 3777 4882 +> 15 0 23 3715 topology 3781 4880 +> 16 0 23 3715 topology 3792 4880 +> 15 0 23 3715 topology 3780 4881 +> 16 0 23 3715 topology 3792 4881 +> 15 0 23 3715 topology 3784 4882 > 16 0 23 3715 topology 3792 4882 -> 15 0 23 3715 topology 3724 4883 +> 15 0 23 3715 topology 3783 4883 > 16 0 23 3715 topology 3792 4883 -> 15 0 23 3715 topology 3759 4884 +> 15 0 23 3715 topology 3787 4884 > 16 0 23 3715 topology 3792 4884 -> 15 0 23 3715 topology 3789 4885 +> 15 0 23 3715 topology 3786 4885 > 16 0 23 3715 topology 3792 4885 -> 15 0 24 3715 topology 3728 4886 -> 16 0 24 3715 topology 3729 4886 -> 15 0 23 3715 topology 3736 4887 +> 15 0 23 3715 topology 3790 4886 +> 16 0 23 3715 topology 3792 4886 +> 15 0 23 3715 topology 3789 4887 > 16 0 23 3715 topology 3792 4887 -> 15 0 23 3715 topology 3771 4888 +> 15 0 23 3715 topology 3721 4888 > 16 0 23 3715 topology 3792 4888 -> 15 0 24 3715 topology 3740 4889 -> 16 0 24 3715 topology 3741 4889 -> 15 0 23 3715 topology 3726 4890 +> 15 0 23 3715 topology 3720 4889 +> 16 0 23 3715 topology 3792 4889 +> 15 0 23 3715 topology 3724 4890 > 16 0 23 3715 topology 3792 4890 -> 15 0 24 3715 topology 3719 4891 -> 16 0 24 3715 topology 3721 4891 -> 15 0 23 3715 topology 3748 4892 +> 15 0 23 3715 topology 3723 4891 +> 16 0 23 3715 topology 3792 4891 +> 15 0 23 3715 topology 3727 4892 > 16 0 23 3715 topology 3792 4892 -> 15 0 23 3715 topology 3738 4893 +> 15 0 23 3715 topology 3726 4893 > 16 0 23 3715 topology 3792 4893 -> 15 0 23 3715 topology 3784 4894 +> 15 0 23 3715 topology 3730 4894 > 16 0 23 3715 topology 3792 4894 -> 15 0 23 3715 topology 3760 4895 +> 15 0 23 3715 topology 3729 4895 > 16 0 23 3715 topology 3792 4895 -> 15 0 24 3715 topology 3731 4896 -> 16 0 24 3715 topology 3733 4896 -> 15 0 23 3715 topology 3772 4897 +> 15 0 23 3715 topology 3733 4896 +> 16 0 23 3715 topology 3792 4896 +> 15 0 23 3715 topology 3732 4897 > 16 0 23 3715 topology 3792 4897 -> 15 0 24 3715 topology 3743 4898 -> 16 0 24 3715 topology 3744 4898 -> 15 0 23 3715 topology 3744 4899 +> 15 0 23 3715 topology 3736 4898 +> 16 0 23 3715 topology 3792 4898 +> 15 0 23 3715 topology 3735 4899 > 16 0 23 3715 topology 3792 4899 -> 15 0 24 3715 topology 3746 4900 -> 16 0 24 3715 topology 3747 4900 -> 15 0 23 3715 topology 3774 4901 +> 15 0 23 3715 topology 3739 4900 +> 16 0 23 3715 topology 3792 4900 +> 15 0 23 3715 topology 3738 4901 > 16 0 23 3715 topology 3792 4901 -> 15 0 24 3715 topology 3749 4902 -> 16 0 24 3715 topology 3750 4902 -> 15 0 23 3715 topology 3756 4903 +> 15 0 23 3715 topology 3742 4902 +> 16 0 23 3715 topology 3792 4902 +> 15 0 23 3715 topology 3741 4903 > 16 0 23 3715 topology 3792 4903 -> 15 0 24 3715 topology 3725 4904 -> 16 0 24 3715 topology 3726 4904 -> 15 0 24 3715 topology 3752 4905 -> 16 0 24 3715 topology 3753 4905 -> 15 0 23 3715 topology 3786 4906 -> 16 0 23 3715 topology 3792 4906 -> 15 0 23 3715 topology 3727 4907 -> 16 0 23 3715 topology 3792 4907 -> 15 0 24 3715 topology 3755 4908 -> 16 0 24 3715 topology 3756 4908 -> 15 0 23 3715 topology 3768 4909 -> 16 0 23 3715 topology 3792 4909 -> 15 0 24 3715 topology 3758 4910 -> 16 0 24 3715 topology 3759 4910 -> 15 0 23 3715 topology 3739 4911 -> 16 0 23 3715 topology 3792 4911 -> 15 0 24 3715 topology 3761 4912 -> 16 0 24 3715 topology 3762 4912 -> 15 0 24 3715 topology 3737 4913 -> 16 0 24 3715 topology 3738 4913 -> 15 0 24 3715 topology 3764 4914 -> 16 0 24 3715 topology 3765 4914 -> 15 0 24 3715 topology 3767 4915 -> 16 0 24 3715 topology 3768 4915 -> 15 0 24 3715 topology 3770 4916 -> 16 0 24 3715 topology 3771 4916 -> 15 0 23 3715 topology 3723 4917 -> 16 0 23 3715 topology 3792 4917 -> 15 0 24 3715 topology 3746 4918 -> 16 0 24 3715 topology 3748 4918 -> 15 0 23 3715 topology 3775 4919 -> 16 0 23 3715 topology 3792 4919 -> 15 0 23 3715 topology 3751 4920 -> 16 0 23 3715 topology 3792 4920 -> 15 0 24 3715 topology 3722 4921 -> 16 0 24 3715 topology 3724 4921 -> 15 0 23 3715 topology 3735 4922 -> 16 0 23 3715 topology 3792 4922 -> 15 0 24 3715 topology 3776 4923 -> 16 0 24 3715 topology 3778 4923 -> 15 0 24 3715 topology 3752 4924 -> 16 0 24 3715 topology 3754 4924 -> 15 0 23 3715 topology 3787 4925 -> 16 0 23 3715 topology 3792 4925 -> 15 0 23 3715 topology 3763 4926 -> 16 0 23 3715 topology 3792 4926 -> 15 0 25 3715 topology 3791 4927 -> 16 0 25 3715 topology 3792 4927 -> 15 0 24 3715 topology 3782 4928 -> 16 0 24 3715 topology 3784 4928 -> 15 0 24 3715 topology 3758 4929 -> 16 0 24 3715 topology 3760 4929 -> 15 0 24 3715 topology 3734 4930 -> 16 0 24 3715 topology 3736 4930 -> 15 0 24 3715 topology 3788 4931 -> 16 0 24 3715 topology 3790 4931 -> 15 0 24 3715 topology 3764 4932 -> 16 0 24 3715 topology 3766 4932 -> 15 0 23 3715 topology 3718 4933 -> 16 0 23 3715 topology 3792 4933 -> 15 0 24 3715 topology 3722 4934 -> 16 0 24 3715 topology 3723 4934 -> 15 0 23 3715 topology 3753 4935 -> 16 0 23 3715 topology 3792 4935 -> 15 0 24 3715 topology 3770 4936 -> 16 0 24 3715 topology 3772 4936 -> 15 0 23 3715 topology 3783 4937 -> 16 0 23 3715 topology 3792 4937 -> 15 0 23 3715 topology 3730 4938 -> 16 0 23 3715 topology 3792 4938 -> 15 0 23 3715 topology 3765 4939 -> 16 0 23 3715 topology 3792 4939 -> 15 0 24 3715 topology 3734 4940 -> 16 0 24 3715 topology 3735 4940 -> 15 0 23 3715 topology 3742 4941 -> 16 0 23 3715 topology 3792 4941 -> 15 0 23 3715 topology 3720 4942 -> 16 0 23 3715 topology 3792 4942 -> 15 0 23 3715 topology 3732 4943 -> 16 0 23 3715 topology 3792 4943 -> 15 0 23 3715 topology 3778 4944 -> 16 0 23 3715 topology 3792 4944 -> 15 0 23 3715 topology 3754 4945 -> 16 0 23 3715 topology 3792 4945 -> 15 0 24 3715 topology 3725 4946 -> 16 0 24 3715 topology 3727 4946 -> 15 0 23 3715 topology 3790 4947 -> 16 0 23 3715 topology 3792 4947 -> 15 0 23 3715 topology 3766 4948 -> 16 0 23 3715 topology 3792 4948 -> 15 0 24 3715 topology 3737 4949 -> 16 0 24 3715 topology 3739 4949 -> 15 0 24 3715 topology 3719 4950 -> 16 0 24 3715 topology 3720 4950 -> 15 0 24 3715 topology 3773 4951 -> 16 0 24 3715 topology 3774 4951 -> 15 0 23 3715 topology 3750 4952 -> 16 0 23 3715 topology 3792 4952 -> 15 0 24 3715 topology 3776 4953 -> 16 0 24 3715 topology 3777 4953 -> 15 0 23 3715 topology 3780 4954 -> 16 0 23 3715 topology 3792 4954 -> 15 0 23 3794 topology 3907 4955 +> 15 0 24 3715 topology 3791 4904 +> 16 0 24 3715 topology 3792 4904 +> 15 0 25 3715 topology 3743 4905 +> 16 0 25 3715 topology 3745 4905 +> 15 0 25 3715 topology 3743 4906 +> 16 0 25 3715 topology 3744 4906 +> 15 0 25 3715 topology 3746 4907 +> 16 0 25 3715 topology 3748 4907 +> 15 0 25 3715 topology 3746 4908 +> 16 0 25 3715 topology 3747 4908 +> 15 0 25 3715 topology 3749 4909 +> 16 0 25 3715 topology 3751 4909 +> 15 0 25 3715 topology 3749 4910 +> 16 0 25 3715 topology 3750 4910 +> 15 0 25 3715 topology 3752 4911 +> 16 0 25 3715 topology 3754 4911 +> 15 0 25 3715 topology 3752 4912 +> 16 0 25 3715 topology 3753 4912 +> 15 0 25 3715 topology 3755 4913 +> 16 0 25 3715 topology 3757 4913 +> 15 0 25 3715 topology 3755 4914 +> 16 0 25 3715 topology 3756 4914 +> 15 0 25 3715 topology 3758 4915 +> 16 0 25 3715 topology 3760 4915 +> 15 0 25 3715 topology 3758 4916 +> 16 0 25 3715 topology 3759 4916 +> 15 0 25 3715 topology 3761 4917 +> 16 0 25 3715 topology 3763 4917 +> 15 0 25 3715 topology 3761 4918 +> 16 0 25 3715 topology 3762 4918 +> 15 0 25 3715 topology 3764 4919 +> 16 0 25 3715 topology 3766 4919 +> 15 0 25 3715 topology 3764 4920 +> 16 0 25 3715 topology 3765 4920 +> 15 0 25 3715 topology 3767 4921 +> 16 0 25 3715 topology 3769 4921 +> 15 0 25 3715 topology 3767 4922 +> 16 0 25 3715 topology 3768 4922 +> 15 0 25 3715 topology 3770 4923 +> 16 0 25 3715 topology 3772 4923 +> 15 0 25 3715 topology 3770 4924 +> 16 0 25 3715 topology 3771 4924 +> 15 0 25 3715 topology 3716 4925 +> 16 0 25 3715 topology 3718 4925 +> 15 0 25 3715 topology 3716 4926 +> 16 0 25 3715 topology 3717 4926 +> 15 0 25 3715 topology 3773 4927 +> 16 0 25 3715 topology 3775 4927 +> 15 0 25 3715 topology 3773 4928 +> 16 0 25 3715 topology 3774 4928 +> 15 0 25 3715 topology 3776 4929 +> 16 0 25 3715 topology 3778 4929 +> 15 0 25 3715 topology 3776 4930 +> 16 0 25 3715 topology 3777 4930 +> 15 0 25 3715 topology 3779 4931 +> 16 0 25 3715 topology 3781 4931 +> 15 0 25 3715 topology 3779 4932 +> 16 0 25 3715 topology 3780 4932 +> 15 0 25 3715 topology 3782 4933 +> 16 0 25 3715 topology 3784 4933 +> 15 0 25 3715 topology 3782 4934 +> 16 0 25 3715 topology 3783 4934 +> 15 0 25 3715 topology 3785 4935 +> 16 0 25 3715 topology 3787 4935 +> 15 0 25 3715 topology 3785 4936 +> 16 0 25 3715 topology 3786 4936 +> 15 0 25 3715 topology 3788 4937 +> 16 0 25 3715 topology 3790 4937 +> 15 0 25 3715 topology 3788 4938 +> 16 0 25 3715 topology 3789 4938 +> 15 0 25 3715 topology 3719 4939 +> 16 0 25 3715 topology 3721 4939 +> 15 0 25 3715 topology 3719 4940 +> 16 0 25 3715 topology 3720 4940 +> 15 0 25 3715 topology 3722 4941 +> 16 0 25 3715 topology 3724 4941 +> 15 0 25 3715 topology 3722 4942 +> 16 0 25 3715 topology 3723 4942 +> 15 0 25 3715 topology 3725 4943 +> 16 0 25 3715 topology 3727 4943 +> 15 0 25 3715 topology 3725 4944 +> 16 0 25 3715 topology 3726 4944 +> 15 0 25 3715 topology 3728 4945 +> 16 0 25 3715 topology 3730 4945 +> 15 0 25 3715 topology 3728 4946 +> 16 0 25 3715 topology 3729 4946 +> 15 0 25 3715 topology 3731 4947 +> 16 0 25 3715 topology 3733 4947 +> 15 0 25 3715 topology 3731 4948 +> 16 0 25 3715 topology 3732 4948 +> 15 0 25 3715 topology 3734 4949 +> 16 0 25 3715 topology 3736 4949 +> 15 0 25 3715 topology 3734 4950 +> 16 0 25 3715 topology 3735 4950 +> 15 0 25 3715 topology 3737 4951 +> 16 0 25 3715 topology 3739 4951 +> 15 0 25 3715 topology 3737 4952 +> 16 0 25 3715 topology 3738 4952 +> 15 0 25 3715 topology 3740 4953 +> 16 0 25 3715 topology 3742 4953 +> 15 0 25 3715 topology 3740 4954 +> 16 0 25 3715 topology 3741 4954 +> 15 0 23 3794 topology 3824 4955 > 16 0 23 3794 topology 3916 4955 -> 15 0 24 3794 topology 3870 4956 -> 16 0 24 3794 topology 3871 4956 -> 15 0 23 3794 topology 3796 4957 +> 15 0 23 3794 topology 3823 4956 +> 16 0 23 3794 topology 3916 4956 +> 15 0 23 3794 topology 3827 4957 > 16 0 23 3794 topology 3916 4957 -> 15 0 24 3794 topology 3849 4958 -> 16 0 24 3794 topology 3850 4958 -> 15 0 24 3794 topology 3903 4959 -> 16 0 24 3794 topology 3904 4959 -> 15 0 23 3794 topology 3808 4960 +> 15 0 23 3794 topology 3826 4958 +> 16 0 23 3794 topology 3916 4958 +> 15 0 23 3794 topology 3830 4959 +> 16 0 23 3794 topology 3916 4959 +> 15 0 23 3794 topology 3829 4960 > 16 0 23 3794 topology 3916 4960 -> 15 0 23 3794 topology 3854 4961 +> 15 0 23 3794 topology 3833 4961 > 16 0 23 3794 topology 3916 4961 -> 15 0 23 3794 topology 3830 4962 +> 15 0 23 3794 topology 3832 4962 > 16 0 23 3794 topology 3916 4962 -> 15 0 24 3794 topology 3828 4963 -> 16 0 24 3794 topology 3830 4963 -> 15 0 24 3794 topology 3882 4964 -> 16 0 24 3794 topology 3884 4964 -> 15 0 23 3794 topology 3914 4965 +> 15 0 23 3794 topology 3836 4963 +> 16 0 23 3794 topology 3916 4963 +> 15 0 23 3794 topology 3835 4964 +> 16 0 23 3794 topology 3916 4964 +> 15 0 23 3794 topology 3839 4965 > 16 0 23 3794 topology 3916 4965 -> 15 0 23 3794 topology 3890 4966 +> 15 0 23 3794 topology 3838 4966 > 16 0 23 3794 topology 3916 4966 -> 15 0 23 3794 topology 3820 4967 +> 15 0 23 3794 topology 3842 4967 > 16 0 23 3794 topology 3916 4967 -> 15 0 23 3794 topology 3866 4968 +> 15 0 23 3794 topology 3841 4968 > 16 0 23 3794 topology 3916 4968 -> 15 0 23 3794 topology 3842 4969 +> 15 0 23 3794 topology 3845 4969 > 16 0 23 3794 topology 3916 4969 -> 15 0 24 3794 topology 3861 4970 -> 16 0 24 3794 topology 3863 4970 -> 15 0 23 3794 topology 3902 4971 +> 15 0 23 3794 topology 3844 4970 +> 16 0 23 3794 topology 3916 4970 +> 15 0 23 3794 topology 3848 4971 > 16 0 23 3794 topology 3916 4971 -> 15 0 23 3794 topology 3878 4972 +> 15 0 23 3794 topology 3847 4972 > 16 0 23 3794 topology 3916 4972 -> 15 0 24 3794 topology 3840 4973 -> 16 0 24 3794 topology 3842 4973 -> 15 0 24 3794 topology 3894 4974 -> 16 0 24 3794 topology 3896 4974 -> 15 0 24 3794 topology 3873 4975 -> 16 0 24 3794 topology 3875 4975 -> 15 0 24 3794 topology 3828 4976 -> 16 0 24 3794 topology 3829 4976 -> 15 0 23 3794 topology 3832 4977 +> 15 0 23 3794 topology 3851 4973 +> 16 0 23 3794 topology 3916 4973 +> 15 0 23 3794 topology 3850 4974 +> 16 0 23 3794 topology 3916 4974 +> 15 0 23 3794 topology 3797 4975 +> 16 0 23 3794 topology 3916 4975 +> 15 0 23 3794 topology 3796 4976 +> 16 0 23 3794 topology 3916 4976 +> 15 0 23 3794 topology 3854 4977 > 16 0 23 3794 topology 3916 4977 -> 15 0 24 3794 topology 3882 4978 -> 16 0 24 3794 topology 3883 4978 -> 15 0 23 3794 topology 3862 4979 +> 15 0 23 3794 topology 3853 4978 +> 16 0 23 3794 topology 3916 4978 +> 15 0 23 3794 topology 3857 4979 > 16 0 23 3794 topology 3916 4979 -> 15 0 23 3794 topology 3803 4980 +> 15 0 23 3794 topology 3856 4980 > 16 0 23 3794 topology 3916 4980 -> 15 0 23 3794 topology 3892 4981 +> 15 0 23 3794 topology 3860 4981 > 16 0 23 3794 topology 3916 4981 -> 15 0 24 3794 topology 3906 4982 -> 16 0 24 3794 topology 3908 4982 -> 15 0 23 3794 topology 3844 4983 +> 15 0 23 3794 topology 3859 4982 +> 16 0 23 3794 topology 3916 4982 +> 15 0 23 3794 topology 3863 4983 > 16 0 23 3794 topology 3916 4983 -> 15 0 24 3794 topology 3861 4984 -> 16 0 24 3794 topology 3862 4984 -> 15 0 23 3794 topology 3874 4985 +> 15 0 23 3794 topology 3862 4984 +> 16 0 23 3794 topology 3916 4984 +> 15 0 23 3794 topology 3866 4985 > 16 0 23 3794 topology 3916 4985 -> 15 0 23 3794 topology 3815 4986 +> 15 0 23 3794 topology 3865 4986 > 16 0 23 3794 topology 3916 4986 -> 15 0 23 3794 topology 3904 4987 +> 15 0 23 3794 topology 3869 4987 > 16 0 23 3794 topology 3916 4987 -> 15 0 24 3794 topology 3840 4988 -> 16 0 24 3794 topology 3841 4988 -> 15 0 24 3794 topology 3894 4989 -> 16 0 24 3794 topology 3895 4989 -> 15 0 24 3794 topology 3873 4990 -> 16 0 24 3794 topology 3874 4990 -> 15 0 23 3794 topology 3805 4991 +> 15 0 23 3794 topology 3868 4988 +> 16 0 23 3794 topology 3916 4988 +> 15 0 23 3794 topology 3872 4989 +> 16 0 23 3794 topology 3916 4989 +> 15 0 23 3794 topology 3871 4990 +> 16 0 23 3794 topology 3916 4990 +> 15 0 23 3794 topology 3875 4991 > 16 0 23 3794 topology 3916 4991 -> 15 0 24 3794 topology 3906 4992 -> 16 0 24 3794 topology 3907 4992 -> 15 0 24 3794 topology 3798 4993 -> 16 0 24 3794 topology 3800 4993 -> 15 0 24 3794 topology 3825 4994 -> 16 0 24 3794 topology 3827 4994 -> 15 0 23 3794 topology 3857 4995 +> 15 0 23 3794 topology 3874 4992 +> 16 0 23 3794 topology 3916 4992 +> 15 0 23 3794 topology 3878 4993 +> 16 0 23 3794 topology 3916 4993 +> 15 0 23 3794 topology 3877 4994 +> 16 0 23 3794 topology 3916 4994 +> 15 0 23 3794 topology 3881 4995 > 16 0 23 3794 topology 3916 4995 -> 15 0 23 3794 topology 3833 4996 +> 15 0 23 3794 topology 3880 4996 > 16 0 23 3794 topology 3916 4996 -> 15 0 25 3794 topology 3915 4997 -> 16 0 25 3794 topology 3916 4997 -> 15 0 23 3794 topology 3817 4998 +> 15 0 23 3794 topology 3800 4997 +> 16 0 23 3794 topology 3916 4997 +> 15 0 23 3794 topology 3799 4998 > 16 0 23 3794 topology 3916 4998 -> 15 0 24 3794 topology 3804 4999 -> 16 0 24 3794 topology 3806 4999 -> 15 0 24 3794 topology 3858 5000 -> 16 0 24 3794 topology 3860 5000 -> 15 0 23 3794 topology 3893 5001 +> 15 0 23 3794 topology 3884 4999 +> 16 0 23 3794 topology 3916 4999 +> 15 0 23 3794 topology 3883 5000 +> 16 0 23 3794 topology 3916 5000 +> 15 0 23 3794 topology 3887 5001 > 16 0 23 3794 topology 3916 5001 -> 15 0 24 3794 topology 3912 5002 -> 16 0 24 3794 topology 3914 5002 -> 15 0 23 3794 topology 3869 5003 +> 15 0 23 3794 topology 3886 5002 +> 16 0 23 3794 topology 3916 5002 +> 15 0 23 3794 topology 3890 5003 > 16 0 23 3794 topology 3916 5003 -> 15 0 23 3794 topology 3845 5004 +> 15 0 23 3794 topology 3889 5004 > 16 0 23 3794 topology 3916 5004 -> 15 0 24 3794 topology 3810 5005 -> 16 0 24 3794 topology 3812 5005 -> 15 0 24 3794 topology 3837 5006 -> 16 0 24 3794 topology 3839 5006 -> 15 0 24 3794 topology 3891 5007 -> 16 0 24 3794 topology 3893 5007 -> 15 0 23 3794 topology 3905 5008 +> 15 0 23 3794 topology 3893 5005 +> 16 0 23 3794 topology 3916 5005 +> 15 0 23 3794 topology 3892 5006 +> 16 0 23 3794 topology 3916 5006 +> 15 0 23 3794 topology 3896 5007 +> 16 0 23 3794 topology 3916 5007 +> 15 0 23 3794 topology 3895 5008 > 16 0 23 3794 topology 3916 5008 -> 15 0 23 3794 topology 3881 5009 +> 15 0 23 3794 topology 3899 5009 > 16 0 23 3794 topology 3916 5009 -> 15 0 24 3794 topology 3816 5010 -> 16 0 24 3794 topology 3818 5010 -> 15 0 24 3794 topology 3870 5011 -> 16 0 24 3794 topology 3872 5011 -> 15 0 24 3794 topology 3852 5012 -> 16 0 24 3794 topology 3853 5012 -> 15 0 23 3794 topology 3829 5013 +> 15 0 23 3794 topology 3898 5010 +> 16 0 23 3794 topology 3916 5010 +> 15 0 23 3794 topology 3902 5011 +> 16 0 23 3794 topology 3916 5011 +> 15 0 23 3794 topology 3901 5012 +> 16 0 23 3794 topology 3916 5012 +> 15 0 23 3794 topology 3905 5013 > 16 0 23 3794 topology 3916 5013 -> 15 0 23 3794 topology 3859 5014 +> 15 0 23 3794 topology 3904 5014 > 16 0 23 3794 topology 3916 5014 -> 15 0 24 3794 topology 3849 5015 -> 16 0 24 3794 topology 3851 5015 -> 15 0 23 3794 topology 3889 5016 +> 15 0 23 3794 topology 3908 5015 +> 16 0 23 3794 topology 3916 5015 +> 15 0 23 3794 topology 3907 5016 > 16 0 23 3794 topology 3916 5016 -> 15 0 24 3794 topology 3903 5017 -> 16 0 24 3794 topology 3905 5017 -> 15 0 24 3794 topology 3831 5018 -> 16 0 24 3794 topology 3832 5018 -> 15 0 24 3794 topology 3885 5019 -> 16 0 24 3794 topology 3886 5019 -> 15 0 23 3794 topology 3806 5020 +> 15 0 23 3794 topology 3911 5017 +> 16 0 23 3794 topology 3916 5017 +> 15 0 23 3794 topology 3910 5018 +> 16 0 23 3794 topology 3916 5018 +> 15 0 23 3794 topology 3803 5019 +> 16 0 23 3794 topology 3916 5019 +> 15 0 23 3794 topology 3802 5020 > 16 0 23 3794 topology 3916 5020 -> 15 0 23 3794 topology 3841 5021 +> 15 0 23 3794 topology 3914 5021 > 16 0 23 3794 topology 3916 5021 -> 15 0 23 3794 topology 3871 5022 +> 15 0 23 3794 topology 3913 5022 > 16 0 23 3794 topology 3916 5022 -> 15 0 23 3794 topology 3901 5023 +> 15 0 23 3794 topology 3806 5023 > 16 0 23 3794 topology 3916 5023 -> 15 0 24 3794 topology 3864 5024 -> 16 0 24 3794 topology 3865 5024 -> 15 0 23 3794 topology 3818 5025 +> 15 0 23 3794 topology 3805 5024 +> 16 0 23 3794 topology 3916 5024 +> 15 0 23 3794 topology 3809 5025 > 16 0 23 3794 topology 3916 5025 -> 15 0 24 3794 topology 3843 5026 -> 16 0 24 3794 topology 3844 5026 -> 15 0 24 3794 topology 3897 5027 -> 16 0 24 3794 topology 3898 5027 -> 15 0 24 3794 topology 3876 5028 -> 16 0 24 3794 topology 3877 5028 -> 15 0 23 3794 topology 3802 5029 +> 15 0 23 3794 topology 3808 5026 +> 16 0 23 3794 topology 3916 5026 +> 15 0 23 3794 topology 3812 5027 +> 16 0 23 3794 topology 3916 5027 +> 15 0 23 3794 topology 3811 5028 +> 16 0 23 3794 topology 3916 5028 +> 15 0 23 3794 topology 3815 5029 > 16 0 23 3794 topology 3916 5029 -> 15 0 24 3794 topology 3822 5030 -> 16 0 24 3794 topology 3824 5030 -> 15 0 23 3794 topology 3824 5031 +> 15 0 23 3794 topology 3814 5030 +> 16 0 23 3794 topology 3916 5030 +> 15 0 23 3794 topology 3818 5031 > 16 0 23 3794 topology 3916 5031 -> 15 0 23 3794 topology 3884 5032 +> 15 0 23 3794 topology 3817 5032 > 16 0 23 3794 topology 3916 5032 -> 15 0 24 3794 topology 3909 5033 -> 16 0 24 3794 topology 3910 5033 -> 15 0 23 3794 topology 3814 5034 +> 15 0 23 3794 topology 3821 5033 +> 16 0 23 3794 topology 3916 5033 +> 15 0 23 3794 topology 3820 5034 > 16 0 23 3794 topology 3916 5034 -> 15 0 24 3794 topology 3855 5035 -> 16 0 24 3794 topology 3857 5035 -> 15 0 23 3794 topology 3860 5036 -> 16 0 23 3794 topology 3916 5036 -> 15 0 23 3794 topology 3836 5037 -> 16 0 23 3794 topology 3916 5037 -> 15 0 23 3794 topology 3896 5038 -> 16 0 23 3794 topology 3916 5038 -> 15 0 24 3794 topology 3834 5039 -> 16 0 24 3794 topology 3836 5039 -> 15 0 23 3794 topology 3872 5040 -> 16 0 23 3794 topology 3916 5040 -> 15 0 24 3794 topology 3888 5041 -> 16 0 24 3794 topology 3890 5041 -> 15 0 23 3794 topology 3848 5042 -> 16 0 23 3794 topology 3916 5042 -> 15 0 23 3794 topology 3908 5043 -> 16 0 23 3794 topology 3916 5043 -> 15 0 24 3794 topology 3867 5044 -> 16 0 24 3794 topology 3869 5044 -> 15 0 24 3794 topology 3795 5045 -> 16 0 24 3794 topology 3796 5045 -> 15 0 24 3794 topology 3822 5046 -> 16 0 24 3794 topology 3823 5046 -> 15 0 24 3794 topology 3798 5047 -> 16 0 24 3794 topology 3799 5047 -> 15 0 23 3794 topology 3826 5048 -> 16 0 23 3794 topology 3916 5048 -> 15 0 24 3794 topology 3846 5049 -> 16 0 24 3794 topology 3848 5049 -> 15 0 23 3794 topology 3856 5050 -> 16 0 23 3794 topology 3916 5050 -> 15 0 24 3794 topology 3900 5051 -> 16 0 24 3794 topology 3902 5051 -> 15 0 23 3794 topology 3797 5052 -> 16 0 23 3794 topology 3916 5052 -> 15 0 24 3794 topology 3801 5053 -> 16 0 24 3794 topology 3802 5053 -> 15 0 24 3794 topology 3855 5054 -> 16 0 24 3794 topology 3856 5054 -> 15 0 23 3794 topology 3886 5055 -> 16 0 23 3794 topology 3916 5055 -> 15 0 24 3794 topology 3804 5056 -> 16 0 24 3794 topology 3805 5056 -> 15 0 23 3794 topology 3838 5057 -> 16 0 23 3794 topology 3916 5057 -> 15 0 23 3794 topology 3868 5058 -> 16 0 23 3794 topology 3916 5058 -> 15 0 24 3794 topology 3879 5059 -> 16 0 24 3794 topology 3881 5059 -> 15 0 24 3794 topology 3807 5060 -> 16 0 24 3794 topology 3808 5060 -> 15 0 23 3794 topology 3809 5061 -> 16 0 23 3794 topology 3916 5061 -> 15 0 24 3794 topology 3834 5062 -> 16 0 24 3794 topology 3835 5062 -> 15 0 24 3794 topology 3888 5063 -> 16 0 24 3794 topology 3889 5063 -> 15 0 23 3794 topology 3898 5064 -> 16 0 23 3794 topology 3916 5064 -> 15 0 24 3794 topology 3810 5065 -> 16 0 24 3794 topology 3811 5065 -> 15 0 23 3794 topology 3850 5066 -> 16 0 23 3794 topology 3916 5066 -> 15 0 23 3794 topology 3880 5067 -> 16 0 23 3794 topology 3916 5067 -> 15 0 24 3794 topology 3813 5068 -> 16 0 24 3794 topology 3814 5068 -> 15 0 23 3794 topology 3821 5069 -> 16 0 23 3794 topology 3916 5069 -> 15 0 24 3794 topology 3867 5070 -> 16 0 24 3794 topology 3868 5070 -> 15 0 23 3794 topology 3910 5071 -> 16 0 23 3794 topology 3916 5071 -> 15 0 24 3794 topology 3816 5072 -> 16 0 24 3794 topology 3817 5072 -> 15 0 24 3794 topology 3819 5073 -> 16 0 24 3794 topology 3820 5073 -> 15 0 24 3794 topology 3846 5074 -> 16 0 24 3794 topology 3847 5074 -> 15 0 24 3794 topology 3900 5075 -> 16 0 24 3794 topology 3901 5075 -> 15 0 23 3794 topology 3799 5076 -> 16 0 23 3794 topology 3916 5076 -> 15 0 24 3794 topology 3795 5077 -> 16 0 24 3794 topology 3797 5077 -> 15 0 24 3794 topology 3879 5078 -> 16 0 24 3794 topology 3880 5078 -> 15 0 23 3794 topology 3827 5079 -> 16 0 23 3794 topology 3916 5079 -> 15 0 24 3794 topology 3852 5080 -> 16 0 24 3794 topology 3854 5080 -> 15 0 23 3794 topology 3811 5081 -> 16 0 23 3794 topology 3916 5081 -> 15 0 24 3794 topology 3801 5082 -> 16 0 24 3794 topology 3803 5082 -> 15 0 23 3794 topology 3887 5083 -> 16 0 23 3794 topology 3916 5083 -> 15 0 23 3794 topology 3863 5084 -> 16 0 23 3794 topology 3916 5084 -> 15 0 24 3794 topology 3831 5085 -> 16 0 24 3794 topology 3833 5085 -> 15 0 23 3794 topology 3839 5086 -> 16 0 23 3794 topology 3916 5086 -> 15 0 24 3794 topology 3885 5087 -> 16 0 24 3794 topology 3887 5087 -> 15 0 24 3794 topology 3807 5088 -> 16 0 24 3794 topology 3809 5088 -> 15 0 23 3794 topology 3899 5089 -> 16 0 23 3794 topology 3916 5089 -> 15 0 23 3794 topology 3875 5090 -> 16 0 23 3794 topology 3916 5090 -> 15 0 23 3794 topology 3851 5091 -> 16 0 23 3794 topology 3916 5091 -> 15 0 24 3794 topology 3864 5092 -> 16 0 24 3794 topology 3866 5092 -> 15 0 24 3794 topology 3813 5093 -> 16 0 24 3794 topology 3815 5093 -> 15 0 23 3794 topology 3911 5094 -> 16 0 23 3794 topology 3916 5094 -> 15 0 23 3794 topology 3823 5095 -> 16 0 23 3794 topology 3916 5095 -> 15 0 24 3794 topology 3843 5096 -> 16 0 24 3794 topology 3845 5096 -> 15 0 24 3794 topology 3897 5097 -> 16 0 24 3794 topology 3899 5097 -> 15 0 24 3794 topology 3825 5098 -> 16 0 24 3794 topology 3826 5098 -> 15 0 23 3794 topology 3853 5099 -> 16 0 23 3794 topology 3916 5099 -> 15 0 24 3794 topology 3819 5100 -> 16 0 24 3794 topology 3821 5100 -> 15 0 23 3794 topology 3883 5101 -> 16 0 23 3794 topology 3916 5101 -> 15 0 23 3794 topology 3913 5102 -> 16 0 23 3794 topology 3916 5102 -> 15 0 23 3794 topology 3800 5103 -> 16 0 23 3794 topology 3916 5103 -> 15 0 23 3794 topology 3835 5104 -> 16 0 23 3794 topology 3916 5104 -> 15 0 24 3794 topology 3876 5105 -> 16 0 24 3794 topology 3878 5105 -> 15 0 24 3794 topology 3858 5106 -> 16 0 24 3794 topology 3859 5106 -> 15 0 23 3794 topology 3865 5107 -> 16 0 23 3794 topology 3916 5107 -> 15 0 24 3794 topology 3912 5108 -> 16 0 24 3794 topology 3913 5108 -> 15 0 23 3794 topology 3895 5109 -> 16 0 23 3794 topology 3916 5109 -> 15 0 23 3794 topology 3812 5110 -> 16 0 23 3794 topology 3916 5110 -> 15 0 23 3794 topology 3847 5111 -> 16 0 23 3794 topology 3916 5111 -> 15 0 24 3794 topology 3909 5112 -> 16 0 24 3794 topology 3911 5112 -> 15 0 24 3794 topology 3837 5113 -> 16 0 24 3794 topology 3838 5113 -> 15 0 23 3794 topology 3877 5114 -> 16 0 23 3794 topology 3916 5114 -> 15 0 24 3794 topology 3891 5115 -> 16 0 24 3794 topology 3892 5115 -> 15 0 21 3415 topology 3611 5116 -> 16 0 21 3415 topology 3917 5116 +> 15 0 24 3794 topology 3915 5035 +> 16 0 24 3794 topology 3916 5035 +> 15 0 25 3794 topology 3822 5036 +> 16 0 25 3794 topology 3824 5036 +> 15 0 25 3794 topology 3822 5037 +> 16 0 25 3794 topology 3823 5037 +> 15 0 25 3794 topology 3825 5038 +> 16 0 25 3794 topology 3827 5038 +> 15 0 25 3794 topology 3825 5039 +> 16 0 25 3794 topology 3826 5039 +> 15 0 25 3794 topology 3828 5040 +> 16 0 25 3794 topology 3830 5040 +> 15 0 25 3794 topology 3828 5041 +> 16 0 25 3794 topology 3829 5041 +> 15 0 25 3794 topology 3831 5042 +> 16 0 25 3794 topology 3833 5042 +> 15 0 25 3794 topology 3831 5043 +> 16 0 25 3794 topology 3832 5043 +> 15 0 25 3794 topology 3834 5044 +> 16 0 25 3794 topology 3836 5044 +> 15 0 25 3794 topology 3834 5045 +> 16 0 25 3794 topology 3835 5045 +> 15 0 25 3794 topology 3837 5046 +> 16 0 25 3794 topology 3839 5046 +> 15 0 25 3794 topology 3837 5047 +> 16 0 25 3794 topology 3838 5047 +> 15 0 25 3794 topology 3840 5048 +> 16 0 25 3794 topology 3842 5048 +> 15 0 25 3794 topology 3840 5049 +> 16 0 25 3794 topology 3841 5049 +> 15 0 25 3794 topology 3843 5050 +> 16 0 25 3794 topology 3845 5050 +> 15 0 25 3794 topology 3843 5051 +> 16 0 25 3794 topology 3844 5051 +> 15 0 25 3794 topology 3846 5052 +> 16 0 25 3794 topology 3848 5052 +> 15 0 25 3794 topology 3846 5053 +> 16 0 25 3794 topology 3847 5053 +> 15 0 25 3794 topology 3849 5054 +> 16 0 25 3794 topology 3851 5054 +> 15 0 25 3794 topology 3849 5055 +> 16 0 25 3794 topology 3850 5055 +> 15 0 25 3794 topology 3795 5056 +> 16 0 25 3794 topology 3797 5056 +> 15 0 25 3794 topology 3795 5057 +> 16 0 25 3794 topology 3796 5057 +> 15 0 25 3794 topology 3852 5058 +> 16 0 25 3794 topology 3854 5058 +> 15 0 25 3794 topology 3852 5059 +> 16 0 25 3794 topology 3853 5059 +> 15 0 25 3794 topology 3855 5060 +> 16 0 25 3794 topology 3857 5060 +> 15 0 25 3794 topology 3855 5061 +> 16 0 25 3794 topology 3856 5061 +> 15 0 25 3794 topology 3858 5062 +> 16 0 25 3794 topology 3860 5062 +> 15 0 25 3794 topology 3858 5063 +> 16 0 25 3794 topology 3859 5063 +> 15 0 25 3794 topology 3861 5064 +> 16 0 25 3794 topology 3863 5064 +> 15 0 25 3794 topology 3861 5065 +> 16 0 25 3794 topology 3862 5065 +> 15 0 25 3794 topology 3864 5066 +> 16 0 25 3794 topology 3866 5066 +> 15 0 25 3794 topology 3864 5067 +> 16 0 25 3794 topology 3865 5067 +> 15 0 25 3794 topology 3867 5068 +> 16 0 25 3794 topology 3869 5068 +> 15 0 25 3794 topology 3867 5069 +> 16 0 25 3794 topology 3868 5069 +> 15 0 25 3794 topology 3870 5070 +> 16 0 25 3794 topology 3872 5070 +> 15 0 25 3794 topology 3870 5071 +> 16 0 25 3794 topology 3871 5071 +> 15 0 25 3794 topology 3873 5072 +> 16 0 25 3794 topology 3875 5072 +> 15 0 25 3794 topology 3873 5073 +> 16 0 25 3794 topology 3874 5073 +> 15 0 25 3794 topology 3876 5074 +> 16 0 25 3794 topology 3878 5074 +> 15 0 25 3794 topology 3876 5075 +> 16 0 25 3794 topology 3877 5075 +> 15 0 25 3794 topology 3879 5076 +> 16 0 25 3794 topology 3881 5076 +> 15 0 25 3794 topology 3879 5077 +> 16 0 25 3794 topology 3880 5077 +> 15 0 25 3794 topology 3798 5078 +> 16 0 25 3794 topology 3800 5078 +> 15 0 25 3794 topology 3798 5079 +> 16 0 25 3794 topology 3799 5079 +> 15 0 25 3794 topology 3882 5080 +> 16 0 25 3794 topology 3884 5080 +> 15 0 25 3794 topology 3882 5081 +> 16 0 25 3794 topology 3883 5081 +> 15 0 25 3794 topology 3885 5082 +> 16 0 25 3794 topology 3887 5082 +> 15 0 25 3794 topology 3885 5083 +> 16 0 25 3794 topology 3886 5083 +> 15 0 25 3794 topology 3888 5084 +> 16 0 25 3794 topology 3890 5084 +> 15 0 25 3794 topology 3888 5085 +> 16 0 25 3794 topology 3889 5085 +> 15 0 25 3794 topology 3891 5086 +> 16 0 25 3794 topology 3893 5086 +> 15 0 25 3794 topology 3891 5087 +> 16 0 25 3794 topology 3892 5087 +> 15 0 25 3794 topology 3894 5088 +> 16 0 25 3794 topology 3896 5088 +> 15 0 25 3794 topology 3894 5089 +> 16 0 25 3794 topology 3895 5089 +> 15 0 25 3794 topology 3897 5090 +> 16 0 25 3794 topology 3899 5090 +> 15 0 25 3794 topology 3897 5091 +> 16 0 25 3794 topology 3898 5091 +> 15 0 25 3794 topology 3900 5092 +> 16 0 25 3794 topology 3902 5092 +> 15 0 25 3794 topology 3900 5093 +> 16 0 25 3794 topology 3901 5093 +> 15 0 25 3794 topology 3903 5094 +> 16 0 25 3794 topology 3905 5094 +> 15 0 25 3794 topology 3903 5095 +> 16 0 25 3794 topology 3904 5095 +> 15 0 25 3794 topology 3906 5096 +> 16 0 25 3794 topology 3908 5096 +> 15 0 25 3794 topology 3906 5097 +> 16 0 25 3794 topology 3907 5097 +> 15 0 25 3794 topology 3909 5098 +> 16 0 25 3794 topology 3911 5098 +> 15 0 25 3794 topology 3909 5099 +> 16 0 25 3794 topology 3910 5099 +> 15 0 25 3794 topology 3801 5100 +> 16 0 25 3794 topology 3803 5100 +> 15 0 25 3794 topology 3801 5101 +> 16 0 25 3794 topology 3802 5101 +> 15 0 25 3794 topology 3912 5102 +> 16 0 25 3794 topology 3914 5102 +> 15 0 25 3794 topology 3912 5103 +> 16 0 25 3794 topology 3913 5103 +> 15 0 25 3794 topology 3804 5104 +> 16 0 25 3794 topology 3806 5104 +> 15 0 25 3794 topology 3804 5105 +> 16 0 25 3794 topology 3805 5105 +> 15 0 25 3794 topology 3807 5106 +> 16 0 25 3794 topology 3809 5106 +> 15 0 25 3794 topology 3807 5107 +> 16 0 25 3794 topology 3808 5107 +> 15 0 25 3794 topology 3810 5108 +> 16 0 25 3794 topology 3812 5108 +> 15 0 25 3794 topology 3810 5109 +> 16 0 25 3794 topology 3811 5109 +> 15 0 25 3794 topology 3813 5110 +> 16 0 25 3794 topology 3815 5110 +> 15 0 25 3794 topology 3813 5111 +> 16 0 25 3794 topology 3814 5111 +> 15 0 25 3794 topology 3816 5112 +> 16 0 25 3794 topology 3818 5112 +> 15 0 25 3794 topology 3816 5113 +> 16 0 25 3794 topology 3817 5113 +> 15 0 25 3794 topology 3819 5114 +> 16 0 25 3794 topology 3821 5114 +> 15 0 25 3794 topology 3819 5115 +> 16 0 25 3794 topology 3820 5115 +> 15 0 26 3415 topology 3611 5116 +> 16 0 26 3415 topology 3919 5116 > 15 0 26 3415 topology 3714 5117 > 16 0 26 3415 topology 3919 5117 -> 15 0 21 3415 topology 3611 5118 -> 16 0 21 3415 topology 3793 5118 -> 15 0 26 3415 topology 3793 5119 -> 16 0 26 3415 topology 3791 5119 -> 15 0 26 3415 topology 3611 5120 -> 16 0 26 3415 topology 3919 5120 -> 15 0 26 3415 topology 3917 5121 -> 16 0 26 3415 topology 3919 5121 -> 15 0 21 3415 topology 3793 5122 -> 16 0 21 3415 topology 3917 5122 -> 15 0 26 3415 topology 3714 5123 -> 16 0 26 3415 topology 3712 5123 -> 15 0 26 3415 topology 3917 5124 -> 16 0 26 3415 topology 3915 5124 -> 15 0 21 3415 topology 3714 5125 -> 16 0 21 3415 topology 3793 5125 -> 15 0 26 3415 topology 3793 5126 -> 16 0 26 3415 topology 3919 5126 -> 15 0 21 3415 topology 3611 5127 -> 16 0 21 3415 topology 3714 5127 -> 15 0 27 3415 topology 3609 5128 -> 16 0 27 3415 topology 3611 5128 -> 15 0 21 3415 topology 3714 5129 -> 16 0 21 3415 topology 3917 5129 -> 15 0 23 3922 topology 4059 5130 +> 15 0 26 3415 topology 3793 5118 +> 16 0 26 3415 topology 3919 5118 +> 15 0 26 3415 topology 3917 5119 +> 16 0 26 3415 topology 3919 5119 +> 15 0 27 3415 topology 3609 5120 +> 16 0 27 3415 topology 3611 5120 +> 15 0 20 3415 topology 3611 5121 +> 16 0 20 3415 topology 3714 5121 +> 15 0 20 3415 topology 3611 5122 +> 16 0 20 3415 topology 3793 5122 +> 15 0 20 3415 topology 3714 5123 +> 16 0 20 3415 topology 3793 5123 +> 15 0 20 3415 topology 3611 5124 +> 16 0 20 3415 topology 3917 5124 +> 15 0 20 3415 topology 3714 5125 +> 16 0 20 3415 topology 3917 5125 +> 15 0 20 3415 topology 3793 5126 +> 16 0 20 3415 topology 3917 5126 +> 15 0 26 3415 topology 3714 5127 +> 16 0 26 3415 topology 3712 5127 +> 15 0 26 3415 topology 3793 5128 +> 16 0 26 3415 topology 3791 5128 +> 15 0 26 3415 topology 3917 5129 +> 16 0 26 3415 topology 3915 5129 +> 15 0 23 3922 topology 3952 5130 > 16 0 23 3922 topology 4092 5130 -> 15 0 24 3922 topology 3926 5131 -> 16 0 24 3922 topology 3928 5131 -> 15 0 23 3922 topology 3952 5132 +> 15 0 23 3922 topology 3951 5131 +> 16 0 23 3922 topology 4092 5131 +> 15 0 23 3922 topology 3955 5132 > 16 0 23 3922 topology 4092 5132 -> 15 0 23 3922 topology 3936 5133 +> 15 0 23 3922 topology 3954 5133 > 16 0 23 3922 topology 4092 5133 -> 15 0 23 3922 topology 3988 5134 +> 15 0 23 3922 topology 3958 5134 > 16 0 23 3922 topology 4092 5134 -> 15 0 23 3922 topology 4072 5135 +> 15 0 23 3922 topology 3957 5135 > 16 0 23 3922 topology 4092 5135 -> 15 0 23 3922 topology 4024 5136 +> 15 0 23 3922 topology 3961 5136 > 16 0 23 3922 topology 4092 5136 -> 15 0 24 3922 topology 3953 5137 -> 16 0 24 3922 topology 3954 5137 -> 15 0 23 3922 topology 3976 5138 +> 15 0 23 3922 topology 3960 5137 +> 16 0 23 3922 topology 4092 5137 +> 15 0 23 3922 topology 3964 5138 > 16 0 23 3922 topology 4092 5138 -> 15 0 23 3922 topology 4060 5139 +> 15 0 23 3922 topology 3963 5139 > 16 0 23 3922 topology 4092 5139 -> 15 0 24 3922 topology 4013 5140 -> 16 0 24 3922 topology 4014 5140 -> 15 0 24 3922 topology 3989 5141 -> 16 0 24 3922 topology 3990 5141 -> 15 0 24 3922 topology 3938 5142 -> 16 0 24 3922 topology 3939 5142 -> 15 0 24 3922 topology 3965 5143 -> 16 0 24 3922 topology 3966 5143 -> 15 0 23 3922 topology 3984 5144 +> 15 0 23 3922 topology 3967 5140 +> 16 0 23 3922 topology 4092 5140 +> 15 0 23 3922 topology 3966 5141 +> 16 0 23 3922 topology 4092 5141 +> 15 0 23 3922 topology 3970 5142 +> 16 0 23 3922 topology 4092 5142 +> 15 0 23 3922 topology 3969 5143 +> 16 0 23 3922 topology 4092 5143 +> 15 0 23 3922 topology 3973 5144 > 16 0 23 3922 topology 4092 5144 -> 15 0 24 3922 topology 4073 5145 -> 16 0 24 3922 topology 4074 5145 -> 15 0 23 3922 topology 4044 5146 +> 15 0 23 3922 topology 3972 5145 +> 16 0 23 3922 topology 4092 5145 +> 15 0 23 3922 topology 3976 5146 > 16 0 23 3922 topology 4092 5146 -> 15 0 24 3922 topology 4049 5147 -> 16 0 24 3922 topology 4050 5147 -> 15 0 23 3922 topology 3966 5148 +> 15 0 23 3922 topology 3975 5147 +> 16 0 23 3922 topology 4092 5147 +> 15 0 23 3922 topology 3979 5148 > 16 0 23 3922 topology 4092 5148 -> 15 0 24 3922 topology 4025 5149 -> 16 0 24 3922 topology 4026 5149 -> 15 0 23 3922 topology 4026 5150 +> 15 0 23 3922 topology 3978 5149 +> 16 0 23 3922 topology 4092 5149 +> 15 0 23 3922 topology 3925 5150 > 16 0 23 3922 topology 4092 5150 -> 15 0 24 3922 topology 4001 5151 -> 16 0 24 3922 topology 4002 5151 -> 15 0 23 3922 topology 3943 5152 +> 15 0 23 3922 topology 3924 5151 +> 16 0 23 3922 topology 4092 5151 +> 15 0 23 3922 topology 3982 5152 > 16 0 23 3922 topology 4092 5152 -> 15 0 23 3922 topology 4086 5153 +> 15 0 23 3922 topology 3981 5153 > 16 0 23 3922 topology 4092 5153 -> 15 0 24 3922 topology 3977 5154 -> 16 0 24 3922 topology 3978 5154 -> 15 0 23 3922 topology 4008 5155 +> 15 0 23 3922 topology 3985 5154 +> 16 0 23 3922 topology 4092 5154 +> 15 0 23 3922 topology 3984 5155 > 16 0 23 3922 topology 4092 5155 -> 15 0 24 3922 topology 4085 5156 -> 16 0 24 3922 topology 4086 5156 -> 15 0 24 3922 topology 4061 5157 -> 16 0 24 3922 topology 4062 5157 -> 15 0 23 3922 topology 4068 5158 +> 15 0 23 3922 topology 3988 5156 +> 16 0 23 3922 topology 4092 5156 +> 15 0 23 3922 topology 3987 5157 +> 16 0 23 3922 topology 4092 5157 +> 15 0 23 3922 topology 3991 5158 > 16 0 23 3922 topology 4092 5158 -> 15 0 24 3922 topology 3980 5159 -> 16 0 24 3922 topology 3982 5159 -> 15 0 24 3922 topology 4037 5160 -> 16 0 24 3922 topology 4038 5160 -> 15 0 24 3922 topology 3986 5161 -> 16 0 24 3922 topology 3988 5161 -> 15 0 24 3922 topology 3935 5162 -> 16 0 24 3922 topology 3937 5162 -> 15 0 24 3922 topology 4043 5163 -> 16 0 24 3922 topology 4045 5163 -> 15 0 24 3922 topology 3992 5164 -> 16 0 24 3922 topology 3994 5164 -> 15 0 23 3922 topology 4015 5165 +> 15 0 23 3922 topology 3990 5159 +> 16 0 23 3922 topology 4092 5159 +> 15 0 23 3922 topology 3994 5160 +> 16 0 23 3922 topology 4092 5160 +> 15 0 23 3922 topology 3993 5161 +> 16 0 23 3922 topology 4092 5161 +> 15 0 23 3922 topology 3997 5162 +> 16 0 23 3922 topology 4092 5162 +> 15 0 23 3922 topology 3996 5163 +> 16 0 23 3922 topology 4092 5163 +> 15 0 23 3922 topology 4000 5164 +> 16 0 23 3922 topology 4092 5164 +> 15 0 23 3922 topology 3999 5165 > 16 0 23 3922 topology 4092 5165 -> 15 0 23 3922 topology 3945 5166 +> 15 0 23 3922 topology 4003 5166 > 16 0 23 3922 topology 4092 5166 -> 15 0 24 3922 topology 4049 5167 -> 16 0 24 3922 topology 4051 5167 -> 15 0 23 3922 topology 3967 5168 +> 15 0 23 3922 topology 4002 5167 +> 16 0 23 3922 topology 4092 5167 +> 15 0 23 3922 topology 4006 5168 > 16 0 23 3922 topology 4092 5168 -> 15 0 24 3922 topology 3998 5169 -> 16 0 24 3922 topology 4000 5169 -> 15 0 23 3922 topology 4051 5170 +> 15 0 23 3922 topology 4005 5169 +> 16 0 23 3922 topology 4092 5169 +> 15 0 23 3922 topology 4009 5170 > 16 0 23 3922 topology 4092 5170 -> 15 0 23 3922 topology 4003 5171 +> 15 0 23 3922 topology 4008 5171 > 16 0 23 3922 topology 4092 5171 -> 15 0 24 3922 topology 4055 5172 -> 16 0 24 3922 topology 4057 5172 -> 15 0 23 3922 topology 4087 5173 +> 15 0 23 3922 topology 3928 5172 +> 16 0 23 3922 topology 4092 5172 +> 15 0 23 3922 topology 3927 5173 > 16 0 23 3922 topology 4092 5173 -> 15 0 24 3922 topology 4004 5174 -> 16 0 24 3922 topology 4006 5174 -> 15 0 23 3922 topology 4039 5175 +> 15 0 23 3922 topology 4012 5174 +> 16 0 23 3922 topology 4092 5174 +> 15 0 23 3922 topology 4011 5175 > 16 0 23 3922 topology 4092 5175 -> 15 0 24 3922 topology 4061 5176 -> 16 0 24 3922 topology 4063 5176 -> 15 0 23 3922 topology 3951 5177 +> 15 0 23 3922 topology 4015 5176 +> 16 0 23 3922 topology 4092 5176 +> 15 0 23 3922 topology 4014 5177 > 16 0 23 3922 topology 4092 5177 -> 15 0 23 3922 topology 4011 5178 +> 15 0 23 3922 topology 4018 5178 > 16 0 23 3922 topology 4092 5178 -> 15 0 24 3922 topology 4067 5179 -> 16 0 24 3922 topology 4069 5179 -> 15 0 24 3922 topology 3941 5180 -> 16 0 24 3922 topology 3942 5180 -> 15 0 23 3922 topology 4071 5181 +> 15 0 23 3922 topology 4017 5179 +> 16 0 23 3922 topology 4092 5179 +> 15 0 23 3922 topology 4021 5180 +> 16 0 23 3922 topology 4092 5180 +> 15 0 23 3922 topology 4020 5181 > 16 0 23 3922 topology 4092 5181 -> 15 0 23 3922 topology 3993 5182 +> 15 0 23 3922 topology 4024 5182 > 16 0 23 3922 topology 4092 5182 -> 15 0 23 3922 topology 3934 5183 +> 15 0 23 3922 topology 4023 5183 > 16 0 23 3922 topology 4092 5183 -> 15 0 23 3922 topology 4053 5184 +> 15 0 23 3922 topology 4027 5184 > 16 0 23 3922 topology 4092 5184 -> 15 0 23 3922 topology 3975 5185 +> 15 0 23 3922 topology 4026 5185 > 16 0 23 3922 topology 4092 5185 -> 15 0 23 3922 topology 4035 5186 +> 15 0 23 3922 topology 4030 5186 > 16 0 23 3922 topology 4092 5186 -> 15 0 23 3922 topology 3930 5187 +> 15 0 23 3922 topology 4029 5187 > 16 0 23 3922 topology 4092 5187 -> 15 0 23 3922 topology 3958 5188 +> 15 0 23 3922 topology 4033 5188 > 16 0 23 3922 topology 4092 5188 -> 15 0 23 3922 topology 4042 5189 +> 15 0 23 3922 topology 4032 5189 > 16 0 23 3922 topology 4092 5189 -> 15 0 23 3922 topology 3994 5190 +> 15 0 23 3922 topology 4036 5190 > 16 0 23 3922 topology 4092 5190 -> 15 0 24 3922 topology 3944 5191 -> 16 0 24 3922 topology 3946 5191 -> 15 0 23 3922 topology 4078 5192 +> 15 0 23 3922 topology 4035 5191 +> 16 0 23 3922 topology 4092 5191 +> 15 0 23 3922 topology 4039 5192 > 16 0 23 3922 topology 4092 5192 -> 15 0 24 3922 topology 3980 5193 -> 16 0 24 3922 topology 3981 5193 -> 15 0 23 3922 topology 4030 5194 +> 15 0 23 3922 topology 4038 5193 +> 16 0 23 3922 topology 4092 5193 +> 15 0 23 3922 topology 3931 5194 > 16 0 23 3922 topology 4092 5194 -> 15 0 24 3922 topology 3956 5195 -> 16 0 24 3922 topology 3957 5195 -> 15 0 24 3922 topology 4040 5196 -> 16 0 24 3922 topology 4041 5196 -> 15 0 23 3922 topology 4066 5197 +> 15 0 23 3922 topology 3930 5195 +> 16 0 23 3922 topology 4092 5195 +> 15 0 23 3922 topology 4042 5196 +> 16 0 23 3922 topology 4092 5196 +> 15 0 23 3922 topology 4041 5197 > 16 0 23 3922 topology 4092 5197 -> 15 0 24 3922 topology 4016 5198 -> 16 0 24 3922 topology 4017 5198 -> 15 0 24 3922 topology 3992 5199 -> 16 0 24 3922 topology 3993 5199 -> 15 0 23 3922 topology 3925 5200 +> 15 0 23 3922 topology 4045 5198 +> 16 0 23 3922 topology 4092 5198 +> 15 0 23 3922 topology 4044 5199 +> 16 0 23 3922 topology 4092 5199 +> 15 0 23 3922 topology 4048 5200 > 16 0 23 3922 topology 4092 5200 -> 15 0 23 3922 topology 3960 5201 +> 15 0 23 3922 topology 4047 5201 > 16 0 23 3922 topology 4092 5201 -> 15 0 24 3922 topology 3968 5202 -> 16 0 24 3922 topology 3969 5202 -> 15 0 24 3922 topology 4076 5203 -> 16 0 24 3922 topology 4077 5203 -> 15 0 23 3922 topology 4020 5204 +> 15 0 23 3922 topology 4051 5202 +> 16 0 23 3922 topology 4092 5202 +> 15 0 23 3922 topology 4050 5203 +> 16 0 23 3922 topology 4092 5203 +> 15 0 23 3922 topology 4054 5204 > 16 0 23 3922 topology 4092 5204 -> 15 0 24 3922 topology 3944 5205 -> 16 0 24 3922 topology 3945 5205 -> 15 0 24 3922 topology 4052 5206 -> 16 0 24 3922 topology 4053 5206 -> 15 0 23 3922 topology 4080 5207 +> 15 0 23 3922 topology 4053 5205 +> 16 0 23 3922 topology 4092 5205 +> 15 0 23 3922 topology 4057 5206 +> 16 0 23 3922 topology 4092 5206 +> 15 0 23 3922 topology 4056 5207 > 16 0 23 3922 topology 4092 5207 -> 15 0 23 3922 topology 4002 5208 +> 15 0 23 3922 topology 4060 5208 > 16 0 23 3922 topology 4092 5208 -> 15 0 24 3922 topology 4028 5209 -> 16 0 24 3922 topology 4029 5209 -> 15 0 24 3922 topology 4004 5210 -> 16 0 24 3922 topology 4005 5210 +> 15 0 23 3922 topology 4059 5209 +> 16 0 23 3922 topology 4092 5209 +> 15 0 23 3922 topology 4063 5210 +> 16 0 23 3922 topology 4092 5210 > 15 0 23 3922 topology 4062 5211 > 16 0 23 3922 topology 4092 5211 -> 15 0 23 3922 topology 3949 5212 +> 15 0 23 3922 topology 4066 5212 > 16 0 23 3922 topology 4092 5212 -> 15 0 24 3922 topology 3950 5213 -> 16 0 24 3922 topology 3952 5213 -> 15 0 24 3922 topology 4088 5214 -> 16 0 24 3922 topology 4089 5214 -> 15 0 24 3922 topology 4064 5215 -> 16 0 24 3922 topology 4065 5215 -> 15 0 24 3922 topology 3929 5216 -> 16 0 24 3922 topology 3931 5216 -> 15 0 24 3922 topology 3956 5217 -> 16 0 24 3922 topology 3958 5217 -> 15 0 24 3922 topology 4013 5218 -> 16 0 24 3922 topology 4015 5218 -> 15 0 24 3922 topology 3962 5219 -> 16 0 24 3922 topology 3964 5219 -> 15 0 24 3922 topology 4070 5220 -> 16 0 24 3922 topology 4072 5220 -> 15 0 23 3922 topology 3939 5221 +> 15 0 23 3922 topology 4065 5213 +> 16 0 23 3922 topology 4092 5213 +> 15 0 23 3922 topology 4069 5214 +> 16 0 23 3922 topology 4092 5214 +> 15 0 23 3922 topology 4068 5215 +> 16 0 23 3922 topology 4092 5215 +> 15 0 23 3922 topology 3934 5216 +> 16 0 23 3922 topology 4092 5216 +> 15 0 23 3922 topology 3933 5217 +> 16 0 23 3922 topology 4092 5217 +> 15 0 23 3922 topology 4072 5218 +> 16 0 23 3922 topology 4092 5218 +> 15 0 23 3922 topology 4071 5219 +> 16 0 23 3922 topology 4092 5219 +> 15 0 23 3922 topology 4075 5220 +> 16 0 23 3922 topology 4092 5220 +> 15 0 23 3922 topology 4074 5221 > 16 0 23 3922 topology 4092 5221 -> 15 0 23 3922 topology 3985 5222 +> 15 0 23 3922 topology 4078 5222 > 16 0 23 3922 topology 4092 5222 -> 15 0 24 3922 topology 4019 5223 -> 16 0 24 3922 topology 4021 5223 -> 15 0 24 3922 topology 3968 5224 -> 16 0 24 3922 topology 3970 5224 -> 15 0 24 3922 topology 4076 5225 -> 16 0 24 3922 topology 4078 5225 -> 15 0 24 3922 topology 3923 5226 -> 16 0 24 3922 topology 3924 5226 -> 15 0 23 3922 topology 4021 5227 +> 15 0 23 3922 topology 4077 5223 +> 16 0 23 3922 topology 4092 5223 +> 15 0 23 3922 topology 4081 5224 +> 16 0 23 3922 topology 4092 5224 +> 15 0 23 3922 topology 4080 5225 +> 16 0 23 3922 topology 4092 5225 +> 15 0 23 3922 topology 4084 5226 +> 16 0 23 3922 topology 4092 5226 +> 15 0 23 3922 topology 4083 5227 > 16 0 23 3922 topology 4092 5227 -> 15 0 24 3922 topology 4025 5228 -> 16 0 24 3922 topology 4027 5228 -> 15 0 23 3922 topology 3973 5229 +> 15 0 23 3922 topology 4087 5228 +> 16 0 23 3922 topology 4092 5228 +> 15 0 23 3922 topology 4086 5229 > 16 0 23 3922 topology 4092 5229 -> 15 0 24 3922 topology 3974 5230 -> 16 0 24 3922 topology 3976 5230 -> 15 0 23 3922 topology 4057 5231 +> 15 0 23 3922 topology 4090 5230 +> 16 0 23 3922 topology 4092 5230 +> 15 0 23 3922 topology 4089 5231 > 16 0 23 3922 topology 4092 5231 -> 15 0 24 3922 topology 4082 5232 -> 16 0 24 3922 topology 4084 5232 -> 15 0 23 3922 topology 4009 5233 +> 15 0 23 3922 topology 3937 5232 +> 16 0 23 3922 topology 4092 5232 +> 15 0 23 3922 topology 3936 5233 > 16 0 23 3922 topology 4092 5233 -> 15 0 24 3922 topology 4031 5234 -> 16 0 24 3922 topology 4033 5234 -> 15 0 24 3922 topology 4088 5235 -> 16 0 24 3922 topology 4090 5235 -> 15 0 24 3922 topology 4037 5236 -> 16 0 24 3922 topology 4039 5236 -> 15 0 23 3922 topology 3987 5237 +> 15 0 23 3922 topology 3940 5234 +> 16 0 23 3922 topology 4092 5234 +> 15 0 23 3922 topology 3939 5235 +> 16 0 23 3922 topology 4092 5235 +> 15 0 23 3922 topology 3943 5236 +> 16 0 23 3922 topology 4092 5236 +> 15 0 23 3922 topology 3942 5237 > 16 0 23 3922 topology 4092 5237 -> 15 0 23 3922 topology 4047 5238 +> 15 0 23 3922 topology 3946 5238 > 16 0 23 3922 topology 4092 5238 -> 15 0 23 3922 topology 3969 5239 +> 15 0 23 3922 topology 3945 5239 > 16 0 23 3922 topology 4092 5239 -> 15 0 23 3922 topology 4029 5240 +> 15 0 23 3922 topology 3949 5240 > 16 0 23 3922 topology 4092 5240 -> 15 0 24 3922 topology 3947 5241 -> 16 0 24 3922 topology 3948 5241 -> 15 0 23 3922 topology 3940 5242 -> 16 0 23 3922 topology 4092 5242 -> 15 0 23 3922 topology 4089 5243 -> 16 0 23 3922 topology 4092 5243 -> 15 0 23 3922 topology 3924 5244 -> 16 0 23 3922 topology 4092 5244 -> 15 0 23 3922 topology 4012 5245 -> 16 0 23 3922 topology 4092 5245 -> 15 0 24 3922 topology 3938 5246 -> 16 0 24 3922 topology 3940 5246 -> 15 0 23 3922 topology 3964 5247 -> 16 0 23 3922 topology 4092 5247 -> 15 0 23 3922 topology 4048 5248 -> 16 0 23 3922 topology 4092 5248 -> 15 0 23 3922 topology 3948 5249 -> 16 0 23 3922 topology 4092 5249 -> 15 0 23 3922 topology 4000 5250 -> 16 0 23 3922 topology 4092 5250 -> 15 0 24 3922 topology 3926 5251 -> 16 0 24 3922 topology 3927 5251 -> 15 0 23 3922 topology 4084 5252 -> 16 0 23 3922 topology 4092 5252 -> 15 0 24 3922 topology 3983 5253 -> 16 0 24 3922 topology 3984 5253 -> 15 0 23 3922 topology 4036 5254 -> 16 0 23 3922 topology 4092 5254 -> 15 0 24 3922 topology 3959 5255 -> 16 0 24 3922 topology 3960 5255 -> 15 0 24 3922 topology 4043 5256 -> 16 0 24 3922 topology 4044 5256 -> 15 0 23 3922 topology 3954 5257 -> 16 0 23 3922 topology 4092 5257 -> 15 0 24 3922 topology 4019 5258 -> 16 0 24 3922 topology 4020 5258 -> 15 0 23 3922 topology 4014 5259 -> 16 0 23 3922 topology 4092 5259 -> 15 0 24 3922 topology 3995 5260 -> 16 0 24 3922 topology 3996 5260 -> 15 0 23 3922 topology 3931 5261 -> 16 0 23 3922 topology 4092 5261 -> 15 0 23 3922 topology 4074 5262 -> 16 0 23 3922 topology 4092 5262 -> 15 0 23 3922 topology 3996 5263 -> 16 0 23 3922 topology 4092 5263 -> 15 0 24 3922 topology 3971 5264 -> 16 0 24 3922 topology 3972 5264 -> 15 0 24 3922 topology 4079 5265 -> 16 0 24 3922 topology 4080 5265 -> 15 0 23 3922 topology 4056 5266 -> 16 0 23 3922 topology 4092 5266 -> 15 0 24 3922 topology 4055 5267 -> 16 0 24 3922 topology 4056 5267 -> 15 0 23 3922 topology 3978 5268 -> 16 0 23 3922 topology 4092 5268 -> 15 0 24 3922 topology 4031 5269 -> 16 0 24 3922 topology 4032 5269 -> 15 0 23 3922 topology 4038 5270 -> 16 0 23 3922 topology 4092 5270 -> 15 0 24 3922 topology 3923 5271 -> 16 0 24 3922 topology 3925 5271 -> 15 0 24 3922 topology 4007 5272 -> 16 0 24 3922 topology 4008 5272 -> 15 0 24 3922 topology 3983 5273 -> 16 0 24 3922 topology 3985 5273 -> 15 0 24 3922 topology 4067 5274 -> 16 0 24 3922 topology 4068 5274 -> 15 0 24 3922 topology 4040 5275 -> 16 0 24 3922 topology 4042 5275 -> 15 0 24 3922 topology 3989 5276 -> 16 0 24 3922 topology 3991 5276 -> 15 0 23 3922 topology 3933 5277 -> 16 0 23 3922 topology 4092 5277 -> 15 0 23 3922 topology 3955 5278 -> 16 0 23 3922 topology 4092 5278 -> 15 0 24 3922 topology 4046 5279 -> 16 0 24 3922 topology 4048 5279 -> 15 0 24 3922 topology 3995 5280 -> 16 0 24 3922 topology 3997 5280 -> 15 0 23 3922 topology 3991 5281 -> 16 0 23 3922 topology 4092 5281 -> 15 0 23 3922 topology 4075 5282 -> 16 0 23 3922 topology 4092 5282 -> 15 0 24 3922 topology 4052 5283 -> 16 0 24 3922 topology 4054 5283 -> 15 0 23 3922 topology 4027 5284 -> 16 0 23 3922 topology 4092 5284 -> 15 0 24 3922 topology 4001 5285 -> 16 0 24 3922 topology 4003 5285 -> 15 0 24 3922 topology 3947 5286 -> 16 0 24 3922 topology 3949 5286 -> 15 0 23 3922 topology 3979 5287 -> 16 0 23 3922 topology 4092 5287 -> 15 0 24 3922 topology 3929 5288 -> 16 0 24 3922 topology 3930 5288 -> 15 0 23 3922 topology 4063 5289 -> 16 0 23 3922 topology 4092 5289 -> 15 0 24 3922 topology 4058 5290 -> 16 0 24 3922 topology 4060 5290 -> 15 0 24 3922 topology 4007 5291 -> 16 0 24 3922 topology 4009 5291 -> 15 0 23 3922 topology 3981 5292 -> 16 0 23 3922 topology 4092 5292 -> 15 0 24 3922 topology 4064 5293 -> 16 0 24 3922 topology 4066 5293 -> 15 0 23 3922 topology 4041 5294 -> 16 0 23 3922 topology 4092 5294 -> 15 0 23 3922 topology 3963 5295 -> 16 0 23 3922 topology 4092 5295 -> 15 0 23 3922 topology 4023 5296 -> 16 0 23 3922 topology 4092 5296 -> 15 0 23 3922 topology 4083 5297 -> 16 0 23 3922 topology 4092 5297 -> 15 0 23 3922 topology 4005 5298 -> 16 0 23 3922 topology 4092 5298 -> 15 0 23 3922 topology 3946 5299 -> 16 0 23 3922 topology 4092 5299 -> 15 0 23 3922 topology 4065 5300 -> 16 0 23 3922 topology 4092 5300 -> 15 0 24 3922 topology 3932 5301 -> 16 0 24 3922 topology 3934 5301 -> 15 0 25 3922 topology 4091 5302 -> 16 0 25 3922 topology 4092 5302 -> 15 0 23 3922 topology 3982 5303 -> 16 0 23 3922 topology 4092 5303 -> 15 0 23 3922 topology 3942 5304 -> 16 0 23 3922 topology 4092 5304 -> 15 0 23 3922 topology 4018 5305 -> 16 0 23 3922 topology 4092 5305 -> 15 0 24 3922 topology 3950 5306 -> 16 0 24 3922 topology 3951 5306 -> 15 0 23 3922 topology 3970 5307 -> 16 0 23 3922 topology 4092 5307 -> 15 0 23 3922 topology 4054 5308 -> 16 0 23 3922 topology 4092 5308 -> 15 0 24 3922 topology 4010 5309 -> 16 0 24 3922 topology 4011 5309 -> 15 0 23 3922 topology 4006 5310 -> 16 0 23 3922 topology 4092 5310 -> 15 0 23 3922 topology 4090 5311 -> 16 0 23 3922 topology 4092 5311 -> 15 0 24 3922 topology 3986 5312 -> 16 0 24 3922 topology 3987 5312 -> 15 0 24 3922 topology 3932 5313 -> 16 0 24 3922 topology 3933 5313 -> 15 0 24 3922 topology 3962 5314 -> 16 0 24 3922 topology 3963 5314 -> 15 0 24 3922 topology 4070 5315 -> 16 0 24 3922 topology 4071 5315 -> 15 0 24 3922 topology 4046 5316 -> 16 0 24 3922 topology 4047 5316 -> 15 0 24 3922 topology 4022 5317 -> 16 0 24 3922 topology 4023 5317 -> 15 0 23 3922 topology 3990 5318 -> 16 0 23 3922 topology 4092 5318 -> 15 0 23 3922 topology 4050 5319 -> 16 0 23 3922 topology 4092 5319 -> 15 0 24 3922 topology 3998 5320 -> 16 0 24 3922 topology 3999 5320 -> 15 0 23 3922 topology 3972 5321 -> 16 0 23 3922 topology 4092 5321 -> 15 0 23 3922 topology 3937 5322 -> 16 0 23 3922 topology 4092 5322 -> 15 0 24 3922 topology 3974 5323 -> 16 0 24 3922 topology 3975 5323 -> 15 0 24 3922 topology 4082 5324 -> 16 0 24 3922 topology 4083 5324 -> 15 0 23 3922 topology 4032 5325 -> 16 0 23 3922 topology 4092 5325 -> 15 0 24 3922 topology 4058 5326 -> 16 0 24 3922 topology 4059 5326 -> 15 0 24 3922 topology 4034 5327 -> 16 0 24 3922 topology 4035 5327 -> 15 0 24 3922 topology 3953 5328 -> 16 0 24 3922 topology 3955 5328 -> 15 0 24 3922 topology 4010 5329 -> 16 0 24 3922 topology 4012 5329 -> 15 0 24 3922 topology 3959 5330 -> 16 0 24 3922 topology 3961 5330 -> 15 0 23 3922 topology 3927 5331 -> 16 0 23 3922 topology 4092 5331 -> 15 0 24 3922 topology 4016 5332 -> 16 0 24 3922 topology 4018 5332 -> 15 0 24 3922 topology 3965 5333 -> 16 0 24 3922 topology 3967 5333 -> 15 0 24 3922 topology 4073 5334 -> 16 0 24 3922 topology 4075 5334 -> 15 0 23 3922 topology 3961 5335 -> 16 0 23 3922 topology 4092 5335 -> 15 0 23 3922 topology 4045 5336 -> 16 0 23 3922 topology 4092 5336 -> 15 0 24 3922 topology 4022 5337 -> 16 0 24 3922 topology 4024 5337 -> 15 0 24 3922 topology 3941 5338 -> 16 0 24 3922 topology 3943 5338 -> 15 0 23 3922 topology 3997 5339 -> 16 0 23 3922 topology 4092 5339 -> 15 0 24 3922 topology 3971 5340 -> 16 0 24 3922 topology 3973 5340 -> 15 0 24 3922 topology 4079 5341 -> 16 0 24 3922 topology 4081 5341 -> 15 0 23 3922 topology 4081 5342 -> 16 0 23 3922 topology 4092 5342 -> 15 0 24 3922 topology 4028 5343 -> 16 0 24 3922 topology 4030 5343 -> 15 0 23 3922 topology 4033 5344 -> 16 0 23 3922 topology 4092 5344 -> 15 0 24 3922 topology 3977 5345 -> 16 0 24 3922 topology 3979 5345 -> 15 0 24 3922 topology 4085 5346 -> 16 0 24 3922 topology 4087 5346 -> 15 0 24 3922 topology 4034 5347 -> 16 0 24 3922 topology 4036 5347 -> 15 0 23 3922 topology 4069 5348 -> 16 0 23 3922 topology 4092 5348 -> 15 0 24 3922 topology 3935 5349 -> 16 0 24 3922 topology 3936 5349 -> 15 0 23 3922 topology 3957 5350 -> 16 0 23 3922 topology 4092 5350 -> 15 0 23 3922 topology 4017 5351 -> 16 0 23 3922 topology 4092 5351 -> 15 0 23 3922 topology 3928 5352 -> 16 0 23 3922 topology 4092 5352 -> 15 0 23 3922 topology 4077 5353 -> 16 0 23 3922 topology 4092 5353 -> 15 0 23 3922 topology 3999 5354 -> 16 0 23 3922 topology 4092 5354 -> 15 0 23 4094 topology 4130 5355 +> 15 0 23 3922 topology 3948 5241 +> 16 0 23 3922 topology 4092 5241 +> 15 0 24 3922 topology 4091 5242 +> 16 0 24 3922 topology 4092 5242 +> 15 0 25 3922 topology 3950 5243 +> 16 0 25 3922 topology 3952 5243 +> 15 0 25 3922 topology 3950 5244 +> 16 0 25 3922 topology 3951 5244 +> 15 0 25 3922 topology 3953 5245 +> 16 0 25 3922 topology 3955 5245 +> 15 0 25 3922 topology 3953 5246 +> 16 0 25 3922 topology 3954 5246 +> 15 0 25 3922 topology 3956 5247 +> 16 0 25 3922 topology 3958 5247 +> 15 0 25 3922 topology 3956 5248 +> 16 0 25 3922 topology 3957 5248 +> 15 0 25 3922 topology 3959 5249 +> 16 0 25 3922 topology 3961 5249 +> 15 0 25 3922 topology 3959 5250 +> 16 0 25 3922 topology 3960 5250 +> 15 0 25 3922 topology 3962 5251 +> 16 0 25 3922 topology 3964 5251 +> 15 0 25 3922 topology 3962 5252 +> 16 0 25 3922 topology 3963 5252 +> 15 0 25 3922 topology 3965 5253 +> 16 0 25 3922 topology 3967 5253 +> 15 0 25 3922 topology 3965 5254 +> 16 0 25 3922 topology 3966 5254 +> 15 0 25 3922 topology 3968 5255 +> 16 0 25 3922 topology 3970 5255 +> 15 0 25 3922 topology 3968 5256 +> 16 0 25 3922 topology 3969 5256 +> 15 0 25 3922 topology 3971 5257 +> 16 0 25 3922 topology 3973 5257 +> 15 0 25 3922 topology 3971 5258 +> 16 0 25 3922 topology 3972 5258 +> 15 0 25 3922 topology 3974 5259 +> 16 0 25 3922 topology 3976 5259 +> 15 0 25 3922 topology 3974 5260 +> 16 0 25 3922 topology 3975 5260 +> 15 0 25 3922 topology 3977 5261 +> 16 0 25 3922 topology 3979 5261 +> 15 0 25 3922 topology 3977 5262 +> 16 0 25 3922 topology 3978 5262 +> 15 0 25 3922 topology 3923 5263 +> 16 0 25 3922 topology 3925 5263 +> 15 0 25 3922 topology 3923 5264 +> 16 0 25 3922 topology 3924 5264 +> 15 0 25 3922 topology 3980 5265 +> 16 0 25 3922 topology 3982 5265 +> 15 0 25 3922 topology 3980 5266 +> 16 0 25 3922 topology 3981 5266 +> 15 0 25 3922 topology 3983 5267 +> 16 0 25 3922 topology 3985 5267 +> 15 0 25 3922 topology 3983 5268 +> 16 0 25 3922 topology 3984 5268 +> 15 0 25 3922 topology 3986 5269 +> 16 0 25 3922 topology 3988 5269 +> 15 0 25 3922 topology 3986 5270 +> 16 0 25 3922 topology 3987 5270 +> 15 0 25 3922 topology 3989 5271 +> 16 0 25 3922 topology 3991 5271 +> 15 0 25 3922 topology 3989 5272 +> 16 0 25 3922 topology 3990 5272 +> 15 0 25 3922 topology 3992 5273 +> 16 0 25 3922 topology 3994 5273 +> 15 0 25 3922 topology 3992 5274 +> 16 0 25 3922 topology 3993 5274 +> 15 0 25 3922 topology 3995 5275 +> 16 0 25 3922 topology 3997 5275 +> 15 0 25 3922 topology 3995 5276 +> 16 0 25 3922 topology 3996 5276 +> 15 0 25 3922 topology 3998 5277 +> 16 0 25 3922 topology 4000 5277 +> 15 0 25 3922 topology 3998 5278 +> 16 0 25 3922 topology 3999 5278 +> 15 0 25 3922 topology 4001 5279 +> 16 0 25 3922 topology 4003 5279 +> 15 0 25 3922 topology 4001 5280 +> 16 0 25 3922 topology 4002 5280 +> 15 0 25 3922 topology 4004 5281 +> 16 0 25 3922 topology 4006 5281 +> 15 0 25 3922 topology 4004 5282 +> 16 0 25 3922 topology 4005 5282 +> 15 0 25 3922 topology 4007 5283 +> 16 0 25 3922 topology 4009 5283 +> 15 0 25 3922 topology 4007 5284 +> 16 0 25 3922 topology 4008 5284 +> 15 0 25 3922 topology 3926 5285 +> 16 0 25 3922 topology 3928 5285 +> 15 0 25 3922 topology 3926 5286 +> 16 0 25 3922 topology 3927 5286 +> 15 0 25 3922 topology 4010 5287 +> 16 0 25 3922 topology 4012 5287 +> 15 0 25 3922 topology 4010 5288 +> 16 0 25 3922 topology 4011 5288 +> 15 0 25 3922 topology 4013 5289 +> 16 0 25 3922 topology 4015 5289 +> 15 0 25 3922 topology 4013 5290 +> 16 0 25 3922 topology 4014 5290 +> 15 0 25 3922 topology 4016 5291 +> 16 0 25 3922 topology 4018 5291 +> 15 0 25 3922 topology 4016 5292 +> 16 0 25 3922 topology 4017 5292 +> 15 0 25 3922 topology 4019 5293 +> 16 0 25 3922 topology 4021 5293 +> 15 0 25 3922 topology 4019 5294 +> 16 0 25 3922 topology 4020 5294 +> 15 0 25 3922 topology 4022 5295 +> 16 0 25 3922 topology 4024 5295 +> 15 0 25 3922 topology 4022 5296 +> 16 0 25 3922 topology 4023 5296 +> 15 0 25 3922 topology 4025 5297 +> 16 0 25 3922 topology 4027 5297 +> 15 0 25 3922 topology 4025 5298 +> 16 0 25 3922 topology 4026 5298 +> 15 0 25 3922 topology 4028 5299 +> 16 0 25 3922 topology 4030 5299 +> 15 0 25 3922 topology 4028 5300 +> 16 0 25 3922 topology 4029 5300 +> 15 0 25 3922 topology 4031 5301 +> 16 0 25 3922 topology 4033 5301 +> 15 0 25 3922 topology 4031 5302 +> 16 0 25 3922 topology 4032 5302 +> 15 0 25 3922 topology 4034 5303 +> 16 0 25 3922 topology 4036 5303 +> 15 0 25 3922 topology 4034 5304 +> 16 0 25 3922 topology 4035 5304 +> 15 0 25 3922 topology 4037 5305 +> 16 0 25 3922 topology 4039 5305 +> 15 0 25 3922 topology 4037 5306 +> 16 0 25 3922 topology 4038 5306 +> 15 0 25 3922 topology 3929 5307 +> 16 0 25 3922 topology 3931 5307 +> 15 0 25 3922 topology 3929 5308 +> 16 0 25 3922 topology 3930 5308 +> 15 0 25 3922 topology 4040 5309 +> 16 0 25 3922 topology 4042 5309 +> 15 0 25 3922 topology 4040 5310 +> 16 0 25 3922 topology 4041 5310 +> 15 0 25 3922 topology 4043 5311 +> 16 0 25 3922 topology 4045 5311 +> 15 0 25 3922 topology 4043 5312 +> 16 0 25 3922 topology 4044 5312 +> 15 0 25 3922 topology 4046 5313 +> 16 0 25 3922 topology 4048 5313 +> 15 0 25 3922 topology 4046 5314 +> 16 0 25 3922 topology 4047 5314 +> 15 0 25 3922 topology 4049 5315 +> 16 0 25 3922 topology 4051 5315 +> 15 0 25 3922 topology 4049 5316 +> 16 0 25 3922 topology 4050 5316 +> 15 0 25 3922 topology 4052 5317 +> 16 0 25 3922 topology 4054 5317 +> 15 0 25 3922 topology 4052 5318 +> 16 0 25 3922 topology 4053 5318 +> 15 0 25 3922 topology 4055 5319 +> 16 0 25 3922 topology 4057 5319 +> 15 0 25 3922 topology 4055 5320 +> 16 0 25 3922 topology 4056 5320 +> 15 0 25 3922 topology 4058 5321 +> 16 0 25 3922 topology 4060 5321 +> 15 0 25 3922 topology 4058 5322 +> 16 0 25 3922 topology 4059 5322 +> 15 0 25 3922 topology 4061 5323 +> 16 0 25 3922 topology 4063 5323 +> 15 0 25 3922 topology 4061 5324 +> 16 0 25 3922 topology 4062 5324 +> 15 0 25 3922 topology 4064 5325 +> 16 0 25 3922 topology 4066 5325 +> 15 0 25 3922 topology 4064 5326 +> 16 0 25 3922 topology 4065 5326 +> 15 0 25 3922 topology 4067 5327 +> 16 0 25 3922 topology 4069 5327 +> 15 0 25 3922 topology 4067 5328 +> 16 0 25 3922 topology 4068 5328 +> 15 0 25 3922 topology 3932 5329 +> 16 0 25 3922 topology 3934 5329 +> 15 0 25 3922 topology 3932 5330 +> 16 0 25 3922 topology 3933 5330 +> 15 0 25 3922 topology 4070 5331 +> 16 0 25 3922 topology 4072 5331 +> 15 0 25 3922 topology 4070 5332 +> 16 0 25 3922 topology 4071 5332 +> 15 0 25 3922 topology 4073 5333 +> 16 0 25 3922 topology 4075 5333 +> 15 0 25 3922 topology 4073 5334 +> 16 0 25 3922 topology 4074 5334 +> 15 0 25 3922 topology 4076 5335 +> 16 0 25 3922 topology 4078 5335 +> 15 0 25 3922 topology 4076 5336 +> 16 0 25 3922 topology 4077 5336 +> 15 0 25 3922 topology 4079 5337 +> 16 0 25 3922 topology 4081 5337 +> 15 0 25 3922 topology 4079 5338 +> 16 0 25 3922 topology 4080 5338 +> 15 0 25 3922 topology 4082 5339 +> 16 0 25 3922 topology 4084 5339 +> 15 0 25 3922 topology 4082 5340 +> 16 0 25 3922 topology 4083 5340 +> 15 0 25 3922 topology 4085 5341 +> 16 0 25 3922 topology 4087 5341 +> 15 0 25 3922 topology 4085 5342 +> 16 0 25 3922 topology 4086 5342 +> 15 0 25 3922 topology 4088 5343 +> 16 0 25 3922 topology 4090 5343 +> 15 0 25 3922 topology 4088 5344 +> 16 0 25 3922 topology 4089 5344 +> 15 0 25 3922 topology 3935 5345 +> 16 0 25 3922 topology 3937 5345 +> 15 0 25 3922 topology 3935 5346 +> 16 0 25 3922 topology 3936 5346 +> 15 0 25 3922 topology 3938 5347 +> 16 0 25 3922 topology 3940 5347 +> 15 0 25 3922 topology 3938 5348 +> 16 0 25 3922 topology 3939 5348 +> 15 0 25 3922 topology 3941 5349 +> 16 0 25 3922 topology 3943 5349 +> 15 0 25 3922 topology 3941 5350 +> 16 0 25 3922 topology 3942 5350 +> 15 0 25 3922 topology 3944 5351 +> 16 0 25 3922 topology 3946 5351 +> 15 0 25 3922 topology 3944 5352 +> 16 0 25 3922 topology 3945 5352 +> 15 0 25 3922 topology 3947 5353 +> 16 0 25 3922 topology 3949 5353 +> 15 0 25 3922 topology 3947 5354 +> 16 0 25 3922 topology 3948 5354 +> 15 0 23 4094 topology 4124 5355 > 16 0 23 4094 topology 4246 5355 -> 15 0 23 4094 topology 4114 5356 +> 15 0 23 4094 topology 4123 5356 > 16 0 23 4094 topology 4246 5356 -> 15 0 23 4094 topology 4214 5357 +> 15 0 23 4094 topology 4127 5357 > 16 0 23 4094 topology 4246 5357 -> 15 0 24 4094 topology 4167 5358 -> 16 0 24 4094 topology 4169 5358 -> 15 0 24 4094 topology 4122 5359 -> 16 0 24 4094 topology 4123 5359 -> 15 0 23 4094 topology 4166 5360 +> 15 0 23 4094 topology 4126 5358 +> 16 0 23 4094 topology 4246 5358 +> 15 0 23 4094 topology 4130 5359 +> 16 0 23 4094 topology 4246 5359 +> 15 0 23 4094 topology 4129 5360 > 16 0 23 4094 topology 4246 5360 -> 15 0 24 4094 topology 4146 5361 -> 16 0 24 4094 topology 4148 5361 -> 15 0 23 4094 topology 4202 5362 +> 15 0 23 4094 topology 4133 5361 +> 16 0 23 4094 topology 4246 5361 +> 15 0 23 4094 topology 4132 5362 > 16 0 23 4094 topology 4246 5362 -> 15 0 24 4094 topology 4155 5363 -> 16 0 24 4094 topology 4156 5363 -> 15 0 23 4094 topology 4238 5364 +> 15 0 23 4094 topology 4136 5363 +> 16 0 23 4094 topology 4246 5363 +> 15 0 23 4094 topology 4135 5364 > 16 0 23 4094 topology 4246 5364 -> 15 0 24 4094 topology 4233 5365 -> 16 0 24 4094 topology 4235 5365 -> 15 0 24 4094 topology 4188 5366 -> 16 0 24 4094 topology 4189 5366 -> 15 0 23 4094 topology 4132 5367 +> 15 0 23 4094 topology 4139 5365 +> 16 0 23 4094 topology 4246 5365 +> 15 0 23 4094 topology 4138 5366 +> 16 0 23 4094 topology 4246 5366 +> 15 0 23 4094 topology 4142 5367 > 16 0 23 4094 topology 4246 5367 -> 15 0 24 4094 topology 4221 5368 -> 16 0 24 4094 topology 4222 5368 -> 15 0 23 4094 topology 4192 5369 +> 15 0 23 4094 topology 4141 5368 +> 16 0 23 4094 topology 4246 5368 +> 15 0 23 4094 topology 4145 5369 > 16 0 23 4094 topology 4246 5369 -> 15 0 23 4094 topology 4109 5370 +> 15 0 23 4094 topology 4144 5370 > 16 0 23 4094 topology 4246 5370 -> 15 0 24 4094 topology 4146 5371 -> 16 0 24 4094 topology 4147 5371 -> 15 0 23 4094 topology 4174 5372 +> 15 0 23 4094 topology 4148 5371 +> 16 0 23 4094 topology 4246 5371 +> 15 0 23 4094 topology 4147 5372 > 16 0 23 4094 topology 4246 5372 -> 15 0 23 4094 topology 4234 5373 +> 15 0 23 4094 topology 4151 5373 > 16 0 23 4094 topology 4246 5373 -> 15 0 24 4094 topology 4179 5374 -> 16 0 24 4094 topology 4180 5374 -> 15 0 24 4094 topology 4125 5375 -> 16 0 24 4094 topology 4127 5375 -> 15 0 23 4094 topology 4099 5376 +> 15 0 23 4094 topology 4150 5374 +> 16 0 23 4094 topology 4246 5374 +> 15 0 23 4094 topology 4097 5375 +> 16 0 23 4094 topology 4246 5375 +> 15 0 23 4094 topology 4096 5376 > 16 0 23 4094 topology 4246 5376 -> 15 0 24 4094 topology 4212 5377 -> 16 0 24 4094 topology 4214 5377 -> 15 0 23 4094 topology 4157 5378 +> 15 0 23 4094 topology 4154 5377 +> 16 0 23 4094 topology 4246 5377 +> 15 0 23 4094 topology 4153 5378 > 16 0 23 4094 topology 4246 5378 -> 15 0 24 4094 topology 4191 5379 -> 16 0 24 4094 topology 4193 5379 -> 15 0 23 4094 topology 4193 5380 +> 15 0 23 4094 topology 4157 5379 +> 16 0 23 4094 topology 4246 5379 +> 15 0 23 4094 topology 4156 5380 > 16 0 23 4094 topology 4246 5380 -> 15 0 24 4094 topology 4170 5381 -> 16 0 24 4094 topology 4172 5381 -> 15 0 23 4094 topology 4145 5382 +> 15 0 23 4094 topology 4160 5381 +> 16 0 23 4094 topology 4246 5381 +> 15 0 23 4094 topology 4159 5382 > 16 0 23 4094 topology 4246 5382 -> 15 0 24 4094 topology 4152 5383 -> 16 0 24 4094 topology 4153 5383 -> 15 0 25 4094 topology 4245 5384 -> 16 0 25 4094 topology 4246 5384 -> 15 0 23 4094 topology 4229 5385 +> 15 0 23 4094 topology 4163 5383 +> 16 0 23 4094 topology 4246 5383 +> 15 0 23 4094 topology 4162 5384 +> 16 0 23 4094 topology 4246 5384 +> 15 0 23 4094 topology 4166 5385 > 16 0 23 4094 topology 4246 5385 -> 15 0 24 4094 topology 4149 5386 -> 16 0 24 4094 topology 4151 5386 -> 15 0 23 4094 topology 4181 5387 +> 15 0 23 4094 topology 4165 5386 +> 16 0 23 4094 topology 4246 5386 +> 15 0 23 4094 topology 4169 5387 > 16 0 23 4094 topology 4246 5387 -> 15 0 24 4094 topology 4104 5388 -> 16 0 24 4094 topology 4105 5388 -> 15 0 24 4094 topology 4185 5389 -> 16 0 24 4094 topology 4186 5389 -> 15 0 24 4094 topology 4236 5390 -> 16 0 24 4094 topology 4238 5390 -> 15 0 24 4094 topology 4218 5391 -> 16 0 24 4094 topology 4219 5391 -> 15 0 23 4094 topology 4159 5392 +> 15 0 23 4094 topology 4168 5388 +> 16 0 23 4094 topology 4246 5388 +> 15 0 23 4094 topology 4172 5389 +> 16 0 23 4094 topology 4246 5389 +> 15 0 23 4094 topology 4171 5390 +> 16 0 23 4094 topology 4246 5390 +> 15 0 23 4094 topology 4175 5391 +> 16 0 23 4094 topology 4246 5391 +> 15 0 23 4094 topology 4174 5392 > 16 0 23 4094 topology 4246 5392 -> 15 0 23 4094 topology 4100 5393 +> 15 0 23 4094 topology 4178 5393 > 16 0 23 4094 topology 4246 5393 -> 15 0 23 4094 topology 4219 5394 +> 15 0 23 4094 topology 4177 5394 > 16 0 23 4094 topology 4246 5394 -> 15 0 24 4094 topology 4116 5395 -> 16 0 24 4094 topology 4117 5395 -> 15 0 23 4094 topology 4141 5396 +> 15 0 23 4094 topology 4181 5395 +> 16 0 23 4094 topology 4246 5395 +> 15 0 23 4094 topology 4180 5396 > 16 0 23 4094 topology 4246 5396 -> 15 0 24 4094 topology 4143 5397 -> 16 0 24 4094 topology 4144 5397 -> 15 0 23 4094 topology 4201 5398 +> 15 0 23 4094 topology 4100 5397 +> 16 0 23 4094 topology 4246 5397 +> 15 0 23 4094 topology 4099 5398 > 16 0 23 4094 topology 4246 5398 -> 15 0 24 4094 topology 4176 5399 -> 16 0 24 4094 topology 4177 5399 -> 15 0 24 4094 topology 4209 5400 -> 16 0 24 4094 topology 4210 5400 -> 15 0 24 4094 topology 4128 5401 -> 16 0 24 4094 topology 4130 5401 -> 15 0 24 4094 topology 4215 5402 -> 16 0 24 4094 topology 4217 5402 -> 15 0 23 4094 topology 4108 5403 +> 15 0 23 4094 topology 4184 5399 +> 16 0 23 4094 topology 4246 5399 +> 15 0 23 4094 topology 4183 5400 +> 16 0 23 4094 topology 4246 5400 +> 15 0 23 4094 topology 4187 5401 +> 16 0 23 4094 topology 4246 5401 +> 15 0 23 4094 topology 4186 5402 +> 16 0 23 4094 topology 4246 5402 +> 15 0 23 4094 topology 4190 5403 > 16 0 23 4094 topology 4246 5403 -> 15 0 23 4094 topology 4184 5404 +> 15 0 23 4094 topology 4189 5404 > 16 0 23 4094 topology 4246 5404 -> 15 0 23 4094 topology 4136 5405 +> 15 0 23 4094 topology 4193 5405 > 16 0 23 4094 topology 4246 5405 -> 15 0 24 4094 topology 4194 5406 -> 16 0 24 4094 topology 4196 5406 -> 15 0 23 4094 topology 4220 5407 +> 15 0 23 4094 topology 4192 5406 +> 16 0 23 4094 topology 4246 5406 +> 15 0 23 4094 topology 4196 5407 > 16 0 23 4094 topology 4246 5407 -> 15 0 23 4094 topology 4172 5408 +> 15 0 23 4094 topology 4195 5408 > 16 0 23 4094 topology 4246 5408 -> 15 0 24 4094 topology 4173 5409 -> 16 0 24 4094 topology 4175 5409 -> 15 0 24 4094 topology 4182 5410 -> 16 0 24 4094 topology 4183 5410 -> 15 0 23 4094 topology 4208 5411 +> 15 0 23 4094 topology 4199 5409 +> 16 0 23 4094 topology 4246 5409 +> 15 0 23 4094 topology 4198 5410 +> 16 0 23 4094 topology 4246 5410 +> 15 0 23 4094 topology 4202 5411 > 16 0 23 4094 topology 4246 5411 -> 15 0 24 4094 topology 4215 5412 -> 16 0 24 4094 topology 4216 5412 -> 15 0 23 4094 topology 4126 5413 +> 15 0 23 4094 topology 4201 5412 +> 16 0 23 4094 topology 4246 5412 +> 15 0 23 4094 topology 4205 5413 > 16 0 23 4094 topology 4246 5413 -> 15 0 23 4094 topology 4186 5414 +> 15 0 23 4094 topology 4204 5414 > 16 0 23 4094 topology 4246 5414 -> 15 0 24 4094 topology 4239 5415 -> 16 0 24 4094 topology 4241 5415 -> 15 0 24 4094 topology 4140 5416 -> 16 0 24 4094 topology 4141 5416 -> 15 0 23 4094 topology 4168 5417 +> 15 0 23 4094 topology 4208 5415 +> 16 0 23 4094 topology 4246 5415 +> 15 0 23 4094 topology 4207 5416 +> 16 0 23 4094 topology 4246 5416 +> 15 0 23 4094 topology 4211 5417 > 16 0 23 4094 topology 4246 5417 -> 15 0 24 4094 topology 4173 5418 -> 16 0 24 4094 topology 4174 5418 -> 15 0 23 4094 topology 4228 5419 +> 15 0 23 4094 topology 4210 5418 +> 16 0 23 4094 topology 4246 5418 +> 15 0 23 4094 topology 4103 5419 > 16 0 23 4094 topology 4246 5419 -> 15 0 23 4094 topology 4115 5420 +> 15 0 23 4094 topology 4102 5420 > 16 0 23 4094 topology 4246 5420 -> 15 0 23 4094 topology 4150 5421 +> 15 0 23 4094 topology 4214 5421 > 16 0 23 4094 topology 4246 5421 -> 15 0 23 4094 topology 4210 5422 +> 15 0 23 4094 topology 4213 5422 > 16 0 23 4094 topology 4246 5422 -> 15 0 24 4094 topology 4206 5423 -> 16 0 24 4094 topology 4207 5423 -> 15 0 24 4094 topology 4152 5424 -> 16 0 24 4094 topology 4154 5424 -> 15 0 24 4094 topology 4239 5425 -> 16 0 24 4094 topology 4240 5425 -> 15 0 24 4094 topology 4131 5426 -> 16 0 24 4094 topology 4133 5426 -> 15 0 23 4094 topology 4127 5427 +> 15 0 23 4094 topology 4217 5423 +> 16 0 23 4094 topology 4246 5423 +> 15 0 23 4094 topology 4216 5424 +> 16 0 23 4094 topology 4246 5424 +> 15 0 23 4094 topology 4220 5425 +> 16 0 23 4094 topology 4246 5425 +> 15 0 23 4094 topology 4219 5426 +> 16 0 23 4094 topology 4246 5426 +> 15 0 23 4094 topology 4223 5427 > 16 0 23 4094 topology 4246 5427 -> 15 0 24 4094 topology 4218 5428 -> 16 0 24 4094 topology 4220 5428 -> 15 0 23 4094 topology 4117 5429 +> 15 0 23 4094 topology 4222 5428 +> 16 0 23 4094 topology 4246 5428 +> 15 0 23 4094 topology 4226 5429 > 16 0 23 4094 topology 4246 5429 -> 15 0 23 4094 topology 4163 5430 +> 15 0 23 4094 topology 4225 5430 > 16 0 23 4094 topology 4246 5430 -> 15 0 24 4094 topology 4197 5431 -> 16 0 24 4094 topology 4199 5431 -> 15 0 23 4094 topology 4199 5432 +> 15 0 23 4094 topology 4229 5431 +> 16 0 23 4094 topology 4246 5431 +> 15 0 23 4094 topology 4228 5432 > 16 0 23 4094 topology 4246 5432 -> 15 0 24 4094 topology 4101 5433 -> 16 0 24 4094 topology 4102 5433 -> 15 0 23 4094 topology 4151 5434 +> 15 0 23 4094 topology 4232 5433 +> 16 0 23 4094 topology 4246 5433 +> 15 0 23 4094 topology 4231 5434 > 16 0 23 4094 topology 4246 5434 -> 15 0 24 4094 topology 4176 5435 -> 16 0 24 4094 topology 4178 5435 -> 15 0 23 4094 topology 4235 5436 +> 15 0 23 4094 topology 4235 5435 +> 16 0 23 4094 topology 4246 5435 +> 15 0 23 4094 topology 4234 5436 > 16 0 23 4094 topology 4246 5436 -> 15 0 24 4094 topology 4212 5437 -> 16 0 24 4094 topology 4213 5437 -> 15 0 23 4094 topology 4153 5438 +> 15 0 23 4094 topology 4238 5437 +> 16 0 23 4094 topology 4246 5437 +> 15 0 23 4094 topology 4237 5438 > 16 0 23 4094 topology 4246 5438 -> 15 0 24 4094 topology 4137 5439 -> 16 0 24 4094 topology 4138 5439 -> 15 0 23 4094 topology 4213 5440 +> 15 0 23 4094 topology 4241 5439 +> 16 0 23 4094 topology 4246 5439 +> 15 0 23 4094 topology 4240 5440 > 16 0 23 4094 topology 4246 5440 -> 15 0 24 4094 topology 4113 5441 -> 16 0 24 4094 topology 4114 5441 -> 15 0 23 4094 topology 4135 5442 +> 15 0 23 4094 topology 4106 5441 +> 16 0 23 4094 topology 4246 5441 +> 15 0 23 4094 topology 4105 5442 > 16 0 23 4094 topology 4246 5442 -> 15 0 23 4094 topology 4106 5443 +> 15 0 23 4094 topology 4244 5443 > 16 0 23 4094 topology 4246 5443 -> 15 0 24 4094 topology 4170 5444 -> 16 0 24 4094 topology 4171 5444 -> 15 0 23 4094 topology 4195 5445 +> 15 0 23 4094 topology 4243 5444 +> 16 0 23 4094 topology 4246 5444 +> 15 0 23 4094 topology 4109 5445 > 16 0 23 4094 topology 4246 5445 -> 15 0 23 4094 topology 4177 5446 +> 15 0 23 4094 topology 4108 5446 > 16 0 23 4094 topology 4246 5446 -> 15 0 24 4094 topology 4203 5447 -> 16 0 24 4094 topology 4204 5447 -> 15 0 24 4094 topology 4095 5448 -> 16 0 24 4094 topology 4097 5448 -> 15 0 23 4094 topology 4237 5449 +> 15 0 23 4094 topology 4112 5447 +> 16 0 23 4094 topology 4246 5447 +> 15 0 23 4094 topology 4111 5448 +> 16 0 23 4094 topology 4246 5448 +> 15 0 23 4094 topology 4115 5449 > 16 0 23 4094 topology 4246 5449 -> 15 0 24 4094 topology 4098 5450 -> 16 0 24 4094 topology 4100 5450 -> 15 0 24 4094 topology 4236 5451 -> 16 0 24 4094 topology 4237 5451 -> 15 0 24 4094 topology 4101 5452 -> 16 0 24 4094 topology 4103 5452 -> 15 0 24 4094 topology 4155 5453 -> 16 0 24 4094 topology 4157 5453 -> 15 0 24 4094 topology 4104 5454 -> 16 0 24 4094 topology 4106 5454 -> 15 0 23 4094 topology 4102 5455 -> 16 0 23 4094 topology 4246 5455 -> 15 0 24 4094 topology 4107 5456 -> 16 0 24 4094 topology 4109 5456 -> 15 0 24 4094 topology 4134 5457 -> 16 0 24 4094 topology 4136 5457 -> 15 0 24 4094 topology 4242 5458 -> 16 0 24 4094 topology 4244 5458 -> 15 0 23 4094 topology 4154 5459 -> 16 0 23 4094 topology 4246 5459 -> 15 0 24 4094 topology 4110 5460 -> 16 0 24 4094 topology 4112 5460 -> 15 0 24 4094 topology 4221 5461 -> 16 0 24 4094 topology 4223 5461 -> 15 0 23 4094 topology 4190 5462 -> 16 0 23 4094 topology 4246 5462 -> 15 0 24 4094 topology 4113 5463 -> 16 0 24 4094 topology 4115 5463 -> 15 0 23 4094 topology 4142 5464 -> 16 0 23 4094 topology 4246 5464 -> 15 0 24 4094 topology 4116 5465 -> 16 0 24 4094 topology 4118 5465 -> 15 0 23 4094 topology 4226 5466 -> 16 0 23 4094 topology 4246 5466 -> 15 0 24 4094 topology 4200 5467 -> 16 0 24 4094 topology 4202 5467 -> 15 0 24 4094 topology 4119 5468 -> 16 0 24 4094 topology 4121 5468 -> 15 0 23 4094 topology 4178 5469 -> 16 0 23 4094 topology 4246 5469 -> 15 0 24 4094 topology 4179 5470 -> 16 0 24 4094 topology 4181 5470 -> 15 0 24 4094 topology 4134 5471 -> 16 0 24 4094 topology 4135 5471 -> 15 0 24 4094 topology 4242 5472 -> 16 0 24 4094 topology 4243 5472 -> 15 0 23 4094 topology 4097 5473 -> 16 0 23 4094 topology 4246 5473 -> 15 0 24 4094 topology 4167 5474 -> 16 0 24 4094 topology 4168 5474 -> 15 0 23 4094 topology 4162 5475 -> 16 0 23 4094 topology 4246 5475 -> 15 0 23 4094 topology 4222 5476 -> 16 0 23 4094 topology 4246 5476 -> 15 0 23 4094 topology 4144 5477 -> 16 0 23 4094 topology 4246 5477 -> 15 0 24 4094 topology 4200 5478 -> 16 0 24 4094 topology 4201 5478 -> 15 0 23 4094 topology 4204 5479 -> 16 0 23 4094 topology 4246 5479 -> 15 0 23 4094 topology 4121 5480 -> 16 0 23 4094 topology 4246 5480 -> 15 0 24 4094 topology 4233 5481 -> 16 0 24 4094 topology 4234 5481 -> 15 0 24 4094 topology 4158 5482 -> 16 0 24 4094 topology 4160 5482 -> 15 0 24 4094 topology 4137 5483 -> 16 0 24 4094 topology 4139 5483 -> 15 0 23 4094 topology 4111 5484 -> 16 0 23 4094 topology 4246 5484 -> 15 0 23 4094 topology 4133 5485 -> 16 0 23 4094 topology 4246 5485 -> 15 0 23 4094 topology 4217 5486 -> 16 0 23 4094 topology 4246 5486 -> 15 0 24 4094 topology 4224 5487 -> 16 0 24 4094 topology 4226 5487 -> 15 0 23 4094 topology 4169 5488 -> 16 0 23 4094 topology 4246 5488 -> 15 0 24 4094 topology 4098 5489 -> 16 0 24 4094 topology 4099 5489 -> 15 0 23 4094 topology 4205 5490 -> 16 0 23 4094 topology 4246 5490 -> 15 0 24 4094 topology 4203 5491 -> 16 0 24 4094 topology 4205 5491 -> 15 0 24 4094 topology 4131 5492 -> 16 0 24 4094 topology 4132 5492 -> 15 0 23 4094 topology 4241 5493 -> 16 0 23 4094 topology 4246 5493 -> 15 0 24 4094 topology 4164 5494 -> 16 0 24 4094 topology 4165 5494 -> 15 0 23 4094 topology 4129 5495 -> 16 0 23 4094 topology 4246 5495 -> 15 0 24 4094 topology 4110 5496 -> 16 0 24 4094 topology 4111 5496 -> 15 0 23 4094 topology 4189 5497 -> 16 0 23 4094 topology 4246 5497 -> 15 0 24 4094 topology 4197 5498 -> 16 0 24 4094 topology 4198 5498 -> 15 0 23 4094 topology 4171 5499 -> 16 0 23 4094 topology 4246 5499 -> 15 0 23 4094 topology 4112 5500 -> 16 0 23 4094 topology 4246 5500 -> 15 0 23 4094 topology 4231 5501 -> 16 0 23 4094 topology 4246 5501 -> 15 0 24 4094 topology 4230 5502 -> 16 0 24 4094 topology 4231 5502 -> 15 0 24 4094 topology 4182 5503 -> 16 0 24 4094 topology 4184 5503 -> 15 0 23 4094 topology 4096 5504 -> 16 0 23 4094 topology 4246 5504 -> 15 0 24 4094 topology 4161 5505 -> 16 0 24 4094 topology 4163 5505 -> 15 0 23 4094 topology 4124 5506 -> 16 0 23 4094 topology 4246 5506 -> 15 0 23 4094 topology 4160 5507 -> 16 0 23 4094 topology 4246 5507 -> 15 0 24 4094 topology 4140 5508 -> 16 0 24 4094 topology 4142 5508 -> 15 0 23 4094 topology 4244 5509 -> 16 0 23 4094 topology 4246 5509 -> 15 0 23 4094 topology 4120 5510 -> 16 0 23 4094 topology 4246 5510 -> 15 0 23 4094 topology 4196 5511 -> 16 0 23 4094 topology 4246 5511 -> 15 0 24 4094 topology 4227 5512 -> 16 0 24 4094 topology 4229 5512 -> 15 0 23 4094 topology 4148 5513 -> 16 0 23 4094 topology 4246 5513 -> 15 0 23 4094 topology 4232 5514 -> 16 0 23 4094 topology 4246 5514 -> 15 0 24 4094 topology 4128 5515 -> 16 0 24 4094 topology 4129 5515 -> 15 0 24 4094 topology 4206 5516 -> 16 0 24 4094 topology 4208 5516 -> 15 0 24 4094 topology 4161 5517 -> 16 0 24 4094 topology 4162 5517 -> 15 0 23 4094 topology 4156 5518 -> 16 0 23 4094 topology 4246 5518 -> 15 0 23 4094 topology 4216 5519 -> 16 0 23 4094 topology 4246 5519 -> 15 0 24 4094 topology 4194 5520 -> 16 0 24 4094 topology 4195 5520 -> 15 0 23 4094 topology 4138 5521 -> 16 0 23 4094 topology 4246 5521 -> 15 0 23 4094 topology 4103 5522 -> 16 0 23 4094 topology 4246 5522 -> 15 0 23 4094 topology 4198 5523 -> 16 0 23 4094 topology 4246 5523 -> 15 0 24 4094 topology 4227 5524 -> 16 0 24 4094 topology 4228 5524 -> 15 0 23 4094 topology 4180 5525 -> 16 0 23 4094 topology 4246 5525 -> 15 0 23 4094 topology 4240 5526 -> 16 0 23 4094 topology 4246 5526 -> 15 0 24 4094 topology 4185 5527 -> 16 0 24 4094 topology 4187 5527 -> 15 0 23 4094 topology 4105 5528 -> 16 0 23 4094 topology 4246 5528 -> 15 0 24 4094 topology 4164 5529 -> 16 0 24 4094 topology 4166 5529 -> 15 0 23 4094 topology 4187 5530 -> 16 0 23 4094 topology 4246 5530 -> 15 0 23 4094 topology 4139 5531 -> 16 0 23 4094 topology 4246 5531 -> 15 0 24 4094 topology 4095 5532 -> 16 0 24 4094 topology 4096 5532 -> 15 0 23 4094 topology 4223 5533 -> 16 0 23 4094 topology 4246 5533 -> 15 0 24 4094 topology 4143 5534 -> 16 0 24 4094 topology 4145 5534 -> 15 0 24 4094 topology 4125 5535 -> 16 0 24 4094 topology 4126 5535 -> 15 0 23 4094 topology 4175 5536 -> 16 0 23 4094 topology 4246 5536 -> 15 0 24 4094 topology 4230 5537 -> 16 0 24 4094 topology 4232 5537 -> 15 0 23 4094 topology 4211 5538 -> 16 0 23 4094 topology 4246 5538 -> 15 0 24 4094 topology 4158 5539 -> 16 0 24 4094 topology 4159 5539 -> 15 0 23 4094 topology 4123 5540 -> 16 0 23 4094 topology 4246 5540 -> 15 0 24 4094 topology 4107 5541 -> 16 0 24 4094 topology 4108 5541 -> 15 0 24 4094 topology 4209 5542 -> 16 0 24 4094 topology 4211 5542 -> 15 0 24 4094 topology 4191 5543 -> 16 0 24 4094 topology 4192 5543 -> 15 0 23 4094 topology 4183 5544 -> 16 0 23 4094 topology 4246 5544 -> 15 0 23 4094 topology 4243 5545 -> 16 0 23 4094 topology 4246 5545 -> 15 0 23 4094 topology 4165 5546 -> 16 0 23 4094 topology 4246 5546 -> 15 0 24 4094 topology 4224 5547 -> 16 0 24 4094 topology 4225 5547 -> 15 0 23 4094 topology 4225 5548 -> 16 0 23 4094 topology 4246 5548 -> 15 0 23 4094 topology 4147 5549 -> 16 0 23 4094 topology 4246 5549 -> 15 0 24 4094 topology 4119 5550 -> 16 0 24 4094 topology 4120 5550 -> 15 0 23 4094 topology 4207 5551 -> 16 0 23 4094 topology 4246 5551 -> 15 0 24 4094 topology 4149 5552 -> 16 0 24 4094 topology 4150 5552 -> 15 0 23 4094 topology 4118 5553 -> 16 0 23 4094 topology 4246 5553 -> 15 0 24 4094 topology 4122 5554 -> 16 0 24 4094 topology 4124 5554 -> 15 0 24 4094 topology 4188 5555 -> 16 0 24 4094 topology 4190 5555 -> 15 0 23 4248 topology 4260 5556 +> 15 0 23 4094 topology 4114 5450 +> 16 0 23 4094 topology 4246 5450 +> 15 0 23 4094 topology 4118 5451 +> 16 0 23 4094 topology 4246 5451 +> 15 0 23 4094 topology 4117 5452 +> 16 0 23 4094 topology 4246 5452 +> 15 0 23 4094 topology 4121 5453 +> 16 0 23 4094 topology 4246 5453 +> 15 0 23 4094 topology 4120 5454 +> 16 0 23 4094 topology 4246 5454 +> 15 0 24 4094 topology 4245 5455 +> 16 0 24 4094 topology 4246 5455 +> 15 0 25 4094 topology 4122 5456 +> 16 0 25 4094 topology 4124 5456 +> 15 0 25 4094 topology 4122 5457 +> 16 0 25 4094 topology 4123 5457 +> 15 0 25 4094 topology 4125 5458 +> 16 0 25 4094 topology 4127 5458 +> 15 0 25 4094 topology 4125 5459 +> 16 0 25 4094 topology 4126 5459 +> 15 0 25 4094 topology 4128 5460 +> 16 0 25 4094 topology 4130 5460 +> 15 0 25 4094 topology 4128 5461 +> 16 0 25 4094 topology 4129 5461 +> 15 0 25 4094 topology 4131 5462 +> 16 0 25 4094 topology 4133 5462 +> 15 0 25 4094 topology 4131 5463 +> 16 0 25 4094 topology 4132 5463 +> 15 0 25 4094 topology 4134 5464 +> 16 0 25 4094 topology 4136 5464 +> 15 0 25 4094 topology 4134 5465 +> 16 0 25 4094 topology 4135 5465 +> 15 0 25 4094 topology 4137 5466 +> 16 0 25 4094 topology 4139 5466 +> 15 0 25 4094 topology 4137 5467 +> 16 0 25 4094 topology 4138 5467 +> 15 0 25 4094 topology 4140 5468 +> 16 0 25 4094 topology 4142 5468 +> 15 0 25 4094 topology 4140 5469 +> 16 0 25 4094 topology 4141 5469 +> 15 0 25 4094 topology 4143 5470 +> 16 0 25 4094 topology 4145 5470 +> 15 0 25 4094 topology 4143 5471 +> 16 0 25 4094 topology 4144 5471 +> 15 0 25 4094 topology 4146 5472 +> 16 0 25 4094 topology 4148 5472 +> 15 0 25 4094 topology 4146 5473 +> 16 0 25 4094 topology 4147 5473 +> 15 0 25 4094 topology 4149 5474 +> 16 0 25 4094 topology 4151 5474 +> 15 0 25 4094 topology 4149 5475 +> 16 0 25 4094 topology 4150 5475 +> 15 0 25 4094 topology 4095 5476 +> 16 0 25 4094 topology 4097 5476 +> 15 0 25 4094 topology 4095 5477 +> 16 0 25 4094 topology 4096 5477 +> 15 0 25 4094 topology 4152 5478 +> 16 0 25 4094 topology 4154 5478 +> 15 0 25 4094 topology 4152 5479 +> 16 0 25 4094 topology 4153 5479 +> 15 0 25 4094 topology 4155 5480 +> 16 0 25 4094 topology 4157 5480 +> 15 0 25 4094 topology 4155 5481 +> 16 0 25 4094 topology 4156 5481 +> 15 0 25 4094 topology 4158 5482 +> 16 0 25 4094 topology 4160 5482 +> 15 0 25 4094 topology 4158 5483 +> 16 0 25 4094 topology 4159 5483 +> 15 0 25 4094 topology 4161 5484 +> 16 0 25 4094 topology 4163 5484 +> 15 0 25 4094 topology 4161 5485 +> 16 0 25 4094 topology 4162 5485 +> 15 0 25 4094 topology 4164 5486 +> 16 0 25 4094 topology 4166 5486 +> 15 0 25 4094 topology 4164 5487 +> 16 0 25 4094 topology 4165 5487 +> 15 0 25 4094 topology 4167 5488 +> 16 0 25 4094 topology 4169 5488 +> 15 0 25 4094 topology 4167 5489 +> 16 0 25 4094 topology 4168 5489 +> 15 0 25 4094 topology 4170 5490 +> 16 0 25 4094 topology 4172 5490 +> 15 0 25 4094 topology 4170 5491 +> 16 0 25 4094 topology 4171 5491 +> 15 0 25 4094 topology 4173 5492 +> 16 0 25 4094 topology 4175 5492 +> 15 0 25 4094 topology 4173 5493 +> 16 0 25 4094 topology 4174 5493 +> 15 0 25 4094 topology 4176 5494 +> 16 0 25 4094 topology 4178 5494 +> 15 0 25 4094 topology 4176 5495 +> 16 0 25 4094 topology 4177 5495 +> 15 0 25 4094 topology 4179 5496 +> 16 0 25 4094 topology 4181 5496 +> 15 0 25 4094 topology 4179 5497 +> 16 0 25 4094 topology 4180 5497 +> 15 0 25 4094 topology 4098 5498 +> 16 0 25 4094 topology 4100 5498 +> 15 0 25 4094 topology 4098 5499 +> 16 0 25 4094 topology 4099 5499 +> 15 0 25 4094 topology 4182 5500 +> 16 0 25 4094 topology 4184 5500 +> 15 0 25 4094 topology 4182 5501 +> 16 0 25 4094 topology 4183 5501 +> 15 0 25 4094 topology 4185 5502 +> 16 0 25 4094 topology 4187 5502 +> 15 0 25 4094 topology 4185 5503 +> 16 0 25 4094 topology 4186 5503 +> 15 0 25 4094 topology 4188 5504 +> 16 0 25 4094 topology 4190 5504 +> 15 0 25 4094 topology 4188 5505 +> 16 0 25 4094 topology 4189 5505 +> 15 0 25 4094 topology 4191 5506 +> 16 0 25 4094 topology 4193 5506 +> 15 0 25 4094 topology 4191 5507 +> 16 0 25 4094 topology 4192 5507 +> 15 0 25 4094 topology 4194 5508 +> 16 0 25 4094 topology 4196 5508 +> 15 0 25 4094 topology 4194 5509 +> 16 0 25 4094 topology 4195 5509 +> 15 0 25 4094 topology 4197 5510 +> 16 0 25 4094 topology 4199 5510 +> 15 0 25 4094 topology 4197 5511 +> 16 0 25 4094 topology 4198 5511 +> 15 0 25 4094 topology 4200 5512 +> 16 0 25 4094 topology 4202 5512 +> 15 0 25 4094 topology 4200 5513 +> 16 0 25 4094 topology 4201 5513 +> 15 0 25 4094 topology 4203 5514 +> 16 0 25 4094 topology 4205 5514 +> 15 0 25 4094 topology 4203 5515 +> 16 0 25 4094 topology 4204 5515 +> 15 0 25 4094 topology 4206 5516 +> 16 0 25 4094 topology 4208 5516 +> 15 0 25 4094 topology 4206 5517 +> 16 0 25 4094 topology 4207 5517 +> 15 0 25 4094 topology 4209 5518 +> 16 0 25 4094 topology 4211 5518 +> 15 0 25 4094 topology 4209 5519 +> 16 0 25 4094 topology 4210 5519 +> 15 0 25 4094 topology 4101 5520 +> 16 0 25 4094 topology 4103 5520 +> 15 0 25 4094 topology 4101 5521 +> 16 0 25 4094 topology 4102 5521 +> 15 0 25 4094 topology 4212 5522 +> 16 0 25 4094 topology 4214 5522 +> 15 0 25 4094 topology 4212 5523 +> 16 0 25 4094 topology 4213 5523 +> 15 0 25 4094 topology 4215 5524 +> 16 0 25 4094 topology 4217 5524 +> 15 0 25 4094 topology 4215 5525 +> 16 0 25 4094 topology 4216 5525 +> 15 0 25 4094 topology 4218 5526 +> 16 0 25 4094 topology 4220 5526 +> 15 0 25 4094 topology 4218 5527 +> 16 0 25 4094 topology 4219 5527 +> 15 0 25 4094 topology 4221 5528 +> 16 0 25 4094 topology 4223 5528 +> 15 0 25 4094 topology 4221 5529 +> 16 0 25 4094 topology 4222 5529 +> 15 0 25 4094 topology 4224 5530 +> 16 0 25 4094 topology 4226 5530 +> 15 0 25 4094 topology 4224 5531 +> 16 0 25 4094 topology 4225 5531 +> 15 0 25 4094 topology 4227 5532 +> 16 0 25 4094 topology 4229 5532 +> 15 0 25 4094 topology 4227 5533 +> 16 0 25 4094 topology 4228 5533 +> 15 0 25 4094 topology 4230 5534 +> 16 0 25 4094 topology 4232 5534 +> 15 0 25 4094 topology 4230 5535 +> 16 0 25 4094 topology 4231 5535 +> 15 0 25 4094 topology 4233 5536 +> 16 0 25 4094 topology 4235 5536 +> 15 0 25 4094 topology 4233 5537 +> 16 0 25 4094 topology 4234 5537 +> 15 0 25 4094 topology 4236 5538 +> 16 0 25 4094 topology 4238 5538 +> 15 0 25 4094 topology 4236 5539 +> 16 0 25 4094 topology 4237 5539 +> 15 0 25 4094 topology 4239 5540 +> 16 0 25 4094 topology 4241 5540 +> 15 0 25 4094 topology 4239 5541 +> 16 0 25 4094 topology 4240 5541 +> 15 0 25 4094 topology 4104 5542 +> 16 0 25 4094 topology 4106 5542 +> 15 0 25 4094 topology 4104 5543 +> 16 0 25 4094 topology 4105 5543 +> 15 0 25 4094 topology 4242 5544 +> 16 0 25 4094 topology 4244 5544 +> 15 0 25 4094 topology 4242 5545 +> 16 0 25 4094 topology 4243 5545 +> 15 0 25 4094 topology 4107 5546 +> 16 0 25 4094 topology 4109 5546 +> 15 0 25 4094 topology 4107 5547 +> 16 0 25 4094 topology 4108 5547 +> 15 0 25 4094 topology 4110 5548 +> 16 0 25 4094 topology 4112 5548 +> 15 0 25 4094 topology 4110 5549 +> 16 0 25 4094 topology 4111 5549 +> 15 0 25 4094 topology 4113 5550 +> 16 0 25 4094 topology 4115 5550 +> 15 0 25 4094 topology 4113 5551 +> 16 0 25 4094 topology 4114 5551 +> 15 0 25 4094 topology 4116 5552 +> 16 0 25 4094 topology 4118 5552 +> 15 0 25 4094 topology 4116 5553 +> 16 0 25 4094 topology 4117 5553 +> 15 0 25 4094 topology 4119 5554 +> 16 0 25 4094 topology 4121 5554 +> 15 0 25 4094 topology 4119 5555 +> 16 0 25 4094 topology 4120 5555 +> 15 0 23 4248 topology 4278 5556 > 16 0 23 4248 topology 4385 5556 -> 15 0 23 4248 topology 4295 5557 +> 15 0 23 4248 topology 4277 5557 > 16 0 23 4248 topology 4385 5557 -> 15 0 24 4248 topology 4297 5558 -> 16 0 24 4248 topology 4298 5558 -> 15 0 24 4248 topology 4351 5559 -> 16 0 24 4248 topology 4352 5559 -> 15 0 23 4248 topology 4325 5560 +> 15 0 23 4248 topology 4281 5558 +> 16 0 23 4248 topology 4385 5558 +> 15 0 23 4248 topology 4280 5559 +> 16 0 23 4248 topology 4385 5559 +> 15 0 23 4248 topology 4284 5560 > 16 0 23 4248 topology 4385 5560 -> 15 0 24 4248 topology 4300 5561 -> 16 0 24 4248 topology 4301 5561 -> 15 0 24 4248 topology 4354 5562 -> 16 0 24 4248 topology 4355 5562 -> 15 0 23 4248 topology 4355 5563 +> 15 0 23 4248 topology 4283 5561 +> 16 0 23 4248 topology 4385 5561 +> 15 0 23 4248 topology 4287 5562 +> 16 0 23 4248 topology 4385 5562 +> 15 0 23 4248 topology 4286 5563 > 16 0 23 4248 topology 4385 5563 -> 15 0 23 4248 topology 4272 5564 +> 15 0 23 4248 topology 4290 5564 > 16 0 23 4248 topology 4385 5564 -> 15 0 24 4248 topology 4303 5565 -> 16 0 24 4248 topology 4304 5565 -> 15 0 24 4248 topology 4357 5566 -> 16 0 24 4248 topology 4358 5566 -> 15 0 24 4248 topology 4276 5567 -> 16 0 24 4248 topology 4278 5567 -> 15 0 24 4248 topology 4360 5568 -> 16 0 24 4248 topology 4361 5568 -> 15 0 24 4248 topology 4252 5569 -> 16 0 24 4248 topology 4254 5569 -> 15 0 24 4248 topology 4306 5570 -> 16 0 24 4248 topology 4308 5570 -> 15 0 24 4248 topology 4363 5571 -> 16 0 24 4248 topology 4364 5571 -> 15 0 24 4248 topology 4282 5572 -> 16 0 24 4248 topology 4284 5572 -> 15 0 24 4248 topology 4336 5573 -> 16 0 24 4248 topology 4338 5573 -> 15 0 24 4248 topology 4312 5574 -> 16 0 24 4248 topology 4314 5574 -> 15 0 24 4248 topology 4366 5575 -> 16 0 24 4248 topology 4368 5575 -> 15 0 23 4248 topology 4256 5576 +> 15 0 23 4248 topology 4289 5565 +> 16 0 23 4248 topology 4385 5565 +> 15 0 23 4248 topology 4293 5566 +> 16 0 23 4248 topology 4385 5566 +> 15 0 23 4248 topology 4292 5567 +> 16 0 23 4248 topology 4385 5567 +> 15 0 23 4248 topology 4296 5568 +> 16 0 23 4248 topology 4385 5568 +> 15 0 23 4248 topology 4295 5569 +> 16 0 23 4248 topology 4385 5569 +> 15 0 23 4248 topology 4299 5570 +> 16 0 23 4248 topology 4385 5570 +> 15 0 23 4248 topology 4298 5571 +> 16 0 23 4248 topology 4385 5571 +> 15 0 23 4248 topology 4302 5572 +> 16 0 23 4248 topology 4385 5572 +> 15 0 23 4248 topology 4301 5573 +> 16 0 23 4248 topology 4385 5573 +> 15 0 23 4248 topology 4305 5574 +> 16 0 23 4248 topology 4385 5574 +> 15 0 23 4248 topology 4304 5575 +> 16 0 23 4248 topology 4385 5575 +> 15 0 23 4248 topology 4251 5576 > 16 0 23 4248 topology 4385 5576 -> 15 0 23 4248 topology 4278 5577 +> 15 0 23 4248 topology 4250 5577 > 16 0 23 4248 topology 4385 5577 -> 15 0 24 4248 topology 4288 5578 -> 16 0 24 4248 topology 4290 5578 -> 15 0 24 4248 topology 4342 5579 -> 16 0 24 4248 topology 4344 5579 -> 15 0 24 4248 topology 4264 5580 -> 16 0 24 4248 topology 4266 5580 -> 15 0 24 4248 topology 4318 5581 -> 16 0 24 4248 topology 4320 5581 -> 15 0 23 4248 topology 4338 5582 +> 15 0 23 4248 topology 4308 5578 +> 16 0 23 4248 topology 4385 5578 +> 15 0 23 4248 topology 4307 5579 +> 16 0 23 4248 topology 4385 5579 +> 15 0 23 4248 topology 4311 5580 +> 16 0 23 4248 topology 4385 5580 +> 15 0 23 4248 topology 4310 5581 +> 16 0 23 4248 topology 4385 5581 +> 15 0 23 4248 topology 4314 5582 > 16 0 23 4248 topology 4385 5582 -> 15 0 24 4248 topology 4372 5583 -> 16 0 24 4248 topology 4374 5583 -> 15 0 23 4248 topology 4268 5584 +> 15 0 23 4248 topology 4313 5583 +> 16 0 23 4248 topology 4385 5583 +> 15 0 23 4248 topology 4317 5584 > 16 0 23 4248 topology 4385 5584 -> 15 0 23 4248 topology 4314 5585 +> 15 0 23 4248 topology 4316 5585 > 16 0 23 4248 topology 4385 5585 -> 15 0 23 4248 topology 4290 5586 +> 15 0 23 4248 topology 4320 5586 > 16 0 23 4248 topology 4385 5586 -> 15 0 24 4248 topology 4294 5587 -> 16 0 24 4248 topology 4296 5587 -> 15 0 24 4248 topology 4348 5588 -> 16 0 24 4248 topology 4350 5588 -> 15 0 23 4248 topology 4374 5589 +> 15 0 23 4248 topology 4319 5587 +> 16 0 23 4248 topology 4385 5587 +> 15 0 23 4248 topology 4323 5588 +> 16 0 23 4248 topology 4385 5588 +> 15 0 23 4248 topology 4322 5589 > 16 0 23 4248 topology 4385 5589 -> 15 0 24 4248 topology 4324 5590 -> 16 0 24 4248 topology 4326 5590 -> 15 0 23 4248 topology 4350 5591 +> 15 0 23 4248 topology 4326 5590 +> 16 0 23 4248 topology 4385 5590 +> 15 0 23 4248 topology 4325 5591 > 16 0 23 4248 topology 4385 5591 -> 15 0 24 4248 topology 4378 5592 -> 16 0 24 4248 topology 4380 5592 -> 15 0 24 4248 topology 4252 5593 -> 16 0 24 4248 topology 4253 5593 -> 15 0 23 4248 topology 4326 5594 +> 15 0 23 4248 topology 4329 5592 +> 16 0 23 4248 topology 4385 5592 +> 15 0 23 4248 topology 4328 5593 +> 16 0 23 4248 topology 4385 5593 +> 15 0 23 4248 topology 4332 5594 > 16 0 23 4248 topology 4385 5594 -> 15 0 24 4248 topology 4300 5595 -> 16 0 24 4248 topology 4302 5595 -> 15 0 23 4248 topology 4302 5596 +> 15 0 23 4248 topology 4331 5595 +> 16 0 23 4248 topology 4385 5595 +> 15 0 23 4248 topology 4335 5596 > 16 0 23 4248 topology 4385 5596 -> 15 0 24 4248 topology 4354 5597 -> 16 0 24 4248 topology 4356 5597 -> 15 0 24 4248 topology 4330 5598 -> 16 0 24 4248 topology 4332 5598 -> 15 0 23 4248 topology 4362 5599 +> 15 0 23 4248 topology 4334 5597 +> 16 0 23 4248 topology 4385 5597 +> 15 0 23 4248 topology 4254 5598 +> 16 0 23 4248 topology 4385 5598 +> 15 0 23 4248 topology 4253 5599 > 16 0 23 4248 topology 4385 5599 -> 15 0 24 4248 topology 4360 5600 -> 16 0 24 4248 topology 4362 5600 -> 15 0 23 4248 topology 4280 5601 +> 15 0 23 4248 topology 4338 5600 +> 16 0 23 4248 topology 4385 5600 +> 15 0 23 4248 topology 4337 5601 > 16 0 23 4248 topology 4385 5601 -> 15 0 24 4248 topology 4264 5602 -> 16 0 24 4248 topology 4265 5602 -> 15 0 23 4248 topology 4310 5603 +> 15 0 23 4248 topology 4341 5602 +> 16 0 23 4248 topology 4385 5602 +> 15 0 23 4248 topology 4340 5603 > 16 0 23 4248 topology 4385 5603 -> 15 0 23 4248 topology 4251 5604 +> 15 0 23 4248 topology 4344 5604 > 16 0 23 4248 topology 4385 5604 -> 15 0 23 4248 topology 4340 5605 +> 15 0 23 4248 topology 4343 5605 > 16 0 23 4248 topology 4385 5605 -> 15 0 23 4248 topology 4370 5606 +> 15 0 23 4248 topology 4347 5606 > 16 0 23 4248 topology 4385 5606 -> 15 0 23 4248 topology 4292 5607 +> 15 0 23 4248 topology 4346 5607 > 16 0 23 4248 topology 4385 5607 -> 15 0 23 4248 topology 4322 5608 +> 15 0 23 4248 topology 4350 5608 > 16 0 23 4248 topology 4385 5608 -> 15 0 23 4248 topology 4263 5609 +> 15 0 23 4248 topology 4349 5609 > 16 0 23 4248 topology 4385 5609 -> 15 0 23 4248 topology 4352 5610 +> 15 0 23 4248 topology 4353 5610 > 16 0 23 4248 topology 4385 5610 -> 15 0 23 4248 topology 4382 5611 +> 15 0 23 4248 topology 4352 5611 > 16 0 23 4248 topology 4385 5611 -> 15 0 23 4248 topology 4304 5612 +> 15 0 23 4248 topology 4356 5612 > 16 0 23 4248 topology 4385 5612 -> 15 0 23 4248 topology 4334 5613 +> 15 0 23 4248 topology 4355 5613 > 16 0 23 4248 topology 4385 5613 -> 15 0 23 4248 topology 4275 5614 +> 15 0 23 4248 topology 4359 5614 > 16 0 23 4248 topology 4385 5614 -> 15 0 23 4248 topology 4364 5615 +> 15 0 23 4248 topology 4358 5615 > 16 0 23 4248 topology 4385 5615 -> 15 0 24 4248 topology 4255 5616 -> 16 0 24 4248 topology 4257 5616 -> 15 0 23 4248 topology 4253 5617 +> 15 0 23 4248 topology 4362 5616 +> 16 0 23 4248 topology 4385 5616 +> 15 0 23 4248 topology 4361 5617 > 16 0 23 4248 topology 4385 5617 -> 15 0 23 4248 topology 4281 5618 +> 15 0 23 4248 topology 4365 5618 > 16 0 23 4248 topology 4385 5618 -> 15 0 23 4248 topology 4265 5619 +> 15 0 23 4248 topology 4364 5619 > 16 0 23 4248 topology 4385 5619 -> 15 0 23 4248 topology 4341 5620 +> 15 0 23 4248 topology 4257 5620 > 16 0 23 4248 topology 4385 5620 -> 15 0 24 4248 topology 4267 5621 -> 16 0 24 4248 topology 4269 5621 -> 15 0 23 4248 topology 4317 5622 +> 15 0 23 4248 topology 4256 5621 +> 16 0 23 4248 topology 4385 5621 +> 15 0 23 4248 topology 4368 5622 > 16 0 23 4248 topology 4385 5622 -> 15 0 24 4248 topology 4249 5623 -> 16 0 24 4248 topology 4250 5623 -> 15 0 23 4248 topology 4293 5624 +> 15 0 23 4248 topology 4367 5623 +> 16 0 23 4248 topology 4385 5623 +> 15 0 23 4248 topology 4371 5624 > 16 0 23 4248 topology 4385 5624 -> 15 0 23 4248 topology 4377 5625 +> 15 0 23 4248 topology 4370 5625 > 16 0 23 4248 topology 4385 5625 -> 15 0 24 4248 topology 4306 5626 -> 16 0 24 4248 topology 4307 5626 -> 15 0 23 4248 topology 4353 5627 +> 15 0 23 4248 topology 4374 5626 +> 16 0 23 4248 topology 4385 5626 +> 15 0 23 4248 topology 4373 5627 > 16 0 23 4248 topology 4385 5627 -> 15 0 23 4248 topology 4329 5628 +> 15 0 23 4248 topology 4377 5628 > 16 0 23 4248 topology 4385 5628 -> 15 0 23 4248 topology 4305 5629 +> 15 0 23 4248 topology 4376 5629 > 16 0 23 4248 topology 4385 5629 -> 15 0 24 4248 topology 4309 5630 -> 16 0 24 4248 topology 4310 5630 -> 15 0 24 4248 topology 4312 5631 -> 16 0 24 4248 topology 4313 5631 -> 15 0 23 4248 topology 4365 5632 +> 15 0 23 4248 topology 4380 5630 +> 16 0 23 4248 topology 4385 5630 +> 15 0 23 4248 topology 4379 5631 +> 16 0 23 4248 topology 4385 5631 +> 15 0 23 4248 topology 4383 5632 > 16 0 23 4248 topology 4385 5632 -> 15 0 24 4248 topology 4366 5633 -> 16 0 24 4248 topology 4367 5633 -> 15 0 24 4248 topology 4261 5634 -> 16 0 24 4248 topology 4262 5634 -> 15 0 23 4248 topology 4277 5635 +> 15 0 23 4248 topology 4382 5633 +> 16 0 23 4248 topology 4385 5633 +> 15 0 23 4248 topology 4260 5634 +> 16 0 23 4248 topology 4385 5634 +> 15 0 23 4248 topology 4259 5635 > 16 0 23 4248 topology 4385 5635 -> 15 0 24 4248 topology 4315 5636 -> 16 0 24 4248 topology 4316 5636 -> 15 0 24 4248 topology 4369 5637 -> 16 0 24 4248 topology 4370 5637 -> 15 0 23 4248 topology 4307 5638 +> 15 0 23 4248 topology 4263 5636 +> 16 0 23 4248 topology 4385 5636 +> 15 0 23 4248 topology 4262 5637 +> 16 0 23 4248 topology 4385 5637 +> 15 0 23 4248 topology 4266 5638 > 16 0 23 4248 topology 4385 5638 -> 15 0 24 4248 topology 4318 5639 -> 16 0 24 4248 topology 4319 5639 -> 15 0 23 4248 topology 4337 5640 +> 15 0 23 4248 topology 4265 5639 +> 16 0 23 4248 topology 4385 5639 +> 15 0 23 4248 topology 4269 5640 > 16 0 23 4248 topology 4385 5640 -> 15 0 24 4248 topology 4372 5641 -> 16 0 24 4248 topology 4373 5641 -> 15 0 23 4248 topology 4367 5642 +> 15 0 23 4248 topology 4268 5641 +> 16 0 23 4248 topology 4385 5641 +> 15 0 23 4248 topology 4272 5642 > 16 0 23 4248 topology 4385 5642 -> 15 0 23 4248 topology 4254 5643 +> 15 0 23 4248 topology 4271 5643 > 16 0 23 4248 topology 4385 5643 -> 15 0 23 4248 topology 4289 5644 +> 15 0 23 4248 topology 4275 5644 > 16 0 23 4248 topology 4385 5644 -> 15 0 24 4248 topology 4321 5645 -> 16 0 24 4248 topology 4322 5645 -> 15 0 24 4248 topology 4375 5646 -> 16 0 24 4248 topology 4376 5646 -> 15 0 23 4248 topology 4319 5647 -> 16 0 23 4248 topology 4385 5647 -> 15 0 24 4248 topology 4324 5648 -> 16 0 24 4248 topology 4325 5648 -> 15 0 23 4248 topology 4349 5649 -> 16 0 23 4248 topology 4385 5649 -> 15 0 24 4248 topology 4378 5650 -> 16 0 24 4248 topology 4379 5650 -> 15 0 23 4248 topology 4379 5651 -> 16 0 23 4248 topology 4385 5651 -> 15 0 23 4248 topology 4266 5652 -> 16 0 23 4248 topology 4385 5652 -> 15 0 24 4248 topology 4273 5653 -> 16 0 24 4248 topology 4274 5653 -> 15 0 23 4248 topology 4301 5654 -> 16 0 23 4248 topology 4385 5654 -> 15 0 24 4248 topology 4327 5655 -> 16 0 24 4248 topology 4328 5655 -> 15 0 24 4248 topology 4381 5656 -> 16 0 24 4248 topology 4382 5656 -> 15 0 23 4248 topology 4331 5657 -> 16 0 23 4248 topology 4385 5657 -> 15 0 24 4248 topology 4330 5658 -> 16 0 24 4248 topology 4331 5658 -> 15 0 23 4248 topology 4361 5659 -> 16 0 23 4248 topology 4385 5659 -> 15 0 24 4248 topology 4333 5660 -> 16 0 24 4248 topology 4334 5660 -> 15 0 24 4248 topology 4279 5661 -> 16 0 24 4248 topology 4281 5661 -> 15 0 24 4248 topology 4309 5662 -> 16 0 24 4248 topology 4311 5662 -> 15 0 23 4248 topology 4250 5663 -> 16 0 23 4248 topology 4385 5663 -> 15 0 24 4248 topology 4258 5664 -> 16 0 24 4248 topology 4260 5664 -> 15 0 24 4248 topology 4285 5665 -> 16 0 24 4248 topology 4287 5665 -> 15 0 24 4248 topology 4339 5666 -> 16 0 24 4248 topology 4341 5666 -> 15 0 24 4248 topology 4315 5667 -> 16 0 24 4248 topology 4317 5667 -> 15 0 24 4248 topology 4369 5668 -> 16 0 24 4248 topology 4371 5668 -> 15 0 23 4248 topology 4262 5669 -> 16 0 23 4248 topology 4385 5669 -> 15 0 23 4248 topology 4308 5670 -> 16 0 23 4248 topology 4385 5670 -> 15 0 23 4248 topology 4284 5671 -> 16 0 23 4248 topology 4385 5671 -> 15 0 24 4248 topology 4291 5672 -> 16 0 24 4248 topology 4293 5672 -> 15 0 24 4248 topology 4345 5673 -> 16 0 24 4248 topology 4347 5673 -> 15 0 23 4248 topology 4368 5674 -> 16 0 23 4248 topology 4385 5674 -> 15 0 24 4248 topology 4321 5675 -> 16 0 24 4248 topology 4323 5675 -> 15 0 23 4248 topology 4344 5676 -> 16 0 23 4248 topology 4385 5676 -> 15 0 24 4248 topology 4375 5677 -> 16 0 24 4248 topology 4377 5677 -> 15 0 23 4248 topology 4274 5678 -> 16 0 23 4248 topology 4385 5678 -> 15 0 23 4248 topology 4320 5679 -> 16 0 23 4248 topology 4385 5679 -> 15 0 24 4248 topology 4270 5680 -> 16 0 24 4248 topology 4272 5680 -> 15 0 23 4248 topology 4296 5681 -> 16 0 23 4248 topology 4385 5681 -> 15 0 24 4248 topology 4297 5682 -> 16 0 24 4248 topology 4299 5682 -> 15 0 24 4248 topology 4351 5683 -> 16 0 24 4248 topology 4353 5683 -> 15 0 23 4248 topology 4380 5684 -> 16 0 23 4248 topology 4385 5684 -> 15 0 24 4248 topology 4327 5685 -> 16 0 24 4248 topology 4329 5685 -> 15 0 23 4248 topology 4356 5686 -> 16 0 23 4248 topology 4385 5686 -> 15 0 24 4248 topology 4381 5687 -> 16 0 24 4248 topology 4383 5687 -> 15 0 23 4248 topology 4332 5688 -> 16 0 23 4248 topology 4385 5688 -> 15 0 24 4248 topology 4303 5689 -> 16 0 24 4248 topology 4305 5689 -> 15 0 24 4248 topology 4357 5690 -> 16 0 24 4248 topology 4359 5690 -> 15 0 24 4248 topology 4258 5691 -> 16 0 24 4248 topology 4259 5691 -> 15 0 24 4248 topology 4333 5692 -> 16 0 24 4248 topology 4335 5692 -> 15 0 24 4248 topology 4363 5693 -> 16 0 24 4248 topology 4365 5693 -> 15 0 23 4248 topology 4286 5694 -> 16 0 23 4248 topology 4385 5694 -> 15 0 23 4248 topology 4316 5695 -> 16 0 23 4248 topology 4385 5695 -> 15 0 23 4248 topology 4257 5696 -> 16 0 23 4248 topology 4385 5696 -> 15 0 23 4248 topology 4346 5697 -> 16 0 23 4248 topology 4385 5697 -> 15 0 24 4248 topology 4270 5698 -> 16 0 24 4248 topology 4271 5698 -> 15 0 23 4248 topology 4376 5699 -> 16 0 23 4248 topology 4385 5699 -> 15 0 23 4248 topology 4298 5700 -> 16 0 23 4248 topology 4385 5700 -> 15 0 23 4248 topology 4328 5701 -> 16 0 23 4248 topology 4385 5701 -> 15 0 23 4248 topology 4269 5702 -> 16 0 23 4248 topology 4385 5702 -> 15 0 23 4248 topology 4358 5703 -> 16 0 23 4248 topology 4385 5703 -> 15 0 24 4248 topology 4249 5704 -> 16 0 24 4248 topology 4251 5704 -> 15 0 25 4248 topology 4384 5705 -> 16 0 25 4248 topology 4385 5705 -> 15 0 23 4248 topology 4259 5706 -> 16 0 23 4248 topology 4385 5706 -> 15 0 24 4248 topology 4261 5707 -> 16 0 24 4248 topology 4263 5707 -> 15 0 23 4248 topology 4311 5708 -> 16 0 23 4248 topology 4385 5708 -> 15 0 23 4248 topology 4287 5709 -> 16 0 23 4248 topology 4385 5709 -> 15 0 23 4248 topology 4271 5710 -> 16 0 23 4248 topology 4385 5710 -> 15 0 23 4248 topology 4371 5711 -> 16 0 23 4248 topology 4385 5711 -> 15 0 24 4248 topology 4276 5712 -> 16 0 24 4248 topology 4277 5712 -> 15 0 23 4248 topology 4347 5713 -> 16 0 23 4248 topology 4385 5713 -> 15 0 23 4248 topology 4323 5714 -> 16 0 23 4248 topology 4385 5714 -> 15 0 24 4248 topology 4279 5715 -> 16 0 24 4248 topology 4280 5715 -> 15 0 23 4248 topology 4299 5716 -> 16 0 23 4248 topology 4385 5716 -> 15 0 24 4248 topology 4273 5717 -> 16 0 24 4248 topology 4275 5717 -> 15 0 23 4248 topology 4383 5718 -> 16 0 23 4248 topology 4385 5718 -> 15 0 24 4248 topology 4255 5719 -> 16 0 24 4248 topology 4256 5719 -> 15 0 24 4248 topology 4282 5720 -> 16 0 24 4248 topology 4283 5720 -> 15 0 24 4248 topology 4336 5721 -> 16 0 24 4248 topology 4337 5721 -> 15 0 23 4248 topology 4359 5722 -> 16 0 23 4248 topology 4385 5722 -> 15 0 23 4248 topology 4335 5723 -> 16 0 23 4248 topology 4385 5723 -> 15 0 24 4248 topology 4285 5724 -> 16 0 24 4248 topology 4286 5724 -> 15 0 24 4248 topology 4339 5725 -> 16 0 24 4248 topology 4340 5725 -> 15 0 24 4248 topology 4288 5726 -> 16 0 24 4248 topology 4289 5726 -> 15 0 24 4248 topology 4342 5727 -> 16 0 24 4248 topology 4343 5727 -> 15 0 23 4248 topology 4283 5728 -> 16 0 23 4248 topology 4385 5728 -> 15 0 24 4248 topology 4291 5729 -> 16 0 24 4248 topology 4292 5729 -> 15 0 24 4248 topology 4345 5730 -> 16 0 24 4248 topology 4346 5730 -> 15 0 23 4248 topology 4313 5731 -> 16 0 23 4248 topology 4385 5731 -> 15 0 24 4248 topology 4267 5732 -> 16 0 24 4248 topology 4268 5732 -> 15 0 24 4248 topology 4294 5733 -> 16 0 24 4248 topology 4295 5733 -> 15 0 23 4248 topology 4343 5734 -> 16 0 23 4248 topology 4385 5734 -> 15 0 24 4248 topology 4348 5735 -> 16 0 24 4248 topology 4349 5735 -> 15 0 23 4248 topology 4373 5736 -> 16 0 23 4248 topology 4385 5736 -> 15 0 27 3921 topology 4091 5737 -> 16 0 27 3921 topology 4093 5737 -> 15 0 21 3921 topology 4093 5738 -> 16 0 21 3921 topology 4386 5738 -> 15 0 26 3921 topology 4093 5739 +> 15 0 23 4248 topology 4274 5645 +> 16 0 23 4248 topology 4385 5645 +> 15 0 24 4248 topology 4384 5646 +> 16 0 24 4248 topology 4385 5646 +> 15 0 25 4248 topology 4276 5647 +> 16 0 25 4248 topology 4278 5647 +> 15 0 25 4248 topology 4276 5648 +> 16 0 25 4248 topology 4277 5648 +> 15 0 25 4248 topology 4279 5649 +> 16 0 25 4248 topology 4281 5649 +> 15 0 25 4248 topology 4279 5650 +> 16 0 25 4248 topology 4280 5650 +> 15 0 25 4248 topology 4282 5651 +> 16 0 25 4248 topology 4284 5651 +> 15 0 25 4248 topology 4282 5652 +> 16 0 25 4248 topology 4283 5652 +> 15 0 25 4248 topology 4285 5653 +> 16 0 25 4248 topology 4287 5653 +> 15 0 25 4248 topology 4285 5654 +> 16 0 25 4248 topology 4286 5654 +> 15 0 25 4248 topology 4288 5655 +> 16 0 25 4248 topology 4290 5655 +> 15 0 25 4248 topology 4288 5656 +> 16 0 25 4248 topology 4289 5656 +> 15 0 25 4248 topology 4291 5657 +> 16 0 25 4248 topology 4293 5657 +> 15 0 25 4248 topology 4291 5658 +> 16 0 25 4248 topology 4292 5658 +> 15 0 25 4248 topology 4294 5659 +> 16 0 25 4248 topology 4296 5659 +> 15 0 25 4248 topology 4294 5660 +> 16 0 25 4248 topology 4295 5660 +> 15 0 25 4248 topology 4297 5661 +> 16 0 25 4248 topology 4299 5661 +> 15 0 25 4248 topology 4297 5662 +> 16 0 25 4248 topology 4298 5662 +> 15 0 25 4248 topology 4300 5663 +> 16 0 25 4248 topology 4302 5663 +> 15 0 25 4248 topology 4300 5664 +> 16 0 25 4248 topology 4301 5664 +> 15 0 25 4248 topology 4303 5665 +> 16 0 25 4248 topology 4305 5665 +> 15 0 25 4248 topology 4303 5666 +> 16 0 25 4248 topology 4304 5666 +> 15 0 25 4248 topology 4249 5667 +> 16 0 25 4248 topology 4251 5667 +> 15 0 25 4248 topology 4249 5668 +> 16 0 25 4248 topology 4250 5668 +> 15 0 25 4248 topology 4306 5669 +> 16 0 25 4248 topology 4308 5669 +> 15 0 25 4248 topology 4306 5670 +> 16 0 25 4248 topology 4307 5670 +> 15 0 25 4248 topology 4309 5671 +> 16 0 25 4248 topology 4311 5671 +> 15 0 25 4248 topology 4309 5672 +> 16 0 25 4248 topology 4310 5672 +> 15 0 25 4248 topology 4312 5673 +> 16 0 25 4248 topology 4314 5673 +> 15 0 25 4248 topology 4312 5674 +> 16 0 25 4248 topology 4313 5674 +> 15 0 25 4248 topology 4315 5675 +> 16 0 25 4248 topology 4317 5675 +> 15 0 25 4248 topology 4315 5676 +> 16 0 25 4248 topology 4316 5676 +> 15 0 25 4248 topology 4318 5677 +> 16 0 25 4248 topology 4320 5677 +> 15 0 25 4248 topology 4318 5678 +> 16 0 25 4248 topology 4319 5678 +> 15 0 25 4248 topology 4321 5679 +> 16 0 25 4248 topology 4323 5679 +> 15 0 25 4248 topology 4321 5680 +> 16 0 25 4248 topology 4322 5680 +> 15 0 25 4248 topology 4324 5681 +> 16 0 25 4248 topology 4326 5681 +> 15 0 25 4248 topology 4324 5682 +> 16 0 25 4248 topology 4325 5682 +> 15 0 25 4248 topology 4327 5683 +> 16 0 25 4248 topology 4329 5683 +> 15 0 25 4248 topology 4327 5684 +> 16 0 25 4248 topology 4328 5684 +> 15 0 25 4248 topology 4330 5685 +> 16 0 25 4248 topology 4332 5685 +> 15 0 25 4248 topology 4330 5686 +> 16 0 25 4248 topology 4331 5686 +> 15 0 25 4248 topology 4333 5687 +> 16 0 25 4248 topology 4335 5687 +> 15 0 25 4248 topology 4333 5688 +> 16 0 25 4248 topology 4334 5688 +> 15 0 25 4248 topology 4252 5689 +> 16 0 25 4248 topology 4254 5689 +> 15 0 25 4248 topology 4252 5690 +> 16 0 25 4248 topology 4253 5690 +> 15 0 25 4248 topology 4336 5691 +> 16 0 25 4248 topology 4338 5691 +> 15 0 25 4248 topology 4336 5692 +> 16 0 25 4248 topology 4337 5692 +> 15 0 25 4248 topology 4339 5693 +> 16 0 25 4248 topology 4341 5693 +> 15 0 25 4248 topology 4339 5694 +> 16 0 25 4248 topology 4340 5694 +> 15 0 25 4248 topology 4342 5695 +> 16 0 25 4248 topology 4344 5695 +> 15 0 25 4248 topology 4342 5696 +> 16 0 25 4248 topology 4343 5696 +> 15 0 25 4248 topology 4345 5697 +> 16 0 25 4248 topology 4347 5697 +> 15 0 25 4248 topology 4345 5698 +> 16 0 25 4248 topology 4346 5698 +> 15 0 25 4248 topology 4348 5699 +> 16 0 25 4248 topology 4350 5699 +> 15 0 25 4248 topology 4348 5700 +> 16 0 25 4248 topology 4349 5700 +> 15 0 25 4248 topology 4351 5701 +> 16 0 25 4248 topology 4353 5701 +> 15 0 25 4248 topology 4351 5702 +> 16 0 25 4248 topology 4352 5702 +> 15 0 25 4248 topology 4354 5703 +> 16 0 25 4248 topology 4356 5703 +> 15 0 25 4248 topology 4354 5704 +> 16 0 25 4248 topology 4355 5704 +> 15 0 25 4248 topology 4357 5705 +> 16 0 25 4248 topology 4359 5705 +> 15 0 25 4248 topology 4357 5706 +> 16 0 25 4248 topology 4358 5706 +> 15 0 25 4248 topology 4360 5707 +> 16 0 25 4248 topology 4362 5707 +> 15 0 25 4248 topology 4360 5708 +> 16 0 25 4248 topology 4361 5708 +> 15 0 25 4248 topology 4363 5709 +> 16 0 25 4248 topology 4365 5709 +> 15 0 25 4248 topology 4363 5710 +> 16 0 25 4248 topology 4364 5710 +> 15 0 25 4248 topology 4255 5711 +> 16 0 25 4248 topology 4257 5711 +> 15 0 25 4248 topology 4255 5712 +> 16 0 25 4248 topology 4256 5712 +> 15 0 25 4248 topology 4366 5713 +> 16 0 25 4248 topology 4368 5713 +> 15 0 25 4248 topology 4366 5714 +> 16 0 25 4248 topology 4367 5714 +> 15 0 25 4248 topology 4369 5715 +> 16 0 25 4248 topology 4371 5715 +> 15 0 25 4248 topology 4369 5716 +> 16 0 25 4248 topology 4370 5716 +> 15 0 25 4248 topology 4372 5717 +> 16 0 25 4248 topology 4374 5717 +> 15 0 25 4248 topology 4372 5718 +> 16 0 25 4248 topology 4373 5718 +> 15 0 25 4248 topology 4375 5719 +> 16 0 25 4248 topology 4377 5719 +> 15 0 25 4248 topology 4375 5720 +> 16 0 25 4248 topology 4376 5720 +> 15 0 25 4248 topology 4378 5721 +> 16 0 25 4248 topology 4380 5721 +> 15 0 25 4248 topology 4378 5722 +> 16 0 25 4248 topology 4379 5722 +> 15 0 25 4248 topology 4381 5723 +> 16 0 25 4248 topology 4383 5723 +> 15 0 25 4248 topology 4381 5724 +> 16 0 25 4248 topology 4382 5724 +> 15 0 25 4248 topology 4258 5725 +> 16 0 25 4248 topology 4260 5725 +> 15 0 25 4248 topology 4258 5726 +> 16 0 25 4248 topology 4259 5726 +> 15 0 25 4248 topology 4261 5727 +> 16 0 25 4248 topology 4263 5727 +> 15 0 25 4248 topology 4261 5728 +> 16 0 25 4248 topology 4262 5728 +> 15 0 25 4248 topology 4264 5729 +> 16 0 25 4248 topology 4266 5729 +> 15 0 25 4248 topology 4264 5730 +> 16 0 25 4248 topology 4265 5730 +> 15 0 25 4248 topology 4267 5731 +> 16 0 25 4248 topology 4269 5731 +> 15 0 25 4248 topology 4267 5732 +> 16 0 25 4248 topology 4268 5732 +> 15 0 25 4248 topology 4270 5733 +> 16 0 25 4248 topology 4272 5733 +> 15 0 25 4248 topology 4270 5734 +> 16 0 25 4248 topology 4271 5734 +> 15 0 25 4248 topology 4273 5735 +> 16 0 25 4248 topology 4275 5735 +> 15 0 25 4248 topology 4273 5736 +> 16 0 25 4248 topology 4274 5736 +> 15 0 26 3921 topology 4093 5737 +> 16 0 26 3921 topology 4388 5737 +> 15 0 26 3921 topology 4247 5738 +> 16 0 26 3921 topology 4388 5738 +> 15 0 26 3921 topology 4386 5739 > 16 0 26 3921 topology 4388 5739 -> 15 0 26 3921 topology 4386 5740 -> 16 0 26 3921 topology 4388 5740 -> 15 0 21 3921 topology 4093 5741 -> 16 0 21 3921 topology 4247 5741 -> 15 0 26 3921 topology 4247 5742 -> 16 0 26 3921 topology 4388 5742 -> 15 0 26 3921 topology 4247 5743 -> 16 0 26 3921 topology 4245 5743 -> 15 0 26 3921 topology 4386 5744 -> 16 0 26 3921 topology 4384 5744 -> 15 0 21 3921 topology 4247 5745 -> 16 0 21 3921 topology 4386 5745 -> 15 0 23 4391 topology 4508 5746 +> 15 0 27 3921 topology 4091 5740 +> 16 0 27 3921 topology 4093 5740 +> 15 0 20 3921 topology 4093 5741 +> 16 0 20 3921 topology 4247 5741 +> 15 0 20 3921 topology 4093 5742 +> 16 0 20 3921 topology 4386 5742 +> 15 0 20 3921 topology 4247 5743 +> 16 0 20 3921 topology 4386 5743 +> 15 0 26 3921 topology 4247 5744 +> 16 0 26 3921 topology 4245 5744 +> 15 0 26 3921 topology 4386 5745 +> 16 0 26 3921 topology 4384 5745 +> 15 0 23 4391 topology 4421 5746 > 16 0 23 4391 topology 4633 5746 -> 15 0 24 4391 topology 4536 5747 -> 16 0 24 4391 topology 4538 5747 -> 15 0 23 4391 topology 4592 5748 +> 15 0 23 4391 topology 4420 5747 +> 16 0 23 4391 topology 4633 5747 +> 15 0 23 4391 topology 4424 5748 > 16 0 23 4391 topology 4633 5748 -> 15 0 23 4391 topology 4450 5749 +> 15 0 23 4391 topology 4423 5749 > 16 0 23 4391 topology 4633 5749 -> 15 0 23 4391 topology 4628 5750 +> 15 0 23 4391 topology 4427 5750 > 16 0 23 4391 topology 4633 5750 -> 15 0 23 4391 topology 4510 5751 +> 15 0 23 4391 topology 4426 5751 > 16 0 23 4391 topology 4633 5751 -> 15 0 23 4391 topology 4432 5752 +> 15 0 23 4391 topology 4430 5752 > 16 0 23 4391 topology 4633 5752 -> 15 0 23 4391 topology 4570 5753 +> 15 0 23 4391 topology 4429 5753 > 16 0 23 4391 topology 4633 5753 -> 15 0 23 4391 topology 4492 5754 +> 15 0 23 4391 topology 4433 5754 > 16 0 23 4391 topology 4633 5754 -> 15 0 23 4391 topology 4630 5755 +> 15 0 23 4391 topology 4432 5755 > 16 0 23 4391 topology 4633 5755 -> 15 0 23 4391 topology 4409 5756 +> 15 0 23 4391 topology 4436 5756 > 16 0 23 4391 topology 4633 5756 -> 15 0 23 4391 topology 4552 5757 +> 15 0 23 4391 topology 4435 5757 > 16 0 23 4391 topology 4633 5757 -> 15 0 23 4391 topology 4474 5758 +> 15 0 23 4391 topology 4439 5758 > 16 0 23 4391 topology 4633 5758 -> 15 0 23 4391 topology 4612 5759 +> 15 0 23 4391 topology 4438 5759 > 16 0 23 4391 topology 4633 5759 -> 15 0 23 4391 topology 4534 5760 +> 15 0 23 4391 topology 4442 5760 > 16 0 23 4391 topology 4633 5760 -> 15 0 23 4391 topology 4594 5761 +> 15 0 23 4391 topology 4441 5761 > 16 0 23 4391 topology 4633 5761 -> 15 0 24 4391 topology 4404 5762 -> 16 0 24 4391 topology 4406 5762 -> 15 0 23 4391 topology 4405 5763 +> 15 0 23 4391 topology 4445 5762 +> 16 0 23 4391 topology 4633 5762 +> 15 0 23 4391 topology 4444 5763 > 16 0 23 4391 topology 4633 5763 -> 15 0 23 4391 topology 4427 5764 +> 15 0 23 4391 topology 4448 5764 > 16 0 23 4391 topology 4633 5764 -> 15 0 23 4391 topology 4511 5765 +> 15 0 23 4391 topology 4447 5765 > 16 0 23 4391 topology 4633 5765 -> 15 0 24 4391 topology 4425 5766 -> 16 0 24 4391 topology 4426 5766 -> 15 0 23 4391 topology 4463 5767 +> 15 0 23 4391 topology 4394 5766 +> 16 0 23 4391 topology 4633 5766 +> 15 0 23 4391 topology 4393 5767 > 16 0 23 4391 topology 4633 5767 -> 15 0 23 4391 topology 4547 5768 +> 15 0 23 4391 topology 4451 5768 > 16 0 23 4391 topology 4633 5768 -> 15 0 24 4391 topology 4455 5769 -> 16 0 24 4391 topology 4456 5769 -> 15 0 23 4391 topology 4631 5770 +> 15 0 23 4391 topology 4450 5769 +> 16 0 23 4391 topology 4633 5769 +> 15 0 23 4391 topology 4454 5770 > 16 0 23 4391 topology 4633 5770 -> 15 0 23 4391 topology 4499 5771 +> 15 0 23 4391 topology 4453 5771 > 16 0 23 4391 topology 4633 5771 -> 15 0 24 4391 topology 4485 5772 -> 16 0 24 4391 topology 4486 5772 -> 15 0 23 4391 topology 4583 5773 +> 15 0 23 4391 topology 4457 5772 +> 16 0 23 4391 topology 4633 5772 +> 15 0 23 4391 topology 4456 5773 > 16 0 23 4391 topology 4633 5773 -> 15 0 24 4391 topology 4515 5774 -> 16 0 24 4391 topology 4516 5774 -> 15 0 23 4391 topology 4535 5775 +> 15 0 23 4391 topology 4460 5774 +> 16 0 23 4391 topology 4633 5774 +> 15 0 23 4391 topology 4459 5775 > 16 0 23 4391 topology 4633 5775 -> 15 0 23 4391 topology 4619 5776 +> 15 0 23 4391 topology 4463 5776 > 16 0 23 4391 topology 4633 5776 -> 15 0 24 4391 topology 4410 5777 -> 16 0 24 4391 topology 4411 5777 -> 15 0 24 4391 topology 4437 5778 -> 16 0 24 4391 topology 4438 5778 -> 15 0 24 4391 topology 4545 5779 -> 16 0 24 4391 topology 4546 5779 -> 15 0 24 4391 topology 4467 5780 -> 16 0 24 4391 topology 4468 5780 -> 15 0 24 4391 topology 4575 5781 -> 16 0 24 4391 topology 4576 5781 -> 15 0 23 4391 topology 4459 5782 +> 15 0 23 4391 topology 4462 5777 +> 16 0 23 4391 topology 4633 5777 +> 15 0 23 4391 topology 4466 5778 +> 16 0 23 4391 topology 4633 5778 +> 15 0 23 4391 topology 4465 5779 +> 16 0 23 4391 topology 4633 5779 +> 15 0 23 4391 topology 4469 5780 +> 16 0 23 4391 topology 4633 5780 +> 15 0 23 4391 topology 4468 5781 +> 16 0 23 4391 topology 4633 5781 +> 15 0 23 4391 topology 4472 5782 > 16 0 23 4391 topology 4633 5782 -> 15 0 24 4391 topology 4497 5783 -> 16 0 24 4391 topology 4498 5783 -> 15 0 24 4391 topology 4605 5784 -> 16 0 24 4391 topology 4606 5784 -> 15 0 23 4391 topology 4400 5785 +> 15 0 23 4391 topology 4471 5783 +> 16 0 23 4391 topology 4633 5783 +> 15 0 23 4391 topology 4475 5784 +> 16 0 23 4391 topology 4633 5784 +> 15 0 23 4391 topology 4474 5785 > 16 0 23 4391 topology 4633 5785 -> 15 0 23 4391 topology 4519 5786 +> 15 0 23 4391 topology 4478 5786 > 16 0 23 4391 topology 4633 5786 -> 15 0 24 4391 topology 4527 5787 -> 16 0 24 4391 topology 4528 5787 -> 15 0 24 4391 topology 4419 5788 -> 16 0 24 4391 topology 4421 5788 -> 15 0 23 4391 topology 4441 5789 +> 15 0 23 4391 topology 4477 5787 +> 16 0 23 4391 topology 4633 5787 +> 15 0 23 4391 topology 4397 5788 +> 16 0 23 4391 topology 4633 5788 +> 15 0 23 4391 topology 4396 5789 > 16 0 23 4391 topology 4633 5789 -> 15 0 24 4391 topology 4557 5790 -> 16 0 24 4391 topology 4558 5790 -> 15 0 23 4391 topology 4579 5791 +> 15 0 23 4391 topology 4481 5790 +> 16 0 23 4391 topology 4633 5790 +> 15 0 23 4391 topology 4480 5791 > 16 0 23 4391 topology 4633 5791 -> 15 0 24 4391 topology 4422 5792 -> 16 0 24 4391 topology 4424 5792 -> 15 0 23 4391 topology 4501 5793 +> 15 0 23 4391 topology 4484 5792 +> 16 0 23 4391 topology 4633 5792 +> 15 0 23 4391 topology 4483 5793 > 16 0 23 4391 topology 4633 5793 -> 15 0 24 4391 topology 4587 5794 -> 16 0 24 4391 topology 4588 5794 -> 15 0 24 4391 topology 4425 5795 -> 16 0 24 4391 topology 4427 5795 -> 15 0 23 4391 topology 4561 5796 +> 15 0 23 4391 topology 4487 5794 +> 16 0 23 4391 topology 4633 5794 +> 15 0 23 4391 topology 4486 5795 +> 16 0 23 4391 topology 4633 5795 +> 15 0 23 4391 topology 4490 5796 > 16 0 23 4391 topology 4633 5796 -> 15 0 24 4391 topology 4617 5797 -> 16 0 24 4391 topology 4618 5797 -> 15 0 24 4391 topology 4401 5798 -> 16 0 24 4391 topology 4403 5798 -> 15 0 24 4391 topology 4428 5799 -> 16 0 24 4391 topology 4430 5799 -> 15 0 23 4391 topology 4621 5800 +> 15 0 23 4391 topology 4489 5797 +> 16 0 23 4391 topology 4633 5797 +> 15 0 23 4391 topology 4493 5798 +> 16 0 23 4391 topology 4633 5798 +> 15 0 23 4391 topology 4492 5799 +> 16 0 23 4391 topology 4633 5799 +> 15 0 23 4391 topology 4496 5800 > 16 0 23 4391 topology 4633 5800 -> 15 0 24 4391 topology 4431 5801 -> 16 0 24 4391 topology 4433 5801 -> 15 0 24 4391 topology 4539 5802 -> 16 0 24 4391 topology 4541 5802 -> 15 0 24 4391 topology 4434 5803 -> 16 0 24 4391 topology 4436 5803 -> 15 0 24 4391 topology 4542 5804 -> 16 0 24 4391 topology 4544 5804 -> 15 0 24 4391 topology 4437 5805 -> 16 0 24 4391 topology 4439 5805 -> 15 0 24 4391 topology 4545 5806 -> 16 0 24 4391 topology 4547 5806 -> 15 0 24 4391 topology 4440 5807 -> 16 0 24 4391 topology 4442 5807 -> 15 0 23 4391 topology 4454 5808 +> 15 0 23 4391 topology 4495 5801 +> 16 0 23 4391 topology 4633 5801 +> 15 0 23 4391 topology 4499 5802 +> 16 0 23 4391 topology 4633 5802 +> 15 0 23 4391 topology 4498 5803 +> 16 0 23 4391 topology 4633 5803 +> 15 0 23 4391 topology 4502 5804 +> 16 0 23 4391 topology 4633 5804 +> 15 0 23 4391 topology 4501 5805 +> 16 0 23 4391 topology 4633 5805 +> 15 0 23 4391 topology 4505 5806 +> 16 0 23 4391 topology 4633 5806 +> 15 0 23 4391 topology 4504 5807 +> 16 0 23 4391 topology 4633 5807 +> 15 0 23 4391 topology 4508 5808 > 16 0 23 4391 topology 4633 5808 -> 15 0 24 4391 topology 4548 5809 -> 16 0 24 4391 topology 4550 5809 -> 15 0 23 4391 topology 4414 5810 +> 15 0 23 4391 topology 4507 5809 +> 16 0 23 4391 topology 4633 5809 +> 15 0 23 4391 topology 4400 5810 > 16 0 23 4391 topology 4633 5810 -> 15 0 24 4391 topology 4443 5811 -> 16 0 24 4391 topology 4445 5811 -> 15 0 24 4391 topology 4551 5812 -> 16 0 24 4391 topology 4553 5812 -> 15 0 23 4391 topology 4490 5813 +> 15 0 23 4391 topology 4399 5811 +> 16 0 23 4391 topology 4633 5811 +> 15 0 23 4391 topology 4511 5812 +> 16 0 23 4391 topology 4633 5812 +> 15 0 23 4391 topology 4510 5813 > 16 0 23 4391 topology 4633 5813 -> 15 0 24 4391 topology 4446 5814 -> 16 0 24 4391 topology 4448 5814 -> 15 0 24 4391 topology 4554 5815 -> 16 0 24 4391 topology 4556 5815 -> 15 0 23 4391 topology 4574 5816 +> 15 0 23 4391 topology 4514 5814 +> 16 0 23 4391 topology 4633 5814 +> 15 0 23 4391 topology 4513 5815 +> 16 0 23 4391 topology 4633 5815 +> 15 0 23 4391 topology 4517 5816 > 16 0 23 4391 topology 4633 5816 -> 15 0 24 4391 topology 4401 5817 -> 16 0 24 4391 topology 4402 5817 -> 15 0 23 4391 topology 4442 5818 +> 15 0 23 4391 topology 4516 5817 +> 16 0 23 4391 topology 4633 5817 +> 15 0 23 4391 topology 4520 5818 > 16 0 23 4391 topology 4633 5818 -> 15 0 23 4391 topology 4526 5819 +> 15 0 23 4391 topology 4519 5819 > 16 0 23 4391 topology 4633 5819 -> 15 0 24 4391 topology 4557 5820 -> 16 0 24 4391 topology 4559 5820 -> 15 0 23 4391 topology 4610 5821 +> 15 0 23 4391 topology 4523 5820 +> 16 0 23 4391 topology 4633 5820 +> 15 0 23 4391 topology 4522 5821 > 16 0 23 4391 topology 4633 5821 -> 15 0 23 4391 topology 4478 5822 +> 15 0 23 4391 topology 4526 5822 > 16 0 23 4391 topology 4633 5822 -> 15 0 24 4391 topology 4560 5823 -> 16 0 24 4391 topology 4562 5823 -> 15 0 23 4391 topology 4562 5824 +> 15 0 23 4391 topology 4525 5823 +> 16 0 23 4391 topology 4633 5823 +> 15 0 23 4391 topology 4529 5824 > 16 0 23 4391 topology 4633 5824 -> 15 0 24 4391 topology 4563 5825 -> 16 0 24 4391 topology 4565 5825 -> 15 0 24 4391 topology 4566 5826 -> 16 0 24 4391 topology 4568 5826 -> 15 0 23 4391 topology 4598 5827 +> 15 0 23 4391 topology 4528 5825 +> 16 0 23 4391 topology 4633 5825 +> 15 0 23 4391 topology 4532 5826 +> 16 0 23 4391 topology 4633 5826 +> 15 0 23 4391 topology 4531 5827 > 16 0 23 4391 topology 4633 5827 -> 15 0 23 4391 topology 4426 5828 +> 15 0 23 4391 topology 4535 5828 > 16 0 23 4391 topology 4633 5828 -> 15 0 23 4391 topology 4486 5829 +> 15 0 23 4391 topology 4534 5829 > 16 0 23 4391 topology 4633 5829 -> 15 0 23 4391 topology 4546 5830 +> 15 0 23 4391 topology 4538 5830 > 16 0 23 4391 topology 4633 5830 -> 15 0 23 4391 topology 4468 5831 +> 15 0 23 4391 topology 4537 5831 > 16 0 23 4391 topology 4633 5831 -> 15 0 23 4391 topology 4606 5832 +> 15 0 23 4391 topology 4403 5832 > 16 0 23 4391 topology 4633 5832 -> 15 0 23 4391 topology 4528 5833 +> 15 0 23 4391 topology 4402 5833 > 16 0 23 4391 topology 4633 5833 -> 15 0 23 4391 topology 4415 5834 +> 15 0 23 4391 topology 4541 5834 > 16 0 23 4391 topology 4633 5834 -> 15 0 24 4391 topology 4398 5835 -> 16 0 24 4391 topology 4400 5835 -> 15 0 23 4391 topology 4588 5836 +> 15 0 23 4391 topology 4540 5835 +> 16 0 23 4391 topology 4633 5835 +> 15 0 23 4391 topology 4544 5836 > 16 0 23 4391 topology 4633 5836 -> 15 0 23 4391 topology 4399 5837 +> 15 0 23 4391 topology 4543 5837 > 16 0 23 4391 topology 4633 5837 -> 15 0 24 4391 topology 4392 5838 -> 16 0 24 4391 topology 4393 5838 -> 15 0 23 4391 topology 4481 5839 +> 15 0 23 4391 topology 4547 5838 +> 16 0 23 4391 topology 4633 5838 +> 15 0 23 4391 topology 4546 5839 > 16 0 23 4391 topology 4633 5839 -> 15 0 24 4391 topology 4422 5840 -> 16 0 24 4391 topology 4423 5840 -> 15 0 23 4391 topology 4433 5841 +> 15 0 23 4391 topology 4550 5840 +> 16 0 23 4391 topology 4633 5840 +> 15 0 23 4391 topology 4549 5841 > 16 0 23 4391 topology 4633 5841 -> 15 0 24 4391 topology 4452 5842 -> 16 0 24 4391 topology 4453 5842 -> 15 0 23 4391 topology 4517 5843 +> 15 0 23 4391 topology 4553 5842 +> 16 0 23 4391 topology 4633 5842 +> 15 0 23 4391 topology 4552 5843 > 16 0 23 4391 topology 4633 5843 -> 15 0 23 4391 topology 4601 5844 +> 15 0 23 4391 topology 4556 5844 > 16 0 23 4391 topology 4633 5844 -> 15 0 23 4391 topology 4469 5845 +> 15 0 23 4391 topology 4555 5845 > 16 0 23 4391 topology 4633 5845 -> 15 0 24 4391 topology 4482 5846 -> 16 0 24 4391 topology 4483 5846 -> 15 0 23 4391 topology 4553 5847 +> 15 0 23 4391 topology 4559 5846 +> 16 0 23 4391 topology 4633 5846 +> 15 0 23 4391 topology 4558 5847 > 16 0 23 4391 topology 4633 5847 -> 15 0 24 4391 topology 4512 5848 -> 16 0 24 4391 topology 4513 5848 -> 15 0 23 4391 topology 4505 5849 +> 15 0 23 4391 topology 4562 5848 +> 16 0 23 4391 topology 4633 5848 +> 15 0 23 4391 topology 4561 5849 > 16 0 23 4391 topology 4633 5849 -> 15 0 24 4391 topology 4434 5850 -> 16 0 24 4391 topology 4435 5850 -> 15 0 24 4391 topology 4542 5851 -> 16 0 24 4391 topology 4543 5851 -> 15 0 23 4391 topology 4589 5852 +> 15 0 23 4391 topology 4565 5850 +> 16 0 23 4391 topology 4633 5850 +> 15 0 23 4391 topology 4564 5851 +> 16 0 23 4391 topology 4633 5851 +> 15 0 23 4391 topology 4568 5852 > 16 0 23 4391 topology 4633 5852 -> 15 0 24 4391 topology 4464 5853 -> 16 0 24 4391 topology 4465 5853 -> 15 0 24 4391 topology 4572 5854 -> 16 0 24 4391 topology 4573 5854 -> 15 0 23 4391 topology 4625 5855 +> 15 0 23 4391 topology 4567 5853 +> 16 0 23 4391 topology 4633 5853 +> 15 0 23 4391 topology 4406 5854 +> 16 0 23 4391 topology 4633 5854 +> 15 0 23 4391 topology 4405 5855 > 16 0 23 4391 topology 4633 5855 -> 15 0 23 4391 topology 4453 5856 +> 15 0 23 4391 topology 4571 5856 > 16 0 23 4391 topology 4633 5856 -> 15 0 24 4391 topology 4494 5857 -> 16 0 24 4391 topology 4495 5857 -> 15 0 24 4391 topology 4602 5858 -> 16 0 24 4391 topology 4603 5858 -> 15 0 24 4391 topology 4416 5859 -> 16 0 24 4391 topology 4417 5859 -> 15 0 23 4391 topology 4513 5860 +> 15 0 23 4391 topology 4570 5857 +> 16 0 23 4391 topology 4633 5857 +> 15 0 23 4391 topology 4574 5858 +> 16 0 23 4391 topology 4633 5858 +> 15 0 23 4391 topology 4573 5859 +> 16 0 23 4391 topology 4633 5859 +> 15 0 23 4391 topology 4577 5860 > 16 0 23 4391 topology 4633 5860 -> 15 0 24 4391 topology 4524 5861 -> 16 0 24 4391 topology 4525 5861 -> 15 0 23 4391 topology 4435 5862 +> 15 0 23 4391 topology 4576 5861 +> 16 0 23 4391 topology 4633 5861 +> 15 0 23 4391 topology 4580 5862 > 16 0 23 4391 topology 4633 5862 -> 15 0 24 4391 topology 4446 5863 -> 16 0 24 4391 topology 4447 5863 -> 15 0 24 4391 topology 4554 5864 -> 16 0 24 4391 topology 4555 5864 -> 15 0 23 4391 topology 4573 5865 +> 15 0 23 4391 topology 4579 5863 +> 16 0 23 4391 topology 4633 5863 +> 15 0 23 4391 topology 4583 5864 +> 16 0 23 4391 topology 4633 5864 +> 15 0 23 4391 topology 4582 5865 > 16 0 23 4391 topology 4633 5865 -> 15 0 23 4391 topology 4406 5866 +> 15 0 23 4391 topology 4586 5866 > 16 0 23 4391 topology 4633 5866 -> 15 0 23 4391 topology 4495 5867 +> 15 0 23 4391 topology 4585 5867 > 16 0 23 4391 topology 4633 5867 -> 15 0 24 4391 topology 4476 5868 -> 16 0 24 4391 topology 4477 5868 -> 15 0 24 4391 topology 4584 5869 -> 16 0 24 4391 topology 4585 5869 -> 15 0 24 4391 topology 4395 5870 -> 16 0 24 4391 topology 4397 5870 -> 15 0 24 4391 topology 4449 5871 -> 16 0 24 4391 topology 4451 5871 -> 15 0 23 4391 topology 4555 5872 +> 15 0 23 4391 topology 4589 5868 +> 16 0 23 4391 topology 4633 5868 +> 15 0 23 4391 topology 4588 5869 +> 16 0 23 4391 topology 4633 5869 +> 15 0 23 4391 topology 4592 5870 +> 16 0 23 4391 topology 4633 5870 +> 15 0 23 4391 topology 4591 5871 +> 16 0 23 4391 topology 4633 5871 +> 15 0 23 4391 topology 4595 5872 > 16 0 23 4391 topology 4633 5872 -> 15 0 23 4391 topology 4477 5873 +> 15 0 23 4391 topology 4594 5873 > 16 0 23 4391 topology 4633 5873 -> 15 0 24 4391 topology 4506 5874 -> 16 0 24 4391 topology 4507 5874 -> 15 0 24 4391 topology 4614 5875 -> 16 0 24 4391 topology 4615 5875 -> 15 0 24 4391 topology 4452 5876 -> 16 0 24 4391 topology 4454 5876 -> 15 0 23 4391 topology 4615 5877 +> 15 0 23 4391 topology 4598 5874 +> 16 0 23 4391 topology 4633 5874 +> 15 0 23 4391 topology 4597 5875 +> 16 0 23 4391 topology 4633 5875 +> 15 0 23 4391 topology 4409 5876 +> 16 0 23 4391 topology 4633 5876 +> 15 0 23 4391 topology 4408 5877 > 16 0 23 4391 topology 4633 5877 -> 15 0 24 4391 topology 4536 5878 -> 16 0 24 4391 topology 4537 5878 -> 15 0 23 4391 topology 4537 5879 +> 15 0 23 4391 topology 4601 5878 +> 16 0 23 4391 topology 4633 5878 +> 15 0 23 4391 topology 4600 5879 > 16 0 23 4391 topology 4633 5879 -> 15 0 24 4391 topology 4455 5880 -> 16 0 24 4391 topology 4457 5880 -> 15 0 24 4391 topology 4566 5881 -> 16 0 24 4391 topology 4567 5881 -> 15 0 23 4391 topology 4597 5882 +> 15 0 23 4391 topology 4604 5880 +> 16 0 23 4391 topology 4633 5880 +> 15 0 23 4391 topology 4603 5881 +> 16 0 23 4391 topology 4633 5881 +> 15 0 23 4391 topology 4607 5882 > 16 0 23 4391 topology 4633 5882 -> 15 0 24 4391 topology 4458 5883 -> 16 0 24 4391 topology 4460 5883 -> 15 0 24 4391 topology 4596 5884 -> 16 0 24 4391 topology 4597 5884 -> 15 0 24 4391 topology 4461 5885 -> 16 0 24 4391 topology 4463 5885 -> 15 0 24 4391 topology 4569 5886 -> 16 0 24 4391 topology 4571 5886 -> 15 0 24 4391 topology 4626 5887 -> 16 0 24 4391 topology 4627 5887 -> 15 0 24 4391 topology 4464 5888 -> 16 0 24 4391 topology 4466 5888 -> 15 0 24 4391 topology 4572 5889 -> 16 0 24 4391 topology 4574 5889 -> 15 0 23 4391 topology 4424 5890 +> 15 0 23 4391 topology 4606 5883 +> 16 0 23 4391 topology 4633 5883 +> 15 0 23 4391 topology 4610 5884 +> 16 0 23 4391 topology 4633 5884 +> 15 0 23 4391 topology 4609 5885 +> 16 0 23 4391 topology 4633 5885 +> 15 0 23 4391 topology 4613 5886 +> 16 0 23 4391 topology 4633 5886 +> 15 0 23 4391 topology 4612 5887 +> 16 0 23 4391 topology 4633 5887 +> 15 0 23 4391 topology 4616 5888 +> 16 0 23 4391 topology 4633 5888 +> 15 0 23 4391 topology 4615 5889 +> 16 0 23 4391 topology 4633 5889 +> 15 0 23 4391 topology 4619 5890 > 16 0 23 4391 topology 4633 5890 -> 15 0 23 4391 topology 4408 5891 +> 15 0 23 4391 topology 4618 5891 > 16 0 23 4391 topology 4633 5891 -> 15 0 24 4391 topology 4467 5892 -> 16 0 24 4391 topology 4469 5892 -> 15 0 24 4391 topology 4575 5893 -> 16 0 24 4391 topology 4577 5893 -> 15 0 23 4391 topology 4460 5894 +> 15 0 23 4391 topology 4622 5892 +> 16 0 23 4391 topology 4633 5892 +> 15 0 23 4391 topology 4621 5893 +> 16 0 23 4391 topology 4633 5893 +> 15 0 23 4391 topology 4625 5894 > 16 0 23 4391 topology 4633 5894 -> 15 0 24 4391 topology 4470 5895 -> 16 0 24 4391 topology 4472 5895 -> 15 0 24 4391 topology 4578 5896 -> 16 0 24 4391 topology 4580 5896 -> 15 0 23 4391 topology 4544 5897 +> 15 0 23 4391 topology 4624 5895 +> 16 0 23 4391 topology 4633 5895 +> 15 0 23 4391 topology 4628 5896 +> 16 0 23 4391 topology 4633 5896 +> 15 0 23 4391 topology 4627 5897 > 16 0 23 4391 topology 4633 5897 -> 15 0 24 4391 topology 4473 5898 -> 16 0 24 4391 topology 4475 5898 -> 15 0 24 4391 topology 4581 5899 -> 16 0 24 4391 topology 4583 5899 -> 15 0 23 4391 topology 4496 5900 +> 15 0 23 4391 topology 4412 5898 +> 16 0 23 4391 topology 4633 5898 +> 15 0 23 4391 topology 4411 5899 +> 16 0 23 4391 topology 4633 5899 +> 15 0 23 4391 topology 4631 5900 > 16 0 23 4391 topology 4633 5900 -> 15 0 24 4391 topology 4476 5901 -> 16 0 24 4391 topology 4478 5901 -> 15 0 23 4391 topology 4580 5902 +> 15 0 23 4391 topology 4630 5901 +> 16 0 23 4391 topology 4633 5901 +> 15 0 23 4391 topology 4415 5902 > 16 0 23 4391 topology 4633 5902 -> 15 0 24 4391 topology 4584 5903 -> 16 0 24 4391 topology 4586 5903 -> 15 0 23 4391 topology 4448 5904 +> 15 0 23 4391 topology 4414 5903 +> 16 0 23 4391 topology 4633 5903 +> 15 0 23 4391 topology 4418 5904 > 16 0 23 4391 topology 4633 5904 -> 15 0 23 4391 topology 4532 5905 +> 15 0 23 4391 topology 4417 5905 > 16 0 23 4391 topology 4633 5905 -> 15 0 24 4391 topology 4587 5906 -> 16 0 24 4391 topology 4589 5906 -> 15 0 24 4391 topology 4407 5907 -> 16 0 24 4391 topology 4408 5907 -> 15 0 23 4391 topology 4616 5908 -> 16 0 23 4391 topology 4633 5908 -> 15 0 24 4391 topology 4590 5909 -> 16 0 24 4391 topology 4592 5909 -> 15 0 23 4391 topology 4420 5910 -> 16 0 23 4391 topology 4633 5910 -> 15 0 23 4391 topology 4568 5911 -> 16 0 23 4391 topology 4633 5911 -> 15 0 24 4391 topology 4593 5912 -> 16 0 24 4391 topology 4595 5912 -> 15 0 23 4391 topology 4480 5913 -> 16 0 23 4391 topology 4633 5913 -> 15 0 24 4391 topology 4596 5914 -> 16 0 24 4391 topology 4598 5914 -> 15 0 23 4391 topology 4540 5915 -> 16 0 23 4391 topology 4633 5915 -> 15 0 23 4391 topology 4397 5916 -> 16 0 23 4391 topology 4633 5916 -> 15 0 23 4391 topology 4462 5917 -> 16 0 23 4391 topology 4633 5917 -> 15 0 23 4391 topology 4600 5918 -> 16 0 23 4391 topology 4633 5918 -> 15 0 23 4391 topology 4522 5919 -> 16 0 23 4391 topology 4633 5919 -> 15 0 24 4391 topology 4392 5920 -> 16 0 24 4391 topology 4394 5920 -> 15 0 23 4391 topology 4444 5921 -> 16 0 23 4391 topology 4633 5921 -> 15 0 23 4391 topology 4582 5922 -> 16 0 23 4391 topology 4633 5922 -> 15 0 23 4391 topology 4504 5923 -> 16 0 23 4391 topology 4633 5923 -> 15 0 23 4391 topology 4564 5924 -> 16 0 23 4391 topology 4633 5924 -> 15 0 23 4391 topology 4624 5925 -> 16 0 23 4391 topology 4633 5925 -> 15 0 23 4391 topology 4393 5926 -> 16 0 23 4391 topology 4633 5926 -> 15 0 23 4391 topology 4451 5927 -> 16 0 23 4391 topology 4633 5927 -> 15 0 24 4391 topology 4419 5928 -> 16 0 24 4391 topology 4420 5928 -> 15 0 24 4391 topology 4449 5929 -> 16 0 24 4391 topology 4450 5929 -> 15 0 23 4391 topology 4487 5930 -> 16 0 23 4391 topology 4633 5930 -> 15 0 24 4391 topology 4416 5931 -> 16 0 24 4391 topology 4418 5931 -> 15 0 24 4391 topology 4479 5932 -> 16 0 24 4391 topology 4480 5932 -> 15 0 23 4391 topology 4417 5933 -> 16 0 23 4391 topology 4633 5933 -> 15 0 24 4391 topology 4398 5934 -> 16 0 24 4391 topology 4399 5934 -> 15 0 23 4391 topology 4571 5935 -> 16 0 23 4391 topology 4633 5935 -> 15 0 23 4391 topology 4439 5936 -> 16 0 23 4391 topology 4633 5936 -> 15 0 23 4391 topology 4523 5937 -> 16 0 23 4391 topology 4633 5937 -> 15 0 24 4391 topology 4509 5938 -> 16 0 24 4391 topology 4510 5938 -> 15 0 23 4391 topology 4607 5939 -> 16 0 23 4391 topology 4633 5939 -> 15 0 24 4391 topology 4539 5940 -> 16 0 24 4391 topology 4540 5940 -> 15 0 23 4391 topology 4475 5941 -> 16 0 23 4391 topology 4633 5941 -> 15 0 24 4391 topology 4431 5942 -> 16 0 24 4391 topology 4432 5942 -> 15 0 23 4391 topology 4559 5943 -> 16 0 23 4391 topology 4633 5943 -> 15 0 24 4391 topology 4461 5944 -> 16 0 24 4391 topology 4462 5944 -> 15 0 24 4391 topology 4569 5945 -> 16 0 24 4391 topology 4570 5945 -> 15 0 24 4391 topology 4491 5946 -> 16 0 24 4391 topology 4492 5946 -> 15 0 23 4391 topology 4595 5947 -> 16 0 23 4391 topology 4633 5947 -> 15 0 24 4391 topology 4599 5948 -> 16 0 24 4391 topology 4600 5948 -> 15 0 24 4391 topology 4521 5949 -> 16 0 24 4391 topology 4522 5949 -> 15 0 24 4391 topology 4629 5950 -> 16 0 24 4391 topology 4630 5950 -> 15 0 23 4391 topology 4429 5951 -> 16 0 23 4391 topology 4633 5951 -> 15 0 24 4391 topology 4551 5952 -> 16 0 24 4391 topology 4552 5952 -> 15 0 24 4391 topology 4443 5953 -> 16 0 24 4391 topology 4444 5953 -> 15 0 23 4391 topology 4489 5954 -> 16 0 23 4391 topology 4633 5954 -> 15 0 24 4391 topology 4473 5955 -> 16 0 24 4391 topology 4474 5955 -> 15 0 24 4391 topology 4581 5956 -> 16 0 24 4391 topology 4582 5956 -> 15 0 23 4391 topology 4549 5957 -> 16 0 23 4391 topology 4633 5957 -> 15 0 24 4391 topology 4503 5958 -> 16 0 24 4391 topology 4504 5958 -> 15 0 23 4391 topology 4471 5959 -> 16 0 23 4391 topology 4633 5959 -> 15 0 24 4391 topology 4611 5960 -> 16 0 24 4391 topology 4612 5960 -> 15 0 23 4391 topology 4412 5961 -> 16 0 23 4391 topology 4633 5961 -> 15 0 23 4391 topology 4609 5962 -> 16 0 23 4391 topology 4633 5962 -> 15 0 24 4391 topology 4533 5963 -> 16 0 24 4391 topology 4534 5963 -> 15 0 23 4391 topology 4531 5964 -> 16 0 23 4391 topology 4633 5964 -> 15 0 24 4391 topology 4479 5965 -> 16 0 24 4391 topology 4481 5965 -> 15 0 24 4391 topology 4563 5966 -> 16 0 24 4391 topology 4564 5966 -> 15 0 23 4391 topology 4591 5967 -> 16 0 23 4391 topology 4633 5967 -> 15 0 24 4391 topology 4482 5968 -> 16 0 24 4391 topology 4484 5968 -> 15 0 24 4391 topology 4593 5969 -> 16 0 24 4391 topology 4594 5969 -> 15 0 24 4391 topology 4485 5970 -> 16 0 24 4391 topology 4487 5970 -> 15 0 24 4391 topology 4623 5971 -> 16 0 24 4391 topology 4624 5971 -> 15 0 24 4391 topology 4488 5972 -> 16 0 24 4391 topology 4490 5972 -> 15 0 25 4391 topology 4632 5973 -> 16 0 25 4391 topology 4633 5973 -> 15 0 24 4391 topology 4491 5974 -> 16 0 24 4391 topology 4493 5974 -> 15 0 23 4391 topology 4402 5975 -> 16 0 23 4391 topology 4633 5975 -> 15 0 24 4391 topology 4599 5976 -> 16 0 24 4391 topology 4601 5976 -> 15 0 24 4391 topology 4494 5977 -> 16 0 24 4391 topology 4496 5977 -> 15 0 24 4391 topology 4413 5978 -> 16 0 24 4391 topology 4415 5978 -> 15 0 24 4391 topology 4602 5979 -> 16 0 24 4391 topology 4604 5979 -> 15 0 23 4391 topology 4430 5980 -> 16 0 23 4391 topology 4633 5980 -> 15 0 23 4391 topology 4514 5981 -> 16 0 23 4391 topology 4633 5981 -> 15 0 24 4391 topology 4497 5982 -> 16 0 24 4391 topology 4499 5982 -> 15 0 24 4391 topology 4605 5983 -> 16 0 24 4391 topology 4607 5983 -> 15 0 24 4391 topology 4500 5984 -> 16 0 24 4391 topology 4502 5984 -> 15 0 23 4391 topology 4466 5985 -> 16 0 23 4391 topology 4633 5985 -> 15 0 24 4391 topology 4608 5986 -> 16 0 24 4391 topology 4610 5986 -> 15 0 23 4391 topology 4550 5987 -> 16 0 23 4391 topology 4633 5987 -> 15 0 24 4391 topology 4503 5988 -> 16 0 24 4391 topology 4505 5988 -> 15 0 24 4391 topology 4611 5989 -> 16 0 24 4391 topology 4613 5989 -> 15 0 23 4391 topology 4502 5990 -> 16 0 23 4391 topology 4633 5990 -> 15 0 24 4391 topology 4506 5991 -> 16 0 24 4391 topology 4508 5991 -> 15 0 23 4391 topology 4586 5992 -> 16 0 23 4391 topology 4633 5992 -> 15 0 24 4391 topology 4614 5993 -> 16 0 24 4391 topology 4616 5993 -> 15 0 23 4391 topology 4538 5994 -> 16 0 23 4391 topology 4633 5994 -> 15 0 24 4391 topology 4617 5995 -> 16 0 24 4391 topology 4619 5995 -> 15 0 23 4391 topology 4622 5996 -> 16 0 23 4391 topology 4633 5996 -> 15 0 24 4391 topology 4620 5997 -> 16 0 24 4391 topology 4622 5997 -> 15 0 24 4391 topology 4413 5998 -> 16 0 24 4391 topology 4414 5998 -> 15 0 23 4391 topology 4456 5999 -> 16 0 23 4391 topology 4633 5999 -> 15 0 24 4391 topology 4623 6000 -> 16 0 24 4391 topology 4625 6000 -> 15 0 23 4391 topology 4516 6001 -> 16 0 23 4391 topology 4633 6001 -> 15 0 24 4391 topology 4626 6002 -> 16 0 24 4391 topology 4628 6002 -> 15 0 23 4391 topology 4438 6003 -> 16 0 23 4391 topology 4633 6003 -> 15 0 23 4391 topology 4403 6004 -> 16 0 23 4391 topology 4633 6004 -> 15 0 23 4391 topology 4576 6005 -> 16 0 23 4391 topology 4633 6005 -> 15 0 23 4391 topology 4498 6006 -> 16 0 23 4391 topology 4633 6006 -> 15 0 23 4391 topology 4558 6007 -> 16 0 23 4391 topology 4633 6007 -> 15 0 23 4391 topology 4618 6008 -> 16 0 23 4391 topology 4633 6008 -> 15 0 23 4391 topology 4421 6009 -> 16 0 23 4391 topology 4633 6009 -> 15 0 24 4391 topology 4410 6010 -> 16 0 24 4391 topology 4412 6010 -> 15 0 23 4391 topology 4457 6011 -> 16 0 23 4391 topology 4633 6011 -> 15 0 23 4391 topology 4411 6012 -> 16 0 23 4391 topology 4633 6012 -> 15 0 23 4391 topology 4541 6013 -> 16 0 23 4391 topology 4633 6013 -> 15 0 23 4391 topology 4493 6014 -> 16 0 23 4391 topology 4633 6014 -> 15 0 24 4391 topology 4428 6015 -> 16 0 24 4391 topology 4429 6015 -> 15 0 23 4391 topology 4577 6016 -> 16 0 23 4391 topology 4633 6016 -> 15 0 23 4391 topology 4445 6017 -> 16 0 23 4391 topology 4633 6017 -> 15 0 23 4391 topology 4529 6018 -> 16 0 23 4391 topology 4633 6018 -> 15 0 24 4391 topology 4458 6019 -> 16 0 24 4391 topology 4459 6019 -> 15 0 24 4391 topology 4404 6020 -> 16 0 24 4391 topology 4405 6020 -> 15 0 23 4391 topology 4613 6021 -> 16 0 23 4391 topology 4633 6021 -> 15 0 24 4391 topology 4488 6022 -> 16 0 24 4391 topology 4489 6022 -> 15 0 23 4391 topology 4565 6023 -> 16 0 23 4391 topology 4633 6023 -> 15 0 24 4391 topology 4518 6024 -> 16 0 24 4391 topology 4519 6024 -> 15 0 23 4391 topology 4423 6025 -> 16 0 23 4391 topology 4633 6025 -> 15 0 24 4391 topology 4548 6026 -> 16 0 24 4391 topology 4549 6026 -> 15 0 24 4391 topology 4440 6027 -> 16 0 24 4391 topology 4441 6027 -> 15 0 23 4391 topology 4483 6028 -> 16 0 23 4391 topology 4633 6028 -> 15 0 23 4391 topology 4394 6029 -> 16 0 23 4391 topology 4633 6029 -> 15 0 24 4391 topology 4470 6030 -> 16 0 24 4391 topology 4471 6030 -> 15 0 24 4391 topology 4578 6031 -> 16 0 24 4391 topology 4579 6031 -> 15 0 23 4391 topology 4543 6032 -> 16 0 23 4391 topology 4633 6032 -> 15 0 24 4391 topology 4500 6033 -> 16 0 24 4391 topology 4501 6033 -> 15 0 23 4391 topology 4465 6034 -> 16 0 23 4391 topology 4633 6034 -> 15 0 24 4391 topology 4608 6035 -> 16 0 24 4391 topology 4609 6035 -> 15 0 23 4391 topology 4603 6036 -> 16 0 23 4391 topology 4633 6036 -> 15 0 24 4391 topology 4530 6037 -> 16 0 24 4391 topology 4531 6037 -> 15 0 23 4391 topology 4525 6038 -> 16 0 23 4391 topology 4633 6038 -> 15 0 23 4391 topology 4447 6039 -> 16 0 23 4391 topology 4633 6039 -> 15 0 24 4391 topology 4560 6040 -> 16 0 24 4391 topology 4561 6040 -> 15 0 23 4391 topology 4585 6041 -> 16 0 23 4391 topology 4633 6041 -> 15 0 23 4391 topology 4507 6042 -> 16 0 23 4391 topology 4633 6042 -> 15 0 23 4391 topology 4418 6043 -> 16 0 23 4391 topology 4633 6043 -> 15 0 24 4391 topology 4590 6044 -> 16 0 24 4391 topology 4591 6044 -> 15 0 24 4391 topology 4509 6045 -> 16 0 24 4391 topology 4511 6045 -> 15 0 23 4391 topology 4567 6046 -> 16 0 23 4391 topology 4633 6046 -> 15 0 24 4391 topology 4620 6047 -> 16 0 24 4391 topology 4621 6047 -> 15 0 24 4391 topology 4512 6048 -> 16 0 24 4391 topology 4514 6048 -> 15 0 23 4391 topology 4627 6049 -> 16 0 23 4391 topology 4633 6049 -> 15 0 24 4391 topology 4515 6050 -> 16 0 24 4391 topology 4517 6050 -> 15 0 24 4391 topology 4407 6051 -> 16 0 24 4391 topology 4409 6051 -> 15 0 23 4391 topology 4396 6052 -> 16 0 23 4391 topology 4633 6052 -> 15 0 24 4391 topology 4518 6053 -> 16 0 24 4391 topology 4520 6053 -> 15 0 24 4391 topology 4521 6054 -> 16 0 24 4391 topology 4523 6054 -> 15 0 24 4391 topology 4629 6055 -> 16 0 24 4391 topology 4631 6055 -> 15 0 23 4391 topology 4484 6056 -> 16 0 23 4391 topology 4633 6056 -> 15 0 24 4391 topology 4395 6057 -> 16 0 24 4391 topology 4396 6057 -> 15 0 24 4391 topology 4524 6058 -> 16 0 24 4391 topology 4526 6058 -> 15 0 23 4391 topology 4436 6059 -> 16 0 23 4391 topology 4633 6059 -> 15 0 24 4391 topology 4527 6060 -> 16 0 24 4391 topology 4529 6060 -> 15 0 23 4391 topology 4520 6061 -> 16 0 23 4391 topology 4633 6061 -> 15 0 23 4391 topology 4604 6062 -> 16 0 23 4391 topology 4633 6062 -> 15 0 24 4391 topology 4530 6063 -> 16 0 24 4391 topology 4532 6063 -> 15 0 23 4391 topology 4472 6064 -> 16 0 23 4391 topology 4633 6064 -> 15 0 23 4391 topology 4556 6065 -> 16 0 23 4391 topology 4633 6065 -> 15 0 24 4391 topology 4533 6066 -> 16 0 24 4391 topology 4535 6066 -> 15 0 24 4635 topology 4669 6067 -> 16 0 24 4635 topology 4670 6067 -> 15 0 23 4635 topology 4680 6068 +> 15 0 24 4391 topology 4632 5906 +> 16 0 24 4391 topology 4633 5906 +> 15 0 25 4391 topology 4419 5907 +> 16 0 25 4391 topology 4421 5907 +> 15 0 25 4391 topology 4419 5908 +> 16 0 25 4391 topology 4420 5908 +> 15 0 25 4391 topology 4422 5909 +> 16 0 25 4391 topology 4424 5909 +> 15 0 25 4391 topology 4422 5910 +> 16 0 25 4391 topology 4423 5910 +> 15 0 25 4391 topology 4425 5911 +> 16 0 25 4391 topology 4427 5911 +> 15 0 25 4391 topology 4425 5912 +> 16 0 25 4391 topology 4426 5912 +> 15 0 25 4391 topology 4428 5913 +> 16 0 25 4391 topology 4430 5913 +> 15 0 25 4391 topology 4428 5914 +> 16 0 25 4391 topology 4429 5914 +> 15 0 25 4391 topology 4431 5915 +> 16 0 25 4391 topology 4433 5915 +> 15 0 25 4391 topology 4431 5916 +> 16 0 25 4391 topology 4432 5916 +> 15 0 25 4391 topology 4434 5917 +> 16 0 25 4391 topology 4436 5917 +> 15 0 25 4391 topology 4434 5918 +> 16 0 25 4391 topology 4435 5918 +> 15 0 25 4391 topology 4437 5919 +> 16 0 25 4391 topology 4439 5919 +> 15 0 25 4391 topology 4437 5920 +> 16 0 25 4391 topology 4438 5920 +> 15 0 25 4391 topology 4440 5921 +> 16 0 25 4391 topology 4442 5921 +> 15 0 25 4391 topology 4440 5922 +> 16 0 25 4391 topology 4441 5922 +> 15 0 25 4391 topology 4443 5923 +> 16 0 25 4391 topology 4445 5923 +> 15 0 25 4391 topology 4443 5924 +> 16 0 25 4391 topology 4444 5924 +> 15 0 25 4391 topology 4446 5925 +> 16 0 25 4391 topology 4448 5925 +> 15 0 25 4391 topology 4446 5926 +> 16 0 25 4391 topology 4447 5926 +> 15 0 25 4391 topology 4392 5927 +> 16 0 25 4391 topology 4394 5927 +> 15 0 25 4391 topology 4392 5928 +> 16 0 25 4391 topology 4393 5928 +> 15 0 25 4391 topology 4449 5929 +> 16 0 25 4391 topology 4451 5929 +> 15 0 25 4391 topology 4449 5930 +> 16 0 25 4391 topology 4450 5930 +> 15 0 25 4391 topology 4452 5931 +> 16 0 25 4391 topology 4454 5931 +> 15 0 25 4391 topology 4452 5932 +> 16 0 25 4391 topology 4453 5932 +> 15 0 25 4391 topology 4455 5933 +> 16 0 25 4391 topology 4457 5933 +> 15 0 25 4391 topology 4455 5934 +> 16 0 25 4391 topology 4456 5934 +> 15 0 25 4391 topology 4458 5935 +> 16 0 25 4391 topology 4460 5935 +> 15 0 25 4391 topology 4458 5936 +> 16 0 25 4391 topology 4459 5936 +> 15 0 25 4391 topology 4461 5937 +> 16 0 25 4391 topology 4463 5937 +> 15 0 25 4391 topology 4461 5938 +> 16 0 25 4391 topology 4462 5938 +> 15 0 25 4391 topology 4464 5939 +> 16 0 25 4391 topology 4466 5939 +> 15 0 25 4391 topology 4464 5940 +> 16 0 25 4391 topology 4465 5940 +> 15 0 25 4391 topology 4467 5941 +> 16 0 25 4391 topology 4469 5941 +> 15 0 25 4391 topology 4467 5942 +> 16 0 25 4391 topology 4468 5942 +> 15 0 25 4391 topology 4470 5943 +> 16 0 25 4391 topology 4472 5943 +> 15 0 25 4391 topology 4470 5944 +> 16 0 25 4391 topology 4471 5944 +> 15 0 25 4391 topology 4473 5945 +> 16 0 25 4391 topology 4475 5945 +> 15 0 25 4391 topology 4473 5946 +> 16 0 25 4391 topology 4474 5946 +> 15 0 25 4391 topology 4476 5947 +> 16 0 25 4391 topology 4478 5947 +> 15 0 25 4391 topology 4476 5948 +> 16 0 25 4391 topology 4477 5948 +> 15 0 25 4391 topology 4395 5949 +> 16 0 25 4391 topology 4397 5949 +> 15 0 25 4391 topology 4395 5950 +> 16 0 25 4391 topology 4396 5950 +> 15 0 25 4391 topology 4479 5951 +> 16 0 25 4391 topology 4481 5951 +> 15 0 25 4391 topology 4479 5952 +> 16 0 25 4391 topology 4480 5952 +> 15 0 25 4391 topology 4482 5953 +> 16 0 25 4391 topology 4484 5953 +> 15 0 25 4391 topology 4482 5954 +> 16 0 25 4391 topology 4483 5954 +> 15 0 25 4391 topology 4485 5955 +> 16 0 25 4391 topology 4487 5955 +> 15 0 25 4391 topology 4485 5956 +> 16 0 25 4391 topology 4486 5956 +> 15 0 25 4391 topology 4488 5957 +> 16 0 25 4391 topology 4490 5957 +> 15 0 25 4391 topology 4488 5958 +> 16 0 25 4391 topology 4489 5958 +> 15 0 25 4391 topology 4491 5959 +> 16 0 25 4391 topology 4493 5959 +> 15 0 25 4391 topology 4491 5960 +> 16 0 25 4391 topology 4492 5960 +> 15 0 25 4391 topology 4494 5961 +> 16 0 25 4391 topology 4496 5961 +> 15 0 25 4391 topology 4494 5962 +> 16 0 25 4391 topology 4495 5962 +> 15 0 25 4391 topology 4497 5963 +> 16 0 25 4391 topology 4499 5963 +> 15 0 25 4391 topology 4497 5964 +> 16 0 25 4391 topology 4498 5964 +> 15 0 25 4391 topology 4500 5965 +> 16 0 25 4391 topology 4502 5965 +> 15 0 25 4391 topology 4500 5966 +> 16 0 25 4391 topology 4501 5966 +> 15 0 25 4391 topology 4503 5967 +> 16 0 25 4391 topology 4505 5967 +> 15 0 25 4391 topology 4503 5968 +> 16 0 25 4391 topology 4504 5968 +> 15 0 25 4391 topology 4506 5969 +> 16 0 25 4391 topology 4508 5969 +> 15 0 25 4391 topology 4506 5970 +> 16 0 25 4391 topology 4507 5970 +> 15 0 25 4391 topology 4398 5971 +> 16 0 25 4391 topology 4400 5971 +> 15 0 25 4391 topology 4398 5972 +> 16 0 25 4391 topology 4399 5972 +> 15 0 25 4391 topology 4509 5973 +> 16 0 25 4391 topology 4511 5973 +> 15 0 25 4391 topology 4509 5974 +> 16 0 25 4391 topology 4510 5974 +> 15 0 25 4391 topology 4512 5975 +> 16 0 25 4391 topology 4514 5975 +> 15 0 25 4391 topology 4512 5976 +> 16 0 25 4391 topology 4513 5976 +> 15 0 25 4391 topology 4515 5977 +> 16 0 25 4391 topology 4517 5977 +> 15 0 25 4391 topology 4515 5978 +> 16 0 25 4391 topology 4516 5978 +> 15 0 25 4391 topology 4518 5979 +> 16 0 25 4391 topology 4520 5979 +> 15 0 25 4391 topology 4518 5980 +> 16 0 25 4391 topology 4519 5980 +> 15 0 25 4391 topology 4521 5981 +> 16 0 25 4391 topology 4523 5981 +> 15 0 25 4391 topology 4521 5982 +> 16 0 25 4391 topology 4522 5982 +> 15 0 25 4391 topology 4524 5983 +> 16 0 25 4391 topology 4526 5983 +> 15 0 25 4391 topology 4524 5984 +> 16 0 25 4391 topology 4525 5984 +> 15 0 25 4391 topology 4527 5985 +> 16 0 25 4391 topology 4529 5985 +> 15 0 25 4391 topology 4527 5986 +> 16 0 25 4391 topology 4528 5986 +> 15 0 25 4391 topology 4530 5987 +> 16 0 25 4391 topology 4532 5987 +> 15 0 25 4391 topology 4530 5988 +> 16 0 25 4391 topology 4531 5988 +> 15 0 25 4391 topology 4533 5989 +> 16 0 25 4391 topology 4535 5989 +> 15 0 25 4391 topology 4533 5990 +> 16 0 25 4391 topology 4534 5990 +> 15 0 25 4391 topology 4536 5991 +> 16 0 25 4391 topology 4538 5991 +> 15 0 25 4391 topology 4536 5992 +> 16 0 25 4391 topology 4537 5992 +> 15 0 25 4391 topology 4401 5993 +> 16 0 25 4391 topology 4403 5993 +> 15 0 25 4391 topology 4401 5994 +> 16 0 25 4391 topology 4402 5994 +> 15 0 25 4391 topology 4539 5995 +> 16 0 25 4391 topology 4541 5995 +> 15 0 25 4391 topology 4539 5996 +> 16 0 25 4391 topology 4540 5996 +> 15 0 25 4391 topology 4542 5997 +> 16 0 25 4391 topology 4544 5997 +> 15 0 25 4391 topology 4542 5998 +> 16 0 25 4391 topology 4543 5998 +> 15 0 25 4391 topology 4545 5999 +> 16 0 25 4391 topology 4547 5999 +> 15 0 25 4391 topology 4545 6000 +> 16 0 25 4391 topology 4546 6000 +> 15 0 25 4391 topology 4548 6001 +> 16 0 25 4391 topology 4550 6001 +> 15 0 25 4391 topology 4548 6002 +> 16 0 25 4391 topology 4549 6002 +> 15 0 25 4391 topology 4551 6003 +> 16 0 25 4391 topology 4553 6003 +> 15 0 25 4391 topology 4551 6004 +> 16 0 25 4391 topology 4552 6004 +> 15 0 25 4391 topology 4554 6005 +> 16 0 25 4391 topology 4556 6005 +> 15 0 25 4391 topology 4554 6006 +> 16 0 25 4391 topology 4555 6006 +> 15 0 25 4391 topology 4557 6007 +> 16 0 25 4391 topology 4559 6007 +> 15 0 25 4391 topology 4557 6008 +> 16 0 25 4391 topology 4558 6008 +> 15 0 25 4391 topology 4560 6009 +> 16 0 25 4391 topology 4562 6009 +> 15 0 25 4391 topology 4560 6010 +> 16 0 25 4391 topology 4561 6010 +> 15 0 25 4391 topology 4563 6011 +> 16 0 25 4391 topology 4565 6011 +> 15 0 25 4391 topology 4563 6012 +> 16 0 25 4391 topology 4564 6012 +> 15 0 25 4391 topology 4566 6013 +> 16 0 25 4391 topology 4568 6013 +> 15 0 25 4391 topology 4566 6014 +> 16 0 25 4391 topology 4567 6014 +> 15 0 25 4391 topology 4404 6015 +> 16 0 25 4391 topology 4406 6015 +> 15 0 25 4391 topology 4404 6016 +> 16 0 25 4391 topology 4405 6016 +> 15 0 25 4391 topology 4569 6017 +> 16 0 25 4391 topology 4571 6017 +> 15 0 25 4391 topology 4569 6018 +> 16 0 25 4391 topology 4570 6018 +> 15 0 25 4391 topology 4572 6019 +> 16 0 25 4391 topology 4574 6019 +> 15 0 25 4391 topology 4572 6020 +> 16 0 25 4391 topology 4573 6020 +> 15 0 25 4391 topology 4575 6021 +> 16 0 25 4391 topology 4577 6021 +> 15 0 25 4391 topology 4575 6022 +> 16 0 25 4391 topology 4576 6022 +> 15 0 25 4391 topology 4578 6023 +> 16 0 25 4391 topology 4580 6023 +> 15 0 25 4391 topology 4578 6024 +> 16 0 25 4391 topology 4579 6024 +> 15 0 25 4391 topology 4581 6025 +> 16 0 25 4391 topology 4583 6025 +> 15 0 25 4391 topology 4581 6026 +> 16 0 25 4391 topology 4582 6026 +> 15 0 25 4391 topology 4584 6027 +> 16 0 25 4391 topology 4586 6027 +> 15 0 25 4391 topology 4584 6028 +> 16 0 25 4391 topology 4585 6028 +> 15 0 25 4391 topology 4587 6029 +> 16 0 25 4391 topology 4589 6029 +> 15 0 25 4391 topology 4587 6030 +> 16 0 25 4391 topology 4588 6030 +> 15 0 25 4391 topology 4590 6031 +> 16 0 25 4391 topology 4592 6031 +> 15 0 25 4391 topology 4590 6032 +> 16 0 25 4391 topology 4591 6032 +> 15 0 25 4391 topology 4593 6033 +> 16 0 25 4391 topology 4595 6033 +> 15 0 25 4391 topology 4593 6034 +> 16 0 25 4391 topology 4594 6034 +> 15 0 25 4391 topology 4596 6035 +> 16 0 25 4391 topology 4598 6035 +> 15 0 25 4391 topology 4596 6036 +> 16 0 25 4391 topology 4597 6036 +> 15 0 25 4391 topology 4407 6037 +> 16 0 25 4391 topology 4409 6037 +> 15 0 25 4391 topology 4407 6038 +> 16 0 25 4391 topology 4408 6038 +> 15 0 25 4391 topology 4599 6039 +> 16 0 25 4391 topology 4601 6039 +> 15 0 25 4391 topology 4599 6040 +> 16 0 25 4391 topology 4600 6040 +> 15 0 25 4391 topology 4602 6041 +> 16 0 25 4391 topology 4604 6041 +> 15 0 25 4391 topology 4602 6042 +> 16 0 25 4391 topology 4603 6042 +> 15 0 25 4391 topology 4605 6043 +> 16 0 25 4391 topology 4607 6043 +> 15 0 25 4391 topology 4605 6044 +> 16 0 25 4391 topology 4606 6044 +> 15 0 25 4391 topology 4608 6045 +> 16 0 25 4391 topology 4610 6045 +> 15 0 25 4391 topology 4608 6046 +> 16 0 25 4391 topology 4609 6046 +> 15 0 25 4391 topology 4611 6047 +> 16 0 25 4391 topology 4613 6047 +> 15 0 25 4391 topology 4611 6048 +> 16 0 25 4391 topology 4612 6048 +> 15 0 25 4391 topology 4614 6049 +> 16 0 25 4391 topology 4616 6049 +> 15 0 25 4391 topology 4614 6050 +> 16 0 25 4391 topology 4615 6050 +> 15 0 25 4391 topology 4617 6051 +> 16 0 25 4391 topology 4619 6051 +> 15 0 25 4391 topology 4617 6052 +> 16 0 25 4391 topology 4618 6052 +> 15 0 25 4391 topology 4620 6053 +> 16 0 25 4391 topology 4622 6053 +> 15 0 25 4391 topology 4620 6054 +> 16 0 25 4391 topology 4621 6054 +> 15 0 25 4391 topology 4623 6055 +> 16 0 25 4391 topology 4625 6055 +> 15 0 25 4391 topology 4623 6056 +> 16 0 25 4391 topology 4624 6056 +> 15 0 25 4391 topology 4626 6057 +> 16 0 25 4391 topology 4628 6057 +> 15 0 25 4391 topology 4626 6058 +> 16 0 25 4391 topology 4627 6058 +> 15 0 25 4391 topology 4410 6059 +> 16 0 25 4391 topology 4412 6059 +> 15 0 25 4391 topology 4410 6060 +> 16 0 25 4391 topology 4411 6060 +> 15 0 25 4391 topology 4629 6061 +> 16 0 25 4391 topology 4631 6061 +> 15 0 25 4391 topology 4629 6062 +> 16 0 25 4391 topology 4630 6062 +> 15 0 25 4391 topology 4413 6063 +> 16 0 25 4391 topology 4415 6063 +> 15 0 25 4391 topology 4413 6064 +> 16 0 25 4391 topology 4414 6064 +> 15 0 25 4391 topology 4416 6065 +> 16 0 25 4391 topology 4418 6065 +> 15 0 25 4391 topology 4416 6066 +> 16 0 25 4391 topology 4417 6066 +> 15 0 23 4635 topology 4665 6067 +> 16 0 23 4635 topology 4793 6067 +> 15 0 23 4635 topology 4664 6068 > 16 0 23 4635 topology 4793 6068 -> 15 0 23 4635 topology 4764 6069 +> 15 0 23 4635 topology 4668 6069 > 16 0 23 4635 topology 4793 6069 -> 15 0 24 4635 topology 4672 6070 -> 16 0 24 4635 topology 4673 6070 -> 15 0 23 4635 topology 4716 6071 +> 15 0 23 4635 topology 4667 6070 +> 16 0 23 4635 topology 4793 6070 +> 15 0 23 4635 topology 4671 6071 > 16 0 23 4635 topology 4793 6071 -> 15 0 24 4635 topology 4675 6072 -> 16 0 24 4635 topology 4676 6072 -> 15 0 24 4635 topology 4783 6073 -> 16 0 24 4635 topology 4784 6073 -> 15 0 24 4635 topology 4651 6074 -> 16 0 24 4635 topology 4652 6074 -> 15 0 24 4635 topology 4678 6075 -> 16 0 24 4635 topology 4679 6075 -> 15 0 23 4635 topology 4752 6076 +> 15 0 23 4635 topology 4670 6072 +> 16 0 23 4635 topology 4793 6072 +> 15 0 23 4635 topology 4674 6073 +> 16 0 23 4635 topology 4793 6073 +> 15 0 23 4635 topology 4673 6074 +> 16 0 23 4635 topology 4793 6074 +> 15 0 23 4635 topology 4677 6075 +> 16 0 23 4635 topology 4793 6075 +> 15 0 23 4635 topology 4676 6076 > 16 0 23 4635 topology 4793 6076 -> 15 0 24 4635 topology 4786 6077 -> 16 0 24 4635 topology 4787 6077 -> 15 0 23 4635 topology 4664 6078 +> 15 0 23 4635 topology 4680 6077 +> 16 0 23 4635 topology 4793 6077 +> 15 0 23 4635 topology 4679 6078 > 16 0 23 4635 topology 4793 6078 -> 15 0 24 4635 topology 4681 6079 -> 16 0 24 4635 topology 4682 6079 -> 15 0 24 4635 topology 4789 6080 -> 16 0 24 4635 topology 4790 6080 -> 15 0 24 4635 topology 4684 6081 -> 16 0 24 4635 topology 4685 6081 -> 15 0 23 4635 topology 4724 6082 +> 15 0 23 4635 topology 4683 6079 +> 16 0 23 4635 topology 4793 6079 +> 15 0 23 4635 topology 4682 6080 +> 16 0 23 4635 topology 4793 6080 +> 15 0 23 4635 topology 4686 6081 +> 16 0 23 4635 topology 4793 6081 +> 15 0 23 4635 topology 4685 6082 > 16 0 23 4635 topology 4793 6082 -> 15 0 24 4635 topology 4687 6083 -> 16 0 24 4635 topology 4688 6083 -> 15 0 23 4635 topology 4784 6084 +> 15 0 23 4635 topology 4689 6083 +> 16 0 23 4635 topology 4793 6083 +> 15 0 23 4635 topology 4688 6084 > 16 0 23 4635 topology 4793 6084 -> 15 0 23 4635 topology 4706 6085 +> 15 0 23 4635 topology 4692 6085 > 16 0 23 4635 topology 4793 6085 -> 15 0 23 4635 topology 4647 6086 +> 15 0 23 4635 topology 4691 6086 > 16 0 23 4635 topology 4793 6086 -> 15 0 24 4635 topology 4690 6087 -> 16 0 24 4635 topology 4691 6087 -> 15 0 24 4635 topology 4663 6088 -> 16 0 24 4635 topology 4665 6088 -> 15 0 23 4635 topology 4766 6089 +> 15 0 23 4635 topology 4638 6087 +> 16 0 23 4635 topology 4793 6087 +> 15 0 23 4635 topology 4637 6088 +> 16 0 23 4635 topology 4793 6088 +> 15 0 23 4635 topology 4695 6089 > 16 0 23 4635 topology 4793 6089 -> 15 0 23 4635 topology 4688 6090 +> 15 0 23 4635 topology 4694 6090 > 16 0 23 4635 topology 4793 6090 -> 15 0 23 4635 topology 4748 6091 +> 15 0 23 4635 topology 4698 6091 > 16 0 23 4635 topology 4793 6091 -> 15 0 24 4635 topology 4723 6092 -> 16 0 24 4635 topology 4725 6092 -> 15 0 24 4635 topology 4699 6093 -> 16 0 24 4635 topology 4701 6093 -> 15 0 24 4635 topology 4675 6094 -> 16 0 24 4635 topology 4677 6094 -> 15 0 24 4635 topology 4783 6095 -> 16 0 24 4635 topology 4785 6095 -> 15 0 24 4635 topology 4759 6096 -> 16 0 24 4635 topology 4761 6096 -> 15 0 23 4635 topology 4643 6097 +> 15 0 23 4635 topology 4697 6092 +> 16 0 23 4635 topology 4793 6092 +> 15 0 23 4635 topology 4701 6093 +> 16 0 23 4635 topology 4793 6093 +> 15 0 23 4635 topology 4700 6094 +> 16 0 23 4635 topology 4793 6094 +> 15 0 23 4635 topology 4704 6095 +> 16 0 23 4635 topology 4793 6095 +> 15 0 23 4635 topology 4703 6096 +> 16 0 23 4635 topology 4793 6096 +> 15 0 23 4635 topology 4707 6097 > 16 0 23 4635 topology 4793 6097 -> 15 0 24 4635 topology 4654 6098 -> 16 0 24 4635 topology 4656 6098 -> 15 0 24 4635 topology 4735 6099 -> 16 0 24 4635 topology 4737 6099 -> 15 0 23 4635 topology 4671 6100 +> 15 0 23 4635 topology 4706 6098 +> 16 0 23 4635 topology 4793 6098 +> 15 0 23 4635 topology 4710 6099 +> 16 0 23 4635 topology 4793 6099 +> 15 0 23 4635 topology 4709 6100 > 16 0 23 4635 topology 4793 6100 -> 15 0 24 4635 topology 4711 6101 -> 16 0 24 4635 topology 4713 6101 -> 15 0 23 4635 topology 4755 6102 +> 15 0 23 4635 topology 4713 6101 +> 16 0 23 4635 topology 4793 6101 +> 15 0 23 4635 topology 4712 6102 > 16 0 23 4635 topology 4793 6102 -> 15 0 24 4635 topology 4687 6103 -> 16 0 24 4635 topology 4689 6103 -> 15 0 23 4635 topology 4707 6104 +> 15 0 23 4635 topology 4716 6103 +> 16 0 23 4635 topology 4793 6103 +> 15 0 23 4635 topology 4715 6104 > 16 0 23 4635 topology 4793 6104 -> 15 0 24 4635 topology 4771 6105 -> 16 0 24 4635 topology 4773 6105 -> 15 0 23 4635 topology 4791 6106 +> 15 0 23 4635 topology 4719 6105 +> 16 0 23 4635 topology 4793 6105 +> 15 0 23 4635 topology 4718 6106 > 16 0 23 4635 topology 4793 6106 -> 15 0 23 4635 topology 4743 6107 +> 15 0 23 4635 topology 4722 6107 > 16 0 23 4635 topology 4793 6107 -> 15 0 24 4635 topology 4747 6108 -> 16 0 24 4635 topology 4749 6108 -> 15 0 24 4635 topology 4648 6109 -> 16 0 24 4635 topology 4649 6109 -> 15 0 23 4635 topology 4779 6110 +> 15 0 23 4635 topology 4721 6108 +> 16 0 23 4635 topology 4793 6108 +> 15 0 23 4635 topology 4641 6109 +> 16 0 23 4635 topology 4793 6109 +> 15 0 23 4635 topology 4640 6110 > 16 0 23 4635 topology 4793 6110 -> 15 0 23 4635 topology 4638 6111 +> 15 0 23 4635 topology 4725 6111 > 16 0 23 4635 topology 4793 6111 -> 15 0 23 4635 topology 4673 6112 +> 15 0 23 4635 topology 4724 6112 > 16 0 23 4635 topology 4793 6112 -> 15 0 23 4635 topology 4733 6113 +> 15 0 23 4635 topology 4728 6113 > 16 0 23 4635 topology 4793 6113 -> 15 0 23 4635 topology 4715 6114 +> 15 0 23 4635 topology 4727 6114 > 16 0 23 4635 topology 4793 6114 -> 15 0 23 4635 topology 4775 6115 +> 15 0 23 4635 topology 4731 6115 > 16 0 23 4635 topology 4793 6115 -> 15 0 23 4635 topology 4662 6116 +> 15 0 23 4635 topology 4730 6116 > 16 0 23 4635 topology 4793 6116 -> 15 0 23 4635 topology 4652 6117 +> 15 0 23 4635 topology 4734 6117 > 16 0 23 4635 topology 4793 6117 -> 15 0 24 4635 topology 4657 6118 -> 16 0 24 4635 topology 4659 6118 -> 15 0 23 4635 topology 4698 6119 +> 15 0 23 4635 topology 4733 6118 +> 16 0 23 4635 topology 4793 6118 +> 15 0 23 4635 topology 4737 6119 > 16 0 23 4635 topology 4793 6119 -> 15 0 24 4635 topology 4693 6120 -> 16 0 24 4635 topology 4694 6120 -> 15 0 24 4635 topology 4696 6121 -> 16 0 24 4635 topology 4697 6121 -> 15 0 23 4635 topology 4734 6122 +> 15 0 23 4635 topology 4736 6120 +> 16 0 23 4635 topology 4793 6120 +> 15 0 23 4635 topology 4740 6121 +> 16 0 23 4635 topology 4793 6121 +> 15 0 23 4635 topology 4739 6122 > 16 0 23 4635 topology 4793 6122 -> 15 0 24 4635 topology 4645 6123 -> 16 0 24 4635 topology 4646 6123 -> 15 0 23 4635 topology 4686 6124 +> 15 0 23 4635 topology 4743 6123 +> 16 0 23 4635 topology 4793 6123 +> 15 0 23 4635 topology 4742 6124 > 16 0 23 4635 topology 4793 6124 -> 15 0 24 4635 topology 4699 6125 -> 16 0 24 4635 topology 4700 6125 -> 15 0 23 4635 topology 4770 6126 +> 15 0 23 4635 topology 4746 6125 +> 16 0 23 4635 topology 4793 6125 +> 15 0 23 4635 topology 4745 6126 > 16 0 23 4635 topology 4793 6126 -> 15 0 24 4635 topology 4702 6127 -> 16 0 24 4635 topology 4703 6127 -> 15 0 23 4635 topology 4722 6128 +> 15 0 23 4635 topology 4749 6127 +> 16 0 23 4635 topology 4793 6127 +> 15 0 23 4635 topology 4748 6128 > 16 0 23 4635 topology 4793 6128 -> 15 0 24 4635 topology 4705 6129 -> 16 0 24 4635 topology 4706 6129 -> 15 0 24 4635 topology 4708 6130 -> 16 0 24 4635 topology 4709 6130 -> 15 0 24 4635 topology 4711 6131 -> 16 0 24 4635 topology 4712 6131 -> 15 0 23 4635 topology 4700 6132 +> 15 0 23 4635 topology 4752 6129 +> 16 0 23 4635 topology 4793 6129 +> 15 0 23 4635 topology 4751 6130 +> 16 0 23 4635 topology 4793 6130 +> 15 0 23 4635 topology 4644 6131 +> 16 0 23 4635 topology 4793 6131 +> 15 0 23 4635 topology 4643 6132 > 16 0 23 4635 topology 4793 6132 -> 15 0 24 4635 topology 4714 6133 -> 16 0 24 4635 topology 4715 6133 -> 15 0 23 4635 topology 4760 6134 +> 15 0 23 4635 topology 4755 6133 +> 16 0 23 4635 topology 4793 6133 +> 15 0 23 4635 topology 4754 6134 > 16 0 23 4635 topology 4793 6134 -> 15 0 23 4635 topology 4682 6135 +> 15 0 23 4635 topology 4758 6135 > 16 0 23 4635 topology 4793 6135 -> 15 0 24 4635 topology 4717 6136 -> 16 0 24 4635 topology 4718 6136 -> 15 0 24 4635 topology 4636 6137 -> 16 0 24 4635 topology 4638 6137 -> 15 0 23 4635 topology 4653 6138 +> 15 0 23 4635 topology 4757 6136 +> 16 0 23 4635 topology 4793 6136 +> 15 0 23 4635 topology 4761 6137 +> 16 0 23 4635 topology 4793 6137 +> 15 0 23 4635 topology 4760 6138 > 16 0 23 4635 topology 4793 6138 -> 15 0 24 4635 topology 4720 6139 -> 16 0 24 4635 topology 4721 6139 -> 15 0 23 4635 topology 4742 6140 +> 15 0 23 4635 topology 4764 6139 +> 16 0 23 4635 topology 4793 6139 +> 15 0 23 4635 topology 4763 6140 > 16 0 23 4635 topology 4793 6140 -> 15 0 24 4635 topology 4666 6141 -> 16 0 24 4635 topology 4668 6141 -> 15 0 24 4635 topology 4726 6142 -> 16 0 24 4635 topology 4728 6142 -> 15 0 24 4635 topology 4702 6143 -> 16 0 24 4635 topology 4704 6143 -> 15 0 23 4635 topology 4637 6144 +> 15 0 23 4635 topology 4767 6141 +> 16 0 23 4635 topology 4793 6141 +> 15 0 23 4635 topology 4766 6142 +> 16 0 23 4635 topology 4793 6142 +> 15 0 23 4635 topology 4770 6143 +> 16 0 23 4635 topology 4793 6143 +> 15 0 23 4635 topology 4769 6144 > 16 0 23 4635 topology 4793 6144 -> 15 0 24 4635 topology 4678 6145 -> 16 0 24 4635 topology 4680 6145 -> 15 0 24 4635 topology 4786 6146 -> 16 0 24 4635 topology 4788 6146 -> 15 0 24 4635 topology 4762 6147 -> 16 0 24 4635 topology 4764 6147 -> 15 0 23 4635 topology 4725 6148 +> 15 0 23 4635 topology 4773 6145 +> 16 0 23 4635 topology 4793 6145 +> 15 0 23 4635 topology 4772 6146 +> 16 0 23 4635 topology 4793 6146 +> 15 0 23 4635 topology 4776 6147 +> 16 0 23 4635 topology 4793 6147 +> 15 0 23 4635 topology 4775 6148 > 16 0 23 4635 topology 4793 6148 -> 15 0 24 4635 topology 4738 6149 -> 16 0 24 4635 topology 4740 6149 -> 15 0 24 4635 topology 4660 6150 -> 16 0 24 4635 topology 4662 6150 -> 15 0 23 4635 topology 4677 6151 +> 15 0 23 4635 topology 4779 6149 +> 16 0 23 4635 topology 4793 6149 +> 15 0 23 4635 topology 4778 6150 +> 16 0 23 4635 topology 4793 6150 +> 15 0 23 4635 topology 4782 6151 > 16 0 23 4635 topology 4793 6151 -> 15 0 24 4635 topology 4714 6152 -> 16 0 24 4635 topology 4716 6152 -> 15 0 24 4635 topology 4642 6153 -> 16 0 24 4635 topology 4643 6153 -> 15 0 23 4635 topology 4661 6154 +> 15 0 23 4635 topology 4781 6152 +> 16 0 23 4635 topology 4793 6152 +> 15 0 23 4635 topology 4647 6153 +> 16 0 23 4635 topology 4793 6153 +> 15 0 23 4635 topology 4646 6154 > 16 0 23 4635 topology 4793 6154 -> 15 0 23 4635 topology 4761 6155 +> 15 0 23 4635 topology 4785 6155 > 16 0 23 4635 topology 4793 6155 -> 15 0 24 4635 topology 4690 6156 -> 16 0 24 4635 topology 4692 6156 -> 15 0 23 4635 topology 4713 6157 +> 15 0 23 4635 topology 4784 6156 +> 16 0 23 4635 topology 4793 6156 +> 15 0 23 4635 topology 4788 6157 > 16 0 23 4635 topology 4793 6157 -> 15 0 24 4635 topology 4774 6158 -> 16 0 24 4635 topology 4776 6158 -> 15 0 23 4635 topology 4749 6159 +> 15 0 23 4635 topology 4787 6158 +> 16 0 23 4635 topology 4793 6158 +> 15 0 23 4635 topology 4791 6159 > 16 0 23 4635 topology 4793 6159 -> 15 0 24 4635 topology 4750 6160 -> 16 0 24 4635 topology 4752 6160 -> 15 0 23 4635 topology 4667 6161 +> 15 0 23 4635 topology 4790 6160 +> 16 0 23 4635 topology 4793 6160 +> 15 0 23 4635 topology 4650 6161 > 16 0 23 4635 topology 4793 6161 -> 15 0 23 4635 topology 4727 6162 +> 15 0 23 4635 topology 4649 6162 > 16 0 23 4635 topology 4793 6162 -> 15 0 23 4635 topology 4644 6163 +> 15 0 23 4635 topology 4653 6163 > 16 0 23 4635 topology 4793 6163 -> 15 0 23 4635 topology 4787 6164 +> 15 0 23 4635 topology 4652 6164 > 16 0 23 4635 topology 4793 6164 -> 15 0 23 4635 topology 4709 6165 +> 15 0 23 4635 topology 4656 6165 > 16 0 23 4635 topology 4793 6165 -> 15 0 23 4635 topology 4769 6166 +> 15 0 23 4635 topology 4655 6166 > 16 0 23 4635 topology 4793 6166 -> 15 0 24 4635 topology 4639 6167 -> 16 0 24 4635 topology 4641 6167 -> 15 0 23 4635 topology 4691 6168 +> 15 0 23 4635 topology 4659 6167 +> 16 0 23 4635 topology 4793 6167 +> 15 0 23 4635 topology 4658 6168 > 16 0 23 4635 topology 4793 6168 -> 15 0 23 4635 topology 4751 6169 +> 15 0 23 4635 topology 4662 6169 > 16 0 23 4635 topology 4793 6169 -> 15 0 23 4635 topology 4646 6170 +> 15 0 23 4635 topology 4661 6170 > 16 0 23 4635 topology 4793 6170 -> 15 0 23 4635 topology 4668 6171 -> 16 0 23 4635 topology 4793 6171 -> 15 0 25 4635 topology 4792 6172 -> 16 0 25 4635 topology 4793 6172 -> 15 0 24 4635 topology 4639 6173 -> 16 0 24 4635 topology 4640 6173 -> 15 0 23 4635 topology 4704 6174 -> 16 0 23 4635 topology 4793 6174 -> 15 0 24 4635 topology 4723 6175 -> 16 0 24 4635 topology 4724 6175 -> 15 0 23 4635 topology 4788 6176 -> 16 0 23 4635 topology 4793 6176 -> 15 0 23 4635 topology 4740 6177 -> 16 0 23 4635 topology 4793 6177 -> 15 0 24 4635 topology 4726 6178 -> 16 0 24 4635 topology 4727 6178 -> 15 0 24 4635 topology 4729 6179 -> 16 0 24 4635 topology 4730 6179 -> 15 0 23 4635 topology 4692 6180 -> 16 0 23 4635 topology 4793 6180 -> 15 0 23 4635 topology 4776 6181 -> 16 0 23 4635 topology 4793 6181 -> 15 0 24 4635 topology 4732 6182 -> 16 0 24 4635 topology 4733 6182 -> 15 0 24 4635 topology 4735 6183 -> 16 0 24 4635 topology 4736 6183 -> 15 0 23 4635 topology 4694 6184 -> 16 0 23 4635 topology 4793 6184 -> 15 0 24 4635 topology 4738 6185 -> 16 0 24 4635 topology 4739 6185 -> 15 0 23 4635 topology 4754 6186 -> 16 0 23 4635 topology 4793 6186 -> 15 0 24 4635 topology 4741 6187 -> 16 0 24 4635 topology 4742 6187 -> 15 0 23 4635 topology 4676 6188 -> 16 0 23 4635 topology 4793 6188 -> 15 0 24 4635 topology 4744 6189 -> 16 0 24 4635 topology 4745 6189 -> 15 0 23 4635 topology 4736 6190 -> 16 0 23 4635 topology 4793 6190 -> 15 0 24 4635 topology 4747 6191 -> 16 0 24 4635 topology 4748 6191 -> 15 0 23 4635 topology 4718 6192 -> 16 0 23 4635 topology 4793 6192 -> 15 0 24 4635 topology 4693 6193 -> 16 0 24 4635 topology 4695 6193 -> 15 0 24 4635 topology 4750 6194 -> 16 0 24 4635 topology 4751 6194 -> 15 0 23 4635 topology 4659 6195 -> 16 0 23 4635 topology 4793 6195 -> 15 0 23 4635 topology 4778 6196 -> 16 0 23 4635 topology 4793 6196 -> 15 0 24 4635 topology 4669 6197 -> 16 0 24 4635 topology 4671 6197 -> 15 0 24 4635 topology 4642 6198 -> 16 0 24 4635 topology 4644 6198 -> 15 0 24 4635 topology 4753 6199 -> 16 0 24 4635 topology 4755 6199 -> 15 0 24 4635 topology 4729 6200 -> 16 0 24 4635 topology 4731 6200 -> 15 0 24 4635 topology 4705 6201 -> 16 0 24 4635 topology 4707 6201 -> 15 0 24 4635 topology 4681 6202 -> 16 0 24 4635 topology 4683 6202 -> 15 0 24 4635 topology 4789 6203 -> 16 0 24 4635 topology 4791 6203 -> 15 0 23 4635 topology 4695 6204 -> 16 0 23 4635 topology 4793 6204 -> 15 0 24 4635 topology 4636 6205 -> 16 0 24 4635 topology 4637 6205 -> 15 0 24 4635 topology 4765 6206 -> 16 0 24 4635 topology 4767 6206 -> 15 0 23 4635 topology 4655 6207 -> 16 0 23 4635 topology 4793 6207 -> 15 0 24 4635 topology 4741 6208 -> 16 0 24 4635 topology 4743 6208 -> 15 0 23 4635 topology 4731 6209 -> 16 0 23 4635 topology 4793 6209 -> 15 0 24 4635 topology 4717 6210 -> 16 0 24 4635 topology 4719 6210 -> 15 0 23 4635 topology 4683 6211 -> 16 0 23 4635 topology 4793 6211 -> 15 0 23 4635 topology 4767 6212 -> 16 0 23 4635 topology 4793 6212 -> 15 0 23 4635 topology 4719 6213 -> 16 0 23 4635 topology 4793 6213 -> 15 0 24 4635 topology 4777 6214 -> 16 0 24 4635 topology 4779 6214 -> 15 0 23 4635 topology 4703 6215 -> 16 0 23 4635 topology 4793 6215 -> 15 0 24 4635 topology 4660 6216 -> 16 0 24 4635 topology 4661 6216 -> 15 0 23 4635 topology 4763 6217 -> 16 0 23 4635 topology 4793 6217 -> 15 0 23 4635 topology 4685 6218 -> 16 0 23 4635 topology 4793 6218 -> 15 0 23 4635 topology 4650 6219 -> 16 0 23 4635 topology 4793 6219 -> 15 0 23 4635 topology 4745 6220 -> 16 0 23 4635 topology 4793 6220 -> 15 0 24 4635 topology 4645 6221 -> 16 0 24 4635 topology 4647 6221 -> 15 0 23 4635 topology 4640 6222 -> 16 0 23 4635 topology 4793 6222 -> 15 0 23 4635 topology 4674 6223 -> 16 0 23 4635 topology 4793 6223 -> 15 0 23 4635 topology 4758 6224 -> 16 0 23 4635 topology 4793 6224 -> 15 0 23 4635 topology 4710 6225 -> 16 0 23 4635 topology 4793 6225 -> 15 0 24 4635 topology 4753 6226 -> 16 0 24 4635 topology 4754 6226 -> 15 0 24 4635 topology 4756 6227 -> 16 0 24 4635 topology 4757 6227 -> 15 0 23 4635 topology 4746 6228 -> 16 0 23 4635 topology 4793 6228 -> 15 0 24 4635 topology 4759 6229 -> 16 0 24 4635 topology 4760 6229 -> 15 0 23 4635 topology 4782 6230 -> 16 0 23 4635 topology 4793 6230 -> 15 0 24 4635 topology 4762 6231 -> 16 0 24 4635 topology 4763 6231 -> 15 0 24 4635 topology 4765 6232 -> 16 0 24 4635 topology 4766 6232 -> 15 0 23 4635 topology 4670 6233 -> 16 0 23 4635 topology 4793 6233 -> 15 0 24 4635 topology 4657 6234 -> 16 0 24 4635 topology 4658 6234 -> 15 0 24 4635 topology 4768 6235 -> 16 0 24 4635 topology 4769 6235 -> 15 0 23 4635 topology 4730 6236 -> 16 0 23 4635 topology 4793 6236 -> 15 0 23 4635 topology 4641 6237 -> 16 0 23 4635 topology 4793 6237 -> 15 0 24 4635 topology 4771 6238 -> 16 0 24 4635 topology 4772 6238 -> 15 0 23 4635 topology 4790 6239 -> 16 0 23 4635 topology 4793 6239 -> 15 0 23 4635 topology 4712 6240 -> 16 0 23 4635 topology 4793 6240 -> 15 0 24 4635 topology 4774 6241 -> 16 0 24 4635 topology 4775 6241 -> 15 0 23 4635 topology 4772 6242 -> 16 0 23 4635 topology 4793 6242 -> 15 0 24 4635 topology 4777 6243 -> 16 0 24 4635 topology 4778 6243 -> 15 0 24 4635 topology 4696 6244 -> 16 0 24 4635 topology 4698 6244 -> 15 0 24 4635 topology 4780 6245 -> 16 0 24 4635 topology 4781 6245 -> 15 0 24 4635 topology 4672 6246 -> 16 0 24 4635 topology 4674 6246 -> 15 0 24 4635 topology 4756 6247 -> 16 0 24 4635 topology 4758 6247 -> 15 0 24 4635 topology 4648 6248 -> 16 0 24 4635 topology 4650 6248 -> 15 0 24 4635 topology 4732 6249 -> 16 0 24 4635 topology 4734 6249 -> 15 0 24 4635 topology 4708 6250 -> 16 0 24 4635 topology 4710 6250 -> 15 0 23 4635 topology 4665 6251 -> 16 0 23 4635 topology 4793 6251 -> 15 0 23 4635 topology 4649 6252 -> 16 0 23 4635 topology 4793 6252 -> 15 0 24 4635 topology 4684 6253 -> 16 0 24 4635 topology 4686 6253 -> 15 0 23 4635 topology 4701 6254 -> 16 0 23 4635 topology 4793 6254 -> 15 0 24 4635 topology 4768 6255 -> 16 0 24 4635 topology 4770 6255 -> 15 0 23 4635 topology 4785 6256 -> 16 0 23 4635 topology 4793 6256 -> 15 0 24 4635 topology 4744 6257 -> 16 0 24 4635 topology 4746 6257 -> 15 0 23 4635 topology 4737 6258 -> 16 0 23 4635 topology 4793 6258 -> 15 0 24 4635 topology 4720 6259 -> 16 0 24 4635 topology 4722 6259 -> 15 0 23 4635 topology 4689 6260 -> 16 0 23 4635 topology 4793 6260 -> 15 0 23 4635 topology 4773 6261 -> 16 0 23 4635 topology 4793 6261 -> 15 0 24 4635 topology 4780 6262 -> 16 0 24 4635 topology 4782 6262 -> 15 0 24 4635 topology 4654 6263 -> 16 0 24 4635 topology 4655 6263 -> 15 0 23 4635 topology 4697 6264 -> 16 0 23 4635 topology 4793 6264 -> 15 0 23 4635 topology 4757 6265 -> 16 0 23 4635 topology 4793 6265 -> 15 0 23 4635 topology 4679 6266 -> 16 0 23 4635 topology 4793 6266 -> 15 0 23 4635 topology 4739 6267 -> 16 0 23 4635 topology 4793 6267 -> 15 0 23 4635 topology 4656 6268 -> 16 0 23 4635 topology 4793 6268 -> 15 0 23 4635 topology 4721 6269 -> 16 0 23 4635 topology 4793 6269 -> 15 0 23 4635 topology 4781 6270 -> 16 0 23 4635 topology 4793 6270 -> 15 0 24 4635 topology 4651 6271 -> 16 0 24 4635 topology 4653 6271 -> 15 0 24 4635 topology 4663 6272 -> 16 0 24 4635 topology 4664 6272 -> 15 0 23 4635 topology 4728 6273 -> 16 0 23 4635 topology 4793 6273 -> 15 0 24 4635 topology 4666 6274 -> 16 0 24 4635 topology 4667 6274 -> 15 0 23 4635 topology 4658 6275 -> 16 0 23 4635 topology 4793 6275 -> 15 0 26 4390 topology 4794 6276 +> 15 0 24 4635 topology 4792 6171 +> 16 0 24 4635 topology 4793 6171 +> 15 0 25 4635 topology 4663 6172 +> 16 0 25 4635 topology 4665 6172 +> 15 0 25 4635 topology 4663 6173 +> 16 0 25 4635 topology 4664 6173 +> 15 0 25 4635 topology 4666 6174 +> 16 0 25 4635 topology 4668 6174 +> 15 0 25 4635 topology 4666 6175 +> 16 0 25 4635 topology 4667 6175 +> 15 0 25 4635 topology 4669 6176 +> 16 0 25 4635 topology 4671 6176 +> 15 0 25 4635 topology 4669 6177 +> 16 0 25 4635 topology 4670 6177 +> 15 0 25 4635 topology 4672 6178 +> 16 0 25 4635 topology 4674 6178 +> 15 0 25 4635 topology 4672 6179 +> 16 0 25 4635 topology 4673 6179 +> 15 0 25 4635 topology 4675 6180 +> 16 0 25 4635 topology 4677 6180 +> 15 0 25 4635 topology 4675 6181 +> 16 0 25 4635 topology 4676 6181 +> 15 0 25 4635 topology 4678 6182 +> 16 0 25 4635 topology 4680 6182 +> 15 0 25 4635 topology 4678 6183 +> 16 0 25 4635 topology 4679 6183 +> 15 0 25 4635 topology 4681 6184 +> 16 0 25 4635 topology 4683 6184 +> 15 0 25 4635 topology 4681 6185 +> 16 0 25 4635 topology 4682 6185 +> 15 0 25 4635 topology 4684 6186 +> 16 0 25 4635 topology 4686 6186 +> 15 0 25 4635 topology 4684 6187 +> 16 0 25 4635 topology 4685 6187 +> 15 0 25 4635 topology 4687 6188 +> 16 0 25 4635 topology 4689 6188 +> 15 0 25 4635 topology 4687 6189 +> 16 0 25 4635 topology 4688 6189 +> 15 0 25 4635 topology 4690 6190 +> 16 0 25 4635 topology 4692 6190 +> 15 0 25 4635 topology 4690 6191 +> 16 0 25 4635 topology 4691 6191 +> 15 0 25 4635 topology 4636 6192 +> 16 0 25 4635 topology 4638 6192 +> 15 0 25 4635 topology 4636 6193 +> 16 0 25 4635 topology 4637 6193 +> 15 0 25 4635 topology 4693 6194 +> 16 0 25 4635 topology 4695 6194 +> 15 0 25 4635 topology 4693 6195 +> 16 0 25 4635 topology 4694 6195 +> 15 0 25 4635 topology 4696 6196 +> 16 0 25 4635 topology 4698 6196 +> 15 0 25 4635 topology 4696 6197 +> 16 0 25 4635 topology 4697 6197 +> 15 0 25 4635 topology 4699 6198 +> 16 0 25 4635 topology 4701 6198 +> 15 0 25 4635 topology 4699 6199 +> 16 0 25 4635 topology 4700 6199 +> 15 0 25 4635 topology 4702 6200 +> 16 0 25 4635 topology 4704 6200 +> 15 0 25 4635 topology 4702 6201 +> 16 0 25 4635 topology 4703 6201 +> 15 0 25 4635 topology 4705 6202 +> 16 0 25 4635 topology 4707 6202 +> 15 0 25 4635 topology 4705 6203 +> 16 0 25 4635 topology 4706 6203 +> 15 0 25 4635 topology 4708 6204 +> 16 0 25 4635 topology 4710 6204 +> 15 0 25 4635 topology 4708 6205 +> 16 0 25 4635 topology 4709 6205 +> 15 0 25 4635 topology 4711 6206 +> 16 0 25 4635 topology 4713 6206 +> 15 0 25 4635 topology 4711 6207 +> 16 0 25 4635 topology 4712 6207 +> 15 0 25 4635 topology 4714 6208 +> 16 0 25 4635 topology 4716 6208 +> 15 0 25 4635 topology 4714 6209 +> 16 0 25 4635 topology 4715 6209 +> 15 0 25 4635 topology 4717 6210 +> 16 0 25 4635 topology 4719 6210 +> 15 0 25 4635 topology 4717 6211 +> 16 0 25 4635 topology 4718 6211 +> 15 0 25 4635 topology 4720 6212 +> 16 0 25 4635 topology 4722 6212 +> 15 0 25 4635 topology 4720 6213 +> 16 0 25 4635 topology 4721 6213 +> 15 0 25 4635 topology 4639 6214 +> 16 0 25 4635 topology 4641 6214 +> 15 0 25 4635 topology 4639 6215 +> 16 0 25 4635 topology 4640 6215 +> 15 0 25 4635 topology 4723 6216 +> 16 0 25 4635 topology 4725 6216 +> 15 0 25 4635 topology 4723 6217 +> 16 0 25 4635 topology 4724 6217 +> 15 0 25 4635 topology 4726 6218 +> 16 0 25 4635 topology 4728 6218 +> 15 0 25 4635 topology 4726 6219 +> 16 0 25 4635 topology 4727 6219 +> 15 0 25 4635 topology 4729 6220 +> 16 0 25 4635 topology 4731 6220 +> 15 0 25 4635 topology 4729 6221 +> 16 0 25 4635 topology 4730 6221 +> 15 0 25 4635 topology 4732 6222 +> 16 0 25 4635 topology 4734 6222 +> 15 0 25 4635 topology 4732 6223 +> 16 0 25 4635 topology 4733 6223 +> 15 0 25 4635 topology 4735 6224 +> 16 0 25 4635 topology 4737 6224 +> 15 0 25 4635 topology 4735 6225 +> 16 0 25 4635 topology 4736 6225 +> 15 0 25 4635 topology 4738 6226 +> 16 0 25 4635 topology 4740 6226 +> 15 0 25 4635 topology 4738 6227 +> 16 0 25 4635 topology 4739 6227 +> 15 0 25 4635 topology 4741 6228 +> 16 0 25 4635 topology 4743 6228 +> 15 0 25 4635 topology 4741 6229 +> 16 0 25 4635 topology 4742 6229 +> 15 0 25 4635 topology 4744 6230 +> 16 0 25 4635 topology 4746 6230 +> 15 0 25 4635 topology 4744 6231 +> 16 0 25 4635 topology 4745 6231 +> 15 0 25 4635 topology 4747 6232 +> 16 0 25 4635 topology 4749 6232 +> 15 0 25 4635 topology 4747 6233 +> 16 0 25 4635 topology 4748 6233 +> 15 0 25 4635 topology 4750 6234 +> 16 0 25 4635 topology 4752 6234 +> 15 0 25 4635 topology 4750 6235 +> 16 0 25 4635 topology 4751 6235 +> 15 0 25 4635 topology 4642 6236 +> 16 0 25 4635 topology 4644 6236 +> 15 0 25 4635 topology 4642 6237 +> 16 0 25 4635 topology 4643 6237 +> 15 0 25 4635 topology 4753 6238 +> 16 0 25 4635 topology 4755 6238 +> 15 0 25 4635 topology 4753 6239 +> 16 0 25 4635 topology 4754 6239 +> 15 0 25 4635 topology 4756 6240 +> 16 0 25 4635 topology 4758 6240 +> 15 0 25 4635 topology 4756 6241 +> 16 0 25 4635 topology 4757 6241 +> 15 0 25 4635 topology 4759 6242 +> 16 0 25 4635 topology 4761 6242 +> 15 0 25 4635 topology 4759 6243 +> 16 0 25 4635 topology 4760 6243 +> 15 0 25 4635 topology 4762 6244 +> 16 0 25 4635 topology 4764 6244 +> 15 0 25 4635 topology 4762 6245 +> 16 0 25 4635 topology 4763 6245 +> 15 0 25 4635 topology 4765 6246 +> 16 0 25 4635 topology 4767 6246 +> 15 0 25 4635 topology 4765 6247 +> 16 0 25 4635 topology 4766 6247 +> 15 0 25 4635 topology 4768 6248 +> 16 0 25 4635 topology 4770 6248 +> 15 0 25 4635 topology 4768 6249 +> 16 0 25 4635 topology 4769 6249 +> 15 0 25 4635 topology 4771 6250 +> 16 0 25 4635 topology 4773 6250 +> 15 0 25 4635 topology 4771 6251 +> 16 0 25 4635 topology 4772 6251 +> 15 0 25 4635 topology 4774 6252 +> 16 0 25 4635 topology 4776 6252 +> 15 0 25 4635 topology 4774 6253 +> 16 0 25 4635 topology 4775 6253 +> 15 0 25 4635 topology 4777 6254 +> 16 0 25 4635 topology 4779 6254 +> 15 0 25 4635 topology 4777 6255 +> 16 0 25 4635 topology 4778 6255 +> 15 0 25 4635 topology 4780 6256 +> 16 0 25 4635 topology 4782 6256 +> 15 0 25 4635 topology 4780 6257 +> 16 0 25 4635 topology 4781 6257 +> 15 0 25 4635 topology 4645 6258 +> 16 0 25 4635 topology 4647 6258 +> 15 0 25 4635 topology 4645 6259 +> 16 0 25 4635 topology 4646 6259 +> 15 0 25 4635 topology 4783 6260 +> 16 0 25 4635 topology 4785 6260 +> 15 0 25 4635 topology 4783 6261 +> 16 0 25 4635 topology 4784 6261 +> 15 0 25 4635 topology 4786 6262 +> 16 0 25 4635 topology 4788 6262 +> 15 0 25 4635 topology 4786 6263 +> 16 0 25 4635 topology 4787 6263 +> 15 0 25 4635 topology 4789 6264 +> 16 0 25 4635 topology 4791 6264 +> 15 0 25 4635 topology 4789 6265 +> 16 0 25 4635 topology 4790 6265 +> 15 0 25 4635 topology 4648 6266 +> 16 0 25 4635 topology 4650 6266 +> 15 0 25 4635 topology 4648 6267 +> 16 0 25 4635 topology 4649 6267 +> 15 0 25 4635 topology 4651 6268 +> 16 0 25 4635 topology 4653 6268 +> 15 0 25 4635 topology 4651 6269 +> 16 0 25 4635 topology 4652 6269 +> 15 0 25 4635 topology 4654 6270 +> 16 0 25 4635 topology 4656 6270 +> 15 0 25 4635 topology 4654 6271 +> 16 0 25 4635 topology 4655 6271 +> 15 0 25 4635 topology 4657 6272 +> 16 0 25 4635 topology 4659 6272 +> 15 0 25 4635 topology 4657 6273 +> 16 0 25 4635 topology 4658 6273 +> 15 0 25 4635 topology 4660 6274 +> 16 0 25 4635 topology 4662 6274 +> 15 0 25 4635 topology 4660 6275 +> 16 0 25 4635 topology 4661 6275 +> 15 0 26 4390 topology 4634 6276 > 16 0 26 4390 topology 4796 6276 -> 15 0 21 4390 topology 4634 6277 -> 16 0 21 4390 topology 4794 6277 +> 15 0 26 4390 topology 4794 6277 +> 16 0 26 4390 topology 4796 6277 > 15 0 27 4390 topology 4632 6278 > 16 0 27 4390 topology 4634 6278 -> 15 0 26 4390 topology 4794 6279 -> 16 0 26 4390 topology 4792 6279 -> 15 0 26 4390 topology 4634 6280 -> 16 0 26 4390 topology 4796 6280 -> 15 0 26 21 topology 498 6281 -> 16 0 26 21 topology 497 6281 -> 15 0 35 0 topology 17 6282 -> 16 0 35 0 topology 1605 6282 -> 15 0 26 4390 topology 4797 6283 -> 16 0 26 4390 topology 4796 6283 -> 15 0 26 1189 topology 1605 6284 -> 16 0 26 1189 topology 1604 6284 -> 15 0 36 0 topology 11 6285 -> 16 0 36 0 topology 4389 6285 -> 15 0 36 0 topology 4 6286 -> 16 0 36 0 topology 2348 6286 -> 15 0 35 0 topology 498 6287 -> 16 0 35 0 topology 16 6287 -> 15 0 36 0 topology 5 6288 -> 16 0 36 0 topology 3920 6288 -> 15 0 35 0 topology 3414 6289 -> 16 0 35 0 topology 14 6289 -> 15 0 26 499 topology 868 6290 -> 16 0 26 499 topology 867 6290 -> 15 0 35 0 topology 16 6291 -> 16 0 35 0 topology 1605 6291 -> 15 0 35 0 topology 12 6292 -> 16 0 35 0 topology 3414 6292 -> 15 0 26 869 topology 1188 6293 -> 16 0 26 869 topology 1187 6293 -> 15 0 35 0 topology 15 6294 -> 16 0 35 0 topology 1605 6294 -> 15 0 36 0 topology 7 6295 -> 16 0 36 0 topology 498 6295 -> 15 0 35 0 topology 14 6296 -> 16 0 35 0 topology 3920 6296 -> 15 0 35 0 topology 17 6297 -> 16 0 35 0 topology 868 6297 -> 15 0 35 0 topology 20 6298 -> 16 0 35 0 topology 4797 6298 -> 15 0 36 0 topology 10 6299 -> 16 0 36 0 topology 4797 6299 -> 15 0 35 0 topology 12 6300 -> 16 0 35 0 topology 1188 6300 +> 15 0 20 4390 topology 4634 6279 +> 16 0 20 4390 topology 4794 6279 +> 15 0 26 4390 topology 4794 6280 +> 16 0 26 4390 topology 4792 6280 +> 15 0 35 0 topology 498 6281 +> 16 0 35 0 topology 16 6281 +> 15 0 35 0 topology 1605 6282 +> 16 0 35 0 topology 18 6282 +> 15 0 35 0 topology 3414 6283 +> 16 0 35 0 topology 14 6283 +> 15 0 26 21 topology 498 6284 +> 16 0 26 21 topology 497 6284 +> 15 0 26 499 topology 868 6285 +> 16 0 26 499 topology 867 6285 +> 15 0 26 869 topology 1188 6286 +> 16 0 26 869 topology 1187 6286 +> 15 0 26 1189 topology 1605 6287 +> 16 0 26 1189 topology 1604 6287 +> 15 0 26 1606 topology 2348 6288 +> 16 0 26 1606 topology 2347 6288 +> 15 0 26 2349 topology 3414 6289 +> 16 0 26 2349 topology 3413 6289 +> 15 0 26 3415 topology 3920 6290 +> 16 0 26 3415 topology 3919 6290 +> 15 0 26 3921 topology 4389 6291 +> 16 0 26 3921 topology 4388 6291 +> 15 0 26 4390 topology 4797 6292 +> 16 0 26 4390 topology 4796 6292 +> 15 0 36 0 topology 7 6293 +> 16 0 36 0 topology 498 6293 +> 15 0 35 0 topology 17 6294 +> 16 0 35 0 topology 868 6294 +> 15 0 36 0 topology 8 6295 +> 16 0 36 0 topology 868 6295 +> 15 0 35 0 topology 12 6296 +> 16 0 35 0 topology 1188 6296 +> 15 0 36 0 topology 2 6297 +> 16 0 36 0 topology 1188 6297 +> 15 0 35 0 topology 16 6298 +> 16 0 35 0 topology 1605 6298 +> 15 0 35 0 topology 17 6299 +> 16 0 35 0 topology 1605 6299 +> 15 0 35 0 topology 15 6300 +> 16 0 35 0 topology 1605 6300 > 15 0 36 0 topology 6 6301 > 16 0 36 0 topology 1605 6301 -> 15 0 26 3921 topology 4389 6302 -> 16 0 26 3921 topology 4388 6302 -> 15 0 35 0 topology 19 6303 -> 16 0 35 0 topology 4389 6303 -> 15 0 35 0 topology 13 6304 +> 15 0 35 0 topology 13 6302 +> 16 0 35 0 topology 2348 6302 +> 15 0 36 0 topology 4 6303 +> 16 0 36 0 topology 2348 6303 +> 15 0 35 0 topology 12 6304 > 16 0 35 0 topology 3414 6304 -> 15 0 26 1606 topology 2348 6305 -> 16 0 26 1606 topology 2347 6305 -> 15 0 26 3415 topology 3920 6306 -> 16 0 26 3415 topology 3919 6306 -> 15 0 26 2349 topology 3414 6307 -> 16 0 26 2349 topology 3413 6307 -> 15 0 36 0 topology 8 6308 -> 16 0 36 0 topology 868 6308 -> 15 0 35 0 topology 1605 6309 -> 16 0 35 0 topology 18 6309 -> 15 0 36 0 topology 2 6310 -> 16 0 36 0 topology 1188 6310 -> 15 0 36 0 topology 3 6311 -> 16 0 36 0 topology 3414 6311 -> 15 0 35 0 topology 15 6312 -> 16 0 35 0 topology 3414 6312 -> 15 0 35 0 topology 13 6313 -> 16 0 35 0 topology 2348 6313 -> 7 0 2 9 -> 7 0 3 18 -> 7 0 3 19 -> 7 0 3 17 -> 7 0 2 2 -> 7 0 3 13 -> 7 0 3 20 -> 7 0 2 10 -> 7 0 2 8 -> 7 0 3 16 -> 7 0 2 3 -> 7 0 3 15 -> 7 0 2 11 -> 7 0 3 14 -> 7 0 2 7 -> 7 0 2 6 -> 7 0 2 5 -> 7 0 3 12 -> 7 0 2 4 -> 7 0 1 1 -> 7 0 3 4794 -> 7 0 7 4648 -> 7 0 9 4778 -> 7 0 7 4660 -> 7 0 9 4640 -> 7 0 9 4665 -> 7 0 9 4652 -> 7 0 9 4725 -> 7 0 9 4701 -> 7 0 7 4663 -> 7 0 9 4677 -> 7 0 9 4785 -> 7 0 9 4761 -> 7 0 7 4723 -> 7 0 9 4737 -> 7 0 7 4699 -> 7 0 9 4713 -> 7 0 7 4675 -> 7 0 9 4689 -> 7 0 7 4783 -> 7 0 7 4759 -> 7 0 9 4773 -> 7 0 7 4735 -> 7 0 9 4749 -> 7 0 7 4711 -> 7 0 7 4687 -> 7 0 7 4771 -> 7 0 7 4747 -> 7 0 9 4673 -> 7 0 9 4703 -> 7 0 9 4733 -> 7 0 9 4647 -> 7 0 9 4763 -> 7 0 9 4685 -> 7 0 7 4639 -> 7 0 9 4715 -> 7 0 9 4745 -> 7 0 9 4659 -> 7 0 9 4775 -> 7 0 7 4651 -> 7 0 9 4637 -> 7 0 9 4649 -> 7 0 9 4668 -> 7 0 12 4792 -> 7 0 9 4728 -> 7 0 9 4704 -> 7 0 9 4661 -> 7 0 7 4666 -> 7 0 9 4680 -> 7 0 9 4788 -> 7 0 9 4764 -> 7 0 7 4726 -> 7 0 9 4740 -> 7 0 7 4702 -> 7 0 9 4716 -> 7 0 7 4678 -> 7 0 9 4692 -> 7 0 7 4786 -> 7 0 7 4762 -> 7 0 9 4776 -> 7 0 7 4738 -> 7 0 9 4752 -> 7 0 7 4714 -> 7 0 7 4690 -> 7 0 7 4774 -> 7 0 9 4670 -> 7 0 7 4750 -> 7 0 9 4638 -> 7 0 9 4700 -> 7 0 9 4730 -> 7 0 9 4760 -> 7 0 9 4682 -> 7 0 9 4790 -> 7 0 9 4650 -> 7 0 9 4712 -> 7 0 9 4742 -> 7 0 7 4642 -> 7 0 9 4772 -> 7 0 9 4662 -> 7 0 7 4654 -> 7 0 9 4646 -> 7 0 9 4695 -> 7 0 9 4671 -> 7 0 9 4755 -> 7 0 9 4658 -> 7 0 9 4731 -> 7 0 7 4693 -> 7 0 9 4707 -> 7 0 7 4669 -> 7 0 9 4683 -> 7 0 9 4791 -> 7 0 7 4753 -> 7 0 9 4767 -> 7 0 7 4729 -> 7 0 9 4743 -> 7 0 7 4705 -> 7 0 9 4719 -> 7 0 7 4681 -> 7 0 7 4789 -> 7 0 7 4765 -> 7 0 9 4779 -> 7 0 7 4741 -> 7 0 7 4717 -> 7 0 9 4667 -> 7 0 9 4697 -> 7 0 7 4777 -> 7 0 9 4727 -> 7 0 9 4793 -> 7 0 9 4641 -> 7 0 9 4757 -> 7 0 9 4679 -> 7 0 9 4787 -> 7 0 9 4709 -> 7 0 9 4739 -> 7 0 9 4653 -> 7 0 9 4769 -> 7 0 9 4691 -> 7 0 7 4645 -> 7 0 9 4721 -> 7 0 9 4751 -> 7 0 9 4781 -> 7 0 7 4657 -> 7 0 9 4643 -> 7 0 9 4698 -> 7 0 9 4655 -> 7 0 9 4674 -> 7 0 9 4758 -> 7 0 9 4734 -> 7 0 7 4696 -> 7 0 9 4710 -> 7 0 7 4672 -> 7 0 9 4686 -> 7 0 7 4756 -> 7 0 9 4770 -> 7 0 7 4732 -> 7 0 9 4746 -> 7 0 7 4708 -> 7 0 9 4722 -> 7 0 7 4684 -> 7 0 7 4768 -> 7 0 9 4782 -> 7 0 9 4664 -> 7 0 7 4744 -> 7 0 9 4694 -> 7 0 7 4720 -> 7 0 9 4724 -> 7 0 9 4754 -> 7 0 7 4780 -> 7 0 9 4676 -> 7 0 9 4784 -> 7 0 9 4644 -> 7 0 9 4706 -> 7 0 9 4736 -> 7 0 7 4636 -> 7 0 9 4766 -> 7 0 9 4688 -> 7 0 9 4656 -> 7 0 9 4718 -> 7 0 9 4748 -> 7 0 6 4635 -> 7 0 3 4797 -> 7 0 12 4796 -> 7 0 6 4795 -> 7 0 3 4634 -> 7 0 9 4405 -> 7 0 9 4427 -> 7 0 9 4511 -> 7 0 7 4422 -> 7 0 9 4463 -> 7 0 9 4547 -> 7 0 9 4631 -> 7 0 7 4458 -> 7 0 9 4499 -> 7 0 7 4542 -> 7 0 9 4583 -> 7 0 7 4494 -> 7 0 9 4535 -> 7 0 7 4578 -> 7 0 9 4619 -> 7 0 7 4446 -> 7 0 7 4530 -> 7 0 7 4614 -> 7 0 9 4633 -> 7 0 9 4459 -> 7 0 7 4566 -> 7 0 9 4400 -> 7 0 9 4519 -> 7 0 9 4441 -> 7 0 9 4579 -> 7 0 9 4501 -> 7 0 9 4561 -> 7 0 9 4621 -> 7 0 7 4413 -> 7 0 9 4454 -> 7 0 9 4414 -> 7 0 7 4449 -> 7 0 9 4490 -> 7 0 9 4574 -> 7 0 9 4442 -> 7 0 7 4485 -> 7 0 9 4526 -> 7 0 7 4569 -> 7 0 9 4610 -> 7 0 7 4437 -> 7 0 9 4478 -> 7 0 7 4521 -> 7 0 9 4562 -> 7 0 7 4605 -> 7 0 7 4473 -> 7 0 7 4557 -> 7 0 9 4598 -> 7 0 9 4426 -> 7 0 9 4486 -> 7 0 7 4593 -> 7 0 9 4546 -> 7 0 9 4468 -> 7 0 9 4606 -> 7 0 9 4528 -> 7 0 9 4415 -> 7 0 7 4404 -> 7 0 9 4588 -> 7 0 9 4399 -> 7 0 9 4481 -> 7 0 9 4433 -> 7 0 9 4517 -> 7 0 9 4601 -> 7 0 7 4428 -> 7 0 9 4469 -> 7 0 7 4512 -> 7 0 9 4553 -> 7 0 7 4464 -> 7 0 9 4505 -> 7 0 7 4548 -> 7 0 9 4589 -> 7 0 7 4500 -> 7 0 7 4584 -> 7 0 9 4625 -> 7 0 9 4453 -> 7 0 7 4536 -> 7 0 9 4513 -> 7 0 7 4620 -> 7 0 9 4435 -> 7 0 9 4573 -> 7 0 9 4406 -> 7 0 9 4495 -> 7 0 7 4395 -> 7 0 9 4555 -> 7 0 9 4477 -> 7 0 9 4615 -> 7 0 9 4537 -> 7 0 9 4597 -> 7 0 9 4424 -> 7 0 9 4408 -> 7 0 7 4419 -> 7 0 9 4460 -> 7 0 9 4544 -> 7 0 7 4455 -> 7 0 9 4496 -> 7 0 7 4539 -> 7 0 9 4580 -> 7 0 9 4448 -> 7 0 7 4491 -> 7 0 9 4532 -> 7 0 7 4575 -> 7 0 9 4616 -> 7 0 7 4443 -> 7 0 9 4420 -> 7 0 7 4527 -> 7 0 9 4568 -> 7 0 7 4611 -> 7 0 9 4480 -> 7 0 7 4563 -> 7 0 9 4397 -> 7 0 9 4540 -> 7 0 9 4462 -> 7 0 9 4600 -> 7 0 9 4522 -> 7 0 9 4444 -> 7 0 9 4582 -> 7 0 9 4504 -> 7 0 9 4564 -> 7 0 7 4410 -> 7 0 9 4624 -> 7 0 9 4393 -> 7 0 9 4451 -> 7 0 9 4487 -> 7 0 9 4417 -> 7 0 9 4571 -> 7 0 9 4439 -> 7 0 9 4523 -> 7 0 7 4482 -> 7 0 9 4607 -> 7 0 9 4475 -> 7 0 7 4434 -> 7 0 9 4559 -> 7 0 7 4518 -> 7 0 7 4602 -> 7 0 7 4470 -> 7 0 7 4554 -> 7 0 9 4595 -> 7 0 7 4506 -> 7 0 9 4429 -> 7 0 7 4590 -> 7 0 9 4489 -> 7 0 7 4626 -> 7 0 9 4549 -> 7 0 9 4471 -> 7 0 9 4412 -> 7 0 9 4609 -> 7 0 9 4531 -> 7 0 7 4401 -> 7 0 9 4591 -> 7 0 12 4632 -> 7 0 9 4402 -> 7 0 9 4430 -> 7 0 9 4514 -> 7 0 9 4466 -> 7 0 7 4425 -> 7 0 9 4550 -> 7 0 7 4509 -> 7 0 9 4502 -> 7 0 7 4461 -> 7 0 7 4545 -> 7 0 9 4586 -> 7 0 7 4629 -> 7 0 9 4538 -> 7 0 7 4497 -> 7 0 7 4581 -> 7 0 9 4622 -> 7 0 7 4533 -> 7 0 9 4456 -> 7 0 7 4617 -> 7 0 9 4516 -> 7 0 9 4438 -> 7 0 9 4403 -> 7 0 7 4392 -> 7 0 9 4576 -> 7 0 9 4498 -> 7 0 9 4558 -> 7 0 9 4618 -> 7 0 7 4416 -> 7 0 9 4421 -> 7 0 9 4457 -> 7 0 9 4411 -> 7 0 9 4541 -> 7 0 9 4493 -> 7 0 7 4452 -> 7 0 9 4577 -> 7 0 9 4445 -> 7 0 9 4529 -> 7 0 7 4488 -> 7 0 7 4572 -> 7 0 9 4613 -> 7 0 7 4440 -> 7 0 7 4524 -> 7 0 9 4565 -> 7 0 7 4608 -> 7 0 7 4476 -> 7 0 9 4423 -> 7 0 7 4560 -> 7 0 9 4483 -> 7 0 9 4394 -> 7 0 9 4543 -> 7 0 7 4596 -> 7 0 9 4465 -> 7 0 9 4603 -> 7 0 9 4525 -> 7 0 9 4447 -> 7 0 9 4585 -> 7 0 9 4507 -> 7 0 9 4418 -> 7 0 7 4407 -> 7 0 9 4567 -> 7 0 9 4627 -> 7 0 9 4396 -> 7 0 9 4484 -> 7 0 9 4436 -> 7 0 9 4520 -> 7 0 7 4479 -> 7 0 9 4604 -> 7 0 9 4472 -> 7 0 7 4431 -> 7 0 9 4556 -> 7 0 7 4515 -> 7 0 7 4599 -> 7 0 9 4508 -> 7 0 7 4467 -> 7 0 7 4551 -> 7 0 9 4592 -> 7 0 7 4503 -> 7 0 9 4450 -> 7 0 7 4587 -> 7 0 9 4628 -> 7 0 9 4510 -> 7 0 9 4432 -> 7 0 9 4570 -> 7 0 7 4623 -> 7 0 9 4492 -> 7 0 9 4630 -> 7 0 9 4552 -> 7 0 9 4409 -> 7 0 9 4474 -> 7 0 7 4398 -> 7 0 9 4612 -> 7 0 9 4534 -> 7 0 9 4594 -> 7 0 6 4391 -> 7 0 1 4390 -> 7 0 12 3919 -> 7 0 6 3918 -> 7 0 7 3801 -> 7 0 9 3827 -> 7 0 9 3887 -> 7 0 9 3817 -> 7 0 9 3863 -> 7 0 12 3915 -> 7 0 7 3813 -> 7 0 9 3839 -> 7 0 9 3899 -> 7 0 9 3875 -> 7 0 9 3851 -> 7 0 9 3911 -> 7 0 9 3823 -> 7 0 9 3853 -> 7 0 9 3883 -> 7 0 7 3825 -> 7 0 9 3913 -> 7 0 9 3835 -> 7 0 7 3855 -> 7 0 9 3865 -> 7 0 7 3885 -> 7 0 9 3806 -> 7 0 9 3895 -> 7 0 7 3837 -> 7 0 9 3847 -> 7 0 7 3867 -> 7 0 9 3877 -> 7 0 7 3897 -> 7 0 9 3818 -> 7 0 9 3907 -> 7 0 7 3849 -> 7 0 7 3879 -> 7 0 7 3909 -> 7 0 9 3802 -> 7 0 7 3798 -> 7 0 9 3854 -> 7 0 9 3830 -> 7 0 9 3814 -> 7 0 9 3914 -> 7 0 7 3810 -> 7 0 9 3890 -> 7 0 9 3866 -> 7 0 9 3842 -> 7 0 9 3902 -> 7 0 9 3878 -> 7 0 7 3822 -> 7 0 9 3797 -> 7 0 9 3832 -> 7 0 7 3852 -> 7 0 9 3916 -> 7 0 9 3862 -> 7 0 7 3882 -> 7 0 9 3892 -> 7 0 7 3912 -> 7 0 7 3834 -> 7 0 9 3809 -> 7 0 9 3844 -> 7 0 7 3864 -> 7 0 9 3874 -> 7 0 7 3894 -> 7 0 9 3904 -> 7 0 7 3846 -> 7 0 9 3821 -> 7 0 7 3876 -> 7 0 7 3906 -> 7 0 9 3799 -> 7 0 7 3795 -> 7 0 9 3811 -> 7 0 9 3857 -> 7 0 7 3807 -> 7 0 9 3833 -> 7 0 9 3893 -> 7 0 9 3869 -> 7 0 7 3819 -> 7 0 9 3845 -> 7 0 9 3905 -> 7 0 9 3881 -> 7 0 9 3829 -> 7 0 9 3859 -> 7 0 9 3800 -> 7 0 9 3889 -> 7 0 7 3831 -> 7 0 9 3841 -> 7 0 7 3861 -> 7 0 9 3871 -> 7 0 7 3891 -> 7 0 9 3812 -> 7 0 9 3901 -> 7 0 7 3843 -> 7 0 7 3873 -> 7 0 7 3903 -> 7 0 9 3796 -> 7 0 9 3824 -> 7 0 9 3808 -> 7 0 7 3804 -> 7 0 9 3884 -> 7 0 9 3860 -> 7 0 9 3836 -> 7 0 9 3820 -> 7 0 7 3816 -> 7 0 9 3896 -> 7 0 9 3872 -> 7 0 9 3848 -> 7 0 9 3908 -> 7 0 9 3826 -> 7 0 9 3856 -> 7 0 9 3886 -> 7 0 7 3828 -> 7 0 9 3803 -> 7 0 9 3838 -> 7 0 7 3858 -> 7 0 9 3868 -> 7 0 7 3888 -> 7 0 9 3898 -> 7 0 7 3840 -> 7 0 9 3815 -> 7 0 9 3850 -> 7 0 7 3870 -> 7 0 9 3880 -> 7 0 7 3900 -> 7 0 9 3910 -> 7 0 9 3805 -> 7 0 6 3794 -> 7 0 3 3714 -> 7 0 3 3611 -> 7 0 9 3434 -> 7 0 7 3462 -> 7 0 9 3523 -> 7 0 7 3570 -> 7 0 7 3492 -> 7 0 9 3553 -> 7 0 7 3600 -> 7 0 7 3522 -> 7 0 9 3583 -> 7 0 7 3552 -> 7 0 7 3582 -> 7 0 9 3418 -> 7 0 9 3446 -> 7 0 7 3423 -> 7 0 9 3430 -> 7 0 9 3506 -> 7 0 9 3482 -> 7 0 9 3458 -> 7 0 9 3566 -> 7 0 7 3435 -> 7 0 9 3442 -> 7 0 9 3542 -> 7 0 9 3518 -> 7 0 9 3494 -> 7 0 9 3602 -> 7 0 9 3470 -> 7 0 9 3578 -> 7 0 9 3554 -> 7 0 9 3530 -> 7 0 9 3590 -> 7 0 9 3448 -> 7 0 9 3478 -> 7 0 7 3447 -> 7 0 9 3508 -> 7 0 7 3477 -> 7 0 9 3538 -> 7 0 9 3425 -> 7 0 9 3460 -> 7 0 7 3507 -> 7 0 9 3568 -> 7 0 9 3490 -> 7 0 7 3537 -> 7 0 9 3598 -> 7 0 7 3459 -> 7 0 9 3520 -> 7 0 7 3567 -> 7 0 7 3489 -> 7 0 9 3550 -> 7 0 7 3597 -> 7 0 9 3437 -> 7 0 9 3472 -> 7 0 7 3519 -> 7 0 9 3580 -> 7 0 9 3502 -> 7 0 7 3549 -> 7 0 7 3471 -> 7 0 9 3532 -> 7 0 7 3579 -> 7 0 7 3501 -> 7 0 9 3562 -> 7 0 7 3531 -> 7 0 9 3592 -> 7 0 7 3561 -> 7 0 7 3591 -> 7 0 7 3420 -> 7 0 9 3427 -> 7 0 9 3449 -> 7 0 9 3509 -> 7 0 7 3432 -> 7 0 9 3439 -> 7 0 9 3485 -> 7 0 9 3461 -> 7 0 9 3569 -> 7 0 9 3545 -> 7 0 9 3521 -> 7 0 9 3497 -> 7 0 9 3605 -> 7 0 9 3473 -> 7 0 9 3581 -> 7 0 9 3557 -> 7 0 9 3533 -> 7 0 9 3445 -> 7 0 9 3593 -> 7 0 9 3475 -> 7 0 7 3444 -> 7 0 9 3505 -> 7 0 7 3474 -> 7 0 9 3535 -> 7 0 12 3609 -> 7 0 9 3457 -> 7 0 7 3504 -> 7 0 9 3565 -> 7 0 9 3487 -> 7 0 7 3534 -> 7 0 9 3595 -> 7 0 9 3428 -> 7 0 7 3456 -> 7 0 9 3517 -> 7 0 7 3564 -> 7 0 7 3486 -> 7 0 9 3547 -> 7 0 7 3594 -> 7 0 9 3469 -> 7 0 7 3516 -> 7 0 9 3577 -> 7 0 9 3499 -> 7 0 7 3546 -> 7 0 9 3607 -> 7 0 9 3440 -> 7 0 7 3468 -> 7 0 9 3529 -> 7 0 7 3576 -> 7 0 7 3498 -> 7 0 9 3559 -> 7 0 7 3606 -> 7 0 7 3528 -> 7 0 9 3589 -> 7 0 7 3558 -> 7 0 7 3588 -> 7 0 7 3417 -> 7 0 9 3424 -> 7 0 9 3476 -> 7 0 9 3452 -> 7 0 7 3429 -> 7 0 9 3436 -> 7 0 9 3536 -> 7 0 9 3512 -> 7 0 9 3488 -> 7 0 9 3596 -> 7 0 9 3464 -> 7 0 9 3572 -> 7 0 7 3441 -> 7 0 9 3548 -> 7 0 9 3524 -> 7 0 9 3500 -> 7 0 9 3608 -> 7 0 9 3584 -> 7 0 9 3560 -> 7 0 9 3419 -> 7 0 9 3454 -> 7 0 9 3610 -> 7 0 9 3484 -> 7 0 7 3453 -> 7 0 9 3514 -> 7 0 7 3483 -> 7 0 9 3544 -> 7 0 9 3431 -> 7 0 9 3466 -> 7 0 7 3513 -> 7 0 9 3574 -> 7 0 9 3496 -> 7 0 7 3543 -> 7 0 9 3604 -> 7 0 7 3465 -> 7 0 9 3526 -> 7 0 7 3573 -> 7 0 7 3495 -> 7 0 9 3556 -> 7 0 7 3603 -> 7 0 9 3443 -> 7 0 7 3525 -> 7 0 9 3586 -> 7 0 7 3555 -> 7 0 7 3585 -> 7 0 9 3421 -> 7 0 7 3426 -> 7 0 9 3433 -> 7 0 9 3479 -> 7 0 9 3455 -> 7 0 9 3539 -> 7 0 9 3515 -> 7 0 7 3438 -> 7 0 9 3491 -> 7 0 9 3599 -> 7 0 9 3467 -> 7 0 9 3575 -> 7 0 9 3551 -> 7 0 9 3527 -> 7 0 9 3503 -> 7 0 9 3587 -> 7 0 9 3563 -> 7 0 9 3451 -> 7 0 9 3481 -> 7 0 9 3422 -> 7 0 7 3450 -> 7 0 9 3511 -> 7 0 7 3480 -> 7 0 9 3541 -> 7 0 9 3463 -> 7 0 7 3510 -> 7 0 9 3571 -> 7 0 9 3493 -> 7 0 7 3540 -> 7 0 9 3601 -> 7 0 6 3416 -> 7 0 3 3917 -> 7 0 7 3640 -> 7 0 9 3615 -> 7 0 9 3650 -> 7 0 7 3670 -> 7 0 9 3713 -> 7 0 9 3680 -> 7 0 7 3700 -> 7 0 9 3710 -> 7 0 7 3652 -> 7 0 9 3627 -> 7 0 9 3662 -> 7 0 7 3682 -> 7 0 9 3692 -> 7 0 7 3664 -> 7 0 9 3639 -> 7 0 7 3694 -> 7 0 9 3617 -> 7 0 7 3613 -> 7 0 9 3629 -> 7 0 9 3675 -> 7 0 7 3625 -> 7 0 9 3651 -> 7 0 9 3711 -> 7 0 9 3687 -> 7 0 7 3637 -> 7 0 9 3663 -> 7 0 9 3699 -> 7 0 9 3647 -> 7 0 9 3677 -> 7 0 9 3618 -> 7 0 9 3707 -> 7 0 7 3649 -> 7 0 9 3659 -> 7 0 7 3679 -> 7 0 9 3689 -> 7 0 7 3709 -> 7 0 9 3630 -> 7 0 7 3661 -> 7 0 7 3691 -> 7 0 12 3712 -> 7 0 9 3614 -> 7 0 9 3642 -> 7 0 9 3626 -> 7 0 7 3622 -> 7 0 9 3702 -> 7 0 9 3678 -> 7 0 9 3654 -> 7 0 9 3638 -> 7 0 7 3634 -> 7 0 9 3690 -> 7 0 9 3666 -> 7 0 9 3644 -> 7 0 9 3674 -> 7 0 9 3704 -> 7 0 7 3646 -> 7 0 9 3621 -> 7 0 9 3656 -> 7 0 7 3676 -> 7 0 9 3686 -> 7 0 7 3706 -> 7 0 7 3658 -> 7 0 9 3633 -> 7 0 9 3668 -> 7 0 7 3688 -> 7 0 9 3698 -> 7 0 9 3623 -> 7 0 7 3619 -> 7 0 9 3645 -> 7 0 9 3705 -> 7 0 9 3635 -> 7 0 9 3681 -> 7 0 7 3631 -> 7 0 9 3657 -> 7 0 9 3693 -> 7 0 9 3669 -> 7 0 9 3641 -> 7 0 9 3671 -> 7 0 9 3701 -> 7 0 7 3643 -> 7 0 9 3653 -> 7 0 7 3673 -> 7 0 9 3683 -> 7 0 7 3703 -> 7 0 9 3624 -> 7 0 7 3655 -> 7 0 9 3665 -> 7 0 7 3685 -> 7 0 9 3695 -> 7 0 9 3636 -> 7 0 7 3667 -> 7 0 7 3697 -> 7 0 9 3620 -> 7 0 7 3616 -> 7 0 9 3672 -> 7 0 9 3648 -> 7 0 9 3632 -> 7 0 7 3628 -> 7 0 9 3708 -> 7 0 9 3684 -> 7 0 9 3660 -> 7 0 9 3696 -> 7 0 6 3612 -> 7 0 3 3793 -> 7 0 3 3920 -> 7 0 9 3729 -> 7 0 7 3725 -> 7 0 9 3778 -> 7 0 9 3754 -> 7 0 9 3741 -> 7 0 7 3737 -> 7 0 9 3790 -> 7 0 9 3766 -> 7 0 9 3744 -> 7 0 9 3774 -> 7 0 9 3718 -> 7 0 7 3746 -> 7 0 9 3756 -> 7 0 7 3776 -> 7 0 9 3786 -> 7 0 9 3730 -> 7 0 7 3758 -> 7 0 9 3768 -> 7 0 7 3788 -> 7 0 9 3742 -> 7 0 7 3770 -> 7 0 9 3726 -> 7 0 9 3745 -> 7 0 7 3722 -> 7 0 9 3781 -> 7 0 9 3738 -> 7 0 9 3757 -> 7 0 7 3734 -> 7 0 12 3791 -> 7 0 9 3769 -> 7 0 7 3743 -> 7 0 9 3753 -> 7 0 7 3773 -> 7 0 9 3721 -> 7 0 9 3783 -> 7 0 7 3755 -> 7 0 9 3765 -> 7 0 7 3785 -> 7 0 9 3733 -> 7 0 7 3767 -> 7 0 9 3723 -> 7 0 7 3719 -> 7 0 9 3748 -> 7 0 9 3735 -> 7 0 7 3731 -> 7 0 9 3784 -> 7 0 9 3760 -> 7 0 9 3772 -> 7 0 9 3750 -> 7 0 9 3780 -> 7 0 9 3724 -> 7 0 7 3752 -> 7 0 9 3762 -> 7 0 7 3782 -> 7 0 9 3736 -> 7 0 7 3764 -> 7 0 9 3720 -> 7 0 7 3716 -> 7 0 9 3775 -> 7 0 9 3732 -> 7 0 9 3751 -> 7 0 7 3728 -> 7 0 9 3787 -> 7 0 9 3763 -> 7 0 7 3740 -> 7 0 9 3747 -> 7 0 9 3777 -> 7 0 9 3792 -> 7 0 7 3749 -> 7 0 9 3759 -> 7 0 7 3779 -> 7 0 9 3727 -> 7 0 9 3789 -> 7 0 7 3761 -> 7 0 9 3771 -> 7 0 9 3739 -> 7 0 9 3717 -> 7 0 6 3715 -> 7 0 1 3415 -> 7 0 3 759 -> 7 0 9 684 -> 7 0 9 602 -> 7 0 9 662 -> 7 0 9 584 -> 7 0 9 722 -> 7 0 7 628 -> 7 0 9 644 -> 7 0 7 580 -> 7 0 9 704 -> 7 0 9 564 -> 7 0 9 626 -> 7 0 7 664 -> 7 0 7 748 -> 7 0 7 616 -> 7 0 9 686 -> 7 0 7 700 -> 7 0 9 746 -> 7 0 7 652 -> 7 0 9 542 -> 7 0 7 736 -> 7 0 9 603 -> 7 0 9 566 -> 7 0 9 639 -> 7 0 9 723 -> 7 0 9 591 -> 7 0 9 675 -> 7 0 7 562 -> 7 0 9 627 -> 7 0 9 711 -> 7 0 9 569 -> 7 0 9 747 -> 7 0 9 629 -> 7 0 9 689 -> 7 0 9 611 -> 7 0 7 571 -> 7 0 9 749 -> 7 0 9 555 -> 7 0 9 671 -> 7 0 9 593 -> 7 0 7 607 -> 7 0 9 731 -> 7 0 9 653 -> 7 0 7 691 -> 7 0 7 643 -> 7 0 9 713 -> 7 0 7 727 -> 7 0 7 595 -> 7 0 7 679 -> 7 0 7 715 -> 7 0 9 551 -> 7 0 9 630 -> 7 0 9 582 -> 7 0 9 666 -> 7 0 7 553 -> 7 0 9 750 -> 7 0 9 618 -> 7 0 9 702 -> 7 0 9 654 -> 7 0 9 738 -> 7 0 9 578 -> 7 0 9 546 -> 7 0 9 638 -> 7 0 7 598 -> 7 0 9 698 -> 7 0 9 620 -> 7 0 7 634 -> 7 0 9 680 -> 7 0 7 718 -> 7 0 7 586 -> 7 0 7 670 -> 7 0 9 740 -> 7 0 7 754 -> 7 0 7 622 -> 7 0 7 706 -> 7 0 7 742 -> 7 0 9 573 -> 7 0 7 544 -> 7 0 9 560 -> 7 0 9 609 -> 7 0 9 693 -> 7 0 9 645 -> 7 0 9 729 -> 7 0 9 597 -> 7 0 9 681 -> 7 0 9 717 -> 7 0 9 605 -> 7 0 9 665 -> 7 0 9 587 -> 7 0 9 725 -> 7 0 7 577 -> 7 0 9 647 -> 7 0 9 561 -> 7 0 7 661 -> 7 0 9 707 -> 7 0 7 613 -> 7 0 7 697 -> 7 0 7 649 -> 7 0 7 733 -> 7 0 9 545 -> 7 0 7 685 -> 7 0 9 600 -> 7 0 9 636 -> 7 0 9 720 -> 7 0 9 588 -> 7 0 9 672 -> 7 0 7 559 -> 7 0 9 756 -> 7 0 9 624 -> 7 0 9 708 -> 7 0 9 744 -> 7 0 9 572 -> 7 0 9 632 -> 7 0 9 758 -> 7 0 9 692 -> 7 0 7 568 -> 7 0 9 614 -> 7 0 9 552 -> 7 0 9 752 -> 7 0 9 674 -> 7 0 7 604 -> 7 0 7 688 -> 7 0 9 596 -> 7 0 9 734 -> 7 0 9 656 -> 7 0 7 640 -> 7 0 7 724 -> 7 0 7 592 -> 7 0 9 716 -> 7 0 7 676 -> 7 0 7 712 -> 7 0 12 757 -> 7 0 9 554 -> 7 0 9 579 -> 7 0 9 663 -> 7 0 7 550 -> 7 0 9 615 -> 7 0 9 699 -> 7 0 9 651 -> 7 0 9 735 -> 7 0 9 687 -> 7 0 9 599 -> 7 0 9 659 -> 7 0 9 543 -> 7 0 9 581 -> 7 0 9 719 -> 7 0 9 641 -> 7 0 9 701 -> 7 0 7 631 -> 7 0 9 623 -> 7 0 7 583 -> 7 0 9 683 -> 7 0 7 667 -> 7 0 9 567 -> 7 0 7 751 -> 7 0 7 619 -> 7 0 9 743 -> 7 0 7 703 -> 7 0 7 655 -> 7 0 7 739 -> 7 0 9 570 -> 7 0 7 541 -> 7 0 9 606 -> 7 0 9 690 -> 7 0 9 563 -> 7 0 9 642 -> 7 0 9 726 -> 7 0 9 594 -> 7 0 9 678 -> 7 0 7 565 -> 7 0 9 714 -> 7 0 9 608 -> 7 0 9 668 -> 7 0 9 590 -> 7 0 7 574 -> 7 0 7 658 -> 7 0 9 558 -> 7 0 9 728 -> 7 0 9 650 -> 7 0 7 610 -> 7 0 7 694 -> 7 0 9 710 -> 7 0 7 646 -> 7 0 7 730 -> 7 0 7 682 -> 7 0 9 548 -> 7 0 9 633 -> 7 0 9 585 -> 7 0 9 669 -> 7 0 7 556 -> 7 0 9 753 -> 7 0 9 621 -> 7 0 9 705 -> 7 0 9 657 -> 7 0 9 741 -> 7 0 9 575 -> 7 0 9 635 -> 7 0 9 549 -> 7 0 9 695 -> 7 0 9 617 -> 7 0 7 601 -> 7 0 9 755 -> 7 0 9 677 -> 7 0 7 637 -> 7 0 7 721 -> 7 0 9 737 -> 7 0 7 589 -> 7 0 7 673 -> 7 0 7 625 -> 7 0 7 709 -> 7 0 7 745 -> 7 0 9 576 -> 7 0 9 557 -> 7 0 9 660 -> 7 0 7 547 -> 7 0 9 612 -> 7 0 9 696 -> 7 0 9 648 -> 7 0 9 732 -> 7 0 6 540 -> 7 0 3 868 -> 7 0 12 867 -> 7 0 6 866 -> 7 0 3 865 -> 7 0 3 539 -> 7 0 9 792 -> 7 0 9 822 -> 7 0 9 852 -> 7 0 9 864 -> 7 0 9 766 -> 7 0 7 788 -> 7 0 9 804 -> 7 0 9 834 -> 7 0 7 848 -> 7 0 9 778 -> 7 0 7 824 -> 7 0 7 800 -> 7 0 9 816 -> 7 0 9 846 -> 7 0 7 860 -> 7 0 7 836 -> 7 0 7 812 -> 7 0 12 863 -> 7 0 9 768 -> 7 0 9 823 -> 7 0 7 764 -> 7 0 9 780 -> 7 0 9 799 -> 7 0 9 859 -> 7 0 9 835 -> 7 0 7 776 -> 7 0 9 811 -> 7 0 9 847 -> 7 0 9 789 -> 7 0 9 819 -> 7 0 9 849 -> 7 0 9 801 -> 7 0 9 769 -> 7 0 9 831 -> 7 0 7 791 -> 7 0 9 861 -> 7 0 9 813 -> 7 0 7 851 -> 7 0 9 781 -> 7 0 7 827 -> 7 0 9 843 -> 7 0 7 803 -> 7 0 7 839 -> 7 0 7 815 -> 7 0 9 765 -> 7 0 9 790 -> 7 0 9 777 -> 7 0 9 850 -> 7 0 9 826 -> 7 0 7 767 -> 7 0 9 802 -> 7 0 9 862 -> 7 0 9 838 -> 7 0 7 779 -> 7 0 9 814 -> 7 0 9 798 -> 7 0 9 828 -> 7 0 9 858 -> 7 0 9 772 -> 7 0 7 818 -> 7 0 7 794 -> 7 0 9 810 -> 7 0 9 840 -> 7 0 7 854 -> 7 0 9 784 -> 7 0 7 830 -> 7 0 7 806 -> 7 0 7 842 -> 7 0 9 762 -> 7 0 9 774 -> 7 0 9 793 -> 7 0 9 853 -> 7 0 9 829 -> 7 0 7 770 -> 7 0 9 786 -> 7 0 9 805 -> 7 0 9 841 -> 7 0 7 782 -> 7 0 9 817 -> 7 0 9 795 -> 7 0 9 763 -> 7 0 9 825 -> 7 0 9 855 -> 7 0 9 807 -> 7 0 9 775 -> 7 0 7 821 -> 7 0 9 837 -> 7 0 7 797 -> 7 0 7 857 -> 7 0 9 787 -> 7 0 7 833 -> 7 0 7 809 -> 7 0 7 845 -> 7 0 9 771 -> 7 0 9 820 -> 7 0 7 761 -> 7 0 9 796 -> 7 0 9 783 -> 7 0 9 856 -> 7 0 9 832 -> 7 0 7 773 -> 7 0 9 808 -> 7 0 9 844 -> 7 0 7 785 -> 7 0 6 760 -> 7 0 7 519 -> 7 0 9 506 -> 7 0 7 528 -> 7 0 9 518 -> 7 0 9 508 -> 7 0 9 533 -> 7 0 12 537 -> 7 0 9 520 -> 7 0 7 510 -> 7 0 7 522 -> 7 0 9 535 -> 7 0 9 509 -> 7 0 7 531 -> 7 0 9 521 -> 7 0 9 505 -> 7 0 7 501 -> 7 0 9 517 -> 7 0 9 536 -> 7 0 7 513 -> 7 0 7 525 -> 7 0 9 532 -> 7 0 9 538 -> 7 0 9 512 -> 7 0 7 534 -> 7 0 9 524 -> 7 0 9 502 -> 7 0 9 514 -> 7 0 7 504 -> 7 0 9 526 -> 7 0 7 516 -> 7 0 9 529 -> 7 0 9 503 -> 7 0 9 515 -> 7 0 9 527 -> 7 0 9 511 -> 7 0 9 530 -> 7 0 7 507 -> 7 0 9 523 -> 7 0 6 500 -> 7 0 1 499 -> 7 0 7 3373 -> 7 0 9 3320 -> 7 0 9 3332 -> 7 0 9 3381 -> 7 0 9 3357 -> 7 0 9 3344 -> 7 0 9 3393 -> 7 0 9 3369 -> 7 0 9 3405 -> 7 0 9 3347 -> 7 0 9 3377 -> 7 0 9 3407 -> 7 0 9 3321 -> 7 0 9 3359 -> 7 0 9 3389 -> 7 0 7 3376 -> 7 0 9 3333 -> 7 0 9 3371 -> 7 0 7 3382 -> 7 0 9 3401 -> 7 0 7 3388 -> 7 0 9 3345 -> 7 0 7 3394 -> 7 0 7 3400 -> 7 0 9 3329 -> 7 0 9 3348 -> 7 0 9 3408 -> 7 0 7 3322 -> 7 0 9 3384 -> 7 0 9 3341 -> 7 0 9 3360 -> 7 0 7 3328 -> 7 0 7 3334 -> 7 0 9 3396 -> 7 0 9 3372 -> 7 0 7 3340 -> 7 0 9 3356 -> 7 0 9 3324 -> 7 0 9 3386 -> 7 0 7 3346 -> 7 0 7 3352 -> 7 0 9 3368 -> 7 0 9 3336 -> 7 0 9 3398 -> 7 0 7 3358 -> 7 0 7 3364 -> 7 0 7 3370 -> 7 0 9 3326 -> 7 0 9 3351 -> 7 0 9 3338 -> 7 0 9 3387 -> 7 0 9 3363 -> 7 0 9 3399 -> 7 0 9 3375 -> 7 0 9 3353 -> 7 0 9 3383 -> 7 0 9 3327 -> 7 0 9 3365 -> 7 0 7 3379 -> 7 0 9 3395 -> 7 0 9 3339 -> 7 0 7 3385 -> 7 0 7 3391 -> 7 0 7 3397 -> 7 0 7 3403 -> 7 0 9 3323 -> 7 0 9 3378 -> 7 0 7 3319 -> 7 0 9 3335 -> 7 0 9 3354 -> 7 0 7 3325 -> 7 0 9 3390 -> 7 0 7 3331 -> 7 0 9 3366 -> 7 0 7 3337 -> 7 0 9 3402 -> 7 0 7 3343 -> 7 0 9 3350 -> 7 0 12 3409 -> 7 0 9 3380 -> 7 0 9 3410 -> 7 0 9 3362 -> 7 0 9 3330 -> 7 0 7 3349 -> 7 0 9 3392 -> 7 0 7 3406 -> 7 0 7 3355 -> 7 0 9 3374 -> 7 0 9 3342 -> 7 0 7 3361 -> 7 0 9 3404 -> 7 0 7 3367 -> 7 0 6 3318 -> 7 0 12 3413 -> 7 0 6 3412 -> 7 0 3 3317 -> 7 0 3 3414 -> 7 0 16 3155 -> 7 0 16 3131 -> 7 0 16 3107 -> 7 0 16 3191 -> 7 0 16 3167 -> 7 0 16 3143 -> 7 0 14 3144 -> 7 0 14 3093 -> 7 0 16 3121 -> 7 0 14 3150 -> 7 0 14 3099 -> 7 0 16 3151 -> 7 0 14 3156 -> 7 0 16 3181 -> 7 0 16 3103 -> 7 0 14 3105 -> 7 0 16 3133 -> 7 0 14 3162 -> 7 0 14 3111 -> 7 0 16 3163 -> 7 0 14 3168 -> 7 0 16 3193 -> 7 0 16 3146 -> 7 0 16 3122 -> 7 0 16 3098 -> 7 0 16 3182 -> 7 0 16 3158 -> 7 0 16 3134 -> 7 0 16 3110 -> 7 0 16 3194 -> 7 0 16 3170 -> 7 0 14 3114 -> 7 0 16 3118 -> 7 0 14 3120 -> 7 0 16 3148 -> 7 0 14 3177 -> 7 0 14 3126 -> 7 0 16 3178 -> 7 0 16 3100 -> 7 0 14 3183 -> 7 0 16 3130 -> 7 0 14 3132 -> 7 0 16 3160 -> 7 0 14 3189 -> 7 0 14 3138 -> 7 0 16 3190 -> 7 0 16 3112 -> 7 0 14 3195 -> 7 0 16 3142 -> 7 0 16 3172 -> 7 0 16 3149 -> 7 0 16 3125 -> 7 0 16 3101 -> 7 0 16 3185 -> 7 0 16 3161 -> 7 0 16 3137 -> 7 0 16 3113 -> 7 0 16 3197 -> 7 0 16 3173 -> 7 0 16 3115 -> 7 0 16 3145 -> 7 0 14 3147 -> 7 0 14 3096 -> 7 0 16 3175 -> 7 0 16 3097 -> 7 0 14 3153 -> 7 0 19 3201 -> 7 0 14 3102 -> 7 0 16 3127 -> 7 0 16 3157 -> 7 0 14 3159 -> 7 0 14 3108 -> 7 0 16 3187 -> 7 0 16 3109 -> 7 0 14 3165 -> 7 0 16 3139 -> 7 0 16 3169 -> 7 0 14 3171 -> 7 0 16 3199 -> 7 0 16 3202 -> 7 0 16 3116 -> 7 0 16 3176 -> 7 0 16 3152 -> 7 0 16 3128 -> 7 0 16 3104 -> 7 0 16 3188 -> 7 0 16 3164 -> 7 0 16 3140 -> 7 0 16 3200 -> 7 0 14 3117 -> 7 0 14 3174 -> 7 0 16 3094 -> 7 0 14 3123 -> 7 0 16 3124 -> 7 0 14 3180 -> 7 0 14 3129 -> 7 0 16 3154 -> 7 0 16 3184 -> 7 0 14 3186 -> 7 0 16 3106 -> 7 0 14 3135 -> 7 0 16 3136 -> 7 0 14 3192 -> 7 0 14 3141 -> 7 0 16 3166 -> 7 0 16 3196 -> 7 0 14 3198 -> 7 0 16 3119 -> 7 0 16 3095 -> 7 0 16 3179 -> 7 0 13 3092 -> 7 0 9 3316 -> 7 0 16 3278 -> 7 0 16 3290 -> 7 0 16 3274 -> 7 0 16 3286 -> 7 0 16 3281 -> 7 0 14 3273 -> 7 0 14 3279 -> 7 0 14 3285 -> 7 0 16 3283 -> 7 0 16 3284 -> 7 0 16 3280 -> 7 0 16 3275 -> 7 0 14 3276 -> 7 0 16 3287 -> 7 0 14 3282 -> 7 0 14 3288 -> 7 0 16 3277 -> 7 0 19 3291 -> 7 0 16 3289 -> 7 0 16 3292 -> 7 0 13 3272 -> 7 0 14 2352 -> 7 0 16 2371 -> 7 0 16 2444 -> 7 0 16 2420 -> 7 0 14 2358 -> 7 0 16 2396 -> 7 0 14 2364 -> 7 0 16 2456 -> 7 0 16 2432 -> 7 0 14 2370 -> 7 0 16 2408 -> 7 0 14 2376 -> 7 0 16 2386 -> 7 0 16 2416 -> 7 0 16 2446 -> 7 0 16 2360 -> 7 0 16 2398 -> 7 0 16 2428 -> 7 0 14 2412 -> 7 0 16 2458 -> 7 0 16 2372 -> 7 0 14 2418 -> 7 0 14 2424 -> 7 0 14 2430 -> 7 0 14 2436 -> 7 0 16 2356 -> 7 0 16 2411 -> 7 0 16 2368 -> 7 0 16 2387 -> 7 0 16 2447 -> 7 0 16 2423 -> 7 0 16 2399 -> 7 0 19 2460 -> 7 0 16 2459 -> 7 0 16 2435 -> 7 0 16 2383 -> 7 0 16 2413 -> 7 0 16 2443 -> 7 0 16 2461 -> 7 0 16 2395 -> 7 0 16 2363 -> 7 0 16 2425 -> 7 0 14 2382 -> 7 0 16 2455 -> 7 0 14 2439 -> 7 0 14 2388 -> 7 0 16 2407 -> 7 0 16 2375 -> 7 0 16 2437 -> 7 0 14 2445 -> 7 0 14 2394 -> 7 0 14 2451 -> 7 0 14 2400 -> 7 0 14 2457 -> 7 0 14 2406 -> 7 0 16 2353 -> 7 0 16 2365 -> 7 0 16 2414 -> 7 0 16 2390 -> 7 0 14 2355 -> 7 0 16 2377 -> 7 0 16 2450 -> 7 0 14 2361 -> 7 0 16 2426 -> 7 0 16 2402 -> 7 0 14 2367 -> 7 0 14 2373 -> 7 0 16 2438 -> 7 0 16 2380 -> 7 0 16 2410 -> 7 0 16 2440 -> 7 0 16 2354 -> 7 0 16 2392 -> 7 0 16 2422 -> 7 0 16 2452 -> 7 0 16 2366 -> 7 0 14 2409 -> 7 0 16 2404 -> 7 0 14 2415 -> 7 0 16 2434 -> 7 0 16 2378 -> 7 0 14 2421 -> 7 0 14 2427 -> 7 0 14 2433 -> 7 0 16 2362 -> 7 0 16 2381 -> 7 0 16 2441 -> 7 0 16 2417 -> 7 0 16 2374 -> 7 0 16 2393 -> 7 0 16 2453 -> 7 0 16 2429 -> 7 0 16 2405 -> 7 0 16 2389 -> 7 0 16 2357 -> 7 0 16 2419 -> 7 0 16 2449 -> 7 0 14 2379 -> 7 0 16 2401 -> 7 0 16 2369 -> 7 0 14 2385 -> 7 0 16 2431 -> 7 0 14 2442 -> 7 0 14 2391 -> 7 0 14 2448 -> 7 0 14 2397 -> 7 0 14 2454 -> 7 0 14 2403 -> 7 0 16 2359 -> 7 0 16 2384 -> 7 0 13 2351 -> 7 0 14 2592 -> 7 0 16 2665 -> 7 0 14 2649 -> 7 0 16 2677 -> 7 0 16 2600 -> 7 0 16 2576 -> 7 0 16 2636 -> 7 0 16 2612 -> 7 0 16 2588 -> 7 0 16 2648 -> 7 0 16 2624 -> 7 0 16 2660 -> 7 0 16 2596 -> 7 0 16 2626 -> 7 0 16 2672 -> 7 0 16 2578 -> 7 0 14 2595 -> 7 0 16 2608 -> 7 0 16 2638 -> 7 0 14 2601 -> 7 0 16 2590 -> 7 0 14 2607 -> 7 0 16 2620 -> 7 0 16 2650 -> 7 0 14 2613 -> 7 0 16 2662 -> 7 0 14 2619 -> 7 0 14 2658 -> 7 0 16 2674 -> 7 0 14 2664 -> 7 0 14 2670 -> 7 0 16 2627 -> 7 0 14 2676 -> 7 0 16 2603 -> 7 0 16 2579 -> 7 0 16 2639 -> 7 0 16 2615 -> 7 0 16 2591 -> 7 0 16 2651 -> 7 0 16 2663 -> 7 0 16 2575 -> 7 0 16 2675 -> 7 0 16 2605 -> 7 0 16 2635 -> 7 0 16 2587 -> 7 0 14 2628 -> 7 0 14 2577 -> 7 0 16 2617 -> 7 0 14 2634 -> 7 0 16 2647 -> 7 0 14 2583 -> 7 0 14 2640 -> 7 0 16 2659 -> 7 0 14 2589 -> 7 0 14 2646 -> 7 0 14 2652 -> 7 0 16 2671 -> 7 0 16 2630 -> 7 0 16 2606 -> 7 0 16 2582 -> 7 0 16 2642 -> 7 0 16 2618 -> 7 0 16 2594 -> 7 0 16 2654 -> 7 0 16 2666 -> 7 0 16 2602 -> 7 0 16 2632 -> 7 0 16 2678 -> 7 0 16 2584 -> 7 0 14 2598 -> 7 0 16 2614 -> 7 0 14 2604 -> 7 0 16 2644 -> 7 0 14 2610 -> 7 0 16 2656 -> 7 0 14 2616 -> 7 0 14 2622 -> 7 0 14 2655 -> 7 0 16 2668 -> 7 0 14 2661 -> 7 0 14 2667 -> 7 0 16 2680 -> 7 0 16 2597 -> 7 0 14 2673 -> 7 0 19 2682 -> 7 0 14 2679 -> 7 0 16 2633 -> 7 0 16 2609 -> 7 0 16 2585 -> 7 0 16 2645 -> 7 0 16 2621 -> 7 0 16 2657 -> 7 0 16 2683 -> 7 0 16 2669 -> 7 0 16 2599 -> 7 0 16 2629 -> 7 0 16 2581 -> 7 0 16 2681 -> 7 0 16 2611 -> 7 0 14 2625 -> 7 0 14 2574 -> 7 0 16 2641 -> 7 0 14 2631 -> 7 0 14 2580 -> 7 0 16 2593 -> 7 0 16 2623 -> 7 0 14 2637 -> 7 0 14 2586 -> 7 0 16 2653 -> 7 0 14 2643 -> 7 0 13 2573 -> 7 0 16 2867 -> 7 0 14 2814 -> 7 0 16 2821 -> 7 0 16 2851 -> 7 0 14 2871 -> 7 0 14 2820 -> 7 0 16 2881 -> 7 0 16 2803 -> 7 0 14 2877 -> 7 0 14 2826 -> 7 0 16 2833 -> 7 0 16 2863 -> 7 0 14 2883 -> 7 0 14 2832 -> 7 0 16 2893 -> 7 0 14 2889 -> 7 0 14 2838 -> 7 0 14 2895 -> 7 0 16 2846 -> 7 0 16 2822 -> 7 0 16 2798 -> 7 0 16 2882 -> 7 0 16 2858 -> 7 0 16 2834 -> 7 0 16 2810 -> 7 0 16 2894 -> 7 0 16 2870 -> 7 0 16 2818 -> 7 0 14 2841 -> 7 0 16 2848 -> 7 0 16 2878 -> 7 0 16 2800 -> 7 0 14 2847 -> 7 0 19 2904 -> 7 0 14 2796 -> 7 0 16 2830 -> 7 0 14 2853 -> 7 0 16 2860 -> 7 0 14 2802 -> 7 0 16 2890 -> 7 0 14 2859 -> 7 0 14 2808 -> 7 0 14 2865 -> 7 0 16 2905 -> 7 0 16 2813 -> 7 0 16 2873 -> 7 0 16 2849 -> 7 0 16 2825 -> 7 0 16 2801 -> 7 0 16 2885 -> 7 0 16 2861 -> 7 0 16 2837 -> 7 0 16 2897 -> 7 0 16 2815 -> 7 0 14 2811 -> 7 0 16 2845 -> 7 0 16 2875 -> 7 0 16 2797 -> 7 0 14 2817 -> 7 0 16 2827 -> 7 0 14 2874 -> 7 0 14 2823 -> 7 0 16 2857 -> 7 0 14 2880 -> 7 0 16 2887 -> 7 0 16 2809 -> 7 0 14 2829 -> 7 0 16 2839 -> 7 0 14 2886 -> 7 0 14 2835 -> 7 0 16 2869 -> 7 0 14 2892 -> 7 0 16 2899 -> 7 0 14 2898 -> 7 0 16 2816 -> 7 0 16 2876 -> 7 0 16 2852 -> 7 0 16 2828 -> 7 0 16 2804 -> 7 0 16 2888 -> 7 0 16 2864 -> 7 0 16 2840 -> 7 0 16 2900 -> 7 0 16 2812 -> 7 0 16 2842 -> 7 0 16 2872 -> 7 0 16 2902 -> 7 0 16 2824 -> 7 0 14 2844 -> 7 0 16 2854 -> 7 0 14 2901 -> 7 0 14 2850 -> 7 0 16 2884 -> 7 0 14 2799 -> 7 0 16 2806 -> 7 0 16 2836 -> 7 0 14 2856 -> 7 0 14 2805 -> 7 0 16 2866 -> 7 0 14 2862 -> 7 0 16 2896 -> 7 0 14 2868 -> 7 0 16 2843 -> 7 0 16 2819 -> 7 0 16 2903 -> 7 0 16 2879 -> 7 0 16 2855 -> 7 0 16 2831 -> 7 0 16 2807 -> 7 0 16 2891 -> 7 0 13 2795 -> 7 0 16 3020 -> 7 0 16 3080 -> 7 0 16 2992 -> 7 0 14 3021 -> 7 0 16 3022 -> 7 0 16 3052 -> 7 0 14 3027 -> 7 0 16 3082 -> 7 0 16 3004 -> 7 0 14 3084 -> 7 0 14 3033 -> 7 0 16 3034 -> 7 0 14 2982 -> 7 0 16 3064 -> 7 0 16 2986 -> 7 0 14 3039 -> 7 0 14 2988 -> 7 0 16 3016 -> 7 0 14 3045 -> 7 0 16 3046 -> 7 0 16 3076 -> 7 0 16 3023 -> 7 0 16 2999 -> 7 0 16 3083 -> 7 0 16 3059 -> 7 0 16 3035 -> 7 0 16 3011 -> 7 0 16 2987 -> 7 0 16 3071 -> 7 0 16 3047 -> 7 0 14 2991 -> 7 0 14 2997 -> 7 0 16 3001 -> 7 0 14 3054 -> 7 0 14 3003 -> 7 0 16 3031 -> 7 0 14 3060 -> 7 0 16 3061 -> 7 0 16 2983 -> 7 0 14 3009 -> 7 0 16 3013 -> 7 0 14 3066 -> 7 0 14 3015 -> 7 0 16 3043 -> 7 0 14 3072 -> 7 0 16 3073 -> 7 0 14 3078 -> 7 0 16 3026 -> 7 0 16 3002 -> 7 0 16 3086 -> 7 0 16 3062 -> 7 0 16 3038 -> 7 0 16 3014 -> 7 0 16 2990 -> 7 0 16 3074 -> 7 0 16 3050 -> 7 0 16 2998 -> 7 0 14 3024 -> 7 0 16 3028 -> 7 0 14 3081 -> 7 0 14 3030 -> 7 0 16 3058 -> 7 0 14 3087 -> 7 0 16 3088 -> 7 0 16 3010 -> 7 0 14 3036 -> 7 0 14 2985 -> 7 0 16 3040 -> 7 0 14 3042 -> 7 0 16 3070 -> 7 0 14 3048 -> 7 0 16 2993 -> 7 0 16 3053 -> 7 0 16 3029 -> 7 0 16 3005 -> 7 0 16 3089 -> 7 0 16 3065 -> 7 0 16 3041 -> 7 0 16 3017 -> 7 0 16 3077 -> 7 0 14 2994 -> 7 0 16 2995 -> 7 0 16 3025 -> 7 0 14 3051 -> 7 0 14 3000 -> 7 0 16 3055 -> 7 0 14 3057 -> 7 0 16 3085 -> 7 0 14 3006 -> 7 0 16 3007 -> 7 0 16 3037 -> 7 0 14 3063 -> 7 0 14 3012 -> 7 0 16 3067 -> 7 0 19 3090 -> 7 0 16 2989 -> 7 0 14 3069 -> 7 0 14 3018 -> 7 0 16 3019 -> 7 0 16 3049 -> 7 0 14 3075 -> 7 0 16 3079 -> 7 0 16 3091 -> 7 0 16 2996 -> 7 0 16 3056 -> 7 0 16 3032 -> 7 0 16 3008 -> 7 0 16 2984 -> 7 0 16 3068 -> 7 0 16 3044 -> 7 0 13 2981 -> 7 0 16 3305 -> 7 0 14 3306 -> 7 0 16 3295 -> 7 0 16 3308 -> 7 0 16 3296 -> 7 0 14 3294 -> 7 0 14 3300 -> 7 0 16 3310 -> 7 0 14 3303 -> 7 0 16 3311 -> 7 0 14 3309 -> 7 0 16 3299 -> 7 0 16 3307 -> 7 0 19 3312 -> 7 0 16 3301 -> 7 0 16 3313 -> 7 0 16 3302 -> 7 0 14 3297 -> 7 0 16 3304 -> 7 0 16 3298 -> 7 0 13 3293 -> 7 0 16 3227 -> 7 0 16 3244 -> 7 0 16 3256 -> 7 0 16 3211 -> 7 0 14 3210 -> 7 0 14 3216 -> 7 0 16 3223 -> 7 0 14 3222 -> 7 0 16 3205 -> 7 0 14 3228 -> 7 0 16 3235 -> 7 0 14 3234 -> 7 0 16 3269 -> 7 0 16 3245 -> 7 0 16 3257 -> 7 0 16 3218 -> 7 0 16 3241 -> 7 0 16 3230 -> 7 0 16 3206 -> 7 0 14 3240 -> 7 0 14 3246 -> 7 0 16 3253 -> 7 0 14 3252 -> 7 0 16 3208 -> 7 0 14 3258 -> 7 0 16 3265 -> 7 0 14 3264 -> 7 0 16 3220 -> 7 0 16 3232 -> 7 0 14 3204 -> 7 0 16 3248 -> 7 0 16 3260 -> 7 0 16 3209 -> 7 0 16 3221 -> 7 0 16 3238 -> 7 0 16 3268 -> 7 0 16 3233 -> 7 0 14 3267 -> 7 0 16 3250 -> 7 0 16 3262 -> 7 0 19 3270 -> 7 0 14 3207 -> 7 0 16 3217 -> 7 0 14 3213 -> 7 0 14 3219 -> 7 0 16 3229 -> 7 0 14 3225 -> 7 0 16 3271 -> 7 0 14 3231 -> 7 0 16 3239 -> 7 0 16 3251 -> 7 0 16 3263 -> 7 0 16 3212 -> 7 0 16 3224 -> 7 0 14 3237 -> 7 0 16 3247 -> 7 0 16 3236 -> 7 0 14 3243 -> 7 0 14 3249 -> 7 0 16 3259 -> 7 0 14 3255 -> 7 0 16 3214 -> 7 0 14 3261 -> 7 0 16 3226 -> 7 0 16 3242 -> 7 0 16 3254 -> 7 0 16 3266 -> 7 0 16 3215 -> 7 0 13 3203 -> 7 0 19 3315 -> 7 0 13 3314 -> 7 0 16 2474 -> 7 0 16 2534 -> 7 0 16 2510 -> 7 0 16 2486 -> 7 0 19 2571 -> 7 0 16 2570 -> 7 0 16 2546 -> 7 0 16 2522 -> 7 0 16 2498 -> 7 0 16 2558 -> 7 0 16 2572 -> 7 0 16 2482 -> 7 0 16 2512 -> 7 0 14 2472 -> 7 0 16 2542 -> 7 0 16 2464 -> 7 0 14 2478 -> 7 0 16 2494 -> 7 0 16 2524 -> 7 0 14 2535 -> 7 0 14 2484 -> 7 0 16 2554 -> 7 0 14 2541 -> 7 0 14 2490 -> 7 0 14 2547 -> 7 0 14 2496 -> 7 0 14 2553 -> 7 0 14 2559 -> 7 0 16 2477 -> 7 0 16 2537 -> 7 0 16 2513 -> 7 0 16 2489 -> 7 0 16 2465 -> 7 0 16 2549 -> 7 0 16 2525 -> 7 0 16 2501 -> 7 0 16 2561 -> 7 0 16 2479 -> 7 0 16 2509 -> 7 0 16 2539 -> 7 0 16 2569 -> 7 0 16 2491 -> 7 0 14 2505 -> 7 0 16 2521 -> 7 0 16 2551 -> 7 0 14 2562 -> 7 0 14 2511 -> 7 0 14 2568 -> 7 0 14 2517 -> 7 0 14 2466 -> 7 0 14 2523 -> 7 0 14 2529 -> 7 0 16 2504 -> 7 0 16 2480 -> 7 0 16 2564 -> 7 0 16 2540 -> 7 0 16 2516 -> 7 0 16 2492 -> 7 0 16 2468 -> 7 0 16 2552 -> 7 0 16 2528 -> 7 0 16 2476 -> 7 0 16 2506 -> 7 0 16 2536 -> 7 0 16 2566 -> 7 0 16 2488 -> 7 0 14 2475 -> 7 0 16 2518 -> 7 0 14 2532 -> 7 0 16 2548 -> 7 0 16 2470 -> 7 0 14 2481 -> 7 0 16 2500 -> 7 0 14 2538 -> 7 0 14 2487 -> 7 0 16 2530 -> 7 0 14 2544 -> 7 0 16 2560 -> 7 0 14 2493 -> 7 0 14 2550 -> 7 0 14 2499 -> 7 0 14 2556 -> 7 0 16 2507 -> 7 0 16 2483 -> 7 0 16 2567 -> 7 0 16 2543 -> 7 0 16 2519 -> 7 0 16 2495 -> 7 0 16 2471 -> 7 0 16 2555 -> 7 0 16 2531 -> 7 0 16 2473 -> 7 0 16 2503 -> 7 0 16 2533 -> 7 0 16 2563 -> 7 0 16 2485 -> 7 0 16 2515 -> 7 0 14 2502 -> 7 0 16 2545 -> 7 0 16 2467 -> 7 0 16 2497 -> 7 0 14 2508 -> 7 0 16 2527 -> 7 0 14 2565 -> 7 0 14 2514 -> 7 0 16 2557 -> 7 0 14 2463 -> 7 0 14 2520 -> 7 0 14 2469 -> 7 0 14 2526 -> 7 0 13 2462 -> 7 0 16 2692 -> 7 0 16 2722 -> 7 0 16 2752 -> 7 0 14 2691 -> 7 0 16 2782 -> 7 0 16 2704 -> 7 0 14 2748 -> 7 0 14 2697 -> 7 0 16 2734 -> 7 0 14 2754 -> 7 0 16 2764 -> 7 0 16 2686 -> 7 0 14 2703 -> 7 0 16 2716 -> 7 0 14 2760 -> 7 0 14 2709 -> 7 0 16 2746 -> 7 0 14 2766 -> 7 0 16 2776 -> 7 0 14 2715 -> 7 0 14 2772 -> 7 0 16 2723 -> 7 0 16 2699 -> 7 0 16 2783 -> 7 0 16 2759 -> 7 0 16 2735 -> 7 0 16 2711 -> 7 0 16 2687 -> 7 0 16 2771 -> 7 0 16 2747 -> 7 0 16 2689 -> 7 0 16 2719 -> 7 0 16 2749 -> 7 0 16 2779 -> 7 0 16 2701 -> 7 0 14 2718 -> 7 0 16 2731 -> 7 0 14 2724 -> 7 0 16 2761 -> 7 0 14 2781 -> 7 0 16 2791 -> 7 0 16 2713 -> 7 0 14 2730 -> 7 0 16 2743 -> 7 0 14 2787 -> 7 0 14 2736 -> 7 0 16 2773 -> 7 0 14 2685 -> 7 0 14 2742 -> 7 0 16 2690 -> 7 0 16 2750 -> 7 0 16 2726 -> 7 0 16 2702 -> 7 0 16 2786 -> 7 0 16 2762 -> 7 0 16 2738 -> 7 0 16 2714 -> 7 0 16 2774 -> 7 0 14 2688 -> 7 0 16 2698 -> 7 0 16 2728 -> 7 0 14 2694 -> 7 0 16 2758 -> 7 0 14 2751 -> 7 0 16 2788 -> 7 0 14 2700 -> 7 0 16 2710 -> 7 0 16 2740 -> 7 0 14 2757 -> 7 0 14 2706 -> 7 0 16 2770 -> 7 0 19 2793 -> 7 0 14 2763 -> 7 0 14 2712 -> 7 0 14 2769 -> 7 0 14 2775 -> 7 0 16 2794 -> 7 0 16 2693 -> 7 0 16 2753 -> 7 0 16 2729 -> 7 0 16 2705 -> 7 0 16 2789 -> 7 0 16 2765 -> 7 0 16 2741 -> 7 0 16 2717 -> 7 0 16 2777 -> 7 0 16 2695 -> 7 0 16 2725 -> 7 0 16 2755 -> 7 0 14 2721 -> 7 0 16 2785 -> 7 0 16 2707 -> 7 0 14 2778 -> 7 0 14 2727 -> 7 0 16 2737 -> 7 0 16 2767 -> 7 0 14 2784 -> 7 0 14 2733 -> 7 0 14 2790 -> 7 0 14 2739 -> 7 0 14 2745 -> 7 0 16 2720 -> 7 0 16 2696 -> 7 0 16 2780 -> 7 0 16 2756 -> 7 0 16 2732 -> 7 0 16 2708 -> 7 0 16 2792 -> 7 0 16 2768 -> 7 0 16 2744 -> 7 0 13 2684 -> 7 0 16 2918 -> 7 0 16 2935 -> 7 0 14 2961 -> 7 0 16 2965 -> 7 0 14 2967 -> 7 0 16 2947 -> 7 0 14 2973 -> 7 0 16 2977 -> 7 0 19 2979 -> 7 0 14 2907 -> 7 0 16 2914 -> 7 0 14 2913 -> 7 0 14 2919 -> 7 0 16 2926 -> 7 0 14 2925 -> 7 0 16 2980 -> 7 0 16 2960 -> 7 0 16 2936 -> 7 0 16 2972 -> 7 0 16 2948 -> 7 0 16 2909 -> 7 0 16 2932 -> 7 0 16 2921 -> 7 0 14 2931 -> 7 0 16 2962 -> 7 0 14 2937 -> 7 0 16 2944 -> 7 0 14 2943 -> 7 0 16 2974 -> 7 0 14 2949 -> 7 0 16 2956 -> 7 0 14 2955 -> 7 0 16 2911 -> 7 0 16 2923 -> 7 0 16 2963 -> 7 0 16 2939 -> 7 0 16 2975 -> 7 0 16 2951 -> 7 0 16 2912 -> 7 0 16 2929 -> 7 0 16 2959 -> 7 0 14 2958 -> 7 0 16 2924 -> 7 0 16 2941 -> 7 0 14 2964 -> 7 0 16 2971 -> 7 0 14 2970 -> 7 0 16 2953 -> 7 0 14 2976 -> 7 0 16 2908 -> 7 0 14 2910 -> 7 0 14 2916 -> 7 0 16 2920 -> 7 0 14 2922 -> 7 0 16 2930 -> 7 0 16 2966 -> 7 0 16 2942 -> 7 0 16 2978 -> 7 0 16 2954 -> 7 0 16 2915 -> 7 0 14 2928 -> 7 0 14 2934 -> 7 0 16 2938 -> 7 0 16 2927 -> 7 0 16 2968 -> 7 0 14 2940 -> 7 0 14 2946 -> 7 0 16 2950 -> 7 0 14 2952 -> 7 0 16 2917 -> 7 0 16 2933 -> 7 0 16 2969 -> 7 0 16 2945 -> 7 0 16 2957 -> 7 0 13 2906 -> 7 0 6 2350 -> 7 0 3 3411 -> 7 0 1 2349 -> 7 0 9 2054 -> 7 0 19 2053 -> 7 0 13 2052 -> 7 0 16 1718 -> 7 0 14 1636 -> 7 0 19 1726 -> 7 0 14 1642 -> 7 0 14 1699 -> 7 0 14 1648 -> 7 0 14 1705 -> 7 0 16 1616 -> 7 0 14 1654 -> 7 0 14 1711 -> 7 0 16 1641 -> 7 0 14 1660 -> 7 0 14 1717 -> 7 0 16 1628 -> 7 0 16 1701 -> 7 0 16 1677 -> 7 0 14 1723 -> 7 0 16 1653 -> 7 0 16 1713 -> 7 0 16 1689 -> 7 0 16 1665 -> 7 0 16 1725 -> 7 0 16 1643 -> 7 0 16 1673 -> 7 0 16 1703 -> 7 0 16 1617 -> 7 0 16 1655 -> 7 0 16 1685 -> 7 0 16 1715 -> 7 0 16 1629 -> 7 0 14 1669 -> 7 0 14 1675 -> 7 0 16 1613 -> 7 0 14 1681 -> 7 0 16 1668 -> 7 0 14 1687 -> 7 0 16 1625 -> 7 0 16 1644 -> 7 0 14 1693 -> 7 0 16 1704 -> 7 0 16 1680 -> 7 0 16 1656 -> 7 0 16 1716 -> 7 0 14 1609 -> 7 0 16 1692 -> 7 0 14 1615 -> 7 0 14 1621 -> 7 0 16 1640 -> 7 0 14 1627 -> 7 0 16 1670 -> 7 0 16 1700 -> 7 0 16 1727 -> 7 0 14 1633 -> 7 0 16 1652 -> 7 0 16 1620 -> 7 0 16 1682 -> 7 0 16 1712 -> 7 0 16 1664 -> 7 0 16 1632 -> 7 0 16 1694 -> 7 0 16 1724 -> 7 0 14 1639 -> 7 0 14 1696 -> 7 0 14 1645 -> 7 0 16 1610 -> 7 0 14 1702 -> 7 0 14 1651 -> 7 0 14 1708 -> 7 0 14 1657 -> 7 0 16 1622 -> 7 0 14 1714 -> 7 0 14 1663 -> 7 0 16 1671 -> 7 0 16 1647 -> 7 0 14 1720 -> 7 0 16 1634 -> 7 0 16 1707 -> 7 0 16 1683 -> 7 0 16 1659 -> 7 0 16 1719 -> 7 0 16 1695 -> 7 0 16 1637 -> 7 0 16 1667 -> 7 0 16 1697 -> 7 0 16 1611 -> 7 0 16 1649 -> 7 0 16 1679 -> 7 0 16 1709 -> 7 0 16 1623 -> 7 0 16 1661 -> 7 0 16 1691 -> 7 0 16 1721 -> 7 0 16 1635 -> 7 0 14 1666 -> 7 0 14 1672 -> 7 0 14 1678 -> 7 0 16 1619 -> 7 0 16 1638 -> 7 0 14 1684 -> 7 0 14 1690 -> 7 0 16 1698 -> 7 0 16 1674 -> 7 0 16 1631 -> 7 0 16 1650 -> 7 0 16 1710 -> 7 0 16 1686 -> 7 0 16 1662 -> 7 0 14 1612 -> 7 0 16 1722 -> 7 0 14 1618 -> 7 0 14 1624 -> 7 0 14 1630 -> 7 0 16 1646 -> 7 0 16 1614 -> 7 0 16 1676 -> 7 0 16 1706 -> 7 0 16 1658 -> 7 0 16 1626 -> 7 0 16 1688 -> 7 0 13 1608 -> 7 0 16 1826 -> 7 0 16 1748 -> 7 0 16 1778 -> 7 0 16 1808 -> 7 0 14 1759 -> 7 0 14 1765 -> 7 0 14 1822 -> 7 0 14 1771 -> 7 0 14 1828 -> 7 0 14 1777 -> 7 0 16 1761 -> 7 0 14 1783 -> 7 0 16 1737 -> 7 0 16 1821 -> 7 0 16 1797 -> 7 0 16 1773 -> 7 0 16 1749 -> 7 0 16 1833 -> 7 0 16 1809 -> 7 0 16 1785 -> 7 0 16 1733 -> 7 0 16 1763 -> 7 0 16 1793 -> 7 0 16 1823 -> 7 0 16 1745 -> 7 0 16 1775 -> 7 0 16 1805 -> 7 0 16 1757 -> 7 0 19 1834 -> 7 0 16 1787 -> 7 0 14 1729 -> 7 0 16 1817 -> 7 0 14 1735 -> 7 0 14 1792 -> 7 0 14 1741 -> 7 0 14 1798 -> 7 0 14 1747 -> 7 0 14 1804 -> 7 0 14 1753 -> 7 0 14 1810 -> 7 0 16 1764 -> 7 0 16 1740 -> 7 0 14 1816 -> 7 0 16 1824 -> 7 0 16 1800 -> 7 0 16 1776 -> 7 0 16 1752 -> 7 0 16 1812 -> 7 0 16 1788 -> 7 0 16 1730 -> 7 0 16 1760 -> 7 0 16 1790 -> 7 0 16 1820 -> 7 0 16 1742 -> 7 0 16 1772 -> 7 0 16 1802 -> 7 0 16 1832 -> 7 0 16 1754 -> 7 0 16 1784 -> 7 0 16 1814 -> 7 0 14 1762 -> 7 0 14 1819 -> 7 0 14 1768 -> 7 0 14 1825 -> 7 0 14 1774 -> 7 0 14 1831 -> 7 0 16 1731 -> 7 0 14 1780 -> 7 0 14 1786 -> 7 0 16 1791 -> 7 0 16 1767 -> 7 0 16 1743 -> 7 0 16 1827 -> 7 0 16 1803 -> 7 0 16 1779 -> 7 0 16 1755 -> 7 0 16 1815 -> 7 0 16 1835 -> 7 0 16 1739 -> 7 0 16 1769 -> 7 0 16 1799 -> 7 0 16 1829 -> 7 0 16 1751 -> 7 0 16 1781 -> 7 0 16 1811 -> 7 0 14 1732 -> 7 0 14 1789 -> 7 0 14 1738 -> 7 0 14 1795 -> 7 0 14 1744 -> 7 0 14 1801 -> 7 0 14 1750 -> 7 0 14 1807 -> 7 0 16 1734 -> 7 0 14 1756 -> 7 0 14 1813 -> 7 0 16 1794 -> 7 0 16 1770 -> 7 0 16 1746 -> 7 0 16 1830 -> 7 0 16 1806 -> 7 0 16 1782 -> 7 0 16 1758 -> 7 0 16 1818 -> 7 0 16 1736 -> 7 0 16 1766 -> 7 0 16 1796 -> 7 0 13 1728 -> 7 0 16 1926 -> 7 0 16 1856 -> 7 0 16 1886 -> 7 0 16 1838 -> 7 0 16 1868 -> 7 0 16 1898 -> 7 0 16 1850 -> 7 0 16 1880 -> 7 0 16 1910 -> 7 0 14 1882 -> 7 0 16 1922 -> 7 0 14 1888 -> 7 0 14 1837 -> 7 0 14 1894 -> 7 0 14 1843 -> 7 0 14 1900 -> 7 0 14 1849 -> 7 0 14 1906 -> 7 0 16 1857 -> 7 0 14 1915 -> 7 0 14 1921 -> 7 0 16 1893 -> 7 0 16 1869 -> 7 0 16 1845 -> 7 0 16 1905 -> 7 0 16 1881 -> 7 0 16 1917 -> 7 0 16 1853 -> 7 0 16 1883 -> 7 0 16 1865 -> 7 0 16 1895 -> 7 0 16 1847 -> 7 0 16 1877 -> 7 0 16 1907 -> 7 0 14 1852 -> 7 0 16 1919 -> 7 0 14 1858 -> 7 0 14 1864 -> 7 0 14 1870 -> 7 0 14 1876 -> 7 0 16 1884 -> 7 0 16 1860 -> 7 0 16 1896 -> 7 0 16 1872 -> 7 0 16 1848 -> 7 0 16 1908 -> 7 0 16 1920 -> 7 0 16 1862 -> 7 0 16 1892 -> 7 0 19 1927 -> 7 0 16 1844 -> 7 0 16 1874 -> 7 0 16 1904 -> 7 0 16 1916 -> 7 0 14 1885 -> 7 0 14 1891 -> 7 0 14 1840 -> 7 0 14 1897 -> 7 0 14 1846 -> 7 0 14 1903 -> 7 0 14 1912 -> 7 0 14 1909 -> 7 0 16 1887 -> 7 0 14 1918 -> 7 0 16 1863 -> 7 0 16 1839 -> 7 0 14 1924 -> 7 0 16 1899 -> 7 0 16 1875 -> 7 0 16 1851 -> 7 0 16 1911 -> 7 0 16 1923 -> 7 0 16 1859 -> 7 0 16 1889 -> 7 0 16 1841 -> 7 0 16 1871 -> 7 0 16 1901 -> 7 0 16 1913 -> 7 0 14 1855 -> 7 0 14 1861 -> 7 0 16 1925 -> 7 0 14 1867 -> 7 0 14 1873 -> 7 0 16 1854 -> 7 0 14 1879 -> 7 0 16 1890 -> 7 0 16 1866 -> 7 0 16 1842 -> 7 0 16 1902 -> 7 0 16 1878 -> 7 0 16 1914 -> 7 0 16 1928 -> 7 0 13 1836 -> 7 0 16 2007 -> 7 0 16 1959 -> 7 0 16 2043 -> 7 0 16 1995 -> 7 0 16 2031 -> 7 0 16 1955 -> 7 0 16 2015 -> 7 0 16 1937 -> 7 0 16 1997 -> 7 0 14 1975 -> 7 0 14 2038 -> 7 0 14 1987 -> 7 0 14 1936 -> 7 0 14 1999 -> 7 0 16 2051 -> 7 0 16 1950 -> 7 0 16 1986 -> 7 0 16 1938 -> 7 0 16 2022 -> 7 0 16 1974 -> 7 0 16 1982 -> 7 0 16 2042 -> 7 0 16 1964 -> 7 0 16 2024 -> 7 0 14 1951 -> 7 0 14 2014 -> 7 0 14 1963 -> 7 0 14 2026 -> 7 0 16 1977 -> 7 0 16 2013 -> 7 0 16 1965 -> 7 0 16 2049 -> 7 0 16 2001 -> 7 0 16 1949 -> 7 0 16 2009 -> 7 0 16 1931 -> 7 0 16 1991 -> 7 0 16 1973 -> 7 0 14 1978 -> 7 0 16 2033 -> 7 0 14 2041 -> 7 0 14 1990 -> 7 0 14 1939 -> 7 0 14 2002 -> 7 0 16 1956 -> 7 0 16 2040 -> 7 0 16 1992 -> 7 0 16 1944 -> 7 0 16 2028 -> 7 0 16 1976 -> 7 0 16 2036 -> 7 0 16 1958 -> 7 0 16 2018 -> 7 0 16 1940 -> 7 0 16 2000 -> 7 0 14 2005 -> 7 0 14 1954 -> 7 0 14 2017 -> 7 0 14 1966 -> 7 0 16 1947 -> 7 0 14 2029 -> 7 0 16 1983 -> 7 0 16 1935 -> 7 0 16 2019 -> 7 0 16 1971 -> 7 0 16 1985 -> 7 0 16 2045 -> 7 0 16 1967 -> 7 0 16 2027 -> 7 0 14 1981 -> 7 0 14 1930 -> 7 0 14 2044 -> 7 0 14 1993 -> 7 0 14 1942 -> 7 0 16 2010 -> 7 0 16 1962 -> 7 0 16 2046 -> 7 0 16 1998 -> 7 0 16 2034 -> 7 0 16 1952 -> 7 0 16 2012 -> 7 0 16 1934 -> 7 0 16 1994 -> 7 0 14 1945 -> 7 0 14 2008 -> 7 0 14 1957 -> 7 0 14 2020 -> 7 0 14 1969 -> 7 0 14 2032 -> 7 0 16 1953 -> 7 0 16 2037 -> 7 0 16 1989 -> 7 0 16 1941 -> 7 0 16 2025 -> 7 0 16 1979 -> 7 0 16 2039 -> 7 0 16 1961 -> 7 0 16 2021 -> 7 0 16 1943 -> 7 0 16 2003 -> 7 0 14 2035 -> 7 0 14 1984 -> 7 0 14 1933 -> 7 0 14 2047 -> 7 0 14 1996 -> 7 0 16 1980 -> 7 0 16 1932 -> 7 0 16 2016 -> 7 0 16 1968 -> 7 0 19 2050 -> 7 0 16 2004 -> 7 0 16 1946 -> 7 0 16 2006 -> 7 0 16 1988 -> 7 0 16 2048 -> 7 0 16 1970 -> 7 0 16 2030 -> 7 0 14 1948 -> 7 0 14 2011 -> 7 0 14 1960 -> 7 0 14 2023 -> 7 0 14 1972 -> 7 0 13 1929 -> 7 0 6 1607 -> 7 0 19 2343 -> 7 0 13 2342 -> 7 0 16 2110 -> 7 0 16 2140 -> 7 0 16 2081 -> 7 0 14 2085 -> 7 0 16 2146 -> 7 0 14 2091 -> 7 0 14 2097 -> 7 0 16 2065 -> 7 0 14 2103 -> 7 0 14 2109 -> 7 0 16 2117 -> 7 0 16 2093 -> 7 0 16 2077 -> 7 0 16 2129 -> 7 0 14 2145 -> 7 0 16 2153 -> 7 0 16 2105 -> 7 0 14 2058 -> 7 0 16 2141 -> 7 0 14 2064 -> 7 0 14 2070 -> 7 0 14 2076 -> 7 0 16 2060 -> 7 0 16 2095 -> 7 0 16 2155 -> 7 0 14 2082 -> 7 0 16 2125 -> 7 0 16 2072 -> 7 0 16 2107 -> 7 0 16 2137 -> 7 0 16 2084 -> 7 0 19 2154 -> 7 0 14 2118 -> 7 0 14 2124 -> 7 0 16 2062 -> 7 0 14 2130 -> 7 0 14 2136 -> 7 0 16 2074 -> 7 0 16 2120 -> 7 0 16 2096 -> 7 0 14 2142 -> 7 0 16 2132 -> 7 0 16 2108 -> 7 0 16 2144 -> 7 0 16 2092 -> 7 0 16 2122 -> 7 0 16 2063 -> 7 0 16 2104 -> 7 0 16 2134 -> 7 0 16 2075 -> 7 0 14 2088 -> 7 0 14 2094 -> 7 0 16 2059 -> 7 0 14 2100 -> 7 0 16 2087 -> 7 0 14 2106 -> 7 0 16 2071 -> 7 0 14 2112 -> 7 0 16 2123 -> 7 0 16 2099 -> 7 0 16 2083 -> 7 0 14 2148 -> 7 0 16 2135 -> 7 0 16 2111 -> 7 0 14 2061 -> 7 0 14 2067 -> 7 0 16 2147 -> 7 0 14 2073 -> 7 0 16 2089 -> 7 0 16 2119 -> 7 0 14 2079 -> 7 0 16 2066 -> 7 0 16 2101 -> 7 0 16 2131 -> 7 0 16 2078 -> 7 0 16 2113 -> 7 0 16 2143 -> 7 0 14 2115 -> 7 0 16 2149 -> 7 0 14 2121 -> 7 0 14 2127 -> 7 0 14 2151 -> 7 0 16 2068 -> 7 0 14 2133 -> 7 0 16 2090 -> 7 0 14 2139 -> 7 0 16 2080 -> 7 0 16 2126 -> 7 0 16 2102 -> 7 0 16 2138 -> 7 0 16 2114 -> 7 0 16 2086 -> 7 0 16 2150 -> 7 0 16 2116 -> 7 0 16 2098 -> 7 0 16 2128 -> 7 0 16 2152 -> 7 0 16 2069 -> 7 0 13 2057 -> 7 0 16 2227 -> 7 0 16 2179 -> 7 0 16 2209 -> 7 0 16 2239 -> 7 0 14 2160 -> 7 0 14 2217 -> 7 0 14 2166 -> 7 0 14 2223 -> 7 0 14 2172 -> 7 0 14 2229 -> 7 0 14 2178 -> 7 0 14 2235 -> 7 0 16 2162 -> 7 0 14 2184 -> 7 0 16 2222 -> 7 0 16 2198 -> 7 0 16 2174 -> 7 0 16 2234 -> 7 0 16 2210 -> 7 0 16 2186 -> 7 0 16 2164 -> 7 0 16 2194 -> 7 0 16 2224 -> 7 0 16 2176 -> 7 0 16 2206 -> 7 0 16 2236 -> 7 0 14 2187 -> 7 0 14 2193 -> 7 0 14 2199 -> 7 0 14 2205 -> 7 0 16 2189 -> 7 0 14 2211 -> 7 0 16 2165 -> 7 0 16 2225 -> 7 0 16 2201 -> 7 0 16 2177 -> 7 0 16 2237 -> 7 0 16 2213 -> 7 0 16 2161 -> 7 0 16 2242 -> 7 0 16 2191 -> 7 0 16 2221 -> 7 0 16 2173 -> 7 0 16 2203 -> 7 0 16 2233 -> 7 0 16 2185 -> 7 0 16 2215 -> 7 0 14 2157 -> 7 0 19 2241 -> 7 0 14 2163 -> 7 0 14 2220 -> 7 0 14 2169 -> 7 0 14 2226 -> 7 0 14 2175 -> 7 0 14 2232 -> 7 0 14 2181 -> 7 0 14 2238 -> 7 0 16 2192 -> 7 0 16 2168 -> 7 0 16 2228 -> 7 0 16 2204 -> 7 0 16 2180 -> 7 0 16 2240 -> 7 0 16 2216 -> 7 0 16 2158 -> 7 0 16 2188 -> 7 0 16 2218 -> 7 0 16 2170 -> 7 0 16 2200 -> 7 0 16 2230 -> 7 0 16 2182 -> 7 0 16 2212 -> 7 0 14 2190 -> 7 0 14 2196 -> 7 0 14 2202 -> 7 0 16 2159 -> 7 0 14 2208 -> 7 0 14 2214 -> 7 0 16 2219 -> 7 0 16 2195 -> 7 0 16 2171 -> 7 0 16 2231 -> 7 0 16 2207 -> 7 0 16 2183 -> 7 0 16 2167 -> 7 0 16 2197 -> 7 0 13 2156 -> 7 0 16 2248 -> 7 0 16 2278 -> 7 0 16 2308 -> 7 0 16 2338 -> 7 0 16 2260 -> 7 0 16 2290 -> 7 0 16 2320 -> 7 0 14 2274 -> 7 0 14 2331 -> 7 0 14 2280 -> 7 0 14 2337 -> 7 0 14 2286 -> 7 0 14 2292 -> 7 0 16 2273 -> 7 0 14 2298 -> 7 0 16 2249 -> 7 0 16 2333 -> 7 0 16 2309 -> 7 0 16 2285 -> 7 0 16 2261 -> 7 0 16 2321 -> 7 0 16 2297 -> 7 0 16 2245 -> 7 0 16 2275 -> 7 0 16 2305 -> 7 0 16 2335 -> 7 0 16 2257 -> 7 0 16 2287 -> 7 0 16 2317 -> 7 0 16 2269 -> 7 0 16 2299 -> 7 0 14 2244 -> 7 0 16 2329 -> 7 0 14 2301 -> 7 0 14 2250 -> 7 0 14 2307 -> 7 0 14 2256 -> 7 0 14 2313 -> 7 0 14 2262 -> 7 0 14 2319 -> 7 0 14 2268 -> 7 0 14 2325 -> 7 0 16 2276 -> 7 0 16 2252 -> 7 0 16 2336 -> 7 0 16 2312 -> 7 0 16 2288 -> 7 0 16 2264 -> 7 0 16 2324 -> 7 0 16 2300 -> 7 0 16 2272 -> 7 0 16 2302 -> 7 0 16 2332 -> 7 0 16 2254 -> 7 0 16 2284 -> 7 0 16 2314 -> 7 0 16 2266 -> 7 0 16 2296 -> 7 0 16 2326 -> 7 0 14 2271 -> 7 0 14 2277 -> 7 0 14 2334 -> 7 0 14 2283 -> 7 0 14 2289 -> 7 0 14 2295 -> 7 0 16 2303 -> 7 0 16 2279 -> 7 0 16 2255 -> 7 0 16 2339 -> 7 0 16 2315 -> 7 0 16 2291 -> 7 0 16 2267 -> 7 0 16 2327 -> 7 0 16 2341 -> 7 0 16 2251 -> 7 0 16 2281 -> 7 0 16 2311 -> 7 0 16 2263 -> 7 0 16 2293 -> 7 0 19 2340 -> 7 0 16 2323 -> 7 0 14 2247 -> 7 0 14 2304 -> 7 0 14 2253 -> 7 0 14 2310 -> 7 0 14 2259 -> 7 0 14 2316 -> 7 0 14 2265 -> 7 0 14 2322 -> 7 0 16 2246 -> 7 0 14 2328 -> 7 0 16 2306 -> 7 0 16 2282 -> 7 0 16 2258 -> 7 0 16 2318 -> 7 0 16 2294 -> 7 0 16 2270 -> 7 0 16 2330 -> 7 0 13 2243 -> 7 0 9 2344 -> 7 0 6 2056 -> 7 0 12 2347 -> 7 0 6 2346 -> 7 0 3 2345 -> 7 0 3 2348 -> 7 0 3 2055 -> 7 0 1 1606 -> 7 0 3 461 -> 7 0 3 495 -> 7 0 9 470 -> 7 0 9 482 -> 7 0 7 469 -> 7 0 9 471 -> 7 0 7 481 -> 7 0 9 483 -> 7 0 12 493 -> 7 0 9 467 -> 7 0 7 490 -> 7 0 9 479 -> 7 0 9 494 -> 7 0 7 472 -> 7 0 9 474 -> 7 0 7 484 -> 7 0 9 486 -> 7 0 9 464 -> 7 0 9 476 -> 7 0 9 488 -> 7 0 9 491 -> 7 0 7 463 -> 7 0 9 465 -> 7 0 7 475 -> 7 0 9 477 -> 7 0 7 487 -> 7 0 9 489 -> 7 0 9 473 -> 7 0 9 492 -> 7 0 9 485 -> 7 0 7 466 -> 7 0 9 468 -> 7 0 7 478 -> 7 0 9 480 -> 7 0 6 462 -> 7 0 3 178 -> 7 0 9 111 -> 7 0 9 141 -> 7 0 9 28 -> 7 0 9 63 -> 7 0 9 171 -> 7 0 7 35 -> 7 0 9 93 -> 7 0 9 123 -> 7 0 9 153 -> 7 0 9 40 -> 7 0 9 75 -> 7 0 7 47 -> 7 0 9 105 -> 7 0 9 135 -> 7 0 9 165 -> 7 0 9 24 -> 7 0 7 83 -> 7 0 9 36 -> 7 0 7 59 -> 7 0 9 82 -> 7 0 9 58 -> 7 0 7 143 -> 7 0 7 119 -> 7 0 9 142 -> 7 0 7 95 -> 7 0 9 118 -> 7 0 9 48 -> 7 0 7 71 -> 7 0 9 94 -> 7 0 9 70 -> 7 0 7 155 -> 7 0 7 131 -> 7 0 9 154 -> 7 0 7 107 -> 7 0 9 130 -> 7 0 9 106 -> 7 0 7 167 -> 7 0 9 166 -> 7 0 7 26 -> 7 0 9 60 -> 7 0 9 177 -> 7 0 9 90 -> 7 0 9 31 -> 7 0 9 120 -> 7 0 7 38 -> 7 0 9 150 -> 7 0 9 72 -> 7 0 9 102 -> 7 0 9 43 -> 7 0 9 132 -> 7 0 9 162 -> 7 0 7 50 -> 7 0 9 33 -> 7 0 7 110 -> 7 0 7 86 -> 7 0 7 62 -> 7 0 9 85 -> 7 0 7 170 -> 7 0 9 61 -> 7 0 7 146 -> 7 0 9 45 -> 7 0 7 122 -> 7 0 9 145 -> 7 0 7 98 -> 7 0 9 121 -> 7 0 7 74 -> 7 0 9 97 -> 7 0 9 73 -> 7 0 7 158 -> 7 0 7 134 -> 7 0 9 157 -> 7 0 9 133 -> 7 0 9 109 -> 7 0 9 169 -> 7 0 9 57 -> 7 0 7 29 -> 7 0 9 87 -> 7 0 9 117 -> 7 0 9 147 -> 7 0 9 34 -> 7 0 9 69 -> 7 0 7 41 -> 7 0 9 99 -> 7 0 9 129 -> 7 0 9 159 -> 7 0 9 46 -> 7 0 9 30 -> 7 0 7 53 -> 7 0 9 52 -> 7 0 7 113 -> 7 0 7 89 -> 7 0 9 112 -> 7 0 9 42 -> 7 0 7 65 -> 7 0 9 88 -> 7 0 7 173 -> 7 0 9 64 -> 7 0 7 149 -> 7 0 9 172 -> 7 0 7 125 -> 7 0 9 148 -> 7 0 7 101 -> 7 0 9 124 -> 7 0 7 77 -> 7 0 9 100 -> 7 0 9 76 -> 7 0 7 161 -> 7 0 7 137 -> 7 0 9 160 -> 7 0 9 136 -> 7 0 9 54 -> 7 0 9 84 -> 7 0 9 25 -> 7 0 9 114 -> 7 0 7 32 -> 7 0 9 144 -> 7 0 9 66 -> 7 0 9 174 -> 7 0 9 96 -> 7 0 9 37 -> 7 0 9 126 -> 7 0 7 44 -> 7 0 9 156 -> 7 0 9 78 -> 7 0 9 108 -> 7 0 9 49 -> 7 0 9 138 -> 7 0 9 168 -> 7 0 9 27 -> 7 0 7 80 -> 7 0 7 56 -> 7 0 9 55 -> 7 0 7 140 -> 7 0 9 39 -> 7 0 7 116 -> 7 0 7 92 -> 7 0 9 115 -> 7 0 7 68 -> 7 0 9 91 -> 7 0 9 67 -> 7 0 7 152 -> 7 0 9 175 -> 7 0 12 176 -> 7 0 7 128 -> 7 0 9 151 -> 7 0 7 104 -> 7 0 9 127 -> 7 0 9 103 -> 7 0 9 79 -> 7 0 7 164 -> 7 0 9 163 -> 7 0 9 139 -> 7 0 9 51 -> 7 0 7 23 -> 7 0 9 81 -> 7 0 6 22 -> 7 0 3 498 -> 7 0 12 497 -> 7 0 6 496 -> 7 0 9 377 -> 7 0 7 441 -> 7 0 7 180 -> 7 0 9 413 -> 7 0 9 241 -> 7 0 9 301 -> 7 0 9 223 -> 7 0 9 361 -> 7 0 9 194 -> 7 0 9 283 -> 7 0 9 421 -> 7 0 7 204 -> 7 0 9 343 -> 7 0 9 265 -> 7 0 9 403 -> 7 0 9 325 -> 7 0 9 385 -> 7 0 9 445 -> 7 0 7 240 -> 7 0 9 212 -> 7 0 9 196 -> 7 0 7 276 -> 7 0 9 248 -> 7 0 7 360 -> 7 0 7 228 -> 7 0 9 332 -> 7 0 7 312 -> 7 0 9 284 -> 7 0 7 396 -> 7 0 7 264 -> 7 0 9 368 -> 7 0 9 236 -> 7 0 7 348 -> 7 0 9 452 -> 7 0 9 320 -> 7 0 7 432 -> 7 0 9 404 -> 7 0 7 384 -> 7 0 9 208 -> 7 0 9 356 -> 7 0 9 440 -> 7 0 9 268 -> 7 0 9 185 -> 7 0 9 328 -> 7 0 9 250 -> 7 0 7 195 -> 7 0 9 388 -> 7 0 9 310 -> 7 0 9 232 -> 7 0 9 448 -> 7 0 9 370 -> 7 0 9 292 -> 7 0 9 430 -> 7 0 9 352 -> 7 0 9 412 -> 7 0 9 181 -> 7 0 7 267 -> 7 0 9 239 -> 7 0 7 219 -> 7 0 7 303 -> 7 0 9 275 -> 7 0 7 387 -> 7 0 9 205 -> 7 0 7 255 -> 7 0 9 359 -> 7 0 9 227 -> 7 0 7 339 -> 7 0 9 311 -> 7 0 7 423 -> 7 0 7 291 -> 7 0 9 395 -> 7 0 9 263 -> 7 0 7 375 -> 7 0 9 347 -> 7 0 9 431 -> 7 0 7 411 -> 7 0 9 383 -> 7 0 7 186 -> 7 0 9 217 -> 7 0 9 277 -> 7 0 9 337 -> 7 0 9 259 -> 7 0 9 200 -> 7 0 9 397 -> 7 0 9 319 -> 7 0 9 457 -> 7 0 9 379 -> 7 0 9 439 -> 7 0 7 210 -> 7 0 9 190 -> 7 0 7 246 -> 7 0 9 218 -> 7 0 7 330 -> 7 0 9 302 -> 7 0 7 282 -> 7 0 9 254 -> 7 0 7 366 -> 7 0 7 234 -> 7 0 9 338 -> 7 0 7 450 -> 7 0 7 318 -> 7 0 9 422 -> 7 0 9 290 -> 7 0 7 402 -> 7 0 9 374 -> 7 0 7 354 -> 7 0 9 458 -> 7 0 9 326 -> 7 0 7 438 -> 7 0 9 410 -> 7 0 9 244 -> 7 0 9 446 -> 7 0 9 304 -> 7 0 9 191 -> 7 0 9 226 -> 7 0 9 364 -> 7 0 7 201 -> 7 0 9 286 -> 7 0 9 424 -> 7 0 9 346 -> 7 0 9 406 -> 7 0 7 237 -> 7 0 9 209 -> 7 0 7 273 -> 7 0 9 199 -> 7 0 9 245 -> 7 0 7 357 -> 7 0 7 225 -> 7 0 9 329 -> 7 0 7 309 -> 7 0 9 281 -> 7 0 7 393 -> 7 0 7 261 -> 7 0 9 365 -> 7 0 9 233 -> 7 0 7 345 -> 7 0 9 449 -> 7 0 9 317 -> 7 0 7 429 -> 7 0 9 401 -> 7 0 7 381 -> 7 0 9 353 -> 7 0 9 437 -> 7 0 9 211 -> 7 0 9 271 -> 7 0 9 182 -> 7 0 9 331 -> 7 0 7 192 -> 7 0 9 253 -> 7 0 9 391 -> 7 0 9 313 -> 7 0 9 235 -> 7 0 9 451 -> 7 0 9 373 -> 7 0 9 295 -> 7 0 9 206 -> 7 0 9 433 -> 7 0 9 355 -> 7 0 9 415 -> 7 0 9 184 -> 7 0 7 216 -> 7 0 7 300 -> 7 0 9 272 -> 7 0 7 252 -> 7 0 7 336 -> 7 0 9 224 -> 7 0 9 308 -> 7 0 7 420 -> 7 0 7 288 -> 7 0 9 392 -> 7 0 7 372 -> 7 0 9 260 -> 7 0 9 344 -> 7 0 7 456 -> 7 0 7 324 -> 7 0 9 428 -> 7 0 9 296 -> 7 0 7 408 -> 7 0 9 380 -> 7 0 9 238 -> 7 0 7 444 -> 7 0 7 183 -> 7 0 9 416 -> 7 0 9 298 -> 7 0 9 220 -> 7 0 9 358 -> 7 0 9 280 -> 7 0 9 418 -> 7 0 9 340 -> 7 0 9 197 -> 7 0 9 262 -> 7 0 9 400 -> 7 0 9 322 -> 7 0 9 382 -> 7 0 9 442 -> 7 0 7 207 -> 7 0 7 243 -> 7 0 9 193 -> 7 0 7 327 -> 7 0 9 215 -> 7 0 9 299 -> 7 0 7 279 -> 7 0 7 363 -> 7 0 9 251 -> 7 0 9 335 -> 7 0 7 231 -> 7 0 7 447 -> 7 0 7 315 -> 7 0 9 419 -> 7 0 9 287 -> 7 0 7 399 -> 7 0 9 371 -> 7 0 7 351 -> 7 0 9 455 -> 7 0 9 323 -> 7 0 7 435 -> 7 0 9 407 -> 7 0 9 443 -> 7 0 9 460 -> 7 0 9 247 -> 7 0 9 188 -> 7 0 9 307 -> 7 0 9 229 -> 7 0 7 198 -> 7 0 9 367 -> 7 0 9 289 -> 7 0 9 427 -> 7 0 9 349 -> 7 0 9 409 -> 7 0 7 270 -> 7 0 9 242 -> 7 0 7 222 -> 7 0 7 306 -> 7 0 9 202 -> 7 0 9 278 -> 7 0 7 390 -> 7 0 9 362 -> 7 0 7 258 -> 7 0 7 342 -> 7 0 9 230 -> 7 0 9 314 -> 7 0 7 426 -> 7 0 7 294 -> 7 0 9 398 -> 7 0 12 459 -> 7 0 7 378 -> 7 0 9 266 -> 7 0 9 350 -> 7 0 9 434 -> 7 0 7 414 -> 7 0 9 386 -> 7 0 9 214 -> 7 0 9 274 -> 7 0 7 189 -> 7 0 9 334 -> 7 0 9 256 -> 7 0 9 394 -> 7 0 9 316 -> 7 0 9 203 -> 7 0 9 454 -> 7 0 9 376 -> 7 0 9 436 -> 7 0 9 187 -> 7 0 7 213 -> 7 0 7 297 -> 7 0 9 269 -> 7 0 7 249 -> 7 0 7 333 -> 7 0 9 221 -> 7 0 9 305 -> 7 0 7 417 -> 7 0 7 285 -> 7 0 9 389 -> 7 0 7 369 -> 7 0 9 257 -> 7 0 9 341 -> 7 0 7 453 -> 7 0 7 321 -> 7 0 9 425 -> 7 0 9 293 -> 7 0 7 405 -> 7 0 6 179 -> 7 0 1 21 -> 7 0 3 1602 -> 7 0 9 1475 -> 7 0 9 1535 -> 7 0 7 1375 -> 7 0 9 1595 -> 7 0 9 1376 -> 7 0 9 1422 -> 7 0 9 1458 -> 7 0 9 1542 -> 7 0 9 1410 -> 7 0 9 1494 -> 7 0 7 1423 -> 7 0 9 1578 -> 7 0 7 1399 -> 7 0 9 1446 -> 7 0 9 1530 -> 7 0 7 1543 -> 7 0 7 1519 -> 7 0 9 1566 -> 7 0 7 1495 -> 7 0 7 1471 -> 7 0 9 1400 -> 7 0 7 1447 -> 7 0 9 1371 -> 7 0 9 1460 -> 7 0 7 1591 -> 7 0 9 1520 -> 7 0 7 1567 -> 7 0 9 1442 -> 7 0 9 1580 -> 7 0 9 1502 -> 7 0 9 1562 -> 7 0 7 1378 -> 7 0 9 1401 -> 7 0 9 1385 -> 7 0 9 1485 -> 7 0 9 1437 -> 7 0 9 1521 -> 7 0 7 1450 -> 7 0 7 1426 -> 7 0 9 1473 -> 7 0 7 1402 -> 7 0 9 1557 -> 7 0 9 1509 -> 7 0 7 1570 -> 7 0 7 1546 -> 7 0 9 1593 -> 7 0 7 1522 -> 7 0 7 1498 -> 7 0 9 1427 -> 7 0 7 1474 -> 7 0 9 1487 -> 7 0 9 1409 -> 7 0 9 1547 -> 7 0 7 1594 -> 7 0 9 1469 -> 7 0 9 1386 -> 7 0 9 1529 -> 7 0 9 1589 -> 7 0 7 1381 -> 7 0 9 1370 -> 7 0 9 1392 -> 7 0 9 1428 -> 7 0 9 1512 -> 7 0 9 1464 -> 7 0 9 1548 -> 7 0 9 1416 -> 7 0 7 1453 -> 7 0 9 1500 -> 7 0 7 1429 -> 7 0 9 1584 -> 7 0 7 1405 -> 7 0 9 1536 -> 7 0 7 1573 -> 7 0 9 1394 -> 7 0 7 1549 -> 7 0 7 1525 -> 7 0 9 1454 -> 7 0 7 1501 -> 7 0 7 1477 -> 7 0 9 1514 -> 7 0 9 1436 -> 7 0 9 1377 -> 7 0 9 1574 -> 7 0 9 1496 -> 7 0 7 1597 -> 7 0 9 1418 -> 7 0 9 1556 -> 7 0 9 1478 -> 7 0 9 1538 -> 7 0 9 1598 -> 7 0 7 1384 -> 7 0 9 1379 -> 7 0 9 1455 -> 7 0 9 1407 -> 7 0 12 1600 -> 7 0 9 1491 -> 7 0 9 1575 -> 7 0 9 1443 -> 7 0 7 1480 -> 7 0 9 1527 -> 7 0 7 1456 -> 7 0 7 1432 -> 7 0 9 1479 -> 7 0 7 1408 -> 7 0 9 1563 -> 7 0 9 1421 -> 7 0 7 1576 -> 7 0 7 1552 -> 7 0 9 1599 -> 7 0 9 1481 -> 7 0 7 1528 -> 7 0 9 1368 -> 7 0 9 1403 -> 7 0 7 1504 -> 7 0 9 1541 -> 7 0 9 1463 -> 7 0 9 1523 -> 7 0 7 1363 -> 7 0 9 1445 -> 7 0 9 1583 -> 7 0 9 1505 -> 7 0 9 1565 -> 7 0 9 1364 -> 7 0 7 1387 -> 7 0 9 1398 -> 7 0 9 1482 -> 7 0 9 1434 -> 7 0 9 1388 -> 7 0 9 1518 -> 7 0 9 1470 -> 7 0 9 1554 -> 7 0 7 1483 -> 7 0 7 1459 -> 7 0 9 1506 -> 7 0 7 1435 -> 7 0 9 1590 -> 7 0 7 1411 -> 7 0 7 1579 -> 7 0 7 1555 -> 7 0 9 1601 -> 7 0 9 1430 -> 7 0 7 1531 -> 7 0 7 1507 -> 7 0 9 1490 -> 7 0 9 1412 -> 7 0 9 1550 -> 7 0 9 1472 -> 7 0 9 1383 -> 7 0 7 1366 -> 7 0 9 1532 -> 7 0 9 1592 -> 7 0 9 1373 -> 7 0 9 1425 -> 7 0 9 1461 -> 7 0 7 1390 -> 7 0 9 1545 -> 7 0 9 1413 -> 7 0 9 1497 -> 7 0 9 1581 -> 7 0 9 1449 -> 7 0 7 1510 -> 7 0 7 1486 -> 7 0 9 1533 -> 7 0 7 1462 -> 7 0 7 1438 -> 7 0 7 1414 -> 7 0 9 1569 -> 7 0 9 1397 -> 7 0 7 1582 -> 7 0 9 1457 -> 7 0 7 1558 -> 7 0 7 1534 -> 7 0 9 1374 -> 7 0 9 1517 -> 7 0 9 1439 -> 7 0 9 1577 -> 7 0 9 1499 -> 7 0 7 1369 -> 7 0 9 1559 -> 7 0 9 1452 -> 7 0 9 1382 -> 7 0 9 1404 -> 7 0 9 1488 -> 7 0 9 1572 -> 7 0 9 1440 -> 7 0 7 1393 -> 7 0 9 1524 -> 7 0 9 1476 -> 7 0 7 1513 -> 7 0 9 1560 -> 7 0 7 1489 -> 7 0 7 1465 -> 7 0 7 1441 -> 7 0 9 1596 -> 7 0 9 1424 -> 7 0 7 1417 -> 7 0 9 1365 -> 7 0 9 1484 -> 7 0 7 1585 -> 7 0 9 1406 -> 7 0 7 1561 -> 7 0 7 1537 -> 7 0 9 1544 -> 7 0 9 1466 -> 7 0 9 1526 -> 7 0 9 1448 -> 7 0 9 1389 -> 7 0 9 1586 -> 7 0 7 1372 -> 7 0 9 1508 -> 7 0 9 1568 -> 7 0 9 1367 -> 7 0 9 1395 -> 7 0 9 1431 -> 7 0 9 1515 -> 7 0 9 1467 -> 7 0 7 1420 -> 7 0 7 1396 -> 7 0 9 1551 -> 7 0 9 1419 -> 7 0 9 1503 -> 7 0 7 1540 -> 7 0 9 1587 -> 7 0 7 1516 -> 7 0 7 1492 -> 7 0 9 1391 -> 7 0 9 1539 -> 7 0 7 1468 -> 7 0 9 1451 -> 7 0 7 1444 -> 7 0 9 1511 -> 7 0 9 1433 -> 7 0 7 1588 -> 7 0 7 1564 -> 7 0 9 1571 -> 7 0 9 1493 -> 7 0 9 1415 -> 7 0 9 1380 -> 7 0 9 1553 -> 7 0 6 1362 -> 7 0 3 1605 -> 7 0 12 1604 -> 7 0 6 1603 -> 7 0 3 1361 -> 7 0 9 1204 -> 7 0 9 1253 -> 7 0 9 1229 -> 7 0 9 1313 -> 7 0 9 1216 -> 7 0 9 1289 -> 7 0 9 1265 -> 7 0 7 1221 -> 7 0 9 1241 -> 7 0 9 1349 -> 7 0 9 1325 -> 7 0 7 1281 -> 7 0 9 1301 -> 7 0 7 1257 -> 7 0 9 1277 -> 7 0 7 1233 -> 7 0 7 1341 -> 7 0 7 1317 -> 7 0 9 1337 -> 7 0 9 1219 -> 7 0 7 1293 -> 7 0 9 1249 -> 7 0 7 1269 -> 7 0 7 1245 -> 7 0 9 1279 -> 7 0 7 1353 -> 7 0 9 1193 -> 7 0 9 1309 -> 7 0 7 1329 -> 7 0 9 1231 -> 7 0 7 1305 -> 7 0 9 1339 -> 7 0 9 1261 -> 7 0 9 1291 -> 7 0 9 1205 -> 7 0 9 1321 -> 7 0 9 1243 -> 7 0 9 1351 -> 7 0 7 1191 -> 7 0 9 1273 -> 7 0 9 1303 -> 7 0 9 1217 -> 7 0 9 1333 -> 7 0 7 1203 -> 7 0 7 1215 -> 7 0 12 1359 -> 7 0 9 1201 -> 7 0 9 1220 -> 7 0 9 1280 -> 7 0 9 1256 -> 7 0 9 1213 -> 7 0 9 1232 -> 7 0 9 1340 -> 7 0 9 1316 -> 7 0 9 1292 -> 7 0 7 1248 -> 7 0 9 1268 -> 7 0 7 1224 -> 7 0 9 1244 -> 7 0 9 1352 -> 7 0 7 1308 -> 7 0 9 1328 -> 7 0 7 1284 -> 7 0 9 1304 -> 7 0 7 1260 -> 7 0 7 1236 -> 7 0 7 1344 -> 7 0 7 1320 -> 7 0 7 1296 -> 7 0 7 1272 -> 7 0 9 1228 -> 7 0 7 1356 -> 7 0 9 1196 -> 7 0 9 1258 -> 7 0 7 1332 -> 7 0 9 1288 -> 7 0 9 1318 -> 7 0 9 1240 -> 7 0 9 1348 -> 7 0 9 1208 -> 7 0 9 1270 -> 7 0 9 1300 -> 7 0 7 1194 -> 7 0 9 1330 -> 7 0 7 1206 -> 7 0 9 1198 -> 7 0 9 1223 -> 7 0 9 1210 -> 7 0 9 1283 -> 7 0 9 1259 -> 7 0 9 1235 -> 7 0 9 1343 -> 7 0 9 1319 -> 7 0 9 1295 -> 7 0 7 1251 -> 7 0 9 1271 -> 7 0 7 1227 -> 7 0 9 1247 -> 7 0 9 1355 -> 7 0 7 1311 -> 7 0 9 1331 -> 7 0 7 1287 -> 7 0 9 1307 -> 7 0 7 1263 -> 7 0 7 1239 -> 7 0 7 1347 -> 7 0 7 1323 -> 7 0 9 1225 -> 7 0 7 1299 -> 7 0 9 1255 -> 7 0 7 1275 -> 7 0 9 1285 -> 7 0 9 1199 -> 7 0 9 1315 -> 7 0 7 1335 -> 7 0 9 1237 -> 7 0 9 1345 -> 7 0 9 1267 -> 7 0 9 1297 -> 7 0 9 1211 -> 7 0 9 1327 -> 7 0 9 1357 -> 7 0 7 1197 -> 7 0 7 1209 -> 7 0 9 1195 -> 7 0 9 1250 -> 7 0 9 1207 -> 7 0 9 1226 -> 7 0 9 1310 -> 7 0 9 1286 -> 7 0 9 1262 -> 7 0 7 1218 -> 7 0 9 1238 -> 7 0 9 1346 -> 7 0 9 1322 -> 7 0 7 1278 -> 7 0 9 1298 -> 7 0 7 1254 -> 7 0 9 1274 -> 7 0 7 1230 -> 7 0 7 1338 -> 7 0 9 1358 -> 7 0 7 1314 -> 7 0 9 1334 -> 7 0 7 1290 -> 7 0 7 1266 -> 7 0 9 1222 -> 7 0 7 1242 -> 7 0 7 1350 -> 7 0 9 1252 -> 7 0 7 1326 -> 7 0 9 1282 -> 7 0 7 1302 -> 7 0 9 1360 -> 7 0 9 1312 -> 7 0 9 1234 -> 7 0 9 1342 -> 7 0 9 1202 -> 7 0 9 1264 -> 7 0 9 1294 -> 7 0 9 1324 -> 7 0 9 1246 -> 7 0 9 1354 -> 7 0 9 1214 -> 7 0 9 1276 -> 7 0 9 1306 -> 7 0 7 1200 -> 7 0 9 1336 -> 7 0 9 1192 -> 7 0 7 1212 -> 7 0 6 1190 -> 7 0 1 1189 -> 7 0 7 1059 -> 7 0 7 1122 -> 7 0 7 1071 +> 15 0 35 0 topology 15 6305 +> 16 0 35 0 topology 3414 6305 +> 15 0 35 0 topology 13 6306 +> 16 0 35 0 topology 3414 6306 +> 15 0 36 0 topology 3 6307 +> 16 0 36 0 topology 3414 6307 +> 15 0 35 0 topology 14 6308 +> 16 0 35 0 topology 3920 6308 +> 15 0 36 0 topology 5 6309 +> 16 0 36 0 topology 3920 6309 +> 15 0 35 0 topology 19 6310 +> 16 0 35 0 topology 4389 6310 +> 15 0 36 0 topology 11 6311 +> 16 0 36 0 topology 4389 6311 +> 15 0 35 0 topology 20 6312 +> 16 0 35 0 topology 4797 6312 +> 15 0 36 0 topology 10 6313 +> 16 0 36 0 topology 4797 6313 +> 7 0 9 177 +> 7 0 9 52 +> 7 0 9 51 +> 7 0 9 55 +> 7 0 9 54 +> 7 0 9 58 +> 7 0 9 57 +> 7 0 9 61 +> 7 0 9 60 +> 7 0 9 64 +> 7 0 9 63 +> 7 0 9 67 +> 7 0 9 66 +> 7 0 9 70 +> 7 0 9 69 +> 7 0 9 73 +> 7 0 9 72 +> 7 0 9 76 +> 7 0 9 75 +> 7 0 9 79 +> 7 0 9 78 +> 7 0 9 25 +> 7 0 9 24 +> 7 0 9 82 +> 7 0 9 81 +> 7 0 9 85 +> 7 0 9 84 +> 7 0 9 88 +> 7 0 9 87 +> 7 0 9 91 +> 7 0 9 90 +> 7 0 9 94 +> 7 0 9 93 +> 7 0 9 97 +> 7 0 9 96 +> 7 0 9 100 +> 7 0 9 99 +> 7 0 9 103 +> 7 0 9 102 +> 7 0 9 106 +> 7 0 9 105 +> 7 0 9 109 +> 7 0 9 108 +> 7 0 9 28 +> 7 0 9 27 +> 7 0 9 112 +> 7 0 9 111 +> 7 0 9 115 +> 7 0 9 114 +> 7 0 9 118 +> 7 0 9 117 +> 7 0 9 121 +> 7 0 9 120 +> 7 0 9 124 +> 7 0 9 123 +> 7 0 9 127 +> 7 0 9 126 +> 7 0 9 130 +> 7 0 9 129 +> 7 0 9 133 +> 7 0 9 132 +> 7 0 9 136 +> 7 0 9 135 +> 7 0 9 139 +> 7 0 9 138 +> 7 0 9 31 +> 7 0 9 30 +> 7 0 9 142 +> 7 0 9 141 +> 7 0 9 145 +> 7 0 9 144 +> 7 0 9 148 +> 7 0 9 147 +> 7 0 9 151 +> 7 0 9 150 +> 7 0 9 154 +> 7 0 9 153 +> 7 0 9 157 +> 7 0 9 156 +> 7 0 9 160 +> 7 0 9 159 +> 7 0 9 163 +> 7 0 9 162 +> 7 0 9 166 +> 7 0 9 165 +> 7 0 9 169 +> 7 0 9 168 +> 7 0 9 34 +> 7 0 9 33 +> 7 0 9 172 +> 7 0 9 171 +> 7 0 9 175 +> 7 0 9 174 +> 7 0 9 37 +> 7 0 9 36 +> 7 0 9 40 +> 7 0 9 39 +> 7 0 9 43 +> 7 0 9 42 +> 7 0 9 46 +> 7 0 9 45 +> 7 0 9 49 +> 7 0 9 48 +> 7 0 7 23 +> 7 0 7 50 +> 7 0 7 53 +> 7 0 7 56 +> 7 0 7 59 +> 7 0 7 62 +> 7 0 7 65 +> 7 0 7 68 +> 7 0 7 71 +> 7 0 7 74 +> 7 0 7 77 +> 7 0 7 26 +> 7 0 7 80 +> 7 0 7 83 +> 7 0 7 86 +> 7 0 7 89 +> 7 0 7 92 +> 7 0 7 95 +> 7 0 7 98 +> 7 0 7 101 +> 7 0 7 104 +> 7 0 7 107 +> 7 0 7 29 +> 7 0 7 110 +> 7 0 7 113 +> 7 0 7 116 +> 7 0 7 119 +> 7 0 7 122 +> 7 0 7 125 +> 7 0 7 128 +> 7 0 7 131 +> 7 0 7 134 +> 7 0 7 137 +> 7 0 7 32 +> 7 0 7 140 +> 7 0 7 143 +> 7 0 7 146 +> 7 0 7 149 +> 7 0 7 152 +> 7 0 7 155 +> 7 0 7 158 +> 7 0 7 161 +> 7 0 7 164 +> 7 0 7 167 +> 7 0 7 35 +> 7 0 7 170 +> 7 0 7 173 +> 7 0 7 38 +> 7 0 7 41 +> 7 0 7 44 +> 7 0 7 47 +> 7 0 12 176 +> 7 0 6 22 +> 7 0 9 460 +> 7 0 9 209 +> 7 0 9 208 +> 7 0 9 212 +> 7 0 9 211 +> 7 0 9 215 +> 7 0 9 214 +> 7 0 9 218 +> 7 0 9 217 +> 7 0 9 221 +> 7 0 9 220 +> 7 0 9 224 +> 7 0 9 223 +> 7 0 9 227 +> 7 0 9 226 +> 7 0 9 230 +> 7 0 9 229 +> 7 0 9 233 +> 7 0 9 232 +> 7 0 9 236 +> 7 0 9 235 +> 7 0 9 182 +> 7 0 9 181 +> 7 0 9 239 +> 7 0 9 238 +> 7 0 9 242 +> 7 0 9 241 +> 7 0 9 245 +> 7 0 9 244 +> 7 0 9 248 +> 7 0 9 247 +> 7 0 9 251 +> 7 0 9 250 +> 7 0 9 254 +> 7 0 9 253 +> 7 0 9 257 +> 7 0 9 256 +> 7 0 9 260 +> 7 0 9 259 +> 7 0 9 263 +> 7 0 9 262 +> 7 0 9 266 +> 7 0 9 265 +> 7 0 9 185 +> 7 0 9 184 +> 7 0 9 269 +> 7 0 9 268 +> 7 0 9 272 +> 7 0 9 271 +> 7 0 9 275 +> 7 0 9 274 +> 7 0 9 278 +> 7 0 9 277 +> 7 0 9 281 +> 7 0 9 280 +> 7 0 9 284 +> 7 0 9 283 +> 7 0 9 287 +> 7 0 9 286 +> 7 0 9 290 +> 7 0 9 289 +> 7 0 9 293 +> 7 0 9 292 +> 7 0 9 296 +> 7 0 9 295 +> 7 0 9 188 +> 7 0 9 187 +> 7 0 9 299 +> 7 0 9 298 +> 7 0 9 302 +> 7 0 9 301 +> 7 0 9 305 +> 7 0 9 304 +> 7 0 9 308 +> 7 0 9 307 +> 7 0 9 311 +> 7 0 9 310 +> 7 0 9 314 +> 7 0 9 313 +> 7 0 9 317 +> 7 0 9 316 +> 7 0 9 320 +> 7 0 9 319 +> 7 0 9 323 +> 7 0 9 322 +> 7 0 9 326 +> 7 0 9 325 +> 7 0 9 191 +> 7 0 9 190 +> 7 0 9 329 +> 7 0 9 328 +> 7 0 9 332 +> 7 0 9 331 +> 7 0 9 335 +> 7 0 9 334 +> 7 0 9 338 +> 7 0 9 337 +> 7 0 9 341 +> 7 0 9 340 +> 7 0 9 344 +> 7 0 9 343 +> 7 0 9 347 +> 7 0 9 346 +> 7 0 9 350 +> 7 0 9 349 +> 7 0 9 353 +> 7 0 9 352 +> 7 0 9 356 +> 7 0 9 355 +> 7 0 9 194 +> 7 0 9 193 +> 7 0 9 359 +> 7 0 9 358 +> 7 0 9 362 +> 7 0 9 361 +> 7 0 9 365 +> 7 0 9 364 +> 7 0 9 368 +> 7 0 9 367 +> 7 0 9 371 +> 7 0 9 370 +> 7 0 9 374 +> 7 0 9 373 +> 7 0 9 377 +> 7 0 9 376 +> 7 0 9 380 +> 7 0 9 379 +> 7 0 9 383 +> 7 0 9 382 +> 7 0 9 386 +> 7 0 9 385 +> 7 0 9 197 +> 7 0 9 196 +> 7 0 9 389 +> 7 0 9 388 +> 7 0 9 392 +> 7 0 9 391 +> 7 0 9 395 +> 7 0 9 394 +> 7 0 9 398 +> 7 0 9 397 +> 7 0 9 401 +> 7 0 9 400 +> 7 0 9 404 +> 7 0 9 403 +> 7 0 9 407 +> 7 0 9 406 +> 7 0 9 410 +> 7 0 9 409 +> 7 0 9 413 +> 7 0 9 412 +> 7 0 9 416 +> 7 0 9 415 +> 7 0 9 200 +> 7 0 9 199 +> 7 0 9 419 +> 7 0 9 418 +> 7 0 9 422 +> 7 0 9 421 +> 7 0 9 425 +> 7 0 9 424 +> 7 0 9 428 +> 7 0 9 427 +> 7 0 9 431 +> 7 0 9 430 +> 7 0 9 434 +> 7 0 9 433 +> 7 0 9 437 +> 7 0 9 436 +> 7 0 9 440 +> 7 0 9 439 +> 7 0 9 443 +> 7 0 9 442 +> 7 0 9 446 +> 7 0 9 445 +> 7 0 9 203 +> 7 0 9 202 +> 7 0 9 449 +> 7 0 9 448 +> 7 0 9 452 +> 7 0 9 451 +> 7 0 9 455 +> 7 0 9 454 +> 7 0 9 458 +> 7 0 9 457 +> 7 0 9 206 +> 7 0 9 205 +> 7 0 7 180 +> 7 0 7 207 +> 7 0 7 210 +> 7 0 7 213 +> 7 0 7 216 +> 7 0 7 219 +> 7 0 7 222 +> 7 0 7 225 +> 7 0 7 228 +> 7 0 7 231 +> 7 0 7 234 +> 7 0 7 183 +> 7 0 7 237 +> 7 0 7 240 +> 7 0 7 243 +> 7 0 7 246 +> 7 0 7 249 +> 7 0 7 252 +> 7 0 7 255 +> 7 0 7 258 +> 7 0 7 261 +> 7 0 7 264 +> 7 0 7 186 +> 7 0 7 267 +> 7 0 7 270 +> 7 0 7 273 +> 7 0 7 276 +> 7 0 7 279 +> 7 0 7 282 +> 7 0 7 285 +> 7 0 7 288 +> 7 0 7 291 +> 7 0 7 294 +> 7 0 7 189 +> 7 0 7 297 +> 7 0 7 300 +> 7 0 7 303 +> 7 0 7 306 +> 7 0 7 309 +> 7 0 7 312 +> 7 0 7 315 +> 7 0 7 318 +> 7 0 7 321 +> 7 0 7 324 +> 7 0 7 192 +> 7 0 7 327 +> 7 0 7 330 +> 7 0 7 333 +> 7 0 7 336 +> 7 0 7 339 +> 7 0 7 342 +> 7 0 7 345 +> 7 0 7 348 +> 7 0 7 351 +> 7 0 7 354 +> 7 0 7 195 +> 7 0 7 357 +> 7 0 7 360 +> 7 0 7 363 +> 7 0 7 366 +> 7 0 7 369 +> 7 0 7 372 +> 7 0 7 375 +> 7 0 7 378 +> 7 0 7 381 +> 7 0 7 384 +> 7 0 7 198 +> 7 0 7 387 +> 7 0 7 390 +> 7 0 7 393 +> 7 0 7 396 +> 7 0 7 399 +> 7 0 7 402 +> 7 0 7 405 +> 7 0 7 408 +> 7 0 7 411 +> 7 0 7 414 +> 7 0 7 201 +> 7 0 7 417 +> 7 0 7 420 +> 7 0 7 423 +> 7 0 7 426 +> 7 0 7 429 +> 7 0 7 432 +> 7 0 7 435 +> 7 0 7 438 +> 7 0 7 441 +> 7 0 7 444 +> 7 0 7 204 +> 7 0 7 447 +> 7 0 7 450 +> 7 0 7 453 +> 7 0 7 456 +> 7 0 12 459 +> 7 0 6 179 +> 7 0 9 494 +> 7 0 9 492 +> 7 0 9 491 +> 7 0 9 465 +> 7 0 9 464 +> 7 0 9 468 +> 7 0 9 467 +> 7 0 9 471 +> 7 0 9 470 +> 7 0 9 474 +> 7 0 9 473 +> 7 0 9 477 +> 7 0 9 476 +> 7 0 9 480 +> 7 0 9 479 +> 7 0 9 483 +> 7 0 9 482 +> 7 0 9 486 +> 7 0 9 485 +> 7 0 9 489 +> 7 0 9 488 +> 7 0 7 463 +> 7 0 7 490 +> 7 0 7 466 +> 7 0 7 469 +> 7 0 7 472 +> 7 0 7 475 +> 7 0 7 478 +> 7 0 7 481 +> 7 0 7 484 +> 7 0 7 487 +> 7 0 12 493 +> 7 0 6 462 +> 7 0 12 497 +> 7 0 6 496 +> 7 0 3 178 +> 7 0 3 461 +> 7 0 3 495 +> 7 0 3 498 +> 7 0 1 21 +> 7 0 9 538 +> 7 0 9 530 +> 7 0 9 529 +> 7 0 9 533 +> 7 0 9 532 +> 7 0 9 536 +> 7 0 9 535 +> 7 0 9 503 +> 7 0 9 502 +> 7 0 9 506 +> 7 0 9 505 +> 7 0 9 509 +> 7 0 9 508 +> 7 0 9 512 +> 7 0 9 511 +> 7 0 9 515 +> 7 0 9 514 +> 7 0 9 518 +> 7 0 9 517 +> 7 0 9 521 +> 7 0 9 520 +> 7 0 9 524 +> 7 0 9 523 +> 7 0 9 527 +> 7 0 9 526 +> 7 0 7 501 +> 7 0 7 528 +> 7 0 7 531 +> 7 0 7 534 +> 7 0 7 504 +> 7 0 7 507 +> 7 0 7 510 +> 7 0 7 513 +> 7 0 7 516 +> 7 0 7 519 +> 7 0 7 522 +> 7 0 7 525 +> 7 0 12 537 +> 7 0 6 500 +> 7 0 9 758 +> 7 0 9 570 +> 7 0 9 569 +> 7 0 9 573 +> 7 0 9 572 +> 7 0 9 576 +> 7 0 9 575 +> 7 0 9 579 +> 7 0 9 578 +> 7 0 9 582 +> 7 0 9 581 +> 7 0 9 585 +> 7 0 9 584 +> 7 0 9 588 +> 7 0 9 587 +> 7 0 9 591 +> 7 0 9 590 +> 7 0 9 594 +> 7 0 9 593 +> 7 0 9 597 +> 7 0 9 596 +> 7 0 9 543 +> 7 0 9 542 +> 7 0 9 600 +> 7 0 9 599 +> 7 0 9 603 +> 7 0 9 602 +> 7 0 9 606 +> 7 0 9 605 +> 7 0 9 609 +> 7 0 9 608 +> 7 0 9 612 +> 7 0 9 611 +> 7 0 9 615 +> 7 0 9 614 +> 7 0 9 618 +> 7 0 9 617 +> 7 0 9 621 +> 7 0 9 620 +> 7 0 9 624 +> 7 0 9 623 +> 7 0 9 627 +> 7 0 9 626 +> 7 0 9 546 +> 7 0 9 545 +> 7 0 9 630 +> 7 0 9 629 +> 7 0 9 633 +> 7 0 9 632 +> 7 0 9 636 +> 7 0 9 635 +> 7 0 9 639 +> 7 0 9 638 +> 7 0 9 642 +> 7 0 9 641 +> 7 0 9 645 +> 7 0 9 644 +> 7 0 9 648 +> 7 0 9 647 +> 7 0 9 651 +> 7 0 9 650 +> 7 0 9 654 +> 7 0 9 653 +> 7 0 9 657 +> 7 0 9 656 +> 7 0 9 549 +> 7 0 9 548 +> 7 0 9 660 +> 7 0 9 659 +> 7 0 9 663 +> 7 0 9 662 +> 7 0 9 666 +> 7 0 9 665 +> 7 0 9 669 +> 7 0 9 668 +> 7 0 9 672 +> 7 0 9 671 +> 7 0 9 675 +> 7 0 9 674 +> 7 0 9 678 +> 7 0 9 677 +> 7 0 9 681 +> 7 0 9 680 +> 7 0 9 684 +> 7 0 9 683 +> 7 0 9 687 +> 7 0 9 686 +> 7 0 9 552 +> 7 0 9 551 +> 7 0 9 690 +> 7 0 9 689 +> 7 0 9 693 +> 7 0 9 692 +> 7 0 9 696 +> 7 0 9 695 +> 7 0 9 699 +> 7 0 9 698 +> 7 0 9 702 +> 7 0 9 701 +> 7 0 9 705 +> 7 0 9 704 +> 7 0 9 708 +> 7 0 9 707 +> 7 0 9 711 +> 7 0 9 710 +> 7 0 9 714 +> 7 0 9 713 +> 7 0 9 717 +> 7 0 9 716 +> 7 0 9 555 +> 7 0 9 554 +> 7 0 9 720 +> 7 0 9 719 +> 7 0 9 723 +> 7 0 9 722 +> 7 0 9 726 +> 7 0 9 725 +> 7 0 9 729 +> 7 0 9 728 +> 7 0 9 732 +> 7 0 9 731 +> 7 0 9 735 +> 7 0 9 734 +> 7 0 9 738 +> 7 0 9 737 +> 7 0 9 741 +> 7 0 9 740 +> 7 0 9 744 +> 7 0 9 743 +> 7 0 9 747 +> 7 0 9 746 +> 7 0 9 558 +> 7 0 9 557 +> 7 0 9 750 +> 7 0 9 749 +> 7 0 9 753 +> 7 0 9 752 +> 7 0 9 756 +> 7 0 9 755 +> 7 0 9 561 +> 7 0 9 560 +> 7 0 9 564 +> 7 0 9 563 +> 7 0 9 567 +> 7 0 9 566 +> 7 0 7 541 +> 7 0 7 568 +> 7 0 7 571 +> 7 0 7 574 +> 7 0 7 577 +> 7 0 7 580 +> 7 0 7 583 +> 7 0 7 586 +> 7 0 7 589 +> 7 0 7 592 +> 7 0 7 595 +> 7 0 7 544 +> 7 0 7 598 +> 7 0 7 601 +> 7 0 7 604 +> 7 0 7 607 +> 7 0 7 610 +> 7 0 7 613 +> 7 0 7 616 +> 7 0 7 619 +> 7 0 7 622 +> 7 0 7 625 +> 7 0 7 547 +> 7 0 7 628 +> 7 0 7 631 +> 7 0 7 634 +> 7 0 7 637 +> 7 0 7 640 +> 7 0 7 643 +> 7 0 7 646 +> 7 0 7 649 +> 7 0 7 652 +> 7 0 7 655 +> 7 0 7 550 +> 7 0 7 658 +> 7 0 7 661 +> 7 0 7 664 +> 7 0 7 667 +> 7 0 7 670 +> 7 0 7 673 +> 7 0 7 676 +> 7 0 7 679 +> 7 0 7 682 +> 7 0 7 685 +> 7 0 7 553 +> 7 0 7 688 +> 7 0 7 691 +> 7 0 7 694 +> 7 0 7 697 +> 7 0 7 700 +> 7 0 7 703 +> 7 0 7 706 +> 7 0 7 709 +> 7 0 7 712 +> 7 0 7 715 +> 7 0 7 556 +> 7 0 7 718 +> 7 0 7 721 +> 7 0 7 724 +> 7 0 7 727 +> 7 0 7 730 +> 7 0 7 733 +> 7 0 7 736 +> 7 0 7 739 +> 7 0 7 742 +> 7 0 7 745 +> 7 0 7 559 +> 7 0 7 748 +> 7 0 7 751 +> 7 0 7 754 +> 7 0 7 562 +> 7 0 7 565 +> 7 0 12 757 +> 7 0 6 540 +> 7 0 9 864 +> 7 0 9 790 +> 7 0 9 789 +> 7 0 9 793 +> 7 0 9 792 +> 7 0 9 796 +> 7 0 9 795 +> 7 0 9 799 +> 7 0 9 798 +> 7 0 9 802 +> 7 0 9 801 +> 7 0 9 805 +> 7 0 9 804 +> 7 0 9 808 +> 7 0 9 807 +> 7 0 9 811 +> 7 0 9 810 +> 7 0 9 814 +> 7 0 9 813 +> 7 0 9 817 +> 7 0 9 816 +> 7 0 9 763 +> 7 0 9 762 +> 7 0 9 820 +> 7 0 9 819 +> 7 0 9 823 +> 7 0 9 822 +> 7 0 9 826 +> 7 0 9 825 +> 7 0 9 829 +> 7 0 9 828 +> 7 0 9 832 +> 7 0 9 831 +> 7 0 9 835 +> 7 0 9 834 +> 7 0 9 838 +> 7 0 9 837 +> 7 0 9 841 +> 7 0 9 840 +> 7 0 9 844 +> 7 0 9 843 +> 7 0 9 847 +> 7 0 9 846 +> 7 0 9 766 +> 7 0 9 765 +> 7 0 9 850 +> 7 0 9 849 +> 7 0 9 853 +> 7 0 9 852 +> 7 0 9 856 +> 7 0 9 855 +> 7 0 9 859 +> 7 0 9 858 +> 7 0 9 862 +> 7 0 9 861 +> 7 0 9 769 +> 7 0 9 768 +> 7 0 9 772 +> 7 0 9 771 +> 7 0 9 775 +> 7 0 9 774 +> 7 0 9 778 +> 7 0 9 777 +> 7 0 9 781 +> 7 0 9 780 +> 7 0 9 784 +> 7 0 9 783 +> 7 0 9 787 +> 7 0 9 786 +> 7 0 7 761 +> 7 0 7 788 +> 7 0 7 791 +> 7 0 7 794 +> 7 0 7 797 +> 7 0 7 800 +> 7 0 7 803 +> 7 0 7 806 +> 7 0 7 809 +> 7 0 7 812 +> 7 0 7 815 +> 7 0 7 764 +> 7 0 7 818 +> 7 0 7 821 +> 7 0 7 824 +> 7 0 7 827 +> 7 0 7 830 +> 7 0 7 833 +> 7 0 7 836 +> 7 0 7 839 +> 7 0 7 842 +> 7 0 7 845 +> 7 0 7 767 +> 7 0 7 848 +> 7 0 7 851 +> 7 0 7 854 +> 7 0 7 857 +> 7 0 7 860 +> 7 0 7 770 +> 7 0 7 773 +> 7 0 7 776 +> 7 0 7 779 +> 7 0 7 782 +> 7 0 7 785 +> 7 0 12 863 +> 7 0 6 760 +> 7 0 12 867 +> 7 0 6 866 +> 7 0 3 539 +> 7 0 3 759 +> 7 0 3 865 +> 7 0 3 868 +> 7 0 1 499 +> 7 0 3 16 +> 7 0 3 12 +> 7 0 3 17 +> 7 0 3 18 +> 7 0 3 19 +> 7 0 3 20 +> 7 0 3 15 +> 7 0 3 13 +> 7 0 3 14 +> 7 0 2 7 +> 7 0 2 8 +> 7 0 2 2 +> 7 0 2 6 +> 7 0 2 9 +> 7 0 2 4 +> 7 0 2 3 +> 7 0 2 5 +> 7 0 2 11 +> 7 0 2 10 +> 7 0 1 1 +> 7 0 9 950 +> 7 0 9 900 +> 7 0 9 899 +> 7 0 9 903 +> 7 0 9 902 +> 7 0 9 906 +> 7 0 9 905 +> 7 0 9 909 +> 7 0 9 908 +> 7 0 9 912 +> 7 0 9 911 +> 7 0 9 915 +> 7 0 9 914 +> 7 0 9 918 +> 7 0 9 917 +> 7 0 9 921 +> 7 0 9 920 +> 7 0 9 924 +> 7 0 9 923 +> 7 0 9 927 +> 7 0 9 926 +> 7 0 9 873 +> 7 0 9 872 +> 7 0 9 930 +> 7 0 9 929 +> 7 0 9 933 +> 7 0 9 932 +> 7 0 9 936 +> 7 0 9 935 +> 7 0 9 939 +> 7 0 9 938 +> 7 0 9 942 +> 7 0 9 941 +> 7 0 9 945 +> 7 0 9 944 +> 7 0 9 948 +> 7 0 9 947 +> 7 0 9 876 +> 7 0 9 875 +> 7 0 9 879 +> 7 0 9 878 +> 7 0 9 882 +> 7 0 9 881 +> 7 0 9 885 +> 7 0 9 884 +> 7 0 9 888 +> 7 0 9 887 +> 7 0 9 891 +> 7 0 9 890 +> 7 0 9 894 +> 7 0 9 893 +> 7 0 9 897 +> 7 0 9 896 +> 7 0 7 871 +> 7 0 7 898 +> 7 0 7 901 +> 7 0 7 904 +> 7 0 7 907 +> 7 0 7 910 +> 7 0 7 913 +> 7 0 7 916 +> 7 0 7 919 +> 7 0 7 922 +> 7 0 7 925 +> 7 0 7 874 +> 7 0 7 928 +> 7 0 7 931 +> 7 0 7 934 +> 7 0 7 937 +> 7 0 7 940 +> 7 0 7 943 +> 7 0 7 946 +> 7 0 7 877 +> 7 0 7 880 +> 7 0 7 883 +> 7 0 7 886 +> 7 0 7 889 +> 7 0 7 892 +> 7 0 7 895 +> 7 0 12 949 +> 7 0 6 870 +> 7 0 9 1014 +> 7 0 9 982 +> 7 0 9 981 +> 7 0 9 985 +> 7 0 9 984 +> 7 0 9 988 +> 7 0 9 987 +> 7 0 9 991 +> 7 0 9 990 +> 7 0 9 994 +> 7 0 9 993 +> 7 0 9 997 +> 7 0 9 996 +> 7 0 9 1000 +> 7 0 9 999 +> 7 0 9 1003 +> 7 0 9 1002 +> 7 0 9 1006 +> 7 0 9 1005 +> 7 0 9 1009 +> 7 0 9 1008 +> 7 0 9 955 +> 7 0 9 954 +> 7 0 9 1012 +> 7 0 9 1011 +> 7 0 9 958 +> 7 0 9 957 +> 7 0 9 961 +> 7 0 9 960 +> 7 0 9 964 +> 7 0 9 963 +> 7 0 9 967 +> 7 0 9 966 +> 7 0 9 970 +> 7 0 9 969 +> 7 0 9 973 +> 7 0 9 972 +> 7 0 9 976 +> 7 0 9 975 +> 7 0 9 979 +> 7 0 9 978 +> 7 0 7 953 +> 7 0 7 980 +> 7 0 7 983 +> 7 0 7 986 +> 7 0 7 989 +> 7 0 7 992 +> 7 0 7 995 +> 7 0 7 998 +> 7 0 7 1001 +> 7 0 7 1004 +> 7 0 7 1007 +> 7 0 7 956 +> 7 0 7 1010 +> 7 0 7 959 +> 7 0 7 962 +> 7 0 7 965 +> 7 0 7 968 +> 7 0 7 971 +> 7 0 7 974 +> 7 0 7 977 +> 7 0 12 1013 +> 7 0 6 952 +> 7 0 9 1156 > 7 0 9 1046 -> 7 0 9 1036 -> 7 0 9 1082 -> 7 0 7 1017 -> 7 0 9 1118 -> 7 0 9 1070 -> 7 0 9 1154 -> 7 0 7 1029 -> 7 0 7 1041 +> 7 0 9 1045 +> 7 0 9 1049 > 7 0 9 1048 +> 7 0 9 1052 +> 7 0 9 1051 +> 7 0 9 1055 +> 7 0 9 1054 +> 7 0 9 1058 +> 7 0 9 1057 +> 7 0 9 1061 +> 7 0 9 1060 +> 7 0 9 1064 +> 7 0 9 1063 +> 7 0 9 1067 +> 7 0 9 1066 +> 7 0 9 1070 +> 7 0 9 1069 +> 7 0 9 1073 +> 7 0 9 1072 > 7 0 9 1019 -> 7 0 9 1108 -> 7 0 12 1155 +> 7 0 9 1018 +> 7 0 9 1076 +> 7 0 9 1075 +> 7 0 9 1079 +> 7 0 9 1078 +> 7 0 9 1082 +> 7 0 9 1081 +> 7 0 9 1085 +> 7 0 9 1084 +> 7 0 9 1088 +> 7 0 9 1087 +> 7 0 9 1091 > 7 0 9 1090 -> 7 0 9 1150 -> 7 0 9 1072 -> 7 0 7 1074 -> 7 0 9 1043 -> 7 0 9 1132 -> 7 0 7 1137 -> 7 0 7 1086 +> 7 0 9 1094 +> 7 0 9 1093 +> 7 0 9 1097 +> 7 0 9 1096 +> 7 0 9 1100 +> 7 0 9 1099 +> 7 0 9 1103 +> 7 0 9 1102 +> 7 0 9 1022 > 7 0 9 1021 -> 7 0 7 1149 -> 7 0 7 1098 +> 7 0 9 1106 +> 7 0 9 1105 > 7 0 9 1109 -> 7 0 9 1061 -> 7 0 9 1145 -> 7 0 9 1097 -> 7 0 9 1133 -> 7 0 9 1075 -> 7 0 9 1135 -> 7 0 9 1057 +> 7 0 9 1108 +> 7 0 9 1112 +> 7 0 9 1111 +> 7 0 9 1115 +> 7 0 9 1114 +> 7 0 9 1118 > 7 0 9 1117 -> 7 0 9 1034 -> 7 0 9 1099 -> 7 0 7 1050 -> 7 0 7 1113 -> 7 0 7 1062 -> 7 0 7 1125 -> 7 0 9 1030 -> 7 0 9 1052 -> 7 0 9 1136 -> 7 0 9 1088 -> 7 0 7 1020 +> 7 0 9 1121 +> 7 0 9 1120 > 7 0 9 1124 -> 7 0 7 1032 -> 7 0 9 1156 -> 7 0 9 1084 +> 7 0 9 1123 +> 7 0 9 1127 +> 7 0 9 1126 +> 7 0 9 1130 +> 7 0 9 1129 +> 7 0 9 1133 +> 7 0 9 1132 > 7 0 9 1025 +> 7 0 9 1024 +> 7 0 9 1136 +> 7 0 9 1135 +> 7 0 9 1139 +> 7 0 9 1138 +> 7 0 9 1142 +> 7 0 9 1141 +> 7 0 9 1145 > 7 0 9 1144 -> 7 0 9 1066 -> 7 0 9 1126 -> 7 0 7 1077 -> 7 0 7 1140 -> 7 0 7 1089 -> 7 0 7 1152 -> 7 0 7 1101 -> 7 0 9 1079 -> 7 0 9 1039 -> 7 0 9 1115 -> 7 0 9 1067 +> 7 0 9 1148 +> 7 0 9 1147 > 7 0 9 1151 -> 7 0 9 1103 -> 7 0 9 1051 -> 7 0 9 1111 -> 7 0 9 1093 +> 7 0 9 1150 +> 7 0 9 1154 > 7 0 9 1153 +> 7 0 9 1028 +> 7 0 9 1027 +> 7 0 9 1031 +> 7 0 9 1030 +> 7 0 9 1034 +> 7 0 9 1033 +> 7 0 9 1037 +> 7 0 9 1036 > 7 0 9 1040 -> 7 0 7 1104 +> 7 0 9 1039 +> 7 0 9 1043 +> 7 0 9 1042 +> 7 0 7 1017 +> 7 0 7 1044 +> 7 0 7 1047 +> 7 0 7 1050 > 7 0 7 1053 -> 7 0 7 1116 +> 7 0 7 1056 +> 7 0 7 1059 +> 7 0 7 1062 > 7 0 7 1065 -> 7 0 9 1024 -> 7 0 7 1128 -> 7 0 9 1106 -> 7 0 9 1058 -> 7 0 9 1142 -> 7 0 9 1094 -> 7 0 7 1023 -> 7 0 9 1130 -> 7 0 7 1035 -> 7 0 9 1078 -> 7 0 9 1138 -> 7 0 9 1060 -> 7 0 9 1120 -> 7 0 9 1031 -> 7 0 9 1102 +> 7 0 7 1068 +> 7 0 7 1071 +> 7 0 7 1020 +> 7 0 7 1074 +> 7 0 7 1077 > 7 0 7 1080 -> 7 0 7 1143 +> 7 0 7 1083 +> 7 0 7 1086 +> 7 0 7 1089 > 7 0 7 1092 -> 7 0 9 1049 -> 7 0 9 1033 -> 7 0 9 1085 -> 7 0 9 1121 -> 7 0 9 1073 -> 7 0 9 1045 -> 7 0 9 1105 -> 7 0 9 1022 -> 7 0 9 1087 -> 7 0 9 1147 -> 7 0 9 1069 -> 7 0 7 1044 -> 7 0 9 1129 +> 7 0 7 1095 +> 7 0 7 1098 +> 7 0 7 1101 +> 7 0 7 1023 +> 7 0 7 1104 > 7 0 7 1107 -> 7 0 7 1056 +> 7 0 7 1110 +> 7 0 7 1113 +> 7 0 7 1116 > 7 0 7 1119 -> 7 0 9 1018 -> 7 0 7 1068 +> 7 0 7 1122 +> 7 0 7 1125 +> 7 0 7 1128 > 7 0 7 1131 -> 7 0 9 1076 -> 7 0 9 1112 -> 7 0 9 1042 -> 7 0 9 1064 -> 7 0 9 1148 -> 7 0 9 1100 > 7 0 7 1026 -> 7 0 7 1038 -> 7 0 9 1054 -> 7 0 9 1114 -> 7 0 9 1096 -> 7 0 9 1037 > 7 0 7 1134 -> 7 0 7 1083 +> 7 0 7 1137 +> 7 0 7 1140 +> 7 0 7 1143 > 7 0 7 1146 -> 7 0 7 1095 -> 7 0 9 1027 -> 7 0 9 1055 -> 7 0 9 1139 -> 7 0 9 1091 -> 7 0 9 1127 -> 7 0 9 1081 -> 7 0 9 1141 -> 7 0 9 1063 -> 7 0 9 1028 -> 7 0 9 1123 -> 7 0 7 1047 -> 7 0 7 1110 +> 7 0 7 1149 +> 7 0 7 1152 +> 7 0 7 1029 +> 7 0 7 1032 +> 7 0 7 1035 +> 7 0 7 1038 +> 7 0 7 1041 +> 7 0 12 1155 > 7 0 6 1016 -> 7 0 7 989 -> 7 0 7 995 -> 7 0 9 954 -> 7 0 7 1001 -> 7 0 7 1007 -> 7 0 9 966 -> 7 0 9 985 -> 7 0 9 978 -> 7 0 9 997 -> 7 0 9 1009 -> 7 0 9 987 -> 7 0 9 955 -> 7 0 9 999 -> 7 0 9 967 -> 7 0 7 1010 -> 7 0 9 979 -> 7 0 9 963 -> 7 0 9 1012 -> 7 0 9 988 -> 7 0 9 975 -> 7 0 7 953 -> 7 0 9 1000 -> 7 0 7 959 -> 7 0 7 965 -> 7 0 7 971 -> 7 0 7 977 -> 7 0 9 984 -> 7 0 9 1014 -> 7 0 9 958 -> 7 0 9 996 -> 7 0 9 970 -> 7 0 7 980 -> 7 0 9 1008 -> 7 0 7 986 -> 7 0 7 992 -> 7 0 7 998 -> 7 0 7 1004 -> 7 0 9 960 -> 7 0 9 972 -> 7 0 9 991 -> 7 0 9 1003 -> 7 0 9 981 -> 7 0 9 1011 -> 7 0 9 993 -> 7 0 9 961 -> 7 0 12 1013 -> 7 0 9 1005 -> 7 0 9 973 -> 7 0 9 957 -> 7 0 9 982 -> 7 0 9 969 -> 7 0 9 994 -> 7 0 7 956 -> 7 0 9 1006 -> 7 0 7 962 -> 7 0 7 968 -> 7 0 7 974 -> 7 0 9 990 -> 7 0 9 964 -> 7 0 9 1002 -> 7 0 9 976 -> 7 0 7 983 -> 7 0 6 952 -> 7 0 9 1179 -> 7 0 9 1169 -> 7 0 9 1181 -> 7 0 7 1159 -> 7 0 7 1165 -> 7 0 7 1171 -> 7 0 7 1177 -> 7 0 9 1170 -> 7 0 9 1182 -> 7 0 9 1166 -> 7 0 9 1178 -> 7 0 9 1161 > 7 0 9 1184 +> 7 0 9 1161 +> 7 0 9 1160 +> 7 0 9 1164 +> 7 0 9 1163 +> 7 0 9 1167 +> 7 0 9 1166 +> 7 0 9 1170 +> 7 0 9 1169 > 7 0 9 1173 -> 7 0 12 1183 -> 7 0 9 1163 +> 7 0 9 1172 +> 7 0 9 1176 > 7 0 9 1175 +> 7 0 9 1179 +> 7 0 9 1178 +> 7 0 9 1182 +> 7 0 9 1181 +> 7 0 7 1159 > 7 0 7 1162 +> 7 0 7 1165 > 7 0 7 1168 +> 7 0 7 1171 > 7 0 7 1174 +> 7 0 7 1177 > 7 0 7 1180 -> 7 0 9 1164 -> 7 0 9 1176 -> 7 0 9 1160 -> 7 0 9 1172 -> 7 0 9 1167 +> 7 0 12 1183 > 7 0 6 1158 > 7 0 12 1187 > 7 0 6 1186 -> 7 0 3 1015 > 7 0 3 951 -> 7 0 9 950 -> 7 0 9 876 -> 7 0 9 914 -> 7 0 9 944 -> 7 0 9 888 -> 7 0 9 926 -> 7 0 7 931 -> 7 0 7 937 -> 7 0 7 943 -> 7 0 9 878 -> 7 0 9 933 -> 7 0 9 890 -> 7 0 9 909 -> 7 0 9 945 -> 7 0 7 874 -> 7 0 9 921 -> 7 0 7 880 -> 7 0 7 886 -> 7 0 7 892 -> 7 0 9 899 -> 7 0 9 929 -> 7 0 9 911 -> 7 0 9 879 -> 7 0 9 941 -> 7 0 9 923 -> 7 0 9 891 -> 7 0 7 901 -> 7 0 7 907 -> 7 0 7 913 -> 7 0 12 949 -> 7 0 7 919 -> 7 0 9 875 -> 7 0 7 925 -> 7 0 9 900 -> 7 0 9 887 -> 7 0 9 936 -> 7 0 9 912 -> 7 0 9 948 -> 7 0 9 924 -> 7 0 9 908 -> 7 0 9 938 -> 7 0 9 882 -> 7 0 9 920 -> 7 0 9 894 -> 7 0 7 928 -> 7 0 7 934 -> 7 0 7 940 -> 7 0 9 872 -> 7 0 7 946 -> 7 0 9 884 -> 7 0 9 903 -> 7 0 9 939 -> 7 0 9 896 -> 7 0 9 915 -> 7 0 7 871 -> 7 0 7 877 -> 7 0 9 927 -> 7 0 7 883 -> 7 0 7 889 -> 7 0 7 895 -> 7 0 9 905 -> 7 0 9 873 -> 7 0 9 935 -> 7 0 9 917 -> 7 0 9 885 -> 7 0 9 947 -> 7 0 7 898 -> 7 0 9 897 -> 7 0 7 904 -> 7 0 7 910 -> 7 0 7 916 -> 7 0 7 922 -> 7 0 9 881 -> 7 0 9 930 -> 7 0 9 906 -> 7 0 9 893 -> 7 0 9 942 -> 7 0 9 918 -> 7 0 9 902 -> 7 0 9 932 -> 7 0 6 870 +> 7 0 3 1015 +> 7 0 3 1157 > 7 0 3 1185 > 7 0 3 1188 -> 7 0 3 1157 > 7 0 1 869 -> 7 0 3 4093 -> 7 0 9 3939 -> 7 0 9 4012 +> 7 0 9 1360 +> 7 0 9 1220 +> 7 0 9 1219 +> 7 0 9 1223 +> 7 0 9 1222 +> 7 0 9 1226 +> 7 0 9 1225 +> 7 0 9 1229 +> 7 0 9 1228 +> 7 0 9 1232 +> 7 0 9 1231 +> 7 0 9 1235 +> 7 0 9 1234 +> 7 0 9 1238 +> 7 0 9 1237 +> 7 0 9 1241 +> 7 0 9 1240 +> 7 0 9 1244 +> 7 0 9 1243 +> 7 0 9 1247 +> 7 0 9 1246 +> 7 0 9 1193 +> 7 0 9 1192 +> 7 0 9 1250 +> 7 0 9 1249 +> 7 0 9 1253 +> 7 0 9 1252 +> 7 0 9 1256 +> 7 0 9 1255 +> 7 0 9 1259 +> 7 0 9 1258 +> 7 0 9 1262 +> 7 0 9 1261 +> 7 0 9 1265 +> 7 0 9 1264 +> 7 0 9 1268 +> 7 0 9 1267 +> 7 0 9 1271 +> 7 0 9 1270 +> 7 0 9 1274 +> 7 0 9 1273 +> 7 0 9 1277 +> 7 0 9 1276 +> 7 0 9 1196 +> 7 0 9 1195 +> 7 0 9 1280 +> 7 0 9 1279 +> 7 0 9 1283 +> 7 0 9 1282 +> 7 0 9 1286 +> 7 0 9 1285 +> 7 0 9 1289 +> 7 0 9 1288 +> 7 0 9 1292 +> 7 0 9 1291 +> 7 0 9 1295 +> 7 0 9 1294 +> 7 0 9 1298 +> 7 0 9 1297 +> 7 0 9 1301 +> 7 0 9 1300 +> 7 0 9 1304 +> 7 0 9 1303 +> 7 0 9 1307 +> 7 0 9 1306 +> 7 0 9 1199 +> 7 0 9 1198 +> 7 0 9 1310 +> 7 0 9 1309 +> 7 0 9 1313 +> 7 0 9 1312 +> 7 0 9 1316 +> 7 0 9 1315 +> 7 0 9 1319 +> 7 0 9 1318 +> 7 0 9 1322 +> 7 0 9 1321 +> 7 0 9 1325 +> 7 0 9 1324 +> 7 0 9 1328 +> 7 0 9 1327 +> 7 0 9 1331 +> 7 0 9 1330 +> 7 0 9 1334 +> 7 0 9 1333 +> 7 0 9 1337 +> 7 0 9 1336 +> 7 0 9 1202 +> 7 0 9 1201 +> 7 0 9 1340 +> 7 0 9 1339 +> 7 0 9 1343 +> 7 0 9 1342 +> 7 0 9 1346 +> 7 0 9 1345 +> 7 0 9 1349 +> 7 0 9 1348 +> 7 0 9 1352 +> 7 0 9 1351 +> 7 0 9 1355 +> 7 0 9 1354 +> 7 0 9 1358 +> 7 0 9 1357 +> 7 0 9 1205 +> 7 0 9 1204 +> 7 0 9 1208 +> 7 0 9 1207 +> 7 0 9 1211 +> 7 0 9 1210 +> 7 0 9 1214 +> 7 0 9 1213 +> 7 0 9 1217 +> 7 0 9 1216 +> 7 0 7 1191 +> 7 0 7 1218 +> 7 0 7 1221 +> 7 0 7 1224 +> 7 0 7 1227 +> 7 0 7 1230 +> 7 0 7 1233 +> 7 0 7 1236 +> 7 0 7 1239 +> 7 0 7 1242 +> 7 0 7 1245 +> 7 0 7 1194 +> 7 0 7 1248 +> 7 0 7 1251 +> 7 0 7 1254 +> 7 0 7 1257 +> 7 0 7 1260 +> 7 0 7 1263 +> 7 0 7 1266 +> 7 0 7 1269 +> 7 0 7 1272 +> 7 0 7 1275 +> 7 0 7 1197 +> 7 0 7 1278 +> 7 0 7 1281 +> 7 0 7 1284 +> 7 0 7 1287 +> 7 0 7 1290 +> 7 0 7 1293 +> 7 0 7 1296 +> 7 0 7 1299 +> 7 0 7 1302 +> 7 0 7 1305 +> 7 0 7 1200 +> 7 0 7 1308 +> 7 0 7 1311 +> 7 0 7 1314 +> 7 0 7 1317 +> 7 0 7 1320 +> 7 0 7 1323 +> 7 0 7 1326 +> 7 0 7 1329 +> 7 0 7 1332 +> 7 0 7 1335 +> 7 0 7 1203 +> 7 0 7 1338 +> 7 0 7 1341 +> 7 0 7 1344 +> 7 0 7 1347 +> 7 0 7 1350 +> 7 0 7 1353 +> 7 0 7 1356 +> 7 0 7 1206 +> 7 0 7 1209 +> 7 0 7 1212 +> 7 0 7 1215 +> 7 0 12 1359 +> 7 0 6 1190 +> 7 0 9 1601 +> 7 0 9 1392 +> 7 0 9 1391 +> 7 0 9 1395 +> 7 0 9 1394 +> 7 0 9 1398 +> 7 0 9 1397 +> 7 0 9 1401 +> 7 0 9 1400 +> 7 0 9 1404 +> 7 0 9 1403 +> 7 0 9 1407 +> 7 0 9 1406 +> 7 0 9 1410 +> 7 0 9 1409 +> 7 0 9 1413 +> 7 0 9 1412 +> 7 0 9 1416 +> 7 0 9 1415 +> 7 0 9 1419 +> 7 0 9 1418 +> 7 0 9 1365 +> 7 0 9 1364 +> 7 0 9 1422 +> 7 0 9 1421 +> 7 0 9 1425 +> 7 0 9 1424 +> 7 0 9 1428 +> 7 0 9 1427 +> 7 0 9 1431 +> 7 0 9 1430 +> 7 0 9 1434 +> 7 0 9 1433 +> 7 0 9 1437 +> 7 0 9 1436 +> 7 0 9 1440 +> 7 0 9 1439 +> 7 0 9 1443 +> 7 0 9 1442 +> 7 0 9 1446 +> 7 0 9 1445 +> 7 0 9 1449 +> 7 0 9 1448 +> 7 0 9 1368 +> 7 0 9 1367 +> 7 0 9 1452 +> 7 0 9 1451 +> 7 0 9 1455 +> 7 0 9 1454 +> 7 0 9 1458 +> 7 0 9 1457 +> 7 0 9 1461 +> 7 0 9 1460 +> 7 0 9 1464 +> 7 0 9 1463 +> 7 0 9 1467 +> 7 0 9 1466 +> 7 0 9 1470 +> 7 0 9 1469 +> 7 0 9 1473 +> 7 0 9 1472 +> 7 0 9 1476 +> 7 0 9 1475 +> 7 0 9 1479 +> 7 0 9 1478 +> 7 0 9 1371 +> 7 0 9 1370 +> 7 0 9 1482 +> 7 0 9 1481 +> 7 0 9 1485 +> 7 0 9 1484 +> 7 0 9 1488 +> 7 0 9 1487 +> 7 0 9 1491 +> 7 0 9 1490 +> 7 0 9 1494 +> 7 0 9 1493 +> 7 0 9 1497 +> 7 0 9 1496 +> 7 0 9 1500 +> 7 0 9 1499 +> 7 0 9 1503 +> 7 0 9 1502 +> 7 0 9 1506 +> 7 0 9 1505 +> 7 0 9 1509 +> 7 0 9 1508 +> 7 0 9 1374 +> 7 0 9 1373 +> 7 0 9 1512 +> 7 0 9 1511 +> 7 0 9 1515 +> 7 0 9 1514 +> 7 0 9 1518 +> 7 0 9 1517 +> 7 0 9 1521 +> 7 0 9 1520 +> 7 0 9 1524 +> 7 0 9 1523 +> 7 0 9 1527 +> 7 0 9 1526 +> 7 0 9 1530 +> 7 0 9 1529 +> 7 0 9 1533 +> 7 0 9 1532 +> 7 0 9 1536 +> 7 0 9 1535 +> 7 0 9 1539 +> 7 0 9 1538 +> 7 0 9 1377 +> 7 0 9 1376 +> 7 0 9 1542 +> 7 0 9 1541 +> 7 0 9 1545 +> 7 0 9 1544 +> 7 0 9 1548 +> 7 0 9 1547 +> 7 0 9 1551 +> 7 0 9 1550 +> 7 0 9 1554 +> 7 0 9 1553 +> 7 0 9 1557 +> 7 0 9 1556 +> 7 0 9 1560 +> 7 0 9 1559 +> 7 0 9 1563 +> 7 0 9 1562 +> 7 0 9 1566 +> 7 0 9 1565 +> 7 0 9 1569 +> 7 0 9 1568 +> 7 0 9 1380 +> 7 0 9 1379 +> 7 0 9 1572 +> 7 0 9 1571 +> 7 0 9 1575 +> 7 0 9 1574 +> 7 0 9 1578 +> 7 0 9 1577 +> 7 0 9 1581 +> 7 0 9 1580 +> 7 0 9 1584 +> 7 0 9 1583 +> 7 0 9 1587 +> 7 0 9 1586 +> 7 0 9 1590 +> 7 0 9 1589 +> 7 0 9 1593 +> 7 0 9 1592 +> 7 0 9 1596 +> 7 0 9 1595 +> 7 0 9 1599 +> 7 0 9 1598 +> 7 0 9 1383 +> 7 0 9 1382 +> 7 0 9 1386 +> 7 0 9 1385 +> 7 0 9 1389 +> 7 0 9 1388 +> 7 0 7 1363 +> 7 0 7 1390 +> 7 0 7 1393 +> 7 0 7 1396 +> 7 0 7 1399 +> 7 0 7 1402 +> 7 0 7 1405 +> 7 0 7 1408 +> 7 0 7 1411 +> 7 0 7 1414 +> 7 0 7 1417 +> 7 0 7 1366 +> 7 0 7 1420 +> 7 0 7 1423 +> 7 0 7 1426 +> 7 0 7 1429 +> 7 0 7 1432 +> 7 0 7 1435 +> 7 0 7 1438 +> 7 0 7 1441 +> 7 0 7 1444 +> 7 0 7 1447 +> 7 0 7 1369 +> 7 0 7 1450 +> 7 0 7 1453 +> 7 0 7 1456 +> 7 0 7 1459 +> 7 0 7 1462 +> 7 0 7 1465 +> 7 0 7 1468 +> 7 0 7 1471 +> 7 0 7 1474 +> 7 0 7 1477 +> 7 0 7 1372 +> 7 0 7 1480 +> 7 0 7 1483 +> 7 0 7 1486 +> 7 0 7 1489 +> 7 0 7 1492 +> 7 0 7 1495 +> 7 0 7 1498 +> 7 0 7 1501 +> 7 0 7 1504 +> 7 0 7 1507 +> 7 0 7 1375 +> 7 0 7 1510 +> 7 0 7 1513 +> 7 0 7 1516 +> 7 0 7 1519 +> 7 0 7 1522 +> 7 0 7 1525 +> 7 0 7 1528 +> 7 0 7 1531 +> 7 0 7 1534 +> 7 0 7 1537 +> 7 0 7 1378 +> 7 0 7 1540 +> 7 0 7 1543 +> 7 0 7 1546 +> 7 0 7 1549 +> 7 0 7 1552 +> 7 0 7 1555 +> 7 0 7 1558 +> 7 0 7 1561 +> 7 0 7 1564 +> 7 0 7 1567 +> 7 0 7 1381 +> 7 0 7 1570 +> 7 0 7 1573 +> 7 0 7 1576 +> 7 0 7 1579 +> 7 0 7 1582 +> 7 0 7 1585 +> 7 0 7 1588 +> 7 0 7 1591 +> 7 0 7 1594 +> 7 0 7 1597 +> 7 0 7 1384 +> 7 0 7 1387 +> 7 0 12 1600 +> 7 0 6 1362 +> 7 0 12 1604 +> 7 0 6 1603 +> 7 0 3 1361 +> 7 0 3 1605 +> 7 0 3 1602 +> 7 0 1 1189 +> 7 0 16 1727 +> 7 0 16 1638 +> 7 0 16 1637 +> 7 0 16 1641 +> 7 0 16 1640 +> 7 0 16 1644 +> 7 0 16 1643 +> 7 0 16 1647 +> 7 0 16 1646 +> 7 0 16 1650 +> 7 0 16 1649 +> 7 0 16 1653 +> 7 0 16 1652 +> 7 0 16 1656 +> 7 0 16 1655 +> 7 0 16 1659 +> 7 0 16 1658 +> 7 0 16 1662 +> 7 0 16 1661 +> 7 0 16 1665 +> 7 0 16 1664 +> 7 0 16 1611 +> 7 0 16 1610 +> 7 0 16 1668 +> 7 0 16 1667 +> 7 0 16 1671 +> 7 0 16 1670 +> 7 0 16 1674 +> 7 0 16 1673 +> 7 0 16 1677 +> 7 0 16 1676 +> 7 0 16 1680 +> 7 0 16 1679 +> 7 0 16 1683 +> 7 0 16 1682 +> 7 0 16 1686 +> 7 0 16 1685 +> 7 0 16 1689 +> 7 0 16 1688 +> 7 0 16 1692 +> 7 0 16 1691 +> 7 0 16 1695 +> 7 0 16 1694 +> 7 0 16 1614 +> 7 0 16 1613 +> 7 0 16 1698 +> 7 0 16 1697 +> 7 0 16 1701 +> 7 0 16 1700 +> 7 0 16 1704 +> 7 0 16 1703 +> 7 0 16 1707 +> 7 0 16 1706 +> 7 0 16 1710 +> 7 0 16 1709 +> 7 0 16 1713 +> 7 0 16 1712 +> 7 0 16 1716 +> 7 0 16 1715 +> 7 0 16 1719 +> 7 0 16 1718 +> 7 0 16 1722 +> 7 0 16 1721 +> 7 0 16 1725 +> 7 0 16 1724 +> 7 0 16 1617 +> 7 0 16 1616 +> 7 0 16 1620 +> 7 0 16 1619 +> 7 0 16 1623 +> 7 0 16 1622 +> 7 0 16 1626 +> 7 0 16 1625 +> 7 0 16 1629 +> 7 0 16 1628 +> 7 0 16 1632 +> 7 0 16 1631 +> 7 0 16 1635 +> 7 0 16 1634 +> 7 0 14 1609 +> 7 0 14 1636 +> 7 0 14 1639 +> 7 0 14 1642 +> 7 0 14 1645 +> 7 0 14 1648 +> 7 0 14 1651 +> 7 0 14 1654 +> 7 0 14 1657 +> 7 0 14 1660 +> 7 0 14 1663 +> 7 0 14 1612 +> 7 0 14 1666 +> 7 0 14 1669 +> 7 0 14 1672 +> 7 0 14 1675 +> 7 0 14 1678 +> 7 0 14 1681 +> 7 0 14 1684 +> 7 0 14 1687 +> 7 0 14 1690 +> 7 0 14 1693 +> 7 0 14 1615 +> 7 0 14 1696 +> 7 0 14 1699 +> 7 0 14 1702 +> 7 0 14 1705 +> 7 0 14 1708 +> 7 0 14 1711 +> 7 0 14 1714 +> 7 0 14 1717 +> 7 0 14 1720 +> 7 0 14 1723 +> 7 0 14 1618 +> 7 0 14 1621 +> 7 0 14 1624 +> 7 0 14 1627 +> 7 0 14 1630 +> 7 0 14 1633 +> 7 0 19 1726 +> 7 0 13 1608 +> 7 0 16 1835 +> 7 0 16 1731 +> 7 0 16 1730 +> 7 0 16 1734 +> 7 0 16 1733 +> 7 0 16 1737 +> 7 0 16 1736 +> 7 0 16 1740 +> 7 0 16 1739 +> 7 0 16 1743 +> 7 0 16 1742 +> 7 0 16 1746 +> 7 0 16 1745 +> 7 0 16 1749 +> 7 0 16 1748 +> 7 0 16 1752 +> 7 0 16 1751 +> 7 0 16 1755 +> 7 0 16 1754 +> 7 0 16 1758 +> 7 0 16 1757 +> 7 0 16 1761 +> 7 0 16 1760 +> 7 0 16 1764 +> 7 0 16 1763 +> 7 0 16 1767 +> 7 0 16 1766 +> 7 0 16 1770 +> 7 0 16 1769 +> 7 0 16 1773 +> 7 0 16 1772 +> 7 0 16 1776 +> 7 0 16 1775 +> 7 0 16 1779 +> 7 0 16 1778 +> 7 0 16 1782 +> 7 0 16 1781 +> 7 0 16 1785 +> 7 0 16 1784 +> 7 0 16 1788 +> 7 0 16 1787 +> 7 0 16 1791 +> 7 0 16 1790 +> 7 0 16 1794 +> 7 0 16 1793 +> 7 0 16 1797 +> 7 0 16 1796 +> 7 0 16 1800 +> 7 0 16 1799 +> 7 0 16 1803 +> 7 0 16 1802 +> 7 0 16 1806 +> 7 0 16 1805 +> 7 0 16 1809 +> 7 0 16 1808 +> 7 0 16 1812 +> 7 0 16 1811 +> 7 0 16 1815 +> 7 0 16 1814 +> 7 0 16 1818 +> 7 0 16 1817 +> 7 0 16 1821 +> 7 0 16 1820 +> 7 0 16 1824 +> 7 0 16 1823 +> 7 0 16 1827 +> 7 0 16 1826 +> 7 0 16 1830 +> 7 0 16 1829 +> 7 0 16 1833 +> 7 0 16 1832 +> 7 0 14 1729 +> 7 0 14 1732 +> 7 0 14 1735 +> 7 0 14 1738 +> 7 0 14 1741 +> 7 0 14 1744 +> 7 0 14 1747 +> 7 0 14 1750 +> 7 0 14 1753 +> 7 0 14 1756 +> 7 0 14 1759 +> 7 0 14 1762 +> 7 0 14 1765 +> 7 0 14 1768 +> 7 0 14 1771 +> 7 0 14 1774 +> 7 0 14 1777 +> 7 0 14 1780 +> 7 0 14 1783 +> 7 0 14 1786 +> 7 0 14 1789 +> 7 0 14 1792 +> 7 0 14 1795 +> 7 0 14 1798 +> 7 0 14 1801 +> 7 0 14 1804 +> 7 0 14 1807 +> 7 0 14 1810 +> 7 0 14 1813 +> 7 0 14 1816 +> 7 0 14 1819 +> 7 0 14 1822 +> 7 0 14 1825 +> 7 0 14 1828 +> 7 0 14 1831 +> 7 0 19 1834 +> 7 0 13 1728 +> 7 0 16 1928 +> 7 0 16 1914 +> 7 0 16 1913 +> 7 0 16 1917 +> 7 0 16 1916 +> 7 0 16 1920 +> 7 0 16 1919 +> 7 0 16 1923 +> 7 0 16 1922 +> 7 0 16 1926 +> 7 0 16 1925 +> 7 0 16 1839 +> 7 0 16 1838 +> 7 0 16 1842 +> 7 0 16 1841 +> 7 0 16 1845 +> 7 0 16 1844 +> 7 0 16 1848 +> 7 0 16 1847 +> 7 0 16 1851 +> 7 0 16 1850 +> 7 0 16 1854 +> 7 0 16 1853 +> 7 0 16 1857 +> 7 0 16 1856 +> 7 0 16 1860 +> 7 0 16 1859 +> 7 0 16 1863 +> 7 0 16 1862 +> 7 0 16 1866 +> 7 0 16 1865 +> 7 0 16 1869 +> 7 0 16 1868 +> 7 0 16 1872 +> 7 0 16 1871 +> 7 0 16 1875 +> 7 0 16 1874 +> 7 0 16 1878 +> 7 0 16 1877 +> 7 0 16 1881 +> 7 0 16 1880 +> 7 0 16 1884 +> 7 0 16 1883 +> 7 0 16 1887 +> 7 0 16 1886 +> 7 0 16 1890 +> 7 0 16 1889 +> 7 0 16 1893 +> 7 0 16 1892 +> 7 0 16 1896 +> 7 0 16 1895 +> 7 0 16 1899 +> 7 0 16 1898 +> 7 0 16 1902 +> 7 0 16 1901 +> 7 0 16 1905 +> 7 0 16 1904 +> 7 0 16 1908 +> 7 0 16 1907 +> 7 0 16 1911 +> 7 0 16 1910 +> 7 0 14 1912 +> 7 0 14 1915 +> 7 0 14 1918 +> 7 0 14 1921 +> 7 0 14 1924 +> 7 0 14 1837 +> 7 0 14 1840 +> 7 0 14 1843 +> 7 0 14 1846 +> 7 0 14 1849 +> 7 0 14 1852 +> 7 0 14 1855 +> 7 0 14 1858 +> 7 0 14 1861 +> 7 0 14 1864 +> 7 0 14 1867 +> 7 0 14 1870 +> 7 0 14 1873 +> 7 0 14 1876 +> 7 0 14 1879 +> 7 0 14 1882 +> 7 0 14 1885 +> 7 0 14 1888 +> 7 0 14 1891 +> 7 0 14 1894 +> 7 0 14 1897 +> 7 0 14 1900 +> 7 0 14 1903 +> 7 0 14 1906 +> 7 0 14 1909 +> 7 0 19 1927 +> 7 0 13 1836 +> 7 0 16 2051 +> 7 0 16 1932 +> 7 0 16 1931 +> 7 0 16 1935 +> 7 0 16 1934 +> 7 0 16 1938 +> 7 0 16 1937 +> 7 0 16 1941 +> 7 0 16 1940 +> 7 0 16 1944 +> 7 0 16 1943 +> 7 0 16 1947 +> 7 0 16 1946 +> 7 0 16 1950 +> 7 0 16 1949 +> 7 0 16 1953 +> 7 0 16 1952 +> 7 0 16 1956 +> 7 0 16 1955 +> 7 0 16 1959 +> 7 0 16 1958 +> 7 0 16 1962 +> 7 0 16 1961 +> 7 0 16 1965 +> 7 0 16 1964 +> 7 0 16 1968 +> 7 0 16 1967 +> 7 0 16 1971 +> 7 0 16 1970 +> 7 0 16 1974 +> 7 0 16 1973 +> 7 0 16 1977 +> 7 0 16 1976 +> 7 0 16 1980 +> 7 0 16 1979 +> 7 0 16 1983 +> 7 0 16 1982 +> 7 0 16 1986 +> 7 0 16 1985 +> 7 0 16 1989 +> 7 0 16 1988 +> 7 0 16 1992 +> 7 0 16 1991 +> 7 0 16 1995 +> 7 0 16 1994 +> 7 0 16 1998 +> 7 0 16 1997 +> 7 0 16 2001 +> 7 0 16 2000 +> 7 0 16 2004 +> 7 0 16 2003 +> 7 0 16 2007 +> 7 0 16 2006 +> 7 0 16 2010 +> 7 0 16 2009 +> 7 0 16 2013 +> 7 0 16 2012 +> 7 0 16 2016 +> 7 0 16 2015 +> 7 0 16 2019 +> 7 0 16 2018 +> 7 0 16 2022 +> 7 0 16 2021 +> 7 0 16 2025 +> 7 0 16 2024 +> 7 0 16 2028 +> 7 0 16 2027 +> 7 0 16 2031 +> 7 0 16 2030 +> 7 0 16 2034 +> 7 0 16 2033 +> 7 0 16 2037 +> 7 0 16 2036 +> 7 0 16 2040 +> 7 0 16 2039 +> 7 0 16 2043 +> 7 0 16 2042 +> 7 0 16 2046 +> 7 0 16 2045 +> 7 0 16 2049 +> 7 0 16 2048 +> 7 0 14 1930 +> 7 0 14 1933 +> 7 0 14 1936 +> 7 0 14 1939 +> 7 0 14 1942 +> 7 0 14 1945 +> 7 0 14 1948 +> 7 0 14 1951 +> 7 0 14 1954 +> 7 0 14 1957 +> 7 0 14 1960 +> 7 0 14 1963 +> 7 0 14 1966 +> 7 0 14 1969 +> 7 0 14 1972 +> 7 0 14 1975 +> 7 0 14 1978 +> 7 0 14 1981 +> 7 0 14 1984 +> 7 0 14 1987 +> 7 0 14 1990 +> 7 0 14 1993 +> 7 0 14 1996 +> 7 0 14 1999 +> 7 0 14 2002 +> 7 0 14 2005 +> 7 0 14 2008 +> 7 0 14 2011 +> 7 0 14 2014 +> 7 0 14 2017 +> 7 0 14 2020 +> 7 0 14 2023 +> 7 0 14 2026 +> 7 0 14 2029 +> 7 0 14 2032 +> 7 0 14 2035 +> 7 0 14 2038 +> 7 0 14 2041 +> 7 0 14 2044 +> 7 0 14 2047 +> 7 0 19 2050 +> 7 0 13 1929 +> 7 0 19 2053 +> 7 0 13 2052 +> 7 0 9 2054 +> 7 0 6 1607 +> 7 0 16 2155 +> 7 0 16 2087 +> 7 0 16 2086 +> 7 0 16 2090 +> 7 0 16 2089 +> 7 0 16 2093 +> 7 0 16 2092 +> 7 0 16 2096 +> 7 0 16 2095 +> 7 0 16 2099 +> 7 0 16 2098 +> 7 0 16 2102 +> 7 0 16 2101 +> 7 0 16 2105 +> 7 0 16 2104 +> 7 0 16 2108 +> 7 0 16 2107 +> 7 0 16 2111 +> 7 0 16 2110 +> 7 0 16 2114 +> 7 0 16 2113 +> 7 0 16 2060 +> 7 0 16 2059 +> 7 0 16 2117 +> 7 0 16 2116 +> 7 0 16 2120 +> 7 0 16 2119 +> 7 0 16 2123 +> 7 0 16 2122 +> 7 0 16 2126 +> 7 0 16 2125 +> 7 0 16 2129 +> 7 0 16 2128 +> 7 0 16 2132 +> 7 0 16 2131 +> 7 0 16 2135 +> 7 0 16 2134 +> 7 0 16 2138 +> 7 0 16 2137 +> 7 0 16 2141 +> 7 0 16 2140 +> 7 0 16 2144 +> 7 0 16 2143 +> 7 0 16 2063 +> 7 0 16 2062 +> 7 0 16 2066 +> 7 0 16 2065 +> 7 0 16 2069 +> 7 0 16 2068 +> 7 0 16 2147 +> 7 0 16 2146 +> 7 0 16 2150 +> 7 0 16 2149 +> 7 0 16 2072 +> 7 0 16 2071 +> 7 0 16 2153 +> 7 0 16 2152 +> 7 0 16 2075 +> 7 0 16 2074 +> 7 0 16 2078 +> 7 0 16 2077 +> 7 0 16 2081 +> 7 0 16 2080 +> 7 0 16 2084 +> 7 0 16 2083 +> 7 0 14 2058 +> 7 0 14 2085 +> 7 0 14 2088 +> 7 0 14 2091 +> 7 0 14 2094 +> 7 0 14 2097 +> 7 0 14 2100 +> 7 0 14 2103 +> 7 0 14 2106 +> 7 0 14 2109 +> 7 0 14 2112 +> 7 0 14 2061 +> 7 0 14 2115 +> 7 0 14 2118 +> 7 0 14 2121 +> 7 0 14 2124 +> 7 0 14 2127 +> 7 0 14 2130 +> 7 0 14 2133 +> 7 0 14 2136 +> 7 0 14 2139 +> 7 0 14 2142 +> 7 0 14 2064 +> 7 0 14 2067 +> 7 0 14 2070 +> 7 0 14 2145 +> 7 0 14 2148 +> 7 0 14 2073 +> 7 0 14 2151 +> 7 0 14 2076 +> 7 0 14 2079 +> 7 0 14 2082 +> 7 0 19 2154 +> 7 0 13 2057 +> 7 0 16 2242 +> 7 0 16 2159 +> 7 0 16 2158 +> 7 0 16 2162 +> 7 0 16 2161 +> 7 0 16 2165 +> 7 0 16 2164 +> 7 0 16 2168 +> 7 0 16 2167 +> 7 0 16 2171 +> 7 0 16 2170 +> 7 0 16 2174 +> 7 0 16 2173 +> 7 0 16 2177 +> 7 0 16 2176 +> 7 0 16 2180 +> 7 0 16 2179 +> 7 0 16 2183 +> 7 0 16 2182 +> 7 0 16 2186 +> 7 0 16 2185 +> 7 0 16 2189 +> 7 0 16 2188 +> 7 0 16 2192 +> 7 0 16 2191 +> 7 0 16 2195 +> 7 0 16 2194 +> 7 0 16 2198 +> 7 0 16 2197 +> 7 0 16 2201 +> 7 0 16 2200 +> 7 0 16 2204 +> 7 0 16 2203 +> 7 0 16 2207 +> 7 0 16 2206 +> 7 0 16 2210 +> 7 0 16 2209 +> 7 0 16 2213 +> 7 0 16 2212 +> 7 0 16 2216 +> 7 0 16 2215 +> 7 0 16 2219 +> 7 0 16 2218 +> 7 0 16 2222 +> 7 0 16 2221 +> 7 0 16 2225 +> 7 0 16 2224 +> 7 0 16 2228 +> 7 0 16 2227 +> 7 0 16 2231 +> 7 0 16 2230 +> 7 0 16 2234 +> 7 0 16 2233 +> 7 0 16 2237 +> 7 0 16 2236 +> 7 0 16 2240 +> 7 0 16 2239 +> 7 0 14 2157 +> 7 0 14 2160 +> 7 0 14 2163 +> 7 0 14 2166 +> 7 0 14 2169 +> 7 0 14 2172 +> 7 0 14 2175 +> 7 0 14 2178 +> 7 0 14 2181 +> 7 0 14 2184 +> 7 0 14 2187 +> 7 0 14 2190 +> 7 0 14 2193 +> 7 0 14 2196 +> 7 0 14 2199 +> 7 0 14 2202 +> 7 0 14 2205 +> 7 0 14 2208 +> 7 0 14 2211 +> 7 0 14 2214 +> 7 0 14 2217 +> 7 0 14 2220 +> 7 0 14 2223 +> 7 0 14 2226 +> 7 0 14 2229 +> 7 0 14 2232 +> 7 0 14 2235 +> 7 0 14 2238 +> 7 0 19 2241 +> 7 0 13 2156 +> 7 0 16 2341 +> 7 0 16 2246 +> 7 0 16 2245 +> 7 0 16 2249 +> 7 0 16 2248 +> 7 0 16 2252 +> 7 0 16 2251 +> 7 0 16 2255 +> 7 0 16 2254 +> 7 0 16 2258 +> 7 0 16 2257 +> 7 0 16 2261 +> 7 0 16 2260 +> 7 0 16 2264 +> 7 0 16 2263 +> 7 0 16 2267 +> 7 0 16 2266 +> 7 0 16 2270 +> 7 0 16 2269 +> 7 0 16 2273 +> 7 0 16 2272 +> 7 0 16 2276 +> 7 0 16 2275 +> 7 0 16 2279 +> 7 0 16 2278 +> 7 0 16 2282 +> 7 0 16 2281 +> 7 0 16 2285 +> 7 0 16 2284 +> 7 0 16 2288 +> 7 0 16 2287 +> 7 0 16 2291 +> 7 0 16 2290 +> 7 0 16 2294 +> 7 0 16 2293 +> 7 0 16 2297 +> 7 0 16 2296 +> 7 0 16 2300 +> 7 0 16 2299 +> 7 0 16 2303 +> 7 0 16 2302 +> 7 0 16 2306 +> 7 0 16 2305 +> 7 0 16 2309 +> 7 0 16 2308 +> 7 0 16 2312 +> 7 0 16 2311 +> 7 0 16 2315 +> 7 0 16 2314 +> 7 0 16 2318 +> 7 0 16 2317 +> 7 0 16 2321 +> 7 0 16 2320 +> 7 0 16 2324 +> 7 0 16 2323 +> 7 0 16 2327 +> 7 0 16 2326 +> 7 0 16 2330 +> 7 0 16 2329 +> 7 0 16 2333 +> 7 0 16 2332 +> 7 0 16 2336 +> 7 0 16 2335 +> 7 0 16 2339 +> 7 0 16 2338 +> 7 0 14 2244 +> 7 0 14 2247 +> 7 0 14 2250 +> 7 0 14 2253 +> 7 0 14 2256 +> 7 0 14 2259 +> 7 0 14 2262 +> 7 0 14 2265 +> 7 0 14 2268 +> 7 0 14 2271 +> 7 0 14 2274 +> 7 0 14 2277 +> 7 0 14 2280 +> 7 0 14 2283 +> 7 0 14 2286 +> 7 0 14 2289 +> 7 0 14 2292 +> 7 0 14 2295 +> 7 0 14 2298 +> 7 0 14 2301 +> 7 0 14 2304 +> 7 0 14 2307 +> 7 0 14 2310 +> 7 0 14 2313 +> 7 0 14 2316 +> 7 0 14 2319 +> 7 0 14 2322 +> 7 0 14 2325 +> 7 0 14 2328 +> 7 0 14 2331 +> 7 0 14 2334 +> 7 0 14 2337 +> 7 0 19 2340 +> 7 0 13 2243 +> 7 0 19 2343 +> 7 0 13 2342 +> 7 0 9 2344 +> 7 0 6 2056 +> 7 0 12 2347 +> 7 0 6 2346 +> 7 0 3 2055 +> 7 0 3 2345 +> 7 0 3 2348 +> 7 0 1 1606 +> 7 0 16 2461 +> 7 0 16 2381 +> 7 0 16 2380 +> 7 0 16 2384 +> 7 0 16 2383 +> 7 0 16 2387 +> 7 0 16 2386 +> 7 0 16 2390 +> 7 0 16 2389 +> 7 0 16 2393 +> 7 0 16 2392 +> 7 0 16 2396 +> 7 0 16 2395 +> 7 0 16 2399 +> 7 0 16 2398 +> 7 0 16 2402 +> 7 0 16 2401 +> 7 0 16 2405 +> 7 0 16 2404 +> 7 0 16 2408 +> 7 0 16 2407 +> 7 0 16 2354 +> 7 0 16 2353 +> 7 0 16 2411 +> 7 0 16 2410 +> 7 0 16 2414 +> 7 0 16 2413 +> 7 0 16 2417 +> 7 0 16 2416 +> 7 0 16 2420 +> 7 0 16 2419 +> 7 0 16 2423 +> 7 0 16 2422 +> 7 0 16 2426 +> 7 0 16 2425 +> 7 0 16 2429 +> 7 0 16 2428 +> 7 0 16 2432 +> 7 0 16 2431 +> 7 0 16 2435 +> 7 0 16 2434 +> 7 0 16 2438 +> 7 0 16 2437 +> 7 0 16 2357 +> 7 0 16 2356 +> 7 0 16 2441 +> 7 0 16 2440 +> 7 0 16 2444 +> 7 0 16 2443 +> 7 0 16 2447 +> 7 0 16 2446 +> 7 0 16 2450 +> 7 0 16 2449 +> 7 0 16 2453 +> 7 0 16 2452 +> 7 0 16 2456 +> 7 0 16 2455 +> 7 0 16 2459 +> 7 0 16 2458 +> 7 0 16 2360 +> 7 0 16 2359 +> 7 0 16 2363 +> 7 0 16 2362 +> 7 0 16 2366 +> 7 0 16 2365 +> 7 0 16 2369 +> 7 0 16 2368 +> 7 0 16 2372 +> 7 0 16 2371 +> 7 0 16 2375 +> 7 0 16 2374 +> 7 0 16 2378 +> 7 0 16 2377 +> 7 0 14 2352 +> 7 0 14 2379 +> 7 0 14 2382 +> 7 0 14 2385 +> 7 0 14 2388 +> 7 0 14 2391 +> 7 0 14 2394 +> 7 0 14 2397 +> 7 0 14 2400 +> 7 0 14 2403 +> 7 0 14 2406 +> 7 0 14 2355 +> 7 0 14 2409 +> 7 0 14 2412 +> 7 0 14 2415 +> 7 0 14 2418 +> 7 0 14 2421 +> 7 0 14 2424 +> 7 0 14 2427 +> 7 0 14 2430 +> 7 0 14 2433 +> 7 0 14 2436 +> 7 0 14 2358 +> 7 0 14 2439 +> 7 0 14 2442 +> 7 0 14 2445 +> 7 0 14 2448 +> 7 0 14 2451 +> 7 0 14 2454 +> 7 0 14 2457 +> 7 0 14 2361 +> 7 0 14 2364 +> 7 0 14 2367 +> 7 0 14 2370 +> 7 0 14 2373 +> 7 0 14 2376 +> 7 0 19 2460 +> 7 0 13 2351 +> 7 0 16 2572 +> 7 0 16 2465 +> 7 0 16 2464 +> 7 0 16 2468 +> 7 0 16 2467 +> 7 0 16 2471 +> 7 0 16 2470 +> 7 0 16 2474 +> 7 0 16 2473 +> 7 0 16 2477 +> 7 0 16 2476 +> 7 0 16 2480 +> 7 0 16 2479 +> 7 0 16 2483 +> 7 0 16 2482 +> 7 0 16 2486 +> 7 0 16 2485 +> 7 0 16 2489 +> 7 0 16 2488 +> 7 0 16 2492 +> 7 0 16 2491 +> 7 0 16 2495 +> 7 0 16 2494 +> 7 0 16 2498 +> 7 0 16 2497 +> 7 0 16 2501 +> 7 0 16 2500 +> 7 0 16 2504 +> 7 0 16 2503 +> 7 0 16 2507 +> 7 0 16 2506 +> 7 0 16 2510 +> 7 0 16 2509 +> 7 0 16 2513 +> 7 0 16 2512 +> 7 0 16 2516 +> 7 0 16 2515 +> 7 0 16 2519 +> 7 0 16 2518 +> 7 0 16 2522 +> 7 0 16 2521 +> 7 0 16 2525 +> 7 0 16 2524 +> 7 0 16 2528 +> 7 0 16 2527 +> 7 0 16 2531 +> 7 0 16 2530 +> 7 0 16 2534 +> 7 0 16 2533 +> 7 0 16 2537 +> 7 0 16 2536 +> 7 0 16 2540 +> 7 0 16 2539 +> 7 0 16 2543 +> 7 0 16 2542 +> 7 0 16 2546 +> 7 0 16 2545 +> 7 0 16 2549 +> 7 0 16 2548 +> 7 0 16 2552 +> 7 0 16 2551 +> 7 0 16 2555 +> 7 0 16 2554 +> 7 0 16 2558 +> 7 0 16 2557 +> 7 0 16 2561 +> 7 0 16 2560 +> 7 0 16 2564 +> 7 0 16 2563 +> 7 0 16 2567 +> 7 0 16 2566 +> 7 0 16 2570 +> 7 0 16 2569 +> 7 0 14 2463 +> 7 0 14 2466 +> 7 0 14 2469 +> 7 0 14 2472 +> 7 0 14 2475 +> 7 0 14 2478 +> 7 0 14 2481 +> 7 0 14 2484 +> 7 0 14 2487 +> 7 0 14 2490 +> 7 0 14 2493 +> 7 0 14 2496 +> 7 0 14 2499 +> 7 0 14 2502 +> 7 0 14 2505 +> 7 0 14 2508 +> 7 0 14 2511 +> 7 0 14 2514 +> 7 0 14 2517 +> 7 0 14 2520 +> 7 0 14 2523 +> 7 0 14 2526 +> 7 0 14 2529 +> 7 0 14 2532 +> 7 0 14 2535 +> 7 0 14 2538 +> 7 0 14 2541 +> 7 0 14 2544 +> 7 0 14 2547 +> 7 0 14 2550 +> 7 0 14 2553 +> 7 0 14 2556 +> 7 0 14 2559 +> 7 0 14 2562 +> 7 0 14 2565 +> 7 0 14 2568 +> 7 0 19 2571 +> 7 0 13 2462 +> 7 0 16 2683 +> 7 0 16 2657 +> 7 0 16 2656 +> 7 0 16 2660 +> 7 0 16 2659 +> 7 0 16 2663 +> 7 0 16 2662 +> 7 0 16 2666 +> 7 0 16 2665 +> 7 0 16 2669 +> 7 0 16 2668 +> 7 0 16 2672 +> 7 0 16 2671 +> 7 0 16 2675 +> 7 0 16 2674 +> 7 0 16 2678 +> 7 0 16 2677 +> 7 0 16 2681 +> 7 0 16 2680 +> 7 0 16 2576 +> 7 0 16 2575 +> 7 0 16 2579 +> 7 0 16 2578 +> 7 0 16 2582 +> 7 0 16 2581 +> 7 0 16 2585 +> 7 0 16 2584 +> 7 0 16 2588 +> 7 0 16 2587 +> 7 0 16 2591 +> 7 0 16 2590 +> 7 0 16 2594 +> 7 0 16 2593 +> 7 0 16 2597 +> 7 0 16 2596 +> 7 0 16 2600 +> 7 0 16 2599 +> 7 0 16 2603 +> 7 0 16 2602 +> 7 0 16 2606 +> 7 0 16 2605 +> 7 0 16 2609 +> 7 0 16 2608 +> 7 0 16 2612 +> 7 0 16 2611 +> 7 0 16 2615 +> 7 0 16 2614 +> 7 0 16 2618 +> 7 0 16 2617 +> 7 0 16 2621 +> 7 0 16 2620 +> 7 0 16 2624 +> 7 0 16 2623 +> 7 0 16 2627 +> 7 0 16 2626 +> 7 0 16 2630 +> 7 0 16 2629 +> 7 0 16 2633 +> 7 0 16 2632 +> 7 0 16 2636 +> 7 0 16 2635 +> 7 0 16 2639 +> 7 0 16 2638 +> 7 0 16 2642 +> 7 0 16 2641 +> 7 0 16 2645 +> 7 0 16 2644 +> 7 0 16 2648 +> 7 0 16 2647 +> 7 0 16 2651 +> 7 0 16 2650 +> 7 0 16 2654 +> 7 0 16 2653 +> 7 0 14 2655 +> 7 0 14 2658 +> 7 0 14 2661 +> 7 0 14 2664 +> 7 0 14 2667 +> 7 0 14 2670 +> 7 0 14 2673 +> 7 0 14 2676 +> 7 0 14 2679 +> 7 0 14 2574 +> 7 0 14 2577 +> 7 0 14 2580 +> 7 0 14 2583 +> 7 0 14 2586 +> 7 0 14 2589 +> 7 0 14 2592 +> 7 0 14 2595 +> 7 0 14 2598 +> 7 0 14 2601 +> 7 0 14 2604 +> 7 0 14 2607 +> 7 0 14 2610 +> 7 0 14 2613 +> 7 0 14 2616 +> 7 0 14 2619 +> 7 0 14 2622 +> 7 0 14 2625 +> 7 0 14 2628 +> 7 0 14 2631 +> 7 0 14 2634 +> 7 0 14 2637 +> 7 0 14 2640 +> 7 0 14 2643 +> 7 0 14 2646 +> 7 0 14 2649 +> 7 0 14 2652 +> 7 0 19 2682 +> 7 0 13 2573 +> 7 0 16 2794 +> 7 0 16 2687 +> 7 0 16 2686 +> 7 0 16 2690 +> 7 0 16 2689 +> 7 0 16 2693 +> 7 0 16 2692 +> 7 0 16 2696 +> 7 0 16 2695 +> 7 0 16 2699 +> 7 0 16 2698 +> 7 0 16 2702 +> 7 0 16 2701 +> 7 0 16 2705 +> 7 0 16 2704 +> 7 0 16 2708 +> 7 0 16 2707 +> 7 0 16 2711 +> 7 0 16 2710 +> 7 0 16 2714 +> 7 0 16 2713 +> 7 0 16 2717 +> 7 0 16 2716 +> 7 0 16 2720 +> 7 0 16 2719 +> 7 0 16 2723 +> 7 0 16 2722 +> 7 0 16 2726 +> 7 0 16 2725 +> 7 0 16 2729 +> 7 0 16 2728 +> 7 0 16 2732 +> 7 0 16 2731 +> 7 0 16 2735 +> 7 0 16 2734 +> 7 0 16 2738 +> 7 0 16 2737 +> 7 0 16 2741 +> 7 0 16 2740 +> 7 0 16 2744 +> 7 0 16 2743 +> 7 0 16 2747 +> 7 0 16 2746 +> 7 0 16 2750 +> 7 0 16 2749 +> 7 0 16 2753 +> 7 0 16 2752 +> 7 0 16 2756 +> 7 0 16 2755 +> 7 0 16 2759 +> 7 0 16 2758 +> 7 0 16 2762 +> 7 0 16 2761 +> 7 0 16 2765 +> 7 0 16 2764 +> 7 0 16 2768 +> 7 0 16 2767 +> 7 0 16 2771 +> 7 0 16 2770 +> 7 0 16 2774 +> 7 0 16 2773 +> 7 0 16 2777 +> 7 0 16 2776 +> 7 0 16 2780 +> 7 0 16 2779 +> 7 0 16 2783 +> 7 0 16 2782 +> 7 0 16 2786 +> 7 0 16 2785 +> 7 0 16 2789 +> 7 0 16 2788 +> 7 0 16 2792 +> 7 0 16 2791 +> 7 0 14 2685 +> 7 0 14 2688 +> 7 0 14 2691 +> 7 0 14 2694 +> 7 0 14 2697 +> 7 0 14 2700 +> 7 0 14 2703 +> 7 0 14 2706 +> 7 0 14 2709 +> 7 0 14 2712 +> 7 0 14 2715 +> 7 0 14 2718 +> 7 0 14 2721 +> 7 0 14 2724 +> 7 0 14 2727 +> 7 0 14 2730 +> 7 0 14 2733 +> 7 0 14 2736 +> 7 0 14 2739 +> 7 0 14 2742 +> 7 0 14 2745 +> 7 0 14 2748 +> 7 0 14 2751 +> 7 0 14 2754 +> 7 0 14 2757 +> 7 0 14 2760 +> 7 0 14 2763 +> 7 0 14 2766 +> 7 0 14 2769 +> 7 0 14 2772 +> 7 0 14 2775 +> 7 0 14 2778 +> 7 0 14 2781 +> 7 0 14 2784 +> 7 0 14 2787 +> 7 0 14 2790 +> 7 0 19 2793 +> 7 0 13 2684 +> 7 0 16 2905 +> 7 0 16 2798 +> 7 0 16 2797 +> 7 0 16 2801 +> 7 0 16 2800 +> 7 0 16 2804 +> 7 0 16 2803 +> 7 0 16 2807 +> 7 0 16 2806 +> 7 0 16 2810 +> 7 0 16 2809 +> 7 0 16 2813 +> 7 0 16 2812 +> 7 0 16 2816 +> 7 0 16 2815 +> 7 0 16 2819 +> 7 0 16 2818 +> 7 0 16 2822 +> 7 0 16 2821 +> 7 0 16 2825 +> 7 0 16 2824 +> 7 0 16 2828 +> 7 0 16 2827 +> 7 0 16 2831 +> 7 0 16 2830 +> 7 0 16 2834 +> 7 0 16 2833 +> 7 0 16 2837 +> 7 0 16 2836 +> 7 0 16 2840 +> 7 0 16 2839 +> 7 0 16 2843 +> 7 0 16 2842 +> 7 0 16 2846 +> 7 0 16 2845 +> 7 0 16 2849 +> 7 0 16 2848 +> 7 0 16 2852 +> 7 0 16 2851 +> 7 0 16 2855 +> 7 0 16 2854 +> 7 0 16 2858 +> 7 0 16 2857 +> 7 0 16 2861 +> 7 0 16 2860 +> 7 0 16 2864 +> 7 0 16 2863 +> 7 0 16 2867 +> 7 0 16 2866 +> 7 0 16 2870 +> 7 0 16 2869 +> 7 0 16 2873 +> 7 0 16 2872 +> 7 0 16 2876 +> 7 0 16 2875 +> 7 0 16 2879 +> 7 0 16 2878 +> 7 0 16 2882 +> 7 0 16 2881 +> 7 0 16 2885 +> 7 0 16 2884 +> 7 0 16 2888 +> 7 0 16 2887 +> 7 0 16 2891 +> 7 0 16 2890 +> 7 0 16 2894 +> 7 0 16 2893 +> 7 0 16 2897 +> 7 0 16 2896 +> 7 0 16 2900 +> 7 0 16 2899 +> 7 0 16 2903 +> 7 0 16 2902 +> 7 0 14 2796 +> 7 0 14 2799 +> 7 0 14 2802 +> 7 0 14 2805 +> 7 0 14 2808 +> 7 0 14 2811 +> 7 0 14 2814 +> 7 0 14 2817 +> 7 0 14 2820 +> 7 0 14 2823 +> 7 0 14 2826 +> 7 0 14 2829 +> 7 0 14 2832 +> 7 0 14 2835 +> 7 0 14 2838 +> 7 0 14 2841 +> 7 0 14 2844 +> 7 0 14 2847 +> 7 0 14 2850 +> 7 0 14 2853 +> 7 0 14 2856 +> 7 0 14 2859 +> 7 0 14 2862 +> 7 0 14 2865 +> 7 0 14 2868 +> 7 0 14 2871 +> 7 0 14 2874 +> 7 0 14 2877 +> 7 0 14 2880 +> 7 0 14 2883 +> 7 0 14 2886 +> 7 0 14 2889 +> 7 0 14 2892 +> 7 0 14 2895 +> 7 0 14 2898 +> 7 0 14 2901 +> 7 0 19 2904 +> 7 0 13 2795 +> 7 0 16 2980 +> 7 0 16 2909 +> 7 0 16 2908 +> 7 0 16 2912 +> 7 0 16 2911 +> 7 0 16 2915 +> 7 0 16 2914 +> 7 0 16 2918 +> 7 0 16 2917 +> 7 0 16 2921 +> 7 0 16 2920 +> 7 0 16 2924 +> 7 0 16 2923 +> 7 0 16 2927 +> 7 0 16 2926 +> 7 0 16 2930 +> 7 0 16 2929 +> 7 0 16 2933 +> 7 0 16 2932 +> 7 0 16 2936 +> 7 0 16 2935 +> 7 0 16 2939 +> 7 0 16 2938 +> 7 0 16 2942 +> 7 0 16 2941 +> 7 0 16 2945 +> 7 0 16 2944 +> 7 0 16 2948 +> 7 0 16 2947 +> 7 0 16 2951 +> 7 0 16 2950 +> 7 0 16 2954 +> 7 0 16 2953 +> 7 0 16 2957 +> 7 0 16 2956 +> 7 0 16 2960 +> 7 0 16 2959 +> 7 0 16 2963 +> 7 0 16 2962 +> 7 0 16 2966 +> 7 0 16 2965 +> 7 0 16 2969 +> 7 0 16 2968 +> 7 0 16 2972 +> 7 0 16 2971 +> 7 0 16 2975 +> 7 0 16 2974 +> 7 0 16 2978 +> 7 0 16 2977 +> 7 0 14 2907 +> 7 0 14 2910 +> 7 0 14 2913 +> 7 0 14 2916 +> 7 0 14 2919 +> 7 0 14 2922 +> 7 0 14 2925 +> 7 0 14 2928 +> 7 0 14 2931 +> 7 0 14 2934 +> 7 0 14 2937 +> 7 0 14 2940 +> 7 0 14 2943 +> 7 0 14 2946 +> 7 0 14 2949 +> 7 0 14 2952 +> 7 0 14 2955 +> 7 0 14 2958 +> 7 0 14 2961 +> 7 0 14 2964 +> 7 0 14 2967 +> 7 0 14 2970 +> 7 0 14 2973 +> 7 0 14 2976 +> 7 0 19 2979 +> 7 0 13 2906 +> 7 0 16 3091 +> 7 0 16 2984 +> 7 0 16 2983 +> 7 0 16 2987 +> 7 0 16 2986 +> 7 0 16 2990 +> 7 0 16 2989 +> 7 0 16 2993 +> 7 0 16 2992 +> 7 0 16 2996 +> 7 0 16 2995 +> 7 0 16 2999 +> 7 0 16 2998 +> 7 0 16 3002 +> 7 0 16 3001 +> 7 0 16 3005 +> 7 0 16 3004 +> 7 0 16 3008 +> 7 0 16 3007 +> 7 0 16 3011 +> 7 0 16 3010 +> 7 0 16 3014 +> 7 0 16 3013 +> 7 0 16 3017 +> 7 0 16 3016 +> 7 0 16 3020 +> 7 0 16 3019 +> 7 0 16 3023 +> 7 0 16 3022 +> 7 0 16 3026 +> 7 0 16 3025 +> 7 0 16 3029 +> 7 0 16 3028 +> 7 0 16 3032 +> 7 0 16 3031 +> 7 0 16 3035 +> 7 0 16 3034 +> 7 0 16 3038 +> 7 0 16 3037 +> 7 0 16 3041 +> 7 0 16 3040 +> 7 0 16 3044 +> 7 0 16 3043 +> 7 0 16 3047 +> 7 0 16 3046 +> 7 0 16 3050 +> 7 0 16 3049 +> 7 0 16 3053 +> 7 0 16 3052 +> 7 0 16 3056 +> 7 0 16 3055 +> 7 0 16 3059 +> 7 0 16 3058 +> 7 0 16 3062 +> 7 0 16 3061 +> 7 0 16 3065 +> 7 0 16 3064 +> 7 0 16 3068 +> 7 0 16 3067 +> 7 0 16 3071 +> 7 0 16 3070 +> 7 0 16 3074 +> 7 0 16 3073 +> 7 0 16 3077 +> 7 0 16 3076 +> 7 0 16 3080 +> 7 0 16 3079 +> 7 0 16 3083 +> 7 0 16 3082 +> 7 0 16 3086 +> 7 0 16 3085 +> 7 0 16 3089 +> 7 0 16 3088 +> 7 0 14 2982 +> 7 0 14 2985 +> 7 0 14 2988 +> 7 0 14 2991 +> 7 0 14 2994 +> 7 0 14 2997 +> 7 0 14 3000 +> 7 0 14 3003 +> 7 0 14 3006 +> 7 0 14 3009 +> 7 0 14 3012 +> 7 0 14 3015 +> 7 0 14 3018 +> 7 0 14 3021 +> 7 0 14 3024 +> 7 0 14 3027 +> 7 0 14 3030 +> 7 0 14 3033 +> 7 0 14 3036 +> 7 0 14 3039 +> 7 0 14 3042 +> 7 0 14 3045 +> 7 0 14 3048 +> 7 0 14 3051 +> 7 0 14 3054 +> 7 0 14 3057 +> 7 0 14 3060 +> 7 0 14 3063 +> 7 0 14 3066 +> 7 0 14 3069 +> 7 0 14 3072 +> 7 0 14 3075 +> 7 0 14 3078 +> 7 0 14 3081 +> 7 0 14 3084 +> 7 0 14 3087 +> 7 0 19 3090 +> 7 0 13 2981 +> 7 0 16 3202 +> 7 0 16 3095 +> 7 0 16 3094 +> 7 0 16 3098 +> 7 0 16 3097 +> 7 0 16 3101 +> 7 0 16 3100 +> 7 0 16 3104 +> 7 0 16 3103 +> 7 0 16 3107 +> 7 0 16 3106 +> 7 0 16 3110 +> 7 0 16 3109 +> 7 0 16 3113 +> 7 0 16 3112 +> 7 0 16 3116 +> 7 0 16 3115 +> 7 0 16 3119 +> 7 0 16 3118 +> 7 0 16 3122 +> 7 0 16 3121 +> 7 0 16 3125 +> 7 0 16 3124 +> 7 0 16 3128 +> 7 0 16 3127 +> 7 0 16 3131 +> 7 0 16 3130 +> 7 0 16 3134 +> 7 0 16 3133 +> 7 0 16 3137 +> 7 0 16 3136 +> 7 0 16 3140 +> 7 0 16 3139 +> 7 0 16 3143 +> 7 0 16 3142 +> 7 0 16 3146 +> 7 0 16 3145 +> 7 0 16 3149 +> 7 0 16 3148 +> 7 0 16 3152 +> 7 0 16 3151 +> 7 0 16 3155 +> 7 0 16 3154 +> 7 0 16 3158 +> 7 0 16 3157 +> 7 0 16 3161 +> 7 0 16 3160 +> 7 0 16 3164 +> 7 0 16 3163 +> 7 0 16 3167 +> 7 0 16 3166 +> 7 0 16 3170 +> 7 0 16 3169 +> 7 0 16 3173 +> 7 0 16 3172 +> 7 0 16 3176 +> 7 0 16 3175 +> 7 0 16 3179 +> 7 0 16 3178 +> 7 0 16 3182 +> 7 0 16 3181 +> 7 0 16 3185 +> 7 0 16 3184 +> 7 0 16 3188 +> 7 0 16 3187 +> 7 0 16 3191 +> 7 0 16 3190 +> 7 0 16 3194 +> 7 0 16 3193 +> 7 0 16 3197 +> 7 0 16 3196 +> 7 0 16 3200 +> 7 0 16 3199 +> 7 0 14 3093 +> 7 0 14 3096 +> 7 0 14 3099 +> 7 0 14 3102 +> 7 0 14 3105 +> 7 0 14 3108 +> 7 0 14 3111 +> 7 0 14 3114 +> 7 0 14 3117 +> 7 0 14 3120 +> 7 0 14 3123 +> 7 0 14 3126 +> 7 0 14 3129 +> 7 0 14 3132 +> 7 0 14 3135 +> 7 0 14 3138 +> 7 0 14 3141 +> 7 0 14 3144 +> 7 0 14 3147 +> 7 0 14 3150 +> 7 0 14 3153 +> 7 0 14 3156 +> 7 0 14 3159 +> 7 0 14 3162 +> 7 0 14 3165 +> 7 0 14 3168 +> 7 0 14 3171 +> 7 0 14 3174 +> 7 0 14 3177 +> 7 0 14 3180 +> 7 0 14 3183 +> 7 0 14 3186 +> 7 0 14 3189 +> 7 0 14 3192 +> 7 0 14 3195 +> 7 0 14 3198 +> 7 0 19 3201 +> 7 0 13 3092 +> 7 0 16 3271 +> 7 0 16 3206 +> 7 0 16 3205 +> 7 0 16 3209 +> 7 0 16 3208 +> 7 0 16 3212 +> 7 0 16 3211 +> 7 0 16 3215 +> 7 0 16 3214 +> 7 0 16 3218 +> 7 0 16 3217 +> 7 0 16 3221 +> 7 0 16 3220 +> 7 0 16 3224 +> 7 0 16 3223 +> 7 0 16 3227 +> 7 0 16 3226 +> 7 0 16 3230 +> 7 0 16 3229 +> 7 0 16 3233 +> 7 0 16 3232 +> 7 0 16 3236 +> 7 0 16 3235 +> 7 0 16 3239 +> 7 0 16 3238 +> 7 0 16 3242 +> 7 0 16 3241 +> 7 0 16 3245 +> 7 0 16 3244 +> 7 0 16 3248 +> 7 0 16 3247 +> 7 0 16 3251 +> 7 0 16 3250 +> 7 0 16 3254 +> 7 0 16 3253 +> 7 0 16 3257 +> 7 0 16 3256 +> 7 0 16 3260 +> 7 0 16 3259 +> 7 0 16 3263 +> 7 0 16 3262 +> 7 0 16 3266 +> 7 0 16 3265 +> 7 0 16 3269 +> 7 0 16 3268 +> 7 0 14 3204 +> 7 0 14 3207 +> 7 0 14 3210 +> 7 0 14 3213 +> 7 0 14 3216 +> 7 0 14 3219 +> 7 0 14 3222 +> 7 0 14 3225 +> 7 0 14 3228 +> 7 0 14 3231 +> 7 0 14 3234 +> 7 0 14 3237 +> 7 0 14 3240 +> 7 0 14 3243 +> 7 0 14 3246 +> 7 0 14 3249 +> 7 0 14 3252 +> 7 0 14 3255 +> 7 0 14 3258 +> 7 0 14 3261 +> 7 0 14 3264 +> 7 0 14 3267 +> 7 0 19 3270 +> 7 0 13 3203 +> 7 0 16 3292 +> 7 0 16 3275 +> 7 0 16 3274 +> 7 0 16 3278 +> 7 0 16 3277 +> 7 0 16 3281 +> 7 0 16 3280 +> 7 0 16 3284 +> 7 0 16 3283 +> 7 0 16 3287 +> 7 0 16 3286 +> 7 0 16 3290 +> 7 0 16 3289 +> 7 0 14 3273 +> 7 0 14 3276 +> 7 0 14 3279 +> 7 0 14 3282 +> 7 0 14 3285 +> 7 0 14 3288 +> 7 0 19 3291 +> 7 0 13 3272 +> 7 0 16 3313 +> 7 0 16 3296 +> 7 0 16 3295 +> 7 0 16 3299 +> 7 0 16 3298 +> 7 0 16 3302 +> 7 0 16 3301 +> 7 0 16 3305 +> 7 0 16 3304 +> 7 0 16 3308 +> 7 0 16 3307 +> 7 0 16 3311 +> 7 0 16 3310 +> 7 0 14 3294 +> 7 0 14 3297 +> 7 0 14 3300 +> 7 0 14 3303 +> 7 0 14 3306 +> 7 0 14 3309 +> 7 0 19 3312 +> 7 0 13 3293 +> 7 0 19 3315 +> 7 0 13 3314 +> 7 0 9 3316 +> 7 0 6 2350 +> 7 0 9 3410 +> 7 0 9 3348 +> 7 0 9 3347 +> 7 0 9 3351 +> 7 0 9 3350 +> 7 0 9 3354 +> 7 0 9 3353 +> 7 0 9 3357 +> 7 0 9 3356 +> 7 0 9 3360 +> 7 0 9 3359 +> 7 0 9 3363 +> 7 0 9 3362 +> 7 0 9 3366 +> 7 0 9 3365 +> 7 0 9 3369 +> 7 0 9 3368 +> 7 0 9 3372 +> 7 0 9 3371 +> 7 0 9 3375 +> 7 0 9 3374 +> 7 0 9 3321 +> 7 0 9 3320 +> 7 0 9 3378 +> 7 0 9 3377 +> 7 0 9 3381 +> 7 0 9 3380 +> 7 0 9 3384 +> 7 0 9 3383 +> 7 0 9 3387 +> 7 0 9 3386 +> 7 0 9 3390 +> 7 0 9 3389 +> 7 0 9 3393 +> 7 0 9 3392 +> 7 0 9 3396 +> 7 0 9 3395 +> 7 0 9 3399 +> 7 0 9 3398 +> 7 0 9 3402 +> 7 0 9 3401 +> 7 0 9 3405 +> 7 0 9 3404 +> 7 0 9 3324 +> 7 0 9 3323 +> 7 0 9 3408 +> 7 0 9 3407 +> 7 0 9 3327 +> 7 0 9 3326 +> 7 0 9 3330 +> 7 0 9 3329 +> 7 0 9 3333 +> 7 0 9 3332 +> 7 0 9 3336 +> 7 0 9 3335 +> 7 0 9 3339 +> 7 0 9 3338 +> 7 0 9 3342 +> 7 0 9 3341 +> 7 0 9 3345 +> 7 0 9 3344 +> 7 0 7 3319 +> 7 0 7 3346 +> 7 0 7 3349 +> 7 0 7 3352 +> 7 0 7 3355 +> 7 0 7 3358 +> 7 0 7 3361 +> 7 0 7 3364 +> 7 0 7 3367 +> 7 0 7 3370 +> 7 0 7 3373 +> 7 0 7 3322 +> 7 0 7 3376 +> 7 0 7 3379 +> 7 0 7 3382 +> 7 0 7 3385 +> 7 0 7 3388 +> 7 0 7 3391 +> 7 0 7 3394 +> 7 0 7 3397 +> 7 0 7 3400 +> 7 0 7 3403 +> 7 0 7 3325 +> 7 0 7 3406 +> 7 0 7 3328 +> 7 0 7 3331 +> 7 0 7 3334 +> 7 0 7 3337 +> 7 0 7 3340 +> 7 0 7 3343 +> 7 0 12 3409 +> 7 0 6 3318 +> 7 0 12 3413 +> 7 0 6 3412 +> 7 0 3 3317 +> 7 0 3 3414 +> 7 0 3 3411 +> 7 0 1 2349 +> 7 0 9 3610 +> 7 0 9 3446 +> 7 0 9 3445 +> 7 0 9 3449 +> 7 0 9 3448 +> 7 0 9 3452 +> 7 0 9 3451 +> 7 0 9 3455 +> 7 0 9 3454 +> 7 0 9 3458 +> 7 0 9 3457 +> 7 0 9 3461 +> 7 0 9 3460 +> 7 0 9 3464 +> 7 0 9 3463 +> 7 0 9 3467 +> 7 0 9 3466 +> 7 0 9 3470 +> 7 0 9 3469 +> 7 0 9 3473 +> 7 0 9 3472 +> 7 0 9 3419 +> 7 0 9 3418 +> 7 0 9 3476 +> 7 0 9 3475 +> 7 0 9 3479 +> 7 0 9 3478 +> 7 0 9 3482 +> 7 0 9 3481 +> 7 0 9 3485 +> 7 0 9 3484 +> 7 0 9 3488 +> 7 0 9 3487 +> 7 0 9 3491 +> 7 0 9 3490 +> 7 0 9 3494 +> 7 0 9 3493 +> 7 0 9 3497 +> 7 0 9 3496 +> 7 0 9 3500 +> 7 0 9 3499 +> 7 0 9 3503 +> 7 0 9 3502 +> 7 0 9 3422 +> 7 0 9 3421 +> 7 0 9 3506 +> 7 0 9 3505 +> 7 0 9 3509 +> 7 0 9 3508 +> 7 0 9 3512 +> 7 0 9 3511 +> 7 0 9 3515 +> 7 0 9 3514 +> 7 0 9 3518 +> 7 0 9 3517 +> 7 0 9 3521 +> 7 0 9 3520 +> 7 0 9 3524 +> 7 0 9 3523 +> 7 0 9 3527 +> 7 0 9 3526 +> 7 0 9 3530 +> 7 0 9 3529 +> 7 0 9 3533 +> 7 0 9 3532 +> 7 0 9 3425 +> 7 0 9 3424 +> 7 0 9 3536 +> 7 0 9 3535 +> 7 0 9 3539 +> 7 0 9 3538 +> 7 0 9 3542 +> 7 0 9 3541 +> 7 0 9 3545 +> 7 0 9 3544 +> 7 0 9 3548 +> 7 0 9 3547 +> 7 0 9 3551 +> 7 0 9 3550 +> 7 0 9 3554 +> 7 0 9 3553 +> 7 0 9 3557 +> 7 0 9 3556 +> 7 0 9 3560 +> 7 0 9 3559 +> 7 0 9 3563 +> 7 0 9 3562 +> 7 0 9 3428 +> 7 0 9 3427 +> 7 0 9 3566 +> 7 0 9 3565 +> 7 0 9 3569 +> 7 0 9 3568 +> 7 0 9 3572 +> 7 0 9 3571 +> 7 0 9 3575 +> 7 0 9 3574 +> 7 0 9 3578 +> 7 0 9 3577 +> 7 0 9 3581 +> 7 0 9 3580 +> 7 0 9 3584 +> 7 0 9 3583 +> 7 0 9 3587 +> 7 0 9 3586 +> 7 0 9 3590 +> 7 0 9 3589 +> 7 0 9 3593 +> 7 0 9 3592 +> 7 0 9 3431 +> 7 0 9 3430 +> 7 0 9 3596 +> 7 0 9 3595 +> 7 0 9 3599 +> 7 0 9 3598 +> 7 0 9 3602 +> 7 0 9 3601 +> 7 0 9 3605 +> 7 0 9 3604 +> 7 0 9 3608 +> 7 0 9 3607 +> 7 0 9 3434 +> 7 0 9 3433 +> 7 0 9 3437 +> 7 0 9 3436 +> 7 0 9 3440 +> 7 0 9 3439 +> 7 0 9 3443 +> 7 0 9 3442 +> 7 0 7 3417 +> 7 0 7 3444 +> 7 0 7 3447 +> 7 0 7 3450 +> 7 0 7 3453 +> 7 0 7 3456 +> 7 0 7 3459 +> 7 0 7 3462 +> 7 0 7 3465 +> 7 0 7 3468 +> 7 0 7 3471 +> 7 0 7 3420 +> 7 0 7 3474 +> 7 0 7 3477 +> 7 0 7 3480 +> 7 0 7 3483 +> 7 0 7 3486 +> 7 0 7 3489 +> 7 0 7 3492 +> 7 0 7 3495 +> 7 0 7 3498 +> 7 0 7 3501 +> 7 0 7 3423 +> 7 0 7 3504 +> 7 0 7 3507 +> 7 0 7 3510 +> 7 0 7 3513 +> 7 0 7 3516 +> 7 0 7 3519 +> 7 0 7 3522 +> 7 0 7 3525 +> 7 0 7 3528 +> 7 0 7 3531 +> 7 0 7 3426 +> 7 0 7 3534 +> 7 0 7 3537 +> 7 0 7 3540 +> 7 0 7 3543 +> 7 0 7 3546 +> 7 0 7 3549 +> 7 0 7 3552 +> 7 0 7 3555 +> 7 0 7 3558 +> 7 0 7 3561 +> 7 0 7 3429 +> 7 0 7 3564 +> 7 0 7 3567 +> 7 0 7 3570 +> 7 0 7 3573 +> 7 0 7 3576 +> 7 0 7 3579 +> 7 0 7 3582 +> 7 0 7 3585 +> 7 0 7 3588 +> 7 0 7 3591 +> 7 0 7 3432 +> 7 0 7 3594 +> 7 0 7 3597 +> 7 0 7 3600 +> 7 0 7 3603 +> 7 0 7 3606 +> 7 0 7 3435 +> 7 0 7 3438 +> 7 0 7 3441 +> 7 0 12 3609 +> 7 0 6 3416 +> 7 0 9 3713 +> 7 0 9 3642 +> 7 0 9 3641 +> 7 0 9 3645 +> 7 0 9 3644 +> 7 0 9 3648 +> 7 0 9 3647 +> 7 0 9 3651 +> 7 0 9 3650 +> 7 0 9 3654 +> 7 0 9 3653 +> 7 0 9 3657 +> 7 0 9 3656 +> 7 0 9 3660 +> 7 0 9 3659 +> 7 0 9 3663 +> 7 0 9 3662 +> 7 0 9 3666 +> 7 0 9 3665 +> 7 0 9 3669 +> 7 0 9 3668 +> 7 0 9 3615 +> 7 0 9 3614 +> 7 0 9 3672 +> 7 0 9 3671 +> 7 0 9 3675 +> 7 0 9 3674 +> 7 0 9 3678 +> 7 0 9 3677 +> 7 0 9 3681 +> 7 0 9 3680 +> 7 0 9 3684 +> 7 0 9 3683 +> 7 0 9 3687 +> 7 0 9 3686 +> 7 0 9 3690 +> 7 0 9 3689 +> 7 0 9 3693 +> 7 0 9 3692 +> 7 0 9 3696 +> 7 0 9 3695 +> 7 0 9 3699 +> 7 0 9 3698 +> 7 0 9 3618 +> 7 0 9 3617 +> 7 0 9 3702 +> 7 0 9 3701 +> 7 0 9 3705 +> 7 0 9 3704 +> 7 0 9 3708 +> 7 0 9 3707 +> 7 0 9 3711 +> 7 0 9 3710 +> 7 0 9 3621 +> 7 0 9 3620 +> 7 0 9 3624 +> 7 0 9 3623 +> 7 0 9 3627 +> 7 0 9 3626 +> 7 0 9 3630 +> 7 0 9 3629 +> 7 0 9 3633 +> 7 0 9 3632 +> 7 0 9 3636 +> 7 0 9 3635 +> 7 0 9 3639 +> 7 0 9 3638 +> 7 0 7 3613 +> 7 0 7 3640 +> 7 0 7 3643 +> 7 0 7 3646 +> 7 0 7 3649 +> 7 0 7 3652 +> 7 0 7 3655 +> 7 0 7 3658 +> 7 0 7 3661 +> 7 0 7 3664 +> 7 0 7 3667 +> 7 0 7 3616 +> 7 0 7 3670 +> 7 0 7 3673 +> 7 0 7 3676 +> 7 0 7 3679 +> 7 0 7 3682 +> 7 0 7 3685 +> 7 0 7 3688 +> 7 0 7 3691 +> 7 0 7 3694 +> 7 0 7 3697 +> 7 0 7 3619 +> 7 0 7 3700 +> 7 0 7 3703 +> 7 0 7 3706 +> 7 0 7 3709 +> 7 0 7 3622 +> 7 0 7 3625 +> 7 0 7 3628 +> 7 0 7 3631 +> 7 0 7 3634 +> 7 0 7 3637 +> 7 0 12 3712 +> 7 0 6 3612 +> 7 0 9 3792 +> 7 0 9 3745 +> 7 0 9 3744 +> 7 0 9 3748 +> 7 0 9 3747 +> 7 0 9 3751 +> 7 0 9 3750 +> 7 0 9 3754 +> 7 0 9 3753 +> 7 0 9 3757 +> 7 0 9 3756 +> 7 0 9 3760 +> 7 0 9 3759 +> 7 0 9 3763 +> 7 0 9 3762 +> 7 0 9 3766 +> 7 0 9 3765 +> 7 0 9 3769 +> 7 0 9 3768 +> 7 0 9 3772 +> 7 0 9 3771 +> 7 0 9 3718 +> 7 0 9 3717 +> 7 0 9 3775 +> 7 0 9 3774 +> 7 0 9 3778 +> 7 0 9 3777 +> 7 0 9 3781 +> 7 0 9 3780 +> 7 0 9 3784 +> 7 0 9 3783 +> 7 0 9 3787 +> 7 0 9 3786 +> 7 0 9 3790 +> 7 0 9 3789 +> 7 0 9 3721 +> 7 0 9 3720 +> 7 0 9 3724 +> 7 0 9 3723 +> 7 0 9 3727 +> 7 0 9 3726 +> 7 0 9 3730 +> 7 0 9 3729 +> 7 0 9 3733 +> 7 0 9 3732 +> 7 0 9 3736 +> 7 0 9 3735 +> 7 0 9 3739 +> 7 0 9 3738 +> 7 0 9 3742 +> 7 0 9 3741 +> 7 0 7 3716 +> 7 0 7 3743 +> 7 0 7 3746 +> 7 0 7 3749 +> 7 0 7 3752 +> 7 0 7 3755 +> 7 0 7 3758 +> 7 0 7 3761 +> 7 0 7 3764 +> 7 0 7 3767 +> 7 0 7 3770 +> 7 0 7 3719 +> 7 0 7 3773 +> 7 0 7 3776 +> 7 0 7 3779 +> 7 0 7 3782 +> 7 0 7 3785 +> 7 0 7 3788 +> 7 0 7 3722 +> 7 0 7 3725 +> 7 0 7 3728 +> 7 0 7 3731 +> 7 0 7 3734 +> 7 0 7 3737 +> 7 0 7 3740 +> 7 0 12 3791 +> 7 0 6 3715 +> 7 0 9 3916 +> 7 0 9 3824 +> 7 0 9 3823 +> 7 0 9 3827 +> 7 0 9 3826 +> 7 0 9 3830 +> 7 0 9 3829 +> 7 0 9 3833 +> 7 0 9 3832 +> 7 0 9 3836 +> 7 0 9 3835 +> 7 0 9 3839 +> 7 0 9 3838 +> 7 0 9 3842 +> 7 0 9 3841 +> 7 0 9 3845 +> 7 0 9 3844 +> 7 0 9 3848 +> 7 0 9 3847 +> 7 0 9 3851 +> 7 0 9 3850 +> 7 0 9 3797 +> 7 0 9 3796 +> 7 0 9 3854 +> 7 0 9 3853 +> 7 0 9 3857 +> 7 0 9 3856 +> 7 0 9 3860 +> 7 0 9 3859 +> 7 0 9 3863 +> 7 0 9 3862 +> 7 0 9 3866 +> 7 0 9 3865 +> 7 0 9 3869 +> 7 0 9 3868 +> 7 0 9 3872 +> 7 0 9 3871 +> 7 0 9 3875 +> 7 0 9 3874 +> 7 0 9 3878 +> 7 0 9 3877 +> 7 0 9 3881 +> 7 0 9 3880 +> 7 0 9 3800 +> 7 0 9 3799 +> 7 0 9 3884 +> 7 0 9 3883 +> 7 0 9 3887 +> 7 0 9 3886 +> 7 0 9 3890 +> 7 0 9 3889 +> 7 0 9 3893 +> 7 0 9 3892 +> 7 0 9 3896 +> 7 0 9 3895 +> 7 0 9 3899 +> 7 0 9 3898 +> 7 0 9 3902 +> 7 0 9 3901 +> 7 0 9 3905 +> 7 0 9 3904 +> 7 0 9 3908 +> 7 0 9 3907 +> 7 0 9 3911 +> 7 0 9 3910 +> 7 0 9 3803 +> 7 0 9 3802 +> 7 0 9 3914 +> 7 0 9 3913 +> 7 0 9 3806 +> 7 0 9 3805 +> 7 0 9 3809 +> 7 0 9 3808 +> 7 0 9 3812 +> 7 0 9 3811 +> 7 0 9 3815 +> 7 0 9 3814 +> 7 0 9 3818 +> 7 0 9 3817 +> 7 0 9 3821 +> 7 0 9 3820 +> 7 0 7 3795 +> 7 0 7 3822 +> 7 0 7 3825 +> 7 0 7 3828 +> 7 0 7 3831 +> 7 0 7 3834 +> 7 0 7 3837 +> 7 0 7 3840 +> 7 0 7 3843 +> 7 0 7 3846 +> 7 0 7 3849 +> 7 0 7 3798 +> 7 0 7 3852 +> 7 0 7 3855 +> 7 0 7 3858 +> 7 0 7 3861 +> 7 0 7 3864 +> 7 0 7 3867 +> 7 0 7 3870 +> 7 0 7 3873 +> 7 0 7 3876 +> 7 0 7 3879 +> 7 0 7 3801 +> 7 0 7 3882 +> 7 0 7 3885 +> 7 0 7 3888 +> 7 0 7 3891 +> 7 0 7 3894 +> 7 0 7 3897 +> 7 0 7 3900 +> 7 0 7 3903 +> 7 0 7 3906 +> 7 0 7 3909 +> 7 0 7 3804 +> 7 0 7 3912 +> 7 0 7 3807 +> 7 0 7 3810 +> 7 0 7 3813 +> 7 0 7 3816 +> 7 0 7 3819 +> 7 0 12 3915 +> 7 0 6 3794 +> 7 0 12 3919 +> 7 0 6 3918 +> 7 0 3 3920 +> 7 0 3 3611 +> 7 0 3 3714 +> 7 0 3 3793 +> 7 0 3 3917 +> 7 0 1 3415 +> 7 0 9 4092 +> 7 0 9 3952 +> 7 0 9 3951 +> 7 0 9 3955 +> 7 0 9 3954 +> 7 0 9 3958 +> 7 0 9 3957 +> 7 0 9 3961 +> 7 0 9 3960 > 7 0 9 3964 -> 7 0 9 4048 -> 7 0 9 4000 -> 7 0 9 4084 -> 7 0 9 4036 -> 7 0 7 3989 -> 7 0 7 4049 -> 7 0 7 3971 -> 7 0 9 3990 -> 7 0 7 4031 -> 7 0 9 3934 -> 7 0 9 4050 +> 7 0 9 3963 +> 7 0 9 3967 +> 7 0 9 3966 +> 7 0 9 3970 +> 7 0 9 3969 +> 7 0 9 3973 > 7 0 9 3972 -> 7 0 9 4032 -> 7 0 7 3929 -> 7 0 9 3924 -> 7 0 9 3955 -> 7 0 9 3991 -> 7 0 9 3948 -> 7 0 9 4075 -> 7 0 9 4027 +> 7 0 9 3976 +> 7 0 9 3975 > 7 0 9 3979 -> 7 0 7 3956 -> 7 0 9 4063 -> 7 0 7 4016 -> 7 0 7 4076 -> 7 0 9 3957 -> 7 0 7 3998 +> 7 0 9 3978 > 7 0 9 3925 -> 7 0 9 4017 -> 7 0 7 4058 -> 7 0 9 4077 -> 7 0 9 3999 -> 7 0 9 4059 -> 7 0 9 3949 -> 7 0 7 3938 -> 7 0 9 3933 +> 7 0 9 3924 > 7 0 9 3982 -> 7 0 9 4018 -> 7 0 9 3970 -> 7 0 9 4054 -> 7 0 9 4006 -> 7 0 7 3983 -> 7 0 9 4090 -> 7 0 7 4043 -> 7 0 7 3965 +> 7 0 9 3981 +> 7 0 9 3985 > 7 0 9 3984 -> 7 0 7 4025 -> 7 0 9 4092 -> 7 0 9 4044 -> 7 0 7 4085 -> 7 0 9 3966 -> 7 0 7 4007 -> 7 0 9 4026 -> 7 0 7 4067 -> 7 0 9 3940 -> 7 0 9 4086 -> 7 0 9 4008 -> 7 0 7 3923 -> 7 0 9 4068 -> 7 0 7 3947 -> 7 0 9 3942 -> 7 0 9 3961 -> 7 0 9 4045 +> 7 0 9 3988 +> 7 0 9 3987 +> 7 0 9 3991 +> 7 0 9 3990 +> 7 0 9 3994 +> 7 0 9 3993 > 7 0 9 3997 -> 7 0 9 4081 -> 7 0 7 3950 -> 7 0 9 4033 -> 7 0 7 4010 -> 7 0 9 4069 -> 7 0 7 4070 -> 7 0 9 3951 -> 7 0 7 3992 +> 7 0 9 3996 +> 7 0 9 4000 +> 7 0 9 3999 +> 7 0 9 4003 +> 7 0 9 4002 +> 7 0 9 4006 +> 7 0 9 4005 +> 7 0 9 4009 +> 7 0 9 4008 +> 7 0 9 3928 +> 7 0 9 3927 +> 7 0 9 4012 > 7 0 9 4011 -> 7 0 7 4052 -> 7 0 7 3974 -> 7 0 9 4071 +> 7 0 9 4015 +> 7 0 9 4014 +> 7 0 9 4018 +> 7 0 9 4017 +> 7 0 9 4021 +> 7 0 9 4020 +> 7 0 9 4024 +> 7 0 9 4023 +> 7 0 9 4027 +> 7 0 9 4026 +> 7 0 9 4030 +> 7 0 9 4029 +> 7 0 9 4033 +> 7 0 9 4032 +> 7 0 9 4036 +> 7 0 9 4035 +> 7 0 9 4039 +> 7 0 9 4038 > 7 0 9 3931 -> 7 0 9 3993 -> 7 0 7 4034 +> 7 0 9 3930 +> 7 0 9 4042 +> 7 0 9 4041 +> 7 0 9 4045 +> 7 0 9 4044 +> 7 0 9 4048 +> 7 0 9 4047 +> 7 0 9 4051 +> 7 0 9 4050 +> 7 0 9 4054 > 7 0 9 4053 -> 7 0 9 3975 -> 7 0 9 4035 -> 7 0 7 3932 -> 7 0 9 3927 -> 7 0 9 3952 -> 7 0 9 3988 -> 7 0 9 4072 -> 7 0 9 4024 -> 7 0 9 3976 +> 7 0 9 4057 +> 7 0 9 4056 > 7 0 9 4060 -> 7 0 7 3959 -> 7 0 7 4019 -> 7 0 7 4079 -> 7 0 7 4001 -> 7 0 9 3960 -> 7 0 7 4061 -> 7 0 9 4020 -> 7 0 9 4080 -> 7 0 9 4002 +> 7 0 9 4059 +> 7 0 9 4063 > 7 0 9 4062 -> 7 0 9 3946 -> 7 0 7 3941 -> 7 0 9 3936 -> 7 0 9 4015 -> 7 0 9 3967 -> 7 0 9 4051 -> 7 0 9 4003 +> 7 0 9 4066 +> 7 0 9 4065 +> 7 0 9 4069 +> 7 0 9 4068 +> 7 0 9 3934 +> 7 0 9 3933 +> 7 0 9 4072 +> 7 0 9 4071 +> 7 0 9 4075 +> 7 0 9 4074 +> 7 0 9 4078 +> 7 0 9 4077 +> 7 0 9 4081 +> 7 0 9 4080 +> 7 0 9 4084 +> 7 0 9 4083 > 7 0 9 4087 -> 7 0 9 4039 -> 7 0 7 3986 -> 7 0 7 4046 -> 7 0 7 3968 -> 7 0 7 4028 -> 7 0 9 3987 -> 7 0 9 4047 -> 7 0 7 4088 -> 7 0 9 3969 -> 7 0 9 3937 -> 7 0 9 4029 +> 7 0 9 4086 +> 7 0 9 4090 > 7 0 9 4089 -> 7 0 7 3926 -> 7 0 12 4091 -> 7 0 9 3958 -> 7 0 9 4042 +> 7 0 9 3937 +> 7 0 9 3936 +> 7 0 9 3940 +> 7 0 9 3939 +> 7 0 9 3943 +> 7 0 9 3942 +> 7 0 9 3946 > 7 0 9 3945 -> 7 0 9 3994 -> 7 0 9 4078 -> 7 0 9 4030 +> 7 0 9 3949 +> 7 0 9 3948 +> 7 0 7 3923 +> 7 0 7 3950 > 7 0 7 3953 +> 7 0 7 3956 +> 7 0 7 3959 +> 7 0 7 3962 +> 7 0 7 3965 +> 7 0 7 3968 +> 7 0 7 3971 +> 7 0 7 3974 +> 7 0 7 3977 +> 7 0 7 3926 +> 7 0 7 3980 +> 7 0 7 3983 +> 7 0 7 3986 +> 7 0 7 3989 +> 7 0 7 3992 +> 7 0 7 3995 +> 7 0 7 3998 +> 7 0 7 4001 +> 7 0 7 4004 +> 7 0 7 4007 +> 7 0 7 3929 +> 7 0 7 4010 > 7 0 7 4013 -> 7 0 9 4066 -> 7 0 7 4073 -> 7 0 7 3995 -> 7 0 9 3954 -> 7 0 7 4055 -> 7 0 9 4014 -> 7 0 7 3977 -> 7 0 9 3928 -> 7 0 9 4074 +> 7 0 7 4016 +> 7 0 7 4019 +> 7 0 7 4022 +> 7 0 7 4025 +> 7 0 7 4028 +> 7 0 7 4031 +> 7 0 7 4034 > 7 0 7 4037 -> 7 0 9 3996 -> 7 0 9 4056 -> 7 0 9 3978 -> 7 0 9 4038 -> 7 0 7 3935 -> 7 0 9 3930 -> 7 0 9 3985 -> 7 0 9 4021 -> 7 0 9 3973 -> 7 0 9 4057 -> 7 0 7 3980 -> 7 0 9 4009 +> 7 0 7 3932 > 7 0 7 4040 -> 7 0 7 3962 -> 7 0 7 4022 -> 7 0 9 3981 -> 7 0 9 4041 -> 7 0 7 4082 -> 7 0 7 4004 -> 7 0 9 3963 +> 7 0 7 4043 +> 7 0 7 4046 +> 7 0 7 4049 +> 7 0 7 4052 +> 7 0 7 4055 +> 7 0 7 4058 +> 7 0 7 4061 > 7 0 7 4064 -> 7 0 9 4023 -> 7 0 9 4083 -> 7 0 9 4005 -> 7 0 9 3943 -> 7 0 9 4065 +> 7 0 7 4067 +> 7 0 7 3935 +> 7 0 7 4070 +> 7 0 7 4073 +> 7 0 7 4076 +> 7 0 7 4079 +> 7 0 7 4082 +> 7 0 7 4085 +> 7 0 7 4088 +> 7 0 7 3938 +> 7 0 7 3941 > 7 0 7 3944 +> 7 0 7 3947 +> 7 0 12 4091 > 7 0 6 3922 -> 7 0 3 4247 -> 7 0 3 4389 -> 7 0 3 4386 -> 7 0 12 4388 -> 7 0 6 4387 -> 7 0 7 4273 -> 7 0 9 4281 -> 7 0 9 4265 -> 7 0 9 4341 -> 7 0 9 4317 -> 7 0 9 4293 -> 7 0 9 4377 -> 7 0 9 4353 -> 7 0 9 4329 -> 7 0 7 4279 -> 7 0 9 4305 -> 7 0 7 4309 -> 7 0 7 4339 -> 7 0 9 4365 -> 7 0 7 4369 -> 7 0 9 4277 -> 7 0 7 4291 -> 7 0 9 4307 -> 7 0 7 4321 -> 7 0 9 4337 -> 7 0 7 4351 -> 7 0 9 4367 -> 7 0 7 4381 -> 7 0 9 4254 -> 7 0 9 4289 -> 7 0 7 4303 -> 7 0 9 4319 -> 7 0 7 4333 -> 7 0 9 4349 -> 7 0 7 4363 -> 7 0 9 4379 -> 7 0 9 4266 -> 7 0 9 4301 -> 7 0 9 4331 -> 7 0 9 4361 -> 7 0 7 4258 -> 7 0 9 4250 -> 7 0 7 4270 -> 7 0 9 4262 -> 7 0 9 4308 -> 7 0 9 4284 -> 7 0 9 4368 -> 7 0 9 4344 -> 7 0 9 4274 -> 7 0 9 4320 -> 7 0 9 4296 -> 7 0 9 4380 -> 7 0 7 4276 -> 7 0 9 4356 -> 7 0 7 4306 -> 7 0 9 4332 -> 7 0 7 4336 -> 7 0 7 4366 -> 7 0 7 4288 -> 7 0 7 4318 -> 7 0 7 4348 -> 7 0 7 4378 -> 7 0 9 4286 -> 7 0 7 4300 -> 7 0 9 4385 -> 7 0 9 4316 -> 7 0 7 4330 -> 7 0 9 4257 -> 7 0 9 4346 -> 7 0 7 4360 -> 7 0 9 4376 -> 7 0 9 4298 -> 7 0 9 4328 -> 7 0 9 4269 -> 7 0 9 4358 -> 7 0 7 4255 -> 7 0 7 4267 -> 7 0 12 4384 -> 7 0 9 4259 -> 7 0 9 4311 -> 7 0 9 4287 -> 7 0 9 4271 -> 7 0 9 4371 -> 7 0 9 4347 -> 7 0 9 4323 -> 7 0 9 4299 -> 7 0 9 4383 -> 7 0 9 4359 -> 7 0 9 4335 -> 7 0 7 4285 -> 7 0 7 4315 -> 7 0 7 4345 -> 7 0 7 4375 -> 7 0 9 4283 -> 7 0 7 4297 -> 7 0 9 4313 -> 7 0 7 4327 -> 7 0 9 4343 -> 7 0 7 4357 -> 7 0 9 4373 -> 7 0 9 4260 -> 7 0 9 4295 -> 7 0 9 4325 -> 7 0 9 4355 -> 7 0 9 4272 -> 7 0 7 4252 -> 7 0 7 4264 -> 7 0 9 4256 -> 7 0 9 4278 -> 7 0 9 4338 -> 7 0 9 4268 -> 7 0 9 4314 -> 7 0 9 4290 -> 7 0 9 4374 -> 7 0 9 4350 -> 7 0 9 4326 -> 7 0 9 4302 -> 7 0 7 4282 -> 7 0 9 4362 -> 7 0 7 4312 -> 7 0 7 4342 -> 7 0 7 4372 -> 7 0 9 4280 -> 7 0 7 4294 -> 7 0 9 4310 -> 7 0 7 4324 -> 7 0 9 4251 -> 7 0 9 4340 -> 7 0 7 4354 -> 7 0 9 4370 -> 7 0 9 4292 -> 7 0 9 4322 -> 7 0 9 4263 -> 7 0 9 4352 -> 7 0 9 4382 -> 7 0 9 4304 -> 7 0 9 4334 -> 7 0 7 4249 -> 7 0 9 4275 -> 7 0 9 4364 -> 7 0 7 4261 -> 7 0 9 4253 -> 7 0 6 4248 -> 7 0 9 4177 -> 7 0 9 4207 -> 7 0 7 4095 -> 7 0 9 4121 -> 7 0 9 4237 -> 7 0 7 4107 -> 7 0 9 4105 -> 7 0 7 4119 +> 7 0 9 4246 > 7 0 9 4124 -> 7 0 9 4184 -> 7 0 9 4160 -> 7 0 9 4117 -> 7 0 9 4136 -> 7 0 9 4244 -> 7 0 9 4220 -> 7 0 9 4196 -> 7 0 9 4172 -> 7 0 9 4148 -> 7 0 9 4232 -> 7 0 7 4128 -> 7 0 9 4208 -> 7 0 7 4158 -> 7 0 7 4188 -> 7 0 7 4218 -> 7 0 7 4140 -> 7 0 7 4170 -> 7 0 9 4132 -> 7 0 7 4200 -> 7 0 9 4100 -> 7 0 9 4162 -> 7 0 7 4230 -> 7 0 9 4192 -> 7 0 9 4222 -> 7 0 9 4144 -> 7 0 9 4112 -> 7 0 9 4174 -> 7 0 9 4204 -> 7 0 9 4234 -> 7 0 7 4104 -> 7 0 9 4102 -> 7 0 7 4116 +> 7 0 9 4123 > 7 0 9 4127 -> 7 0 9 4114 -> 7 0 9 4187 -> 7 0 9 4163 +> 7 0 9 4126 +> 7 0 9 4130 +> 7 0 9 4129 +> 7 0 9 4133 +> 7 0 9 4132 +> 7 0 9 4136 +> 7 0 9 4135 > 7 0 9 4139 -> 7 0 9 4223 -> 7 0 9 4199 -> 7 0 9 4175 -> 7 0 7 4125 +> 7 0 9 4138 +> 7 0 9 4142 +> 7 0 9 4141 +> 7 0 9 4145 +> 7 0 9 4144 +> 7 0 9 4148 +> 7 0 9 4147 > 7 0 9 4151 -> 7 0 7 4155 -> 7 0 9 4235 -> 7 0 7 4185 -> 7 0 9 4211 -> 7 0 7 4215 -> 7 0 7 4137 -> 7 0 7 4167 -> 7 0 9 4129 -> 7 0 7 4197 +> 7 0 9 4150 +> 7 0 9 4097 +> 7 0 9 4096 +> 7 0 9 4154 +> 7 0 9 4153 +> 7 0 9 4157 +> 7 0 9 4156 +> 7 0 9 4160 > 7 0 9 4159 -> 7 0 7 4227 -> 7 0 7 4149 -> 7 0 9 4189 -> 7 0 9 4103 -> 7 0 7 4179 -> 7 0 9 4219 -> 7 0 9 4141 -> 7 0 7 4209 +> 7 0 9 4163 +> 7 0 9 4162 +> 7 0 9 4166 +> 7 0 9 4165 +> 7 0 9 4169 +> 7 0 9 4168 +> 7 0 9 4172 > 7 0 9 4171 -> 7 0 7 4239 -> 7 0 9 4201 -> 7 0 9 4115 -> 7 0 9 4231 -> 7 0 7 4101 +> 7 0 9 4175 +> 7 0 9 4174 +> 7 0 9 4178 +> 7 0 9 4177 +> 7 0 9 4181 +> 7 0 9 4180 +> 7 0 9 4100 > 7 0 9 4099 -> 7 0 7 4113 -> 7 0 9 4154 -> 7 0 9 4111 -> 7 0 9 4130 -> 7 0 9 4214 +> 7 0 9 4184 +> 7 0 9 4183 +> 7 0 9 4187 +> 7 0 9 4186 > 7 0 9 4190 -> 7 0 9 4166 -> 7 0 9 4142 -> 7 0 9 4226 -> 7 0 7 4122 +> 7 0 9 4189 +> 7 0 9 4193 +> 7 0 9 4192 +> 7 0 9 4196 +> 7 0 9 4195 +> 7 0 9 4199 +> 7 0 9 4198 > 7 0 9 4202 -> 7 0 12 4245 -> 7 0 7 4152 -> 7 0 9 4178 -> 7 0 7 4182 -> 7 0 7 4212 -> 7 0 9 4238 -> 7 0 7 4134 -> 7 0 7 4242 -> 7 0 7 4164 -> 7 0 9 4126 -> 7 0 7 4194 -> 7 0 9 4156 -> 7 0 7 4224 -> 7 0 7 4146 -> 7 0 9 4186 -> 7 0 9 4246 -> 7 0 7 4176 +> 7 0 9 4201 +> 7 0 9 4205 +> 7 0 9 4204 +> 7 0 9 4208 +> 7 0 9 4207 +> 7 0 9 4211 +> 7 0 9 4210 +> 7 0 9 4103 +> 7 0 9 4102 +> 7 0 9 4214 +> 7 0 9 4213 +> 7 0 9 4217 > 7 0 9 4216 -> 7 0 9 4138 -> 7 0 7 4206 -> 7 0 9 4106 -> 7 0 9 4168 -> 7 0 7 4236 -> 7 0 9 4198 +> 7 0 9 4220 +> 7 0 9 4219 +> 7 0 9 4223 +> 7 0 9 4222 +> 7 0 9 4226 +> 7 0 9 4225 +> 7 0 9 4229 > 7 0 9 4228 -> 7 0 9 4150 -> 7 0 9 4118 -> 7 0 9 4180 -> 7 0 9 4210 -> 7 0 7 4098 +> 7 0 9 4232 +> 7 0 9 4231 +> 7 0 9 4235 +> 7 0 9 4234 +> 7 0 9 4238 +> 7 0 9 4237 +> 7 0 9 4241 > 7 0 9 4240 -> 7 0 9 4096 -> 7 0 7 4110 +> 7 0 9 4106 +> 7 0 9 4105 +> 7 0 9 4244 +> 7 0 9 4243 +> 7 0 9 4109 > 7 0 9 4108 -> 7 0 9 4157 -> 7 0 9 4133 -> 7 0 9 4217 +> 7 0 9 4112 +> 7 0 9 4111 +> 7 0 9 4115 +> 7 0 9 4114 +> 7 0 9 4118 +> 7 0 9 4117 +> 7 0 9 4121 > 7 0 9 4120 -> 7 0 9 4193 -> 7 0 9 4169 -> 7 0 9 4145 -> 7 0 9 4229 -> 7 0 9 4205 -> 7 0 9 4181 +> 7 0 7 4095 +> 7 0 7 4122 +> 7 0 7 4125 +> 7 0 7 4128 > 7 0 7 4131 -> 7 0 7 4161 -> 7 0 9 4241 -> 7 0 9 4123 -> 7 0 7 4191 -> 7 0 9 4153 -> 7 0 7 4221 +> 7 0 7 4134 +> 7 0 7 4137 +> 7 0 7 4140 > 7 0 7 4143 -> 7 0 9 4183 -> 7 0 9 4097 +> 7 0 7 4146 +> 7 0 7 4149 +> 7 0 7 4098 +> 7 0 7 4152 +> 7 0 7 4155 +> 7 0 7 4158 +> 7 0 7 4161 +> 7 0 7 4164 +> 7 0 7 4167 +> 7 0 7 4170 > 7 0 7 4173 -> 7 0 9 4213 -> 7 0 9 4135 +> 7 0 7 4176 +> 7 0 7 4179 +> 7 0 7 4101 +> 7 0 7 4182 +> 7 0 7 4185 +> 7 0 7 4188 +> 7 0 7 4191 +> 7 0 7 4194 +> 7 0 7 4197 +> 7 0 7 4200 > 7 0 7 4203 -> 7 0 9 4243 -> 7 0 9 4165 +> 7 0 7 4206 +> 7 0 7 4209 +> 7 0 7 4104 +> 7 0 7 4212 +> 7 0 7 4215 +> 7 0 7 4218 +> 7 0 7 4221 +> 7 0 7 4224 +> 7 0 7 4227 +> 7 0 7 4230 > 7 0 7 4233 -> 7 0 9 4195 -> 7 0 9 4109 -> 7 0 9 4225 -> 7 0 9 4147 +> 7 0 7 4236 +> 7 0 7 4239 +> 7 0 7 4107 +> 7 0 7 4242 +> 7 0 7 4110 +> 7 0 7 4113 +> 7 0 7 4116 +> 7 0 7 4119 +> 7 0 12 4245 > 7 0 6 4094 +> 7 0 9 4385 +> 7 0 9 4278 +> 7 0 9 4277 +> 7 0 9 4281 +> 7 0 9 4280 +> 7 0 9 4284 +> 7 0 9 4283 +> 7 0 9 4287 +> 7 0 9 4286 +> 7 0 9 4290 +> 7 0 9 4289 +> 7 0 9 4293 +> 7 0 9 4292 +> 7 0 9 4296 +> 7 0 9 4295 +> 7 0 9 4299 +> 7 0 9 4298 +> 7 0 9 4302 +> 7 0 9 4301 +> 7 0 9 4305 +> 7 0 9 4304 +> 7 0 9 4251 +> 7 0 9 4250 +> 7 0 9 4308 +> 7 0 9 4307 +> 7 0 9 4311 +> 7 0 9 4310 +> 7 0 9 4314 +> 7 0 9 4313 +> 7 0 9 4317 +> 7 0 9 4316 +> 7 0 9 4320 +> 7 0 9 4319 +> 7 0 9 4323 +> 7 0 9 4322 +> 7 0 9 4326 +> 7 0 9 4325 +> 7 0 9 4329 +> 7 0 9 4328 +> 7 0 9 4332 +> 7 0 9 4331 +> 7 0 9 4335 +> 7 0 9 4334 +> 7 0 9 4254 +> 7 0 9 4253 +> 7 0 9 4338 +> 7 0 9 4337 +> 7 0 9 4341 +> 7 0 9 4340 +> 7 0 9 4344 +> 7 0 9 4343 +> 7 0 9 4347 +> 7 0 9 4346 +> 7 0 9 4350 +> 7 0 9 4349 +> 7 0 9 4353 +> 7 0 9 4352 +> 7 0 9 4356 +> 7 0 9 4355 +> 7 0 9 4359 +> 7 0 9 4358 +> 7 0 9 4362 +> 7 0 9 4361 +> 7 0 9 4365 +> 7 0 9 4364 +> 7 0 9 4257 +> 7 0 9 4256 +> 7 0 9 4368 +> 7 0 9 4367 +> 7 0 9 4371 +> 7 0 9 4370 +> 7 0 9 4374 +> 7 0 9 4373 +> 7 0 9 4377 +> 7 0 9 4376 +> 7 0 9 4380 +> 7 0 9 4379 +> 7 0 9 4383 +> 7 0 9 4382 +> 7 0 9 4260 +> 7 0 9 4259 +> 7 0 9 4263 +> 7 0 9 4262 +> 7 0 9 4266 +> 7 0 9 4265 +> 7 0 9 4269 +> 7 0 9 4268 +> 7 0 9 4272 +> 7 0 9 4271 +> 7 0 9 4275 +> 7 0 9 4274 +> 7 0 7 4249 +> 7 0 7 4276 +> 7 0 7 4279 +> 7 0 7 4282 +> 7 0 7 4285 +> 7 0 7 4288 +> 7 0 7 4291 +> 7 0 7 4294 +> 7 0 7 4297 +> 7 0 7 4300 +> 7 0 7 4303 +> 7 0 7 4252 +> 7 0 7 4306 +> 7 0 7 4309 +> 7 0 7 4312 +> 7 0 7 4315 +> 7 0 7 4318 +> 7 0 7 4321 +> 7 0 7 4324 +> 7 0 7 4327 +> 7 0 7 4330 +> 7 0 7 4333 +> 7 0 7 4255 +> 7 0 7 4336 +> 7 0 7 4339 +> 7 0 7 4342 +> 7 0 7 4345 +> 7 0 7 4348 +> 7 0 7 4351 +> 7 0 7 4354 +> 7 0 7 4357 +> 7 0 7 4360 +> 7 0 7 4363 +> 7 0 7 4258 +> 7 0 7 4366 +> 7 0 7 4369 +> 7 0 7 4372 +> 7 0 7 4375 +> 7 0 7 4378 +> 7 0 7 4381 +> 7 0 7 4261 +> 7 0 7 4264 +> 7 0 7 4267 +> 7 0 7 4270 +> 7 0 7 4273 +> 7 0 12 4384 +> 7 0 6 4248 +> 7 0 12 4388 +> 7 0 6 4387 +> 7 0 3 4389 +> 7 0 3 4093 +> 7 0 3 4247 +> 7 0 3 4386 > 7 0 1 3921 +> 7 0 9 4633 +> 7 0 9 4421 +> 7 0 9 4420 +> 7 0 9 4424 +> 7 0 9 4423 +> 7 0 9 4427 +> 7 0 9 4426 +> 7 0 9 4430 +> 7 0 9 4429 +> 7 0 9 4433 +> 7 0 9 4432 +> 7 0 9 4436 +> 7 0 9 4435 +> 7 0 9 4439 +> 7 0 9 4438 +> 7 0 9 4442 +> 7 0 9 4441 +> 7 0 9 4445 +> 7 0 9 4444 +> 7 0 9 4448 +> 7 0 9 4447 +> 7 0 9 4394 +> 7 0 9 4393 +> 7 0 9 4451 +> 7 0 9 4450 +> 7 0 9 4454 +> 7 0 9 4453 +> 7 0 9 4457 +> 7 0 9 4456 +> 7 0 9 4460 +> 7 0 9 4459 +> 7 0 9 4463 +> 7 0 9 4462 +> 7 0 9 4466 +> 7 0 9 4465 +> 7 0 9 4469 +> 7 0 9 4468 +> 7 0 9 4472 +> 7 0 9 4471 +> 7 0 9 4475 +> 7 0 9 4474 +> 7 0 9 4478 +> 7 0 9 4477 +> 7 0 9 4397 +> 7 0 9 4396 +> 7 0 9 4481 +> 7 0 9 4480 +> 7 0 9 4484 +> 7 0 9 4483 +> 7 0 9 4487 +> 7 0 9 4486 +> 7 0 9 4490 +> 7 0 9 4489 +> 7 0 9 4493 +> 7 0 9 4492 +> 7 0 9 4496 +> 7 0 9 4495 +> 7 0 9 4499 +> 7 0 9 4498 +> 7 0 9 4502 +> 7 0 9 4501 +> 7 0 9 4505 +> 7 0 9 4504 +> 7 0 9 4508 +> 7 0 9 4507 +> 7 0 9 4400 +> 7 0 9 4399 +> 7 0 9 4511 +> 7 0 9 4510 +> 7 0 9 4514 +> 7 0 9 4513 +> 7 0 9 4517 +> 7 0 9 4516 +> 7 0 9 4520 +> 7 0 9 4519 +> 7 0 9 4523 +> 7 0 9 4522 +> 7 0 9 4526 +> 7 0 9 4525 +> 7 0 9 4529 +> 7 0 9 4528 +> 7 0 9 4532 +> 7 0 9 4531 +> 7 0 9 4535 +> 7 0 9 4534 +> 7 0 9 4538 +> 7 0 9 4537 +> 7 0 9 4403 +> 7 0 9 4402 +> 7 0 9 4541 +> 7 0 9 4540 +> 7 0 9 4544 +> 7 0 9 4543 +> 7 0 9 4547 +> 7 0 9 4546 +> 7 0 9 4550 +> 7 0 9 4549 +> 7 0 9 4553 +> 7 0 9 4552 +> 7 0 9 4556 +> 7 0 9 4555 +> 7 0 9 4559 +> 7 0 9 4558 +> 7 0 9 4562 +> 7 0 9 4561 +> 7 0 9 4565 +> 7 0 9 4564 +> 7 0 9 4568 +> 7 0 9 4567 +> 7 0 9 4406 +> 7 0 9 4405 +> 7 0 9 4571 +> 7 0 9 4570 +> 7 0 9 4574 +> 7 0 9 4573 +> 7 0 9 4577 +> 7 0 9 4576 +> 7 0 9 4580 +> 7 0 9 4579 +> 7 0 9 4583 +> 7 0 9 4582 +> 7 0 9 4586 +> 7 0 9 4585 +> 7 0 9 4589 +> 7 0 9 4588 +> 7 0 9 4592 +> 7 0 9 4591 +> 7 0 9 4595 +> 7 0 9 4594 +> 7 0 9 4598 +> 7 0 9 4597 +> 7 0 9 4409 +> 7 0 9 4408 +> 7 0 9 4601 +> 7 0 9 4600 +> 7 0 9 4604 +> 7 0 9 4603 +> 7 0 9 4607 +> 7 0 9 4606 +> 7 0 9 4610 +> 7 0 9 4609 +> 7 0 9 4613 +> 7 0 9 4612 +> 7 0 9 4616 +> 7 0 9 4615 +> 7 0 9 4619 +> 7 0 9 4618 +> 7 0 9 4622 +> 7 0 9 4621 +> 7 0 9 4625 +> 7 0 9 4624 +> 7 0 9 4628 +> 7 0 9 4627 +> 7 0 9 4412 +> 7 0 9 4411 +> 7 0 9 4631 +> 7 0 9 4630 +> 7 0 9 4415 +> 7 0 9 4414 +> 7 0 9 4418 +> 7 0 9 4417 +> 7 0 7 4392 +> 7 0 7 4419 +> 7 0 7 4422 +> 7 0 7 4425 +> 7 0 7 4428 +> 7 0 7 4431 +> 7 0 7 4434 +> 7 0 7 4437 +> 7 0 7 4440 +> 7 0 7 4443 +> 7 0 7 4446 +> 7 0 7 4395 +> 7 0 7 4449 +> 7 0 7 4452 +> 7 0 7 4455 +> 7 0 7 4458 +> 7 0 7 4461 +> 7 0 7 4464 +> 7 0 7 4467 +> 7 0 7 4470 +> 7 0 7 4473 +> 7 0 7 4476 +> 7 0 7 4398 +> 7 0 7 4479 +> 7 0 7 4482 +> 7 0 7 4485 +> 7 0 7 4488 +> 7 0 7 4491 +> 7 0 7 4494 +> 7 0 7 4497 +> 7 0 7 4500 +> 7 0 7 4503 +> 7 0 7 4506 +> 7 0 7 4401 +> 7 0 7 4509 +> 7 0 7 4512 +> 7 0 7 4515 +> 7 0 7 4518 +> 7 0 7 4521 +> 7 0 7 4524 +> 7 0 7 4527 +> 7 0 7 4530 +> 7 0 7 4533 +> 7 0 7 4536 +> 7 0 7 4404 +> 7 0 7 4539 +> 7 0 7 4542 +> 7 0 7 4545 +> 7 0 7 4548 +> 7 0 7 4551 +> 7 0 7 4554 +> 7 0 7 4557 +> 7 0 7 4560 +> 7 0 7 4563 +> 7 0 7 4566 +> 7 0 7 4407 +> 7 0 7 4569 +> 7 0 7 4572 +> 7 0 7 4575 +> 7 0 7 4578 +> 7 0 7 4581 +> 7 0 7 4584 +> 7 0 7 4587 +> 7 0 7 4590 +> 7 0 7 4593 +> 7 0 7 4596 +> 7 0 7 4410 +> 7 0 7 4599 +> 7 0 7 4602 +> 7 0 7 4605 +> 7 0 7 4608 +> 7 0 7 4611 +> 7 0 7 4614 +> 7 0 7 4617 +> 7 0 7 4620 +> 7 0 7 4623 +> 7 0 7 4626 +> 7 0 7 4413 +> 7 0 7 4629 +> 7 0 7 4416 +> 7 0 12 4632 +> 7 0 6 4391 +> 7 0 9 4793 +> 7 0 9 4665 +> 7 0 9 4664 +> 7 0 9 4668 +> 7 0 9 4667 +> 7 0 9 4671 +> 7 0 9 4670 +> 7 0 9 4674 +> 7 0 9 4673 +> 7 0 9 4677 +> 7 0 9 4676 +> 7 0 9 4680 +> 7 0 9 4679 +> 7 0 9 4683 +> 7 0 9 4682 +> 7 0 9 4686 +> 7 0 9 4685 +> 7 0 9 4689 +> 7 0 9 4688 +> 7 0 9 4692 +> 7 0 9 4691 +> 7 0 9 4638 +> 7 0 9 4637 +> 7 0 9 4695 +> 7 0 9 4694 +> 7 0 9 4698 +> 7 0 9 4697 +> 7 0 9 4701 +> 7 0 9 4700 +> 7 0 9 4704 +> 7 0 9 4703 +> 7 0 9 4707 +> 7 0 9 4706 +> 7 0 9 4710 +> 7 0 9 4709 +> 7 0 9 4713 +> 7 0 9 4712 +> 7 0 9 4716 +> 7 0 9 4715 +> 7 0 9 4719 +> 7 0 9 4718 +> 7 0 9 4722 +> 7 0 9 4721 +> 7 0 9 4641 +> 7 0 9 4640 +> 7 0 9 4725 +> 7 0 9 4724 +> 7 0 9 4728 +> 7 0 9 4727 +> 7 0 9 4731 +> 7 0 9 4730 +> 7 0 9 4734 +> 7 0 9 4733 +> 7 0 9 4737 +> 7 0 9 4736 +> 7 0 9 4740 +> 7 0 9 4739 +> 7 0 9 4743 +> 7 0 9 4742 +> 7 0 9 4746 +> 7 0 9 4745 +> 7 0 9 4749 +> 7 0 9 4748 +> 7 0 9 4752 +> 7 0 9 4751 +> 7 0 9 4644 +> 7 0 9 4643 +> 7 0 9 4755 +> 7 0 9 4754 +> 7 0 9 4758 +> 7 0 9 4757 +> 7 0 9 4761 +> 7 0 9 4760 +> 7 0 9 4764 +> 7 0 9 4763 +> 7 0 9 4767 +> 7 0 9 4766 +> 7 0 9 4770 +> 7 0 9 4769 +> 7 0 9 4773 +> 7 0 9 4772 +> 7 0 9 4776 +> 7 0 9 4775 +> 7 0 9 4779 +> 7 0 9 4778 +> 7 0 9 4782 +> 7 0 9 4781 +> 7 0 9 4647 +> 7 0 9 4646 +> 7 0 9 4785 +> 7 0 9 4784 +> 7 0 9 4788 +> 7 0 9 4787 +> 7 0 9 4791 +> 7 0 9 4790 +> 7 0 9 4650 +> 7 0 9 4649 +> 7 0 9 4653 +> 7 0 9 4652 +> 7 0 9 4656 +> 7 0 9 4655 +> 7 0 9 4659 +> 7 0 9 4658 +> 7 0 9 4662 +> 7 0 9 4661 +> 7 0 7 4636 +> 7 0 7 4663 +> 7 0 7 4666 +> 7 0 7 4669 +> 7 0 7 4672 +> 7 0 7 4675 +> 7 0 7 4678 +> 7 0 7 4681 +> 7 0 7 4684 +> 7 0 7 4687 +> 7 0 7 4690 +> 7 0 7 4639 +> 7 0 7 4693 +> 7 0 7 4696 +> 7 0 7 4699 +> 7 0 7 4702 +> 7 0 7 4705 +> 7 0 7 4708 +> 7 0 7 4711 +> 7 0 7 4714 +> 7 0 7 4717 +> 7 0 7 4720 +> 7 0 7 4642 +> 7 0 7 4723 +> 7 0 7 4726 +> 7 0 7 4729 +> 7 0 7 4732 +> 7 0 7 4735 +> 7 0 7 4738 +> 7 0 7 4741 +> 7 0 7 4744 +> 7 0 7 4747 +> 7 0 7 4750 +> 7 0 7 4645 +> 7 0 7 4753 +> 7 0 7 4756 +> 7 0 7 4759 +> 7 0 7 4762 +> 7 0 7 4765 +> 7 0 7 4768 +> 7 0 7 4771 +> 7 0 7 4774 +> 7 0 7 4777 +> 7 0 7 4780 +> 7 0 7 4648 +> 7 0 7 4783 +> 7 0 7 4786 +> 7 0 7 4789 +> 7 0 7 4651 +> 7 0 7 4654 +> 7 0 7 4657 +> 7 0 7 4660 +> 7 0 12 4792 +> 7 0 6 4635 +> 7 0 12 4796 +> 7 0 6 4795 +> 7 0 3 4797 +> 7 0 3 4634 +> 7 0 3 4794 +> 7 0 1 4390 $ rm -f trace_platform.trace diff --git a/examples/msg/trace-process-migration/trace-process-migration.tesh b/examples/msg/trace-process-migration/trace-process-migration.tesh index fb4b0eda24..b80073f1f0 100644 --- a/examples/msg/trace-process-migration/trace-process-migration.tesh +++ b/examples/msg/trace-process-migration/trace-process-migration.tesh @@ -161,98 +161,98 @@ $ tail -n +3 procmig.trace > 4 12 0 11 11 0-LINK11-LINK11 > 4 13 0 1 11 0-HOST1-LINK11 > 4 14 0 11 1 0-LINK11-HOST1 -> 15 0 12 0 topology 19 0 -> 16 0 12 0 topology 20 0 -> 15 0 12 0 topology 15 1 -> 16 0 12 0 topology 9 1 -> 15 0 12 0 topology 27 2 -> 16 0 12 0 topology 18 2 -> 15 0 13 0 topology 5 3 -> 16 0 13 0 topology 24 3 +> 15 0 12 0 topology 12 0 +> 16 0 12 0 topology 16 0 +> 15 0 12 0 topology 9 1 +> 16 0 12 0 topology 16 1 +> 15 0 12 0 topology 16 2 +> 16 0 12 0 topology 14 2 +> 15 0 12 0 topology 21 3 +> 16 0 12 0 topology 19 3 > 15 0 12 0 topology 8 4 -> 16 0 12 0 topology 10 4 -> 15 0 12 0 topology 21 5 -> 16 0 12 0 topology 22 5 -> 15 0 13 0 topology 1 6 -> 16 0 13 0 topology 9 6 -> 15 0 12 0 topology 23 7 -> 16 0 12 0 topology 24 7 -> 15 0 13 0 topology 1 8 -> 16 0 13 0 topology 15 8 -> 15 0 13 0 topology 1 9 -> 16 0 13 0 topology 11 9 -> 15 0 12 0 topology 26 10 -> 16 0 12 0 topology 27 10 -> 15 0 13 0 topology 5 11 -> 16 0 13 0 topology 18 11 -> 15 0 14 0 topology 11 12 -> 16 0 14 0 topology 2 12 -> 15 0 12 0 topology 28 13 -> 16 0 12 0 topology 29 13 -> 15 0 12 0 topology 12 14 -> 16 0 12 0 topology 16 14 -> 15 0 12 0 topology 9 15 -> 16 0 12 0 topology 16 15 -> 15 0 12 0 topology 14 16 -> 16 0 12 0 topology 13 16 -> 15 0 12 0 topology 29 17 -> 16 0 12 0 topology 11 17 -> 15 0 13 0 topology 3 18 -> 16 0 13 0 topology 30 18 -> 15 0 12 0 topology 11 19 -> 16 0 12 0 topology 15 19 +> 16 0 12 0 topology 19 4 +> 15 0 12 0 topology 19 5 +> 16 0 12 0 topology 20 5 +> 15 0 12 0 topology 8 6 +> 16 0 12 0 topology 20 6 +> 15 0 12 0 topology 27 7 +> 16 0 12 0 topology 18 7 +> 15 0 13 0 topology 5 8 +> 16 0 13 0 topology 18 8 +> 15 0 13 0 topology 4 9 +> 16 0 13 0 topology 18 9 +> 15 0 13 0 topology 2 10 +> 16 0 13 0 topology 18 10 +> 15 0 12 0 topology 16 11 +> 16 0 12 0 topology 21 11 +> 15 0 12 0 topology 21 12 +> 16 0 12 0 topology 22 12 +> 15 0 12 0 topology 9 13 +> 16 0 12 0 topology 12 13 +> 15 0 12 0 topology 15 14 +> 16 0 12 0 topology 9 14 +> 15 0 13 0 topology 1 15 +> 16 0 13 0 topology 9 15 +> 15 0 12 0 topology 20 16 +> 16 0 12 0 topology 23 16 +> 15 0 12 0 topology 23 17 +> 16 0 12 0 topology 24 17 +> 15 0 13 0 topology 5 18 +> 16 0 13 0 topology 24 18 +> 15 0 13 0 topology 4 19 +> 16 0 13 0 topology 24 19 > 15 0 13 0 topology 2 20 > 16 0 13 0 topology 24 20 -> 15 0 14 0 topology 18 21 -> 16 0 14 0 topology 6 21 -> 15 0 14 0 topology 10 22 -> 16 0 14 0 topology 5 22 -> 15 0 12 0 topology 8 23 -> 16 0 12 0 topology 19 23 -> 15 0 12 0 topology 12 24 -> 16 0 12 0 topology 25 24 -> 15 0 13 0 topology 4 25 -> 16 0 13 0 topology 24 25 -> 15 0 12 0 topology 16 26 -> 16 0 12 0 topology 14 26 -> 15 0 14 0 topology 17 27 -> 16 0 14 0 topology 4 27 -> 15 0 12 0 topology 12 28 -> 16 0 12 0 topology 17 28 -> 15 0 12 0 topology 9 29 -> 16 0 12 0 topology 17 29 -> 15 0 12 0 topology 21 30 -> 16 0 12 0 topology 19 30 -> 15 0 12 0 topology 22 31 -> 16 0 12 0 topology 25 31 -> 15 0 14 0 topology 24 32 -> 16 0 14 0 topology 7 32 -> 15 0 13 0 topology 3 33 -> 16 0 13 0 topology 28 33 -> 15 0 12 0 topology 25 34 -> 16 0 12 0 topology 26 34 -> 15 0 12 0 topology 8 35 -> 16 0 12 0 topology 20 35 -> 15 0 14 0 topology 13 36 -> 16 0 14 0 topology 3 36 -> 15 0 13 0 topology 2 37 -> 16 0 13 0 topology 18 37 -> 15 0 12 0 topology 9 38 -> 16 0 12 0 topology 12 38 -> 15 0 12 0 topology 14 39 -> 16 0 12 0 topology 8 39 -> 15 0 12 0 topology 20 40 -> 16 0 12 0 topology 23 40 -> 15 0 13 0 topology 4 41 -> 16 0 13 0 topology 18 41 -> 15 0 12 0 topology 13 42 -> 16 0 12 0 topology 8 42 -> 15 0 12 0 topology 11 43 -> 16 0 12 0 topology 8 43 -> 15 0 12 0 topology 16 44 -> 16 0 12 0 topology 21 44 -> 15 0 12 0 topology 30 45 -> 16 0 12 0 topology 28 45 +> 15 0 12 0 topology 11 21 +> 16 0 12 0 topology 15 21 +> 15 0 13 0 topology 1 22 +> 16 0 13 0 topology 15 22 +> 15 0 12 0 topology 12 23 +> 16 0 12 0 topology 17 23 +> 15 0 12 0 topology 9 24 +> 16 0 12 0 topology 17 24 +> 15 0 12 0 topology 22 25 +> 16 0 12 0 topology 25 25 +> 15 0 12 0 topology 12 26 +> 16 0 12 0 topology 25 26 +> 15 0 12 0 topology 25 27 +> 16 0 12 0 topology 26 27 +> 15 0 12 0 topology 26 28 +> 16 0 12 0 topology 27 28 +> 15 0 12 0 topology 14 29 +> 16 0 12 0 topology 8 29 +> 15 0 12 0 topology 13 30 +> 16 0 12 0 topology 8 30 +> 15 0 12 0 topology 11 31 +> 16 0 12 0 topology 8 31 +> 15 0 12 0 topology 8 32 +> 16 0 12 0 topology 10 32 +> 15 0 12 0 topology 30 33 +> 16 0 12 0 topology 28 33 +> 15 0 13 0 topology 3 34 +> 16 0 13 0 topology 28 34 +> 15 0 12 0 topology 28 35 +> 16 0 12 0 topology 29 35 +> 15 0 13 0 topology 3 36 +> 16 0 13 0 topology 30 36 +> 15 0 12 0 topology 14 37 +> 16 0 12 0 topology 13 37 +> 15 0 12 0 topology 29 38 +> 16 0 12 0 topology 11 38 +> 15 0 13 0 topology 1 39 +> 16 0 13 0 topology 11 39 +> 15 0 14 0 topology 24 40 +> 16 0 14 0 topology 7 40 +> 15 0 14 0 topology 10 41 +> 16 0 14 0 topology 5 41 +> 15 0 14 0 topology 13 42 +> 16 0 14 0 topology 3 42 +> 15 0 14 0 topology 17 43 +> 16 0 14 0 topology 4 43 +> 15 0 14 0 topology 18 44 +> 16 0 14 0 topology 6 44 +> 15 0 14 0 topology 11 45 +> 16 0 14 0 topology 2 45 > 6 0 32 2 3 "emigrant-1" > 6 0 33 2 1 "policeman-2" > 12 0 3 32 5 @@ -361,37 +361,37 @@ $ tail -n +3 procmig.trace > 13 18.155073 3 41 > 16 18.155073 10 0 SR 41 p8 > 7 18.155073 2 41 -> 7 18.155073 1 6 -> 7 18.155073 1 3 -> 7 18.155073 11 28 -> 7 18.155073 11 29 -> 7 18.155073 11 23 -> 7 18.155073 11 30 -> 7 18.155073 11 24 -> 7 18.155073 11 18 -> 7 18.155073 1 1 +> 7 18.155073 11 16 +> 7 18.155073 11 14 > 7 18.155073 11 19 > 7 18.155073 11 20 +> 7 18.155073 11 18 > 7 18.155073 11 21 > 7 18.155073 11 22 -> 7 18.155073 11 25 -> 7 18.155073 11 26 -> 7 18.155073 11 31 -> 7 18.155073 11 27 -> 7 18.155073 11 16 -> 7 18.155073 11 14 > 7 18.155073 11 12 > 7 18.155073 11 9 > 7 18.155073 11 15 +> 7 18.155073 11 23 +> 7 18.155073 11 24 > 7 18.155073 11 17 +> 7 18.155073 11 25 +> 7 18.155073 11 26 +> 7 18.155073 11 27 > 7 18.155073 11 8 > 7 18.155073 11 10 +> 7 18.155073 11 28 +> 7 18.155073 11 29 > 7 18.155073 11 13 +> 7 18.155073 11 30 > 7 18.155073 11 11 -> 7 18.155073 1 5 -> 7 18.155073 1 2 > 7 18.155073 1 7 +> 7 18.155073 1 5 +> 7 18.155073 1 3 > 7 18.155073 1 4 +> 7 18.155073 1 6 +> 7 18.155073 1 2 +> 7 18.155073 1 1 +> 7 18.155073 11 31 $ $SG_TEST_EXENV ${bindir:=.}/trace-process-migration$EXEEXT --cfg=tracing:yes --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes --cfg=tracing/buffer:yes --cfg=tracing/filename:procmig.trace --cfg=tracing/msg/process:yes ${srcdir:=.}/small_platform.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes' @@ -615,100 +615,100 @@ $ tail -n +3 procmig.trace > 8 0 15 30 0.035083 > 8 0 14 31 498000000.000000 > 8 0 15 31 0.000015 -> 15 0 17 0 topology 19 0 -> 16 0 17 0 topology 20 0 -> 15 0 17 0 topology 15 1 -> 16 0 17 0 topology 9 1 -> 15 0 17 0 topology 27 2 -> 16 0 17 0 topology 18 2 -> 15 0 18 0 topology 5 3 -> 16 0 18 0 topology 24 3 +> 15 0 17 0 topology 12 0 +> 16 0 17 0 topology 16 0 +> 15 0 17 0 topology 9 1 +> 16 0 17 0 topology 16 1 +> 15 0 17 0 topology 16 2 +> 16 0 17 0 topology 14 2 +> 15 0 17 0 topology 21 3 +> 16 0 17 0 topology 19 3 > 15 0 17 0 topology 8 4 -> 16 0 17 0 topology 10 4 -> 15 0 17 0 topology 21 5 -> 16 0 17 0 topology 22 5 -> 15 0 18 0 topology 1 6 -> 16 0 18 0 topology 9 6 -> 15 0 17 0 topology 23 7 -> 16 0 17 0 topology 24 7 -> 15 0 18 0 topology 1 8 -> 16 0 18 0 topology 15 8 -> 15 0 18 0 topology 1 9 -> 16 0 18 0 topology 11 9 -> 15 0 17 0 topology 26 10 -> 16 0 17 0 topology 27 10 -> 15 0 18 0 topology 5 11 -> 16 0 18 0 topology 18 11 -> 15 0 19 0 topology 11 12 -> 16 0 19 0 topology 2 12 -> 15 0 17 0 topology 28 13 -> 16 0 17 0 topology 29 13 -> 15 0 17 0 topology 12 14 -> 16 0 17 0 topology 16 14 -> 15 0 17 0 topology 9 15 -> 16 0 17 0 topology 16 15 -> 15 0 17 0 topology 14 16 -> 16 0 17 0 topology 13 16 -> 15 0 17 0 topology 29 17 -> 16 0 17 0 topology 11 17 -> 15 0 18 0 topology 3 18 -> 16 0 18 0 topology 30 18 -> 15 0 17 0 topology 11 19 -> 16 0 17 0 topology 15 19 +> 16 0 17 0 topology 19 4 +> 15 0 17 0 topology 19 5 +> 16 0 17 0 topology 20 5 +> 15 0 17 0 topology 8 6 +> 16 0 17 0 topology 20 6 +> 15 0 17 0 topology 27 7 +> 16 0 17 0 topology 18 7 +> 15 0 18 0 topology 5 8 +> 16 0 18 0 topology 18 8 +> 15 0 18 0 topology 4 9 +> 16 0 18 0 topology 18 9 +> 15 0 18 0 topology 2 10 +> 16 0 18 0 topology 18 10 +> 15 0 17 0 topology 16 11 +> 16 0 17 0 topology 21 11 +> 15 0 17 0 topology 21 12 +> 16 0 17 0 topology 22 12 +> 15 0 17 0 topology 9 13 +> 16 0 17 0 topology 12 13 +> 15 0 17 0 topology 15 14 +> 16 0 17 0 topology 9 14 +> 15 0 18 0 topology 1 15 +> 16 0 18 0 topology 9 15 +> 15 0 17 0 topology 20 16 +> 16 0 17 0 topology 23 16 +> 15 0 17 0 topology 23 17 +> 16 0 17 0 topology 24 17 +> 15 0 18 0 topology 5 18 +> 16 0 18 0 topology 24 18 +> 15 0 18 0 topology 4 19 +> 16 0 18 0 topology 24 19 > 15 0 18 0 topology 2 20 > 16 0 18 0 topology 24 20 -> 15 0 19 0 topology 18 21 -> 16 0 19 0 topology 6 21 -> 15 0 19 0 topology 10 22 -> 16 0 19 0 topology 5 22 -> 15 0 17 0 topology 8 23 -> 16 0 17 0 topology 19 23 -> 15 0 17 0 topology 12 24 -> 16 0 17 0 topology 25 24 -> 15 0 18 0 topology 4 25 -> 16 0 18 0 topology 24 25 -> 15 0 17 0 topology 16 26 -> 16 0 17 0 topology 14 26 -> 15 0 19 0 topology 17 27 -> 16 0 19 0 topology 4 27 -> 15 0 17 0 topology 12 28 -> 16 0 17 0 topology 17 28 -> 15 0 17 0 topology 9 29 -> 16 0 17 0 topology 17 29 -> 15 0 17 0 topology 21 30 -> 16 0 17 0 topology 19 30 -> 15 0 17 0 topology 22 31 -> 16 0 17 0 topology 25 31 -> 15 0 19 0 topology 24 32 -> 16 0 19 0 topology 7 32 -> 15 0 18 0 topology 3 33 -> 16 0 18 0 topology 28 33 -> 15 0 17 0 topology 25 34 -> 16 0 17 0 topology 26 34 -> 15 0 17 0 topology 8 35 -> 16 0 17 0 topology 20 35 -> 15 0 19 0 topology 13 36 -> 16 0 19 0 topology 3 36 -> 15 0 18 0 topology 2 37 -> 16 0 18 0 topology 18 37 -> 15 0 17 0 topology 9 38 -> 16 0 17 0 topology 12 38 -> 15 0 17 0 topology 14 39 -> 16 0 17 0 topology 8 39 -> 15 0 17 0 topology 20 40 -> 16 0 17 0 topology 23 40 -> 15 0 18 0 topology 4 41 -> 16 0 18 0 topology 18 41 -> 15 0 17 0 topology 13 42 -> 16 0 17 0 topology 8 42 -> 15 0 17 0 topology 11 43 -> 16 0 17 0 topology 8 43 -> 15 0 17 0 topology 16 44 -> 16 0 17 0 topology 21 44 -> 15 0 17 0 topology 30 45 -> 16 0 17 0 topology 28 45 -> 1 20 13 bmigration_order "0.800026 0.545312 0.857926" -> 1 21 1 pmigration_order "0.800026 0.545312 0.857926" +> 15 0 17 0 topology 11 21 +> 16 0 17 0 topology 15 21 +> 15 0 18 0 topology 1 22 +> 16 0 18 0 topology 15 22 +> 15 0 17 0 topology 12 23 +> 16 0 17 0 topology 17 23 +> 15 0 17 0 topology 9 24 +> 16 0 17 0 topology 17 24 +> 15 0 17 0 topology 22 25 +> 16 0 17 0 topology 25 25 +> 15 0 17 0 topology 12 26 +> 16 0 17 0 topology 25 26 +> 15 0 17 0 topology 25 27 +> 16 0 17 0 topology 26 27 +> 15 0 17 0 topology 26 28 +> 16 0 17 0 topology 27 28 +> 15 0 17 0 topology 14 29 +> 16 0 17 0 topology 8 29 +> 15 0 17 0 topology 13 30 +> 16 0 17 0 topology 8 30 +> 15 0 17 0 topology 11 31 +> 16 0 17 0 topology 8 31 +> 15 0 17 0 topology 8 32 +> 16 0 17 0 topology 10 32 +> 15 0 17 0 topology 30 33 +> 16 0 17 0 topology 28 33 +> 15 0 18 0 topology 3 34 +> 16 0 18 0 topology 28 34 +> 15 0 17 0 topology 28 35 +> 16 0 17 0 topology 29 35 +> 15 0 18 0 topology 3 36 +> 16 0 18 0 topology 30 36 +> 15 0 17 0 topology 14 37 +> 16 0 17 0 topology 13 37 +> 15 0 17 0 topology 29 38 +> 16 0 17 0 topology 11 38 +> 15 0 18 0 topology 1 39 +> 16 0 18 0 topology 11 39 +> 15 0 19 0 topology 24 40 +> 16 0 19 0 topology 7 40 +> 15 0 19 0 topology 10 41 +> 16 0 19 0 topology 5 41 +> 15 0 19 0 topology 13 42 +> 16 0 19 0 topology 3 42 +> 15 0 19 0 topology 17 43 +> 16 0 19 0 topology 4 43 +> 15 0 19 0 topology 18 44 +> 16 0 19 0 topology 6 44 +> 15 0 19 0 topology 11 45 +> 16 0 19 0 topology 2 45 +> 1 20 1 pmigration_order "0.800026 0.545312 0.857926" +> 1 21 13 bmigration_order "0.800026 0.545312 0.857926" > 6 0 32 4 3 "emigrant-1" > 6 0 33 4 1 "policeman-2" > 12 0 5 32 7 @@ -964,37 +964,37 @@ $ tail -n +3 procmig.trace > 13 18.155073 5 41 > 16 18.155073 12 0 SR 41 p8 > 7 18.155073 4 41 -> 7 18.155073 1 6 -> 7 18.155073 1 3 -> 7 18.155073 13 28 -> 7 18.155073 13 29 -> 7 18.155073 13 23 -> 7 18.155073 13 30 -> 7 18.155073 13 24 -> 7 18.155073 13 18 -> 7 18.155073 1 1 +> 7 18.155073 13 16 +> 7 18.155073 13 14 > 7 18.155073 13 19 > 7 18.155073 13 20 +> 7 18.155073 13 18 > 7 18.155073 13 21 > 7 18.155073 13 22 -> 7 18.155073 13 25 -> 7 18.155073 13 26 -> 7 18.155073 13 31 -> 7 18.155073 13 27 -> 7 18.155073 13 16 -> 7 18.155073 13 14 > 7 18.155073 13 12 > 7 18.155073 13 9 > 7 18.155073 13 15 +> 7 18.155073 13 23 +> 7 18.155073 13 24 > 7 18.155073 13 17 +> 7 18.155073 13 25 +> 7 18.155073 13 26 +> 7 18.155073 13 27 > 7 18.155073 13 8 > 7 18.155073 13 10 +> 7 18.155073 13 28 +> 7 18.155073 13 29 > 7 18.155073 13 13 +> 7 18.155073 13 30 > 7 18.155073 13 11 -> 7 18.155073 1 5 -> 7 18.155073 1 2 > 7 18.155073 1 7 +> 7 18.155073 1 5 +> 7 18.155073 1 3 > 7 18.155073 1 4 +> 7 18.155073 1 6 +> 7 18.155073 1 2 +> 7 18.155073 1 1 +> 7 18.155073 13 31 $ $SG_TEST_EXENV ${bindir:=.}/trace-process-migration$EXEEXT --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes --cfg=tracing/buffer:no --cfg=tracing/filename:procmig.trace --cfg=tracing/msg/process:yes ${srcdir:=.}/small_platform.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to 'yes' @@ -1217,100 +1217,100 @@ $ tail -n +3 procmig.trace > 8 0 15 30 0.035083 > 8 0 14 31 498000000.000000 > 8 0 15 31 0.000015 -> 15 0 17 0 topology 19 0 -> 16 0 17 0 topology 20 0 -> 15 0 17 0 topology 15 1 -> 16 0 17 0 topology 9 1 -> 15 0 17 0 topology 27 2 -> 16 0 17 0 topology 18 2 -> 15 0 18 0 topology 5 3 -> 16 0 18 0 topology 24 3 +> 15 0 17 0 topology 12 0 +> 16 0 17 0 topology 16 0 +> 15 0 17 0 topology 9 1 +> 16 0 17 0 topology 16 1 +> 15 0 17 0 topology 16 2 +> 16 0 17 0 topology 14 2 +> 15 0 17 0 topology 21 3 +> 16 0 17 0 topology 19 3 > 15 0 17 0 topology 8 4 -> 16 0 17 0 topology 10 4 -> 15 0 17 0 topology 21 5 -> 16 0 17 0 topology 22 5 -> 15 0 18 0 topology 1 6 -> 16 0 18 0 topology 9 6 -> 15 0 17 0 topology 23 7 -> 16 0 17 0 topology 24 7 -> 15 0 18 0 topology 1 8 -> 16 0 18 0 topology 15 8 -> 15 0 18 0 topology 1 9 -> 16 0 18 0 topology 11 9 -> 15 0 17 0 topology 26 10 -> 16 0 17 0 topology 27 10 -> 15 0 18 0 topology 5 11 -> 16 0 18 0 topology 18 11 -> 15 0 19 0 topology 11 12 -> 16 0 19 0 topology 2 12 -> 15 0 17 0 topology 28 13 -> 16 0 17 0 topology 29 13 -> 15 0 17 0 topology 12 14 -> 16 0 17 0 topology 16 14 -> 15 0 17 0 topology 9 15 -> 16 0 17 0 topology 16 15 -> 15 0 17 0 topology 14 16 -> 16 0 17 0 topology 13 16 -> 15 0 17 0 topology 29 17 -> 16 0 17 0 topology 11 17 -> 15 0 18 0 topology 3 18 -> 16 0 18 0 topology 30 18 -> 15 0 17 0 topology 11 19 -> 16 0 17 0 topology 15 19 +> 16 0 17 0 topology 19 4 +> 15 0 17 0 topology 19 5 +> 16 0 17 0 topology 20 5 +> 15 0 17 0 topology 8 6 +> 16 0 17 0 topology 20 6 +> 15 0 17 0 topology 27 7 +> 16 0 17 0 topology 18 7 +> 15 0 18 0 topology 5 8 +> 16 0 18 0 topology 18 8 +> 15 0 18 0 topology 4 9 +> 16 0 18 0 topology 18 9 +> 15 0 18 0 topology 2 10 +> 16 0 18 0 topology 18 10 +> 15 0 17 0 topology 16 11 +> 16 0 17 0 topology 21 11 +> 15 0 17 0 topology 21 12 +> 16 0 17 0 topology 22 12 +> 15 0 17 0 topology 9 13 +> 16 0 17 0 topology 12 13 +> 15 0 17 0 topology 15 14 +> 16 0 17 0 topology 9 14 +> 15 0 18 0 topology 1 15 +> 16 0 18 0 topology 9 15 +> 15 0 17 0 topology 20 16 +> 16 0 17 0 topology 23 16 +> 15 0 17 0 topology 23 17 +> 16 0 17 0 topology 24 17 +> 15 0 18 0 topology 5 18 +> 16 0 18 0 topology 24 18 +> 15 0 18 0 topology 4 19 +> 16 0 18 0 topology 24 19 > 15 0 18 0 topology 2 20 > 16 0 18 0 topology 24 20 -> 15 0 19 0 topology 18 21 -> 16 0 19 0 topology 6 21 -> 15 0 19 0 topology 10 22 -> 16 0 19 0 topology 5 22 -> 15 0 17 0 topology 8 23 -> 16 0 17 0 topology 19 23 -> 15 0 17 0 topology 12 24 -> 16 0 17 0 topology 25 24 -> 15 0 18 0 topology 4 25 -> 16 0 18 0 topology 24 25 -> 15 0 17 0 topology 16 26 -> 16 0 17 0 topology 14 26 -> 15 0 19 0 topology 17 27 -> 16 0 19 0 topology 4 27 -> 15 0 17 0 topology 12 28 -> 16 0 17 0 topology 17 28 -> 15 0 17 0 topology 9 29 -> 16 0 17 0 topology 17 29 -> 15 0 17 0 topology 21 30 -> 16 0 17 0 topology 19 30 -> 15 0 17 0 topology 22 31 -> 16 0 17 0 topology 25 31 -> 15 0 19 0 topology 24 32 -> 16 0 19 0 topology 7 32 -> 15 0 18 0 topology 3 33 -> 16 0 18 0 topology 28 33 -> 15 0 17 0 topology 25 34 -> 16 0 17 0 topology 26 34 -> 15 0 17 0 topology 8 35 -> 16 0 17 0 topology 20 35 -> 15 0 19 0 topology 13 36 -> 16 0 19 0 topology 3 36 -> 15 0 18 0 topology 2 37 -> 16 0 18 0 topology 18 37 -> 15 0 17 0 topology 9 38 -> 16 0 17 0 topology 12 38 -> 15 0 17 0 topology 14 39 -> 16 0 17 0 topology 8 39 -> 15 0 17 0 topology 20 40 -> 16 0 17 0 topology 23 40 -> 15 0 18 0 topology 4 41 -> 16 0 18 0 topology 18 41 -> 15 0 17 0 topology 13 42 -> 16 0 17 0 topology 8 42 -> 15 0 17 0 topology 11 43 -> 16 0 17 0 topology 8 43 -> 15 0 17 0 topology 16 44 -> 16 0 17 0 topology 21 44 -> 15 0 17 0 topology 30 45 -> 16 0 17 0 topology 28 45 -> 1 20 13 bmigration_order "0.800026 0.545312 0.857926" -> 1 21 1 pmigration_order "0.800026 0.545312 0.857926" +> 15 0 17 0 topology 11 21 +> 16 0 17 0 topology 15 21 +> 15 0 18 0 topology 1 22 +> 16 0 18 0 topology 15 22 +> 15 0 17 0 topology 12 23 +> 16 0 17 0 topology 17 23 +> 15 0 17 0 topology 9 24 +> 16 0 17 0 topology 17 24 +> 15 0 17 0 topology 22 25 +> 16 0 17 0 topology 25 25 +> 15 0 17 0 topology 12 26 +> 16 0 17 0 topology 25 26 +> 15 0 17 0 topology 25 27 +> 16 0 17 0 topology 26 27 +> 15 0 17 0 topology 26 28 +> 16 0 17 0 topology 27 28 +> 15 0 17 0 topology 14 29 +> 16 0 17 0 topology 8 29 +> 15 0 17 0 topology 13 30 +> 16 0 17 0 topology 8 30 +> 15 0 17 0 topology 11 31 +> 16 0 17 0 topology 8 31 +> 15 0 17 0 topology 8 32 +> 16 0 17 0 topology 10 32 +> 15 0 17 0 topology 30 33 +> 16 0 17 0 topology 28 33 +> 15 0 18 0 topology 3 34 +> 16 0 18 0 topology 28 34 +> 15 0 17 0 topology 28 35 +> 16 0 17 0 topology 29 35 +> 15 0 18 0 topology 3 36 +> 16 0 18 0 topology 30 36 +> 15 0 17 0 topology 14 37 +> 16 0 17 0 topology 13 37 +> 15 0 17 0 topology 29 38 +> 16 0 17 0 topology 11 38 +> 15 0 18 0 topology 1 39 +> 16 0 18 0 topology 11 39 +> 15 0 19 0 topology 24 40 +> 16 0 19 0 topology 7 40 +> 15 0 19 0 topology 10 41 +> 16 0 19 0 topology 5 41 +> 15 0 19 0 topology 13 42 +> 16 0 19 0 topology 3 42 +> 15 0 19 0 topology 17 43 +> 16 0 19 0 topology 4 43 +> 15 0 19 0 topology 18 44 +> 16 0 19 0 topology 6 44 +> 15 0 19 0 topology 11 45 +> 16 0 19 0 topology 2 45 +> 1 20 1 pmigration_order "0.800026 0.545312 0.857926" +> 1 21 13 bmigration_order "0.800026 0.545312 0.857926" > 6 0 32 4 3 "emigrant-1" > 6 0 33 4 1 "policeman-2" > 12 0 5 32 7 @@ -1566,37 +1566,37 @@ $ tail -n +3 procmig.trace > 13 18.155073 5 41 > 16 18.155073 12 0 SR 41 p8 > 7 18.155073 4 41 -> 7 18.155073 1 6 -> 7 18.155073 1 3 -> 7 18.155073 13 28 -> 7 18.155073 13 29 -> 7 18.155073 13 23 -> 7 18.155073 13 30 -> 7 18.155073 13 24 -> 7 18.155073 13 18 -> 7 18.155073 1 1 +> 7 18.155073 13 16 +> 7 18.155073 13 14 > 7 18.155073 13 19 > 7 18.155073 13 20 +> 7 18.155073 13 18 > 7 18.155073 13 21 > 7 18.155073 13 22 -> 7 18.155073 13 25 -> 7 18.155073 13 26 -> 7 18.155073 13 31 -> 7 18.155073 13 27 -> 7 18.155073 13 16 -> 7 18.155073 13 14 > 7 18.155073 13 12 > 7 18.155073 13 9 > 7 18.155073 13 15 +> 7 18.155073 13 23 +> 7 18.155073 13 24 > 7 18.155073 13 17 +> 7 18.155073 13 25 +> 7 18.155073 13 26 +> 7 18.155073 13 27 > 7 18.155073 13 8 > 7 18.155073 13 10 +> 7 18.155073 13 28 +> 7 18.155073 13 29 > 7 18.155073 13 13 +> 7 18.155073 13 30 > 7 18.155073 13 11 -> 7 18.155073 1 5 -> 7 18.155073 1 2 > 7 18.155073 1 7 +> 7 18.155073 1 5 +> 7 18.155073 1 3 > 7 18.155073 1 4 +> 7 18.155073 1 6 +> 7 18.155073 1 2 +> 7 18.155073 1 1 +> 7 18.155073 13 31 $ $SG_TEST_EXENV ${bindir:=.}/trace-process-migration$EXEEXT --cfg=tracing:no ${srcdir:=.}/small_platform.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'no' @@ -1808,131 +1808,131 @@ $ tail -n +3 simgrid.trace > 8 0 5 30 0.035083 > 8 0 4 31 498000000.000000 > 8 0 5 31 0.000015 -> 15 0 6 0 topology 19 0 -> 16 0 6 0 topology 20 0 -> 15 0 6 0 topology 15 1 -> 16 0 6 0 topology 9 1 -> 15 0 6 0 topology 27 2 -> 16 0 6 0 topology 18 2 -> 15 0 7 0 topology 5 3 -> 16 0 7 0 topology 24 3 +> 15 0 6 0 topology 12 0 +> 16 0 6 0 topology 16 0 +> 15 0 6 0 topology 9 1 +> 16 0 6 0 topology 16 1 +> 15 0 6 0 topology 16 2 +> 16 0 6 0 topology 14 2 +> 15 0 6 0 topology 21 3 +> 16 0 6 0 topology 19 3 > 15 0 6 0 topology 8 4 -> 16 0 6 0 topology 10 4 -> 15 0 6 0 topology 21 5 -> 16 0 6 0 topology 22 5 -> 15 0 7 0 topology 1 6 -> 16 0 7 0 topology 9 6 -> 15 0 6 0 topology 23 7 -> 16 0 6 0 topology 24 7 -> 15 0 7 0 topology 1 8 -> 16 0 7 0 topology 15 8 -> 15 0 7 0 topology 1 9 -> 16 0 7 0 topology 11 9 -> 15 0 6 0 topology 26 10 -> 16 0 6 0 topology 27 10 -> 15 0 7 0 topology 5 11 -> 16 0 7 0 topology 18 11 -> 15 0 8 0 topology 11 12 -> 16 0 8 0 topology 2 12 -> 15 0 6 0 topology 28 13 -> 16 0 6 0 topology 29 13 -> 15 0 6 0 topology 12 14 -> 16 0 6 0 topology 16 14 -> 15 0 6 0 topology 9 15 -> 16 0 6 0 topology 16 15 -> 15 0 6 0 topology 14 16 -> 16 0 6 0 topology 13 16 -> 15 0 6 0 topology 29 17 -> 16 0 6 0 topology 11 17 -> 15 0 7 0 topology 3 18 -> 16 0 7 0 topology 30 18 -> 15 0 6 0 topology 11 19 -> 16 0 6 0 topology 15 19 +> 16 0 6 0 topology 19 4 +> 15 0 6 0 topology 19 5 +> 16 0 6 0 topology 20 5 +> 15 0 6 0 topology 8 6 +> 16 0 6 0 topology 20 6 +> 15 0 6 0 topology 27 7 +> 16 0 6 0 topology 18 7 +> 15 0 7 0 topology 5 8 +> 16 0 7 0 topology 18 8 +> 15 0 7 0 topology 4 9 +> 16 0 7 0 topology 18 9 +> 15 0 7 0 topology 2 10 +> 16 0 7 0 topology 18 10 +> 15 0 6 0 topology 16 11 +> 16 0 6 0 topology 21 11 +> 15 0 6 0 topology 21 12 +> 16 0 6 0 topology 22 12 +> 15 0 6 0 topology 9 13 +> 16 0 6 0 topology 12 13 +> 15 0 6 0 topology 15 14 +> 16 0 6 0 topology 9 14 +> 15 0 7 0 topology 1 15 +> 16 0 7 0 topology 9 15 +> 15 0 6 0 topology 20 16 +> 16 0 6 0 topology 23 16 +> 15 0 6 0 topology 23 17 +> 16 0 6 0 topology 24 17 +> 15 0 7 0 topology 5 18 +> 16 0 7 0 topology 24 18 +> 15 0 7 0 topology 4 19 +> 16 0 7 0 topology 24 19 > 15 0 7 0 topology 2 20 > 16 0 7 0 topology 24 20 -> 15 0 8 0 topology 18 21 -> 16 0 8 0 topology 6 21 -> 15 0 8 0 topology 10 22 -> 16 0 8 0 topology 5 22 -> 15 0 6 0 topology 8 23 -> 16 0 6 0 topology 19 23 -> 15 0 6 0 topology 12 24 -> 16 0 6 0 topology 25 24 -> 15 0 7 0 topology 4 25 -> 16 0 7 0 topology 24 25 -> 15 0 6 0 topology 16 26 -> 16 0 6 0 topology 14 26 -> 15 0 8 0 topology 17 27 -> 16 0 8 0 topology 4 27 -> 15 0 6 0 topology 12 28 -> 16 0 6 0 topology 17 28 -> 15 0 6 0 topology 9 29 -> 16 0 6 0 topology 17 29 -> 15 0 6 0 topology 21 30 -> 16 0 6 0 topology 19 30 -> 15 0 6 0 topology 22 31 -> 16 0 6 0 topology 25 31 -> 15 0 8 0 topology 24 32 -> 16 0 8 0 topology 7 32 -> 15 0 7 0 topology 3 33 -> 16 0 7 0 topology 28 33 -> 15 0 6 0 topology 25 34 -> 16 0 6 0 topology 26 34 -> 15 0 6 0 topology 8 35 -> 16 0 6 0 topology 20 35 -> 15 0 8 0 topology 13 36 -> 16 0 8 0 topology 3 36 -> 15 0 7 0 topology 2 37 -> 16 0 7 0 topology 18 37 -> 15 0 6 0 topology 9 38 -> 16 0 6 0 topology 12 38 -> 15 0 6 0 topology 14 39 -> 16 0 6 0 topology 8 39 -> 15 0 6 0 topology 20 40 -> 16 0 6 0 topology 23 40 -> 15 0 7 0 topology 4 41 -> 16 0 7 0 topology 18 41 -> 15 0 6 0 topology 13 42 -> 16 0 6 0 topology 8 42 -> 15 0 6 0 topology 11 43 -> 16 0 6 0 topology 8 43 -> 15 0 6 0 topology 16 44 -> 16 0 6 0 topology 21 44 -> 15 0 6 0 topology 30 45 -> 16 0 6 0 topology 28 45 -> 1 9 3 bmigration_order "0.800026 0.545312 0.857926" -> 1 10 1 pmigration_order "0.800026 0.545312 0.857926" -> 7 18.155073 1 6 -> 7 18.155073 1 3 -> 7 18.155073 3 28 -> 7 18.155073 3 29 -> 7 18.155073 3 23 -> 7 18.155073 3 30 -> 7 18.155073 3 24 -> 7 18.155073 3 18 -> 7 18.155073 1 1 +> 15 0 6 0 topology 11 21 +> 16 0 6 0 topology 15 21 +> 15 0 7 0 topology 1 22 +> 16 0 7 0 topology 15 22 +> 15 0 6 0 topology 12 23 +> 16 0 6 0 topology 17 23 +> 15 0 6 0 topology 9 24 +> 16 0 6 0 topology 17 24 +> 15 0 6 0 topology 22 25 +> 16 0 6 0 topology 25 25 +> 15 0 6 0 topology 12 26 +> 16 0 6 0 topology 25 26 +> 15 0 6 0 topology 25 27 +> 16 0 6 0 topology 26 27 +> 15 0 6 0 topology 26 28 +> 16 0 6 0 topology 27 28 +> 15 0 6 0 topology 14 29 +> 16 0 6 0 topology 8 29 +> 15 0 6 0 topology 13 30 +> 16 0 6 0 topology 8 30 +> 15 0 6 0 topology 11 31 +> 16 0 6 0 topology 8 31 +> 15 0 6 0 topology 8 32 +> 16 0 6 0 topology 10 32 +> 15 0 6 0 topology 30 33 +> 16 0 6 0 topology 28 33 +> 15 0 7 0 topology 3 34 +> 16 0 7 0 topology 28 34 +> 15 0 6 0 topology 28 35 +> 16 0 6 0 topology 29 35 +> 15 0 7 0 topology 3 36 +> 16 0 7 0 topology 30 36 +> 15 0 6 0 topology 14 37 +> 16 0 6 0 topology 13 37 +> 15 0 6 0 topology 29 38 +> 16 0 6 0 topology 11 38 +> 15 0 7 0 topology 1 39 +> 16 0 7 0 topology 11 39 +> 15 0 8 0 topology 24 40 +> 16 0 8 0 topology 7 40 +> 15 0 8 0 topology 10 41 +> 16 0 8 0 topology 5 41 +> 15 0 8 0 topology 13 42 +> 16 0 8 0 topology 3 42 +> 15 0 8 0 topology 17 43 +> 16 0 8 0 topology 4 43 +> 15 0 8 0 topology 18 44 +> 16 0 8 0 topology 6 44 +> 15 0 8 0 topology 11 45 +> 16 0 8 0 topology 2 45 +> 1 9 1 pmigration_order "0.800026 0.545312 0.857926" +> 1 10 3 bmigration_order "0.800026 0.545312 0.857926" +> 7 18.155073 3 16 +> 7 18.155073 3 14 > 7 18.155073 3 19 > 7 18.155073 3 20 +> 7 18.155073 3 18 > 7 18.155073 3 21 > 7 18.155073 3 22 -> 7 18.155073 3 25 -> 7 18.155073 3 26 -> 7 18.155073 3 31 -> 7 18.155073 3 27 -> 7 18.155073 3 16 -> 7 18.155073 3 14 > 7 18.155073 3 12 > 7 18.155073 3 9 > 7 18.155073 3 15 +> 7 18.155073 3 23 +> 7 18.155073 3 24 > 7 18.155073 3 17 +> 7 18.155073 3 25 +> 7 18.155073 3 26 +> 7 18.155073 3 27 > 7 18.155073 3 8 > 7 18.155073 3 10 +> 7 18.155073 3 28 +> 7 18.155073 3 29 > 7 18.155073 3 13 +> 7 18.155073 3 30 > 7 18.155073 3 11 -> 7 18.155073 1 5 -> 7 18.155073 1 2 > 7 18.155073 1 7 +> 7 18.155073 1 5 +> 7 18.155073 1 3 > 7 18.155073 1 4 +> 7 18.155073 1 6 +> 7 18.155073 1 2 +> 7 18.155073 1 1 +> 7 18.155073 3 31 $ $SG_TEST_EXENV ${bindir:=.}/trace-process-migration$EXEEXT --cfg=tracing:yes --cfg=tracing/uncategorized:yes ${srcdir:=.}/small_platform.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes' @@ -2143,98 +2143,98 @@ $ tail -n +3 simgrid.trace > 8 0 6 30 0.035083 > 8 0 5 31 498000000.000000 > 8 0 6 31 0.000015 -> 15 0 8 0 topology 19 0 -> 16 0 8 0 topology 20 0 -> 15 0 8 0 topology 15 1 -> 16 0 8 0 topology 9 1 -> 15 0 8 0 topology 27 2 -> 16 0 8 0 topology 18 2 -> 15 0 9 0 topology 5 3 -> 16 0 9 0 topology 24 3 +> 15 0 8 0 topology 12 0 +> 16 0 8 0 topology 16 0 +> 15 0 8 0 topology 9 1 +> 16 0 8 0 topology 16 1 +> 15 0 8 0 topology 16 2 +> 16 0 8 0 topology 14 2 +> 15 0 8 0 topology 21 3 +> 16 0 8 0 topology 19 3 > 15 0 8 0 topology 8 4 -> 16 0 8 0 topology 10 4 -> 15 0 8 0 topology 21 5 -> 16 0 8 0 topology 22 5 -> 15 0 9 0 topology 1 6 -> 16 0 9 0 topology 9 6 -> 15 0 8 0 topology 23 7 -> 16 0 8 0 topology 24 7 -> 15 0 9 0 topology 1 8 -> 16 0 9 0 topology 15 8 -> 15 0 9 0 topology 1 9 -> 16 0 9 0 topology 11 9 -> 15 0 8 0 topology 26 10 -> 16 0 8 0 topology 27 10 -> 15 0 9 0 topology 5 11 -> 16 0 9 0 topology 18 11 -> 15 0 10 0 topology 11 12 -> 16 0 10 0 topology 2 12 -> 15 0 8 0 topology 28 13 -> 16 0 8 0 topology 29 13 -> 15 0 8 0 topology 12 14 -> 16 0 8 0 topology 16 14 -> 15 0 8 0 topology 9 15 -> 16 0 8 0 topology 16 15 -> 15 0 8 0 topology 14 16 -> 16 0 8 0 topology 13 16 -> 15 0 8 0 topology 29 17 -> 16 0 8 0 topology 11 17 -> 15 0 9 0 topology 3 18 -> 16 0 9 0 topology 30 18 -> 15 0 8 0 topology 11 19 -> 16 0 8 0 topology 15 19 +> 16 0 8 0 topology 19 4 +> 15 0 8 0 topology 19 5 +> 16 0 8 0 topology 20 5 +> 15 0 8 0 topology 8 6 +> 16 0 8 0 topology 20 6 +> 15 0 8 0 topology 27 7 +> 16 0 8 0 topology 18 7 +> 15 0 9 0 topology 5 8 +> 16 0 9 0 topology 18 8 +> 15 0 9 0 topology 4 9 +> 16 0 9 0 topology 18 9 +> 15 0 9 0 topology 2 10 +> 16 0 9 0 topology 18 10 +> 15 0 8 0 topology 16 11 +> 16 0 8 0 topology 21 11 +> 15 0 8 0 topology 21 12 +> 16 0 8 0 topology 22 12 +> 15 0 8 0 topology 9 13 +> 16 0 8 0 topology 12 13 +> 15 0 8 0 topology 15 14 +> 16 0 8 0 topology 9 14 +> 15 0 9 0 topology 1 15 +> 16 0 9 0 topology 9 15 +> 15 0 8 0 topology 20 16 +> 16 0 8 0 topology 23 16 +> 15 0 8 0 topology 23 17 +> 16 0 8 0 topology 24 17 +> 15 0 9 0 topology 5 18 +> 16 0 9 0 topology 24 18 +> 15 0 9 0 topology 4 19 +> 16 0 9 0 topology 24 19 > 15 0 9 0 topology 2 20 > 16 0 9 0 topology 24 20 -> 15 0 10 0 topology 18 21 -> 16 0 10 0 topology 6 21 -> 15 0 10 0 topology 10 22 -> 16 0 10 0 topology 5 22 -> 15 0 8 0 topology 8 23 -> 16 0 8 0 topology 19 23 -> 15 0 8 0 topology 12 24 -> 16 0 8 0 topology 25 24 -> 15 0 9 0 topology 4 25 -> 16 0 9 0 topology 24 25 -> 15 0 8 0 topology 16 26 -> 16 0 8 0 topology 14 26 -> 15 0 10 0 topology 17 27 -> 16 0 10 0 topology 4 27 -> 15 0 8 0 topology 12 28 -> 16 0 8 0 topology 17 28 -> 15 0 8 0 topology 9 29 -> 16 0 8 0 topology 17 29 -> 15 0 8 0 topology 21 30 -> 16 0 8 0 topology 19 30 -> 15 0 8 0 topology 22 31 -> 16 0 8 0 topology 25 31 -> 15 0 10 0 topology 24 32 -> 16 0 10 0 topology 7 32 -> 15 0 9 0 topology 3 33 -> 16 0 9 0 topology 28 33 -> 15 0 8 0 topology 25 34 -> 16 0 8 0 topology 26 34 -> 15 0 8 0 topology 8 35 -> 16 0 8 0 topology 20 35 -> 15 0 10 0 topology 13 36 -> 16 0 10 0 topology 3 36 -> 15 0 9 0 topology 2 37 -> 16 0 9 0 topology 18 37 -> 15 0 8 0 topology 9 38 -> 16 0 8 0 topology 12 38 -> 15 0 8 0 topology 14 39 -> 16 0 8 0 topology 8 39 -> 15 0 8 0 topology 20 40 -> 16 0 8 0 topology 23 40 -> 15 0 9 0 topology 4 41 -> 16 0 9 0 topology 18 41 -> 15 0 8 0 topology 13 42 -> 16 0 8 0 topology 8 42 -> 15 0 8 0 topology 11 43 -> 16 0 8 0 topology 8 43 -> 15 0 8 0 topology 16 44 -> 16 0 8 0 topology 21 44 -> 15 0 8 0 topology 30 45 -> 16 0 8 0 topology 28 45 +> 15 0 8 0 topology 11 21 +> 16 0 8 0 topology 15 21 +> 15 0 9 0 topology 1 22 +> 16 0 9 0 topology 15 22 +> 15 0 8 0 topology 12 23 +> 16 0 8 0 topology 17 23 +> 15 0 8 0 topology 9 24 +> 16 0 8 0 topology 17 24 +> 15 0 8 0 topology 22 25 +> 16 0 8 0 topology 25 25 +> 15 0 8 0 topology 12 26 +> 16 0 8 0 topology 25 26 +> 15 0 8 0 topology 25 27 +> 16 0 8 0 topology 26 27 +> 15 0 8 0 topology 26 28 +> 16 0 8 0 topology 27 28 +> 15 0 8 0 topology 14 29 +> 16 0 8 0 topology 8 29 +> 15 0 8 0 topology 13 30 +> 16 0 8 0 topology 8 30 +> 15 0 8 0 topology 11 31 +> 16 0 8 0 topology 8 31 +> 15 0 8 0 topology 8 32 +> 16 0 8 0 topology 10 32 +> 15 0 8 0 topology 30 33 +> 16 0 8 0 topology 28 33 +> 15 0 9 0 topology 3 34 +> 16 0 9 0 topology 28 34 +> 15 0 8 0 topology 28 35 +> 16 0 8 0 topology 29 35 +> 15 0 9 0 topology 3 36 +> 16 0 9 0 topology 30 36 +> 15 0 8 0 topology 14 37 +> 16 0 8 0 topology 13 37 +> 15 0 8 0 topology 29 38 +> 16 0 8 0 topology 11 38 +> 15 0 9 0 topology 1 39 +> 16 0 9 0 topology 11 39 +> 15 0 10 0 topology 24 40 +> 16 0 10 0 topology 7 40 +> 15 0 10 0 topology 10 41 +> 16 0 10 0 topology 5 41 +> 15 0 10 0 topology 13 42 +> 16 0 10 0 topology 3 42 +> 15 0 10 0 topology 17 43 +> 16 0 10 0 topology 4 43 +> 15 0 10 0 topology 18 44 +> 16 0 10 0 topology 6 44 +> 15 0 10 0 topology 11 45 +> 16 0 10 0 topology 2 45 > 8 2.025708 7 15 0.000000 > 9 2.025708 7 15 7536438.095238 > 10 2.025708 7 15 7536438.095238 @@ -2382,37 +2382,37 @@ $ tail -n +3 simgrid.trace > 10 18.155073 7 9 466506.488095 > 9 18.155073 7 15 466506.488095 > 10 18.155073 7 15 466506.488095 -> 7 18.155073 1 6 -> 7 18.155073 1 3 -> 7 18.155073 4 28 -> 7 18.155073 4 29 -> 7 18.155073 4 23 -> 7 18.155073 4 30 -> 7 18.155073 4 24 -> 7 18.155073 4 18 -> 7 18.155073 1 1 +> 7 18.155073 4 16 +> 7 18.155073 4 14 > 7 18.155073 4 19 > 7 18.155073 4 20 +> 7 18.155073 4 18 > 7 18.155073 4 21 > 7 18.155073 4 22 -> 7 18.155073 4 25 -> 7 18.155073 4 26 -> 7 18.155073 4 31 -> 7 18.155073 4 27 -> 7 18.155073 4 16 -> 7 18.155073 4 14 > 7 18.155073 4 12 > 7 18.155073 4 9 > 7 18.155073 4 15 +> 7 18.155073 4 23 +> 7 18.155073 4 24 > 7 18.155073 4 17 +> 7 18.155073 4 25 +> 7 18.155073 4 26 +> 7 18.155073 4 27 > 7 18.155073 4 8 > 7 18.155073 4 10 +> 7 18.155073 4 28 +> 7 18.155073 4 29 > 7 18.155073 4 13 +> 7 18.155073 4 30 > 7 18.155073 4 11 -> 7 18.155073 1 5 -> 7 18.155073 1 2 > 7 18.155073 1 7 +> 7 18.155073 1 5 +> 7 18.155073 1 3 > 7 18.155073 1 4 +> 7 18.155073 1 6 +> 7 18.155073 1 2 +> 7 18.155073 1 1 +> 7 18.155073 4 31 $ $SG_TEST_EXENV ${bindir:=.}/trace-process-migration$EXEEXT --cfg=tracing:yes --cfg=tracing/msg/process:yes ${srcdir:=.}/small_platform.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes' @@ -2572,98 +2572,98 @@ $ tail -n +3 simgrid.trace > 4 12 0 11 11 0-LINK11-LINK11 > 4 13 0 1 11 0-HOST1-LINK11 > 4 14 0 11 1 0-LINK11-HOST1 -> 15 0 12 0 topology 19 0 -> 16 0 12 0 topology 20 0 -> 15 0 12 0 topology 15 1 -> 16 0 12 0 topology 9 1 -> 15 0 12 0 topology 27 2 -> 16 0 12 0 topology 18 2 -> 15 0 13 0 topology 5 3 -> 16 0 13 0 topology 24 3 +> 15 0 12 0 topology 12 0 +> 16 0 12 0 topology 16 0 +> 15 0 12 0 topology 9 1 +> 16 0 12 0 topology 16 1 +> 15 0 12 0 topology 16 2 +> 16 0 12 0 topology 14 2 +> 15 0 12 0 topology 21 3 +> 16 0 12 0 topology 19 3 > 15 0 12 0 topology 8 4 -> 16 0 12 0 topology 10 4 -> 15 0 12 0 topology 21 5 -> 16 0 12 0 topology 22 5 -> 15 0 13 0 topology 1 6 -> 16 0 13 0 topology 9 6 -> 15 0 12 0 topology 23 7 -> 16 0 12 0 topology 24 7 -> 15 0 13 0 topology 1 8 -> 16 0 13 0 topology 15 8 -> 15 0 13 0 topology 1 9 -> 16 0 13 0 topology 11 9 -> 15 0 12 0 topology 26 10 -> 16 0 12 0 topology 27 10 -> 15 0 13 0 topology 5 11 -> 16 0 13 0 topology 18 11 -> 15 0 14 0 topology 11 12 -> 16 0 14 0 topology 2 12 -> 15 0 12 0 topology 28 13 -> 16 0 12 0 topology 29 13 -> 15 0 12 0 topology 12 14 -> 16 0 12 0 topology 16 14 -> 15 0 12 0 topology 9 15 -> 16 0 12 0 topology 16 15 -> 15 0 12 0 topology 14 16 -> 16 0 12 0 topology 13 16 -> 15 0 12 0 topology 29 17 -> 16 0 12 0 topology 11 17 -> 15 0 13 0 topology 3 18 -> 16 0 13 0 topology 30 18 -> 15 0 12 0 topology 11 19 -> 16 0 12 0 topology 15 19 +> 16 0 12 0 topology 19 4 +> 15 0 12 0 topology 19 5 +> 16 0 12 0 topology 20 5 +> 15 0 12 0 topology 8 6 +> 16 0 12 0 topology 20 6 +> 15 0 12 0 topology 27 7 +> 16 0 12 0 topology 18 7 +> 15 0 13 0 topology 5 8 +> 16 0 13 0 topology 18 8 +> 15 0 13 0 topology 4 9 +> 16 0 13 0 topology 18 9 +> 15 0 13 0 topology 2 10 +> 16 0 13 0 topology 18 10 +> 15 0 12 0 topology 16 11 +> 16 0 12 0 topology 21 11 +> 15 0 12 0 topology 21 12 +> 16 0 12 0 topology 22 12 +> 15 0 12 0 topology 9 13 +> 16 0 12 0 topology 12 13 +> 15 0 12 0 topology 15 14 +> 16 0 12 0 topology 9 14 +> 15 0 13 0 topology 1 15 +> 16 0 13 0 topology 9 15 +> 15 0 12 0 topology 20 16 +> 16 0 12 0 topology 23 16 +> 15 0 12 0 topology 23 17 +> 16 0 12 0 topology 24 17 +> 15 0 13 0 topology 5 18 +> 16 0 13 0 topology 24 18 +> 15 0 13 0 topology 4 19 +> 16 0 13 0 topology 24 19 > 15 0 13 0 topology 2 20 > 16 0 13 0 topology 24 20 -> 15 0 14 0 topology 18 21 -> 16 0 14 0 topology 6 21 -> 15 0 14 0 topology 10 22 -> 16 0 14 0 topology 5 22 -> 15 0 12 0 topology 8 23 -> 16 0 12 0 topology 19 23 -> 15 0 12 0 topology 12 24 -> 16 0 12 0 topology 25 24 -> 15 0 13 0 topology 4 25 -> 16 0 13 0 topology 24 25 -> 15 0 12 0 topology 16 26 -> 16 0 12 0 topology 14 26 -> 15 0 14 0 topology 17 27 -> 16 0 14 0 topology 4 27 -> 15 0 12 0 topology 12 28 -> 16 0 12 0 topology 17 28 -> 15 0 12 0 topology 9 29 -> 16 0 12 0 topology 17 29 -> 15 0 12 0 topology 21 30 -> 16 0 12 0 topology 19 30 -> 15 0 12 0 topology 22 31 -> 16 0 12 0 topology 25 31 -> 15 0 14 0 topology 24 32 -> 16 0 14 0 topology 7 32 -> 15 0 13 0 topology 3 33 -> 16 0 13 0 topology 28 33 -> 15 0 12 0 topology 25 34 -> 16 0 12 0 topology 26 34 -> 15 0 12 0 topology 8 35 -> 16 0 12 0 topology 20 35 -> 15 0 14 0 topology 13 36 -> 16 0 14 0 topology 3 36 -> 15 0 13 0 topology 2 37 -> 16 0 13 0 topology 18 37 -> 15 0 12 0 topology 9 38 -> 16 0 12 0 topology 12 38 -> 15 0 12 0 topology 14 39 -> 16 0 12 0 topology 8 39 -> 15 0 12 0 topology 20 40 -> 16 0 12 0 topology 23 40 -> 15 0 13 0 topology 4 41 -> 16 0 13 0 topology 18 41 -> 15 0 12 0 topology 13 42 -> 16 0 12 0 topology 8 42 -> 15 0 12 0 topology 11 43 -> 16 0 12 0 topology 8 43 -> 15 0 12 0 topology 16 44 -> 16 0 12 0 topology 21 44 -> 15 0 12 0 topology 30 45 -> 16 0 12 0 topology 28 45 +> 15 0 12 0 topology 11 21 +> 16 0 12 0 topology 15 21 +> 15 0 13 0 topology 1 22 +> 16 0 13 0 topology 15 22 +> 15 0 12 0 topology 12 23 +> 16 0 12 0 topology 17 23 +> 15 0 12 0 topology 9 24 +> 16 0 12 0 topology 17 24 +> 15 0 12 0 topology 22 25 +> 16 0 12 0 topology 25 25 +> 15 0 12 0 topology 12 26 +> 16 0 12 0 topology 25 26 +> 15 0 12 0 topology 25 27 +> 16 0 12 0 topology 26 27 +> 15 0 12 0 topology 26 28 +> 16 0 12 0 topology 27 28 +> 15 0 12 0 topology 14 29 +> 16 0 12 0 topology 8 29 +> 15 0 12 0 topology 13 30 +> 16 0 12 0 topology 8 30 +> 15 0 12 0 topology 11 31 +> 16 0 12 0 topology 8 31 +> 15 0 12 0 topology 8 32 +> 16 0 12 0 topology 10 32 +> 15 0 12 0 topology 30 33 +> 16 0 12 0 topology 28 33 +> 15 0 13 0 topology 3 34 +> 16 0 13 0 topology 28 34 +> 15 0 12 0 topology 28 35 +> 16 0 12 0 topology 29 35 +> 15 0 13 0 topology 3 36 +> 16 0 13 0 topology 30 36 +> 15 0 12 0 topology 14 37 +> 16 0 12 0 topology 13 37 +> 15 0 12 0 topology 29 38 +> 16 0 12 0 topology 11 38 +> 15 0 13 0 topology 1 39 +> 16 0 13 0 topology 11 39 +> 15 0 14 0 topology 24 40 +> 16 0 14 0 topology 7 40 +> 15 0 14 0 topology 10 41 +> 16 0 14 0 topology 5 41 +> 15 0 14 0 topology 13 42 +> 16 0 14 0 topology 3 42 +> 15 0 14 0 topology 17 43 +> 16 0 14 0 topology 4 43 +> 15 0 14 0 topology 18 44 +> 16 0 14 0 topology 6 44 +> 15 0 14 0 topology 11 45 +> 16 0 14 0 topology 2 45 > 6 0 32 2 3 "emigrant-1" > 6 0 33 2 1 "policeman-2" > 12 0 3 32 5 @@ -2772,36 +2772,36 @@ $ tail -n +3 simgrid.trace > 13 18.155073 3 41 > 16 18.155073 10 0 SR 41 p8 > 7 18.155073 2 41 -> 7 18.155073 1 6 -> 7 18.155073 1 3 -> 7 18.155073 11 28 -> 7 18.155073 11 29 -> 7 18.155073 11 23 -> 7 18.155073 11 30 -> 7 18.155073 11 24 -> 7 18.155073 11 18 -> 7 18.155073 1 1 +> 7 18.155073 11 16 +> 7 18.155073 11 14 > 7 18.155073 11 19 > 7 18.155073 11 20 +> 7 18.155073 11 18 > 7 18.155073 11 21 > 7 18.155073 11 22 -> 7 18.155073 11 25 -> 7 18.155073 11 26 -> 7 18.155073 11 31 -> 7 18.155073 11 27 -> 7 18.155073 11 16 -> 7 18.155073 11 14 > 7 18.155073 11 12 > 7 18.155073 11 9 > 7 18.155073 11 15 +> 7 18.155073 11 23 +> 7 18.155073 11 24 > 7 18.155073 11 17 +> 7 18.155073 11 25 +> 7 18.155073 11 26 +> 7 18.155073 11 27 > 7 18.155073 11 8 > 7 18.155073 11 10 +> 7 18.155073 11 28 +> 7 18.155073 11 29 > 7 18.155073 11 13 +> 7 18.155073 11 30 > 7 18.155073 11 11 -> 7 18.155073 1 5 -> 7 18.155073 1 2 > 7 18.155073 1 7 +> 7 18.155073 1 5 +> 7 18.155073 1 3 > 7 18.155073 1 4 +> 7 18.155073 1 6 +> 7 18.155073 1 2 +> 7 18.155073 1 1 +> 7 18.155073 11 31 $ rm -rf procmig.trace simgrid.trace diff --git a/examples/msg/trace-route-user-variables/trace-route-user-variables.tesh b/examples/msg/trace-route-user-variables/trace-route-user-variables.tesh index dda9db30e4..33ba72b48a 100644 --- a/examples/msg/trace-route-user-variables/trace-route-user-variables.tesh +++ b/examples/msg/trace-route-user-variables/trace-route-user-variables.tesh @@ -208,98 +208,98 @@ $ tail -n +3 simgrid.trace > 8 0 5 30 0.035083 > 8 0 4 31 498000000.000000 > 8 0 5 31 0.000015 -> 15 0 6 0 topology 19 0 -> 16 0 6 0 topology 20 0 -> 15 0 6 0 topology 15 1 -> 16 0 6 0 topology 9 1 -> 15 0 6 0 topology 27 2 -> 16 0 6 0 topology 18 2 -> 15 0 7 0 topology 5 3 -> 16 0 7 0 topology 24 3 +> 15 0 6 0 topology 12 0 +> 16 0 6 0 topology 16 0 +> 15 0 6 0 topology 9 1 +> 16 0 6 0 topology 16 1 +> 15 0 6 0 topology 16 2 +> 16 0 6 0 topology 14 2 +> 15 0 6 0 topology 21 3 +> 16 0 6 0 topology 19 3 > 15 0 6 0 topology 8 4 -> 16 0 6 0 topology 10 4 -> 15 0 6 0 topology 21 5 -> 16 0 6 0 topology 22 5 -> 15 0 7 0 topology 1 6 -> 16 0 7 0 topology 9 6 -> 15 0 6 0 topology 23 7 -> 16 0 6 0 topology 24 7 -> 15 0 7 0 topology 1 8 -> 16 0 7 0 topology 15 8 -> 15 0 7 0 topology 1 9 -> 16 0 7 0 topology 11 9 -> 15 0 6 0 topology 26 10 -> 16 0 6 0 topology 27 10 -> 15 0 7 0 topology 5 11 -> 16 0 7 0 topology 18 11 -> 15 0 8 0 topology 11 12 -> 16 0 8 0 topology 2 12 -> 15 0 6 0 topology 28 13 -> 16 0 6 0 topology 29 13 -> 15 0 6 0 topology 12 14 -> 16 0 6 0 topology 16 14 -> 15 0 6 0 topology 9 15 -> 16 0 6 0 topology 16 15 -> 15 0 6 0 topology 14 16 -> 16 0 6 0 topology 13 16 -> 15 0 6 0 topology 29 17 -> 16 0 6 0 topology 11 17 -> 15 0 7 0 topology 3 18 -> 16 0 7 0 topology 30 18 -> 15 0 6 0 topology 11 19 -> 16 0 6 0 topology 15 19 +> 16 0 6 0 topology 19 4 +> 15 0 6 0 topology 19 5 +> 16 0 6 0 topology 20 5 +> 15 0 6 0 topology 8 6 +> 16 0 6 0 topology 20 6 +> 15 0 6 0 topology 27 7 +> 16 0 6 0 topology 18 7 +> 15 0 7 0 topology 5 8 +> 16 0 7 0 topology 18 8 +> 15 0 7 0 topology 4 9 +> 16 0 7 0 topology 18 9 +> 15 0 7 0 topology 2 10 +> 16 0 7 0 topology 18 10 +> 15 0 6 0 topology 16 11 +> 16 0 6 0 topology 21 11 +> 15 0 6 0 topology 21 12 +> 16 0 6 0 topology 22 12 +> 15 0 6 0 topology 9 13 +> 16 0 6 0 topology 12 13 +> 15 0 6 0 topology 15 14 +> 16 0 6 0 topology 9 14 +> 15 0 7 0 topology 1 15 +> 16 0 7 0 topology 9 15 +> 15 0 6 0 topology 20 16 +> 16 0 6 0 topology 23 16 +> 15 0 6 0 topology 23 17 +> 16 0 6 0 topology 24 17 +> 15 0 7 0 topology 5 18 +> 16 0 7 0 topology 24 18 +> 15 0 7 0 topology 4 19 +> 16 0 7 0 topology 24 19 > 15 0 7 0 topology 2 20 > 16 0 7 0 topology 24 20 -> 15 0 8 0 topology 18 21 -> 16 0 8 0 topology 6 21 -> 15 0 8 0 topology 10 22 -> 16 0 8 0 topology 5 22 -> 15 0 6 0 topology 8 23 -> 16 0 6 0 topology 19 23 -> 15 0 6 0 topology 12 24 -> 16 0 6 0 topology 25 24 -> 15 0 7 0 topology 4 25 -> 16 0 7 0 topology 24 25 -> 15 0 6 0 topology 16 26 -> 16 0 6 0 topology 14 26 -> 15 0 8 0 topology 17 27 -> 16 0 8 0 topology 4 27 -> 15 0 6 0 topology 12 28 -> 16 0 6 0 topology 17 28 -> 15 0 6 0 topology 9 29 -> 16 0 6 0 topology 17 29 -> 15 0 6 0 topology 21 30 -> 16 0 6 0 topology 19 30 -> 15 0 6 0 topology 22 31 -> 16 0 6 0 topology 25 31 -> 15 0 8 0 topology 24 32 -> 16 0 8 0 topology 7 32 -> 15 0 7 0 topology 3 33 -> 16 0 7 0 topology 28 33 -> 15 0 6 0 topology 25 34 -> 16 0 6 0 topology 26 34 -> 15 0 6 0 topology 8 35 -> 16 0 6 0 topology 20 35 -> 15 0 8 0 topology 13 36 -> 16 0 8 0 topology 3 36 -> 15 0 7 0 topology 2 37 -> 16 0 7 0 topology 18 37 -> 15 0 6 0 topology 9 38 -> 16 0 6 0 topology 12 38 -> 15 0 6 0 topology 14 39 -> 16 0 6 0 topology 8 39 -> 15 0 6 0 topology 20 40 -> 16 0 6 0 topology 23 40 -> 15 0 7 0 topology 4 41 -> 16 0 7 0 topology 18 41 -> 15 0 6 0 topology 13 42 -> 16 0 6 0 topology 8 42 -> 15 0 6 0 topology 11 43 -> 16 0 6 0 topology 8 43 -> 15 0 6 0 topology 16 44 -> 16 0 6 0 topology 21 44 -> 15 0 6 0 topology 30 45 -> 16 0 6 0 topology 28 45 +> 15 0 6 0 topology 11 21 +> 16 0 6 0 topology 15 21 +> 15 0 7 0 topology 1 22 +> 16 0 7 0 topology 15 22 +> 15 0 6 0 topology 12 23 +> 16 0 6 0 topology 17 23 +> 15 0 6 0 topology 9 24 +> 16 0 6 0 topology 17 24 +> 15 0 6 0 topology 22 25 +> 16 0 6 0 topology 25 25 +> 15 0 6 0 topology 12 26 +> 16 0 6 0 topology 25 26 +> 15 0 6 0 topology 25 27 +> 16 0 6 0 topology 26 27 +> 15 0 6 0 topology 26 28 +> 16 0 6 0 topology 27 28 +> 15 0 6 0 topology 14 29 +> 16 0 6 0 topology 8 29 +> 15 0 6 0 topology 13 30 +> 16 0 6 0 topology 8 30 +> 15 0 6 0 topology 11 31 +> 16 0 6 0 topology 8 31 +> 15 0 6 0 topology 8 32 +> 16 0 6 0 topology 10 32 +> 15 0 6 0 topology 30 33 +> 16 0 6 0 topology 28 33 +> 15 0 7 0 topology 3 34 +> 16 0 7 0 topology 28 34 +> 15 0 6 0 topology 28 35 +> 16 0 6 0 topology 29 35 +> 15 0 7 0 topology 3 36 +> 16 0 7 0 topology 30 36 +> 15 0 6 0 topology 14 37 +> 16 0 6 0 topology 13 37 +> 15 0 6 0 topology 29 38 +> 16 0 6 0 topology 11 38 +> 15 0 7 0 topology 1 39 +> 16 0 7 0 topology 11 39 +> 15 0 8 0 topology 24 40 +> 16 0 8 0 topology 7 40 +> 15 0 8 0 topology 10 41 +> 16 0 8 0 topology 5 41 +> 15 0 8 0 topology 13 42 +> 16 0 8 0 topology 3 42 +> 15 0 8 0 topology 17 43 +> 16 0 8 0 topology 4 43 +> 15 0 8 0 topology 18 44 +> 16 0 8 0 topology 6 44 +> 15 0 8 0 topology 11 45 +> 16 0 8 0 topology 2 45 > 1 9 3 Link_Capacity "1 1 1" > 1 10 3 Link_Utilization "0.9 0.1 0.1" > 8 0 9 15 12.340000 @@ -1886,35 +1886,35 @@ $ tail -n +3 simgrid.trace > 10 0.412439 10 16 5.600000 > 10 0.412439 10 12 5.600000 > 10 0.412439 10 17 5.600000 -> 7 0.412439 1 6 -> 7 0.412439 1 3 -> 7 0.412439 3 28 -> 7 0.412439 3 29 -> 7 0.412439 3 23 -> 7 0.412439 3 30 -> 7 0.412439 3 24 -> 7 0.412439 3 18 -> 7 0.412439 1 1 +> 7 0.412439 3 16 +> 7 0.412439 3 14 > 7 0.412439 3 19 > 7 0.412439 3 20 +> 7 0.412439 3 18 > 7 0.412439 3 21 > 7 0.412439 3 22 -> 7 0.412439 3 25 -> 7 0.412439 3 26 -> 7 0.412439 3 31 -> 7 0.412439 3 27 -> 7 0.412439 3 16 -> 7 0.412439 3 14 > 7 0.412439 3 12 > 7 0.412439 3 9 > 7 0.412439 3 15 +> 7 0.412439 3 23 +> 7 0.412439 3 24 > 7 0.412439 3 17 +> 7 0.412439 3 25 +> 7 0.412439 3 26 +> 7 0.412439 3 27 > 7 0.412439 3 8 > 7 0.412439 3 10 +> 7 0.412439 3 28 +> 7 0.412439 3 29 > 7 0.412439 3 13 +> 7 0.412439 3 30 > 7 0.412439 3 11 -> 7 0.412439 1 5 -> 7 0.412439 1 2 > 7 0.412439 1 7 +> 7 0.412439 1 5 +> 7 0.412439 1 3 > 7 0.412439 1 4 +> 7 0.412439 1 6 +> 7 0.412439 1 2 +> 7 0.412439 1 1 +> 7 0.412439 3 31 $ rm -f simgrid.trace diff --git a/examples/platforms/config_tracing.xml b/examples/platforms/config_tracing.xml index 38b306b636..9f3fbdc317 100644 --- a/examples/platforms/config_tracing.xml +++ b/examples/platforms/config_tracing.xml @@ -5,9 +5,7 @@ - - diff --git a/examples/platforms/energy_platform.xml b/examples/platforms/energy_platform.xml index 03ce9c7e22..7d9ace555e 100644 --- a/examples/platforms/energy_platform.xml +++ b/examples/platforms/energy_platform.xml @@ -24,8 +24,11 @@ - - + + + + + diff --git a/examples/s4u/CMakeLists.txt b/examples/s4u/CMakeLists.txt index ac2b58b2c2..3e90de1bdc 100644 --- a/examples/s4u/CMakeLists.txt +++ b/examples/s4u/CMakeLists.txt @@ -1,7 +1,8 @@ foreach (example actions-comm actions-storage - actor-create actor-daemon actor-kill actor-migration actor-suspend + actor-create actor-daemon actor-execute actor-kill actor-lifetime actor-migration actor-suspend actor-priority app-masterworker app-pingpong app-token-ring async-wait async-waitany async-waitall actor-yield + energy-link plugin-hostload io mutex) add_executable (s4u-${example} ${example}/s4u-${example}.cpp) target_link_libraries(s4u-${example} simgrid) @@ -33,20 +34,27 @@ set(examples_src ${examples_src} set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/app-bittorrent/s4u-app-bittorrent.tesh ${CMAKE_CURRENT_SOURCE_DIR}/dht-chord/s4u-dht-chord.tesh ${CMAKE_CURRENT_SOURCE_DIR}/actor-yield/s4u-actor-yield.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/actor-priority/s4u-actor-priority.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/actor-lifetime/s4u-actor-lifetime.tesh ${CMAKE_CURRENT_SOURCE_DIR}/async-wait/s4u-async-wait.tesh ${CMAKE_CURRENT_SOURCE_DIR}/async-waitany/s4u-async-waitany.tesh - ${CMAKE_CURRENT_SOURCE_DIR}/async-waitall/s4u-async-waitall.tesh PARENT_SCOPE) + ${CMAKE_CURRENT_SOURCE_DIR}/async-waitall/s4u-async-waitall.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/actor-execute/s4u-actor-execute.tesh + PARENT_SCOPE) set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm-split_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/actions-storage/s4u-actions-storage_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/actor-create/s4u-actor-create_d.xml + ${CMAKE_CURRENT_SOURCE_DIR}/actor-priority/s4u-actor-priority_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/app-bittorrent/s4u-app-bittorrent_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/s4u-app-masterworker_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/async-waitany/s4u-async-waitany_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/async-waitall/s4u-async-waitall_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/async-wait/s4u-async-wait_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/actor-yield/s4u-actor-yield_d.xml - ${CMAKE_CURRENT_SOURCE_DIR}/dht-chord/s4u-dht-chord_d.xml PARENT_SCOPE) + ${CMAKE_CURRENT_SOURCE_DIR}/dht-chord/s4u-dht-chord_d.xml + ${CMAKE_CURRENT_SOURCE_DIR}/actor-lifetime/s4u-actor-lifetime_d.xml + PARENT_SCOPE) set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm-split-p0.txt ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm-split-p1.txt ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm.txt @@ -54,9 +62,11 @@ set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-a ${CMAKE_CURRENT_SOURCE_DIR}/README.doc PARENT_SCOPE) foreach(example actions-comm actions-storage - actor-create actor-daemon actor-kill actor-migration actor-suspend + actor-create actor-daemon actor-execute actor-kill actor-lifetime actor-migration actor-suspend app-bittorrent app-masterworker app-pingpong app-token-ring - async-wait async-waitall async-waitany actor-yield - dht-chord plugin-hostload io mutex) + async-wait async-waitall async-waitany actor-priority actor-yield + dht-chord + energy-link + plugin-hostload io mutex) ADD_TESH_FACTORIES(s4u-${example} "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_CURRENT_BINARY_DIR}/${example} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_HOME_DIRECTORY}/examples/s4u/${example} s4u-${example}.tesh) endforeach() diff --git a/examples/s4u/README.doc b/examples/s4u/README.doc index 9de079760f..f626d7ec70 100644 --- a/examples/s4u/README.doc +++ b/examples/s4u/README.doc @@ -25,10 +25,10 @@ documentation, but it should remain readable directly. @ref examples/s4u/actor-create/s4u-actor-create_d.xml \n Shows how to start your actors to populate your simulation. - - Ping Pong: @ref examples/s4u/app-pingpong/s4u-app-pingpong.c\n - It's hard to think of a simpler example: it is just sending one message back and forth. - The tesh file laying in the directory show how to start the simulator binary, highlighting how to pass options to - the simulators (as detailed in Section \ref options). + - Ping Pong: @ref examples/s4u/app-pingpong/s4u-app-pingpong.cpp\n + This simple example just sends one message back and forth. + The tesh file laying in the directory show how to start the simulator binary, highlighting how to pass options to + the simulators (as detailed in Section \ref options). - Token ring: @ref examples/s4u/app-token-ring/s4u-app-token-ring.cpp \n Shows how to implement a classical communication pattern, where a token is exchanged along a ring to reach every @@ -38,7 +38,7 @@ documentation, but it should remain readable directly. Another good old example, where one Master process has a bunch of task to dispatch to a set of several Worker processes. -@section msg_ex_async Asynchronous communications +@section s4u_ex_async Asynchronous communications - Basic asynchronous communications. @ref examples/s4u/async-wait/s4u-async-wait.cpp \n @@ -57,7 +57,7 @@ documentation, but it should remain readable directly. @ref examples/s4u/async-waitany/s4u-async-waitany.cpp\n The @ref simgrid::s4u::Comm::wait_any() function is useful when you want to block until one activity of the set completes, no matter which terminates - first. + first. @section s4u_ex_actors Acting on Actors @@ -65,6 +65,13 @@ documentation, but it should remain readable directly. @ref examples/s4u/actor-create/s4u-actor-create.cpp \n Most actors are started from the deployment XML file, but they exist other methods. + - Actors using CPU time. + @ref examples/s4u/actor-execute/s4u-actor-execute.cpp \n + The computations done in your program are not reported to the + simulated world, unless you explicitely request the simulator to pause + the actor until a given amount of flops gets computed on its simulated + host. + - Daemonize actors @ref examples/s4u/actor-daemon/s4u-actor-daemon.cpp \n Some actors may be intended to simulate daemons that run in background. This example show how to transform a regular @@ -75,10 +82,21 @@ documentation, but it should remain readable directly. Actors can be suspended and resumed during their executions thanks to the @ref suspend and @ref resume methods. + - Priority actors. + @ref examples/s4u/actor-priority/s4u-actor-priority.cpp \n + Actors can be launched according their priorities thanks to the @ref + execution method. + - Kill actors. @ref examples/s4u/actor-kill/s4u-actor-kill.cpp \n Actors can forcefully stop other actors with the @ref kill method. + - Controling the actor life cycle from the XML. + @ref examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp + @ref examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml + \n + You can specify a start time and a kill time in the deployment file. + - Migrating Actors. @ref examples/s4u/actor-migration/s4u-actor-migration.cpp \n Actors can move or be moved from a host to another with the @ref migrate method. @@ -130,7 +148,10 @@ also the tesh files in the example directories for details. @example examples/s4u/actor-create/s4u-actor-create.cpp @example examples/s4u/actor-create/s4u-actor-create_d.xml @example examples/s4u/actor-daemon/s4u-actor-daemon.cpp +@example examples/s4u/actor-execute/s4u-actor-execute.cpp @example examples/s4u/actor-kill/s4u-actor-kill.cpp +@example examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp +@example examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml @example examples/s4u/actor-migration/s4u-actor-migration.cpp @example examples/s4u/actor-suspend/s4u-actor-suspend.cpp @example examples/s4u/app-token-ring/s4u-app-token-ring.cpp diff --git a/examples/s4u/actions-comm/s4u-actions-comm.cpp b/examples/s4u/actions-comm/s4u-actions-comm.cpp index f620071304..5a1faacf53 100644 --- a/examples/s4u/actions-comm/s4u-actions-comm.cpp +++ b/examples/s4u/actions-comm/s4u-actions-comm.cpp @@ -6,6 +6,7 @@ #include "simgrid/s4u.hpp" #include "xbt/replay.hpp" #include "xbt/str.h" +#include XBT_LOG_NEW_DEFAULT_CATEGORY(actions, "Messages specific for this msg example"); @@ -59,13 +60,13 @@ public: static void send(const char* const* action) { double size = std::stod(action[3]); - char* payload = xbt_strdup(action[3]); + std::string* payload = new std::string(action[3]); double clock = simgrid::s4u::Engine::getClock(); simgrid::s4u::MailboxPtr to = simgrid::s4u::Mailbox::byName(simgrid::s4u::this_actor::getName() + "_" + action[2]); ACT_DEBUG("Entering Send: %s (size: %g) -- Actor %s on mailbox %s", NAME, size, - simgrid::s4u::this_actor::getName().c_str(), to->getName()); + simgrid::s4u::this_actor::getCname(), to->getCname()); to->put(payload, size); - xbt_free(payload); + delete payload; log_action(action, simgrid::s4u::Engine::getClock() - clock); } @@ -76,8 +77,7 @@ public: simgrid::s4u::MailboxPtr from = simgrid::s4u::Mailbox::byName(std::string(action[2]) + "_" + simgrid::s4u::this_actor::getName()); - ACT_DEBUG("Receiving: %s -- Actor %s on mailbox %s", NAME, simgrid::s4u::this_actor::getName().c_str(), - from->getName()); + ACT_DEBUG("Receiving: %s -- Actor %s on mailbox %s", NAME, simgrid::s4u::this_actor::getCname(), from->getCname()); from->get(); log_action(action, simgrid::s4u::Engine::getClock() - clock); } diff --git a/examples/s4u/actor-create/s4u-actor-create.cpp b/examples/s4u/actor-create/s4u-actor-create.cpp index 33ed245dac..87530584fe 100644 --- a/examples/s4u/actor-create/s4u-actor-create.cpp +++ b/examples/s4u/actor-create/s4u-actor-create.cpp @@ -18,6 +18,7 @@ */ #include +#include // This declares a logging channel so that XBT_INFO can be used later XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_actor_create, "The logging channel used in this example"); @@ -42,7 +43,7 @@ public: XBT_INFO("Hello s4u, I have something to send"); simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName("mb42"); - mailbox->put(xbt_strdup(msg.c_str()), msg.size()); + mailbox->put(new std::string(msg), msg.size()); XBT_INFO("I'm done. See you."); } }; @@ -72,13 +73,13 @@ public: } void operator()() { - XBT_INFO("Hello s4u, I'm ready to get any message you'd want on %s", mailbox->getName()); + XBT_INFO("Hello s4u, I'm ready to get any message you'd want on %s", mailbox->getCname()); - char* msg1 = static_cast(mailbox->get()); - char* msg2 = static_cast(mailbox->get()); - XBT_INFO("I received '%s' and '%s'", msg1, msg2); - xbt_free(msg1); - xbt_free(msg2); + std::string* msg1 = static_cast(mailbox->get()); + std::string* msg2 = static_cast(mailbox->get()); + XBT_INFO("I received '%s' and '%s'", msg1->c_str(), msg2->c_str()); + delete msg1; + delete msg2; XBT_INFO("I'm done. See you."); } }; diff --git a/examples/s4u/actor-execute/s4u-actor-execute.cpp b/examples/s4u/actor-execute/s4u-actor-execute.cpp new file mode 100644 index 0000000000..9fc417d823 --- /dev/null +++ b/examples/s4u/actor-execute/s4u-actor-execute.cpp @@ -0,0 +1,31 @@ +/* Copyright (c) 2010-2017. 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/s4u.hpp" + +static int executor(std::vector /*args*/) +{ + /* this_actor::execute() tells SimGrid to pause the calling actor + * until its host has computed the amount of flops passed as a parameter */ + simgrid::s4u::this_actor::execute(100); + + /* This simple example does not do anything beyond that */ + return 0; +} + +int main(int argc, char *argv[]) +{ + simgrid::s4u::Engine e(&argc, argv); + std::vector args; + xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s msg_platform.xml\n", argv[0], argv[0]); + + e.loadPlatform(argv[1]); + + simgrid::s4u::Actor::createActor("executor", simgrid::s4u::Host::by_name("Tremblay"), executor, args); + + e.run(); + + return 0; +} diff --git a/examples/s4u/actor-execute/s4u-actor-execute.tesh b/examples/s4u/actor-execute/s4u-actor-execute.tesh new file mode 100644 index 0000000000..e4575eb320 --- /dev/null +++ b/examples/s4u/actor-execute/s4u-actor-execute.tesh @@ -0,0 +1,4 @@ +#! ./tesh + +p Start remote processes +$ $SG_TEST_EXENV ${bindir:=.}/s4u-actor-execute$EXEEXT ${srcdir:=.}/small_platform.xml diff --git a/examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp b/examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp new file mode 100644 index 0000000000..8f2b4eca25 --- /dev/null +++ b/examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp @@ -0,0 +1,46 @@ +/* Copyright (c) 2007-2017. 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/s4u.hpp" + +XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Messages specific for this s4u example"); + +/* Executed on process termination, to display a message helping to understand the output */ +static int my_onexit(void*, void*) +{ + XBT_INFO("Exiting now (done sleeping or got killed)."); + return 0; +} + +/* Just sleep until termination */ +class sleeper { + +public: + explicit sleeper(std::vector /*args*/) + { + XBT_INFO("Hello! I go to sleep."); + simgrid::s4u::this_actor::onExit(my_onexit, NULL); + + simgrid::s4u::this_actor::sleep_for(10); + } + void operator()() { XBT_INFO("Done sleeping."); } +}; + +int main(int argc, char* argv[]) +{ + simgrid::s4u::Engine e(&argc, argv); + + xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n" + "\tExample: %s msg_platform.xml msg_deployment.xml\n", + argv[0], argv[0]); + + e.loadPlatform(argv[1]); /* - Load the platform description */ + e.registerFunction("sleeper"); + e.loadDeployment(argv[2]); /* - Deploy the sleeper processes with explicit start/kill times */ + + e.run(); /* - Run the simulation */ + + return 0; +} diff --git a/examples/s4u/actor-lifetime/s4u-actor-lifetime.tesh b/examples/s4u/actor-lifetime/s4u-actor-lifetime.tesh new file mode 100644 index 0000000000..9b525ce2b3 --- /dev/null +++ b/examples/s4u/actor-lifetime/s4u-actor-lifetime.tesh @@ -0,0 +1,14 @@ +#! ./tesh + +$ $SG_TEST_EXENV ${bindir:=.}/s4u-actor-lifetime ${srcdir:=.}/cluster.xml ${srcdir:=.}/../s4u/actor-lifetime/s4u-actor-lifetime_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (1:sleeper@node-0.acme.org) Hello! I go to sleep. +> [ 0.000000] (2:sleeper@node-1.acme.org) Hello! I go to sleep. +> [ 2.000000] (3:sleeper@node-0.acme.org) Hello! I go to sleep. +> [ 3.000000] (2:sleeper@node-1.acme.org) Exiting now (done sleeping or got killed). +> [ 4.000000] (4:sleeper@node-2.acme.org) Hello! I go to sleep. +> [ 7.000000] (4:sleeper@node-2.acme.org) Exiting now (done sleeping or got killed). +> [ 10.000000] (1:sleeper@node-0.acme.org) Done sleeping. +> [ 10.000000] (1:sleeper@node-0.acme.org) Exiting now (done sleeping or got killed). +> [ 12.000000] (3:sleeper@node-0.acme.org) Done sleeping. +> [ 12.000000] (3:sleeper@node-0.acme.org) Exiting now (done sleeping or got killed). + diff --git a/examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml b/examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml new file mode 100644 index 0000000000..c69e987886 --- /dev/null +++ b/examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/examples/s4u/actor-priority/s4u-actor-priority.cpp b/examples/s4u/actor-priority/s4u-actor-priority.cpp new file mode 100644 index 0000000000..1564f7e746 --- /dev/null +++ b/examples/s4u/actor-priority/s4u-actor-priority.cpp @@ -0,0 +1,45 @@ +/* Copyright (c) 2007-2016. 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/s4u.hpp" +#include +#include + +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example"); + +class test { + double computation_amount; + double priority; + +public: + explicit test(std::vector args) +{ + computation_amount = std::stod(args[1]); + priority = std::stod(args[2]); +} +void operator()() +{ + XBT_INFO("Hello! Running an actor of size %g with priority %g", computation_amount, priority); + simgrid::s4u::this_actor::execute(computation_amount, priority); + + XBT_INFO("Goodbye now!"); +} +}; + +int main(int argc, char *argv[]) +{ + simgrid::s4u::Engine e(&argc, argv); + xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n" + "\tExample: %s msg_platform.xml msg_deployment.xml\n", argv[0], argv[0]); + + e.registerFunction("test"); + + e.loadPlatform(argv[1]); + e.loadDeployment(argv[2]); + + e.run(); + + return 0; +} diff --git a/examples/s4u/actor-priority/s4u-actor-priority.tesh b/examples/s4u/actor-priority/s4u-actor-priority.tesh new file mode 100644 index 0000000000..82916b37d3 --- /dev/null +++ b/examples/s4u/actor-priority/s4u-actor-priority.tesh @@ -0,0 +1,8 @@ +#! ./tesh + +! output sort 19 +$ $SG_TEST_EXENV ${bindir:=.}/s4u-actor-priority$EXEEXT ${srcdir:=.}/small_platform.xml ${srcdir:=.}/../s4u/actor-priority/s4u-actor-priority_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (1:test@Fafard) Hello! Running an actor of size 7.6296e+07 with priority 1 +> [ 0.000000] (2:test@Fafard) Hello! Running an actor of size 7.6296e+07 with priority 2 +> [ 1.500000] (2:test@Fafard) Goodbye now! +> [ 2.000000] (1:test@Fafard) Goodbye now! diff --git a/examples/s4u/actor-priority/s4u-actor-priority_d.xml b/examples/s4u/actor-priority/s4u-actor-priority_d.xml new file mode 100644 index 0000000000..5d15f2b87f --- /dev/null +++ b/examples/s4u/actor-priority/s4u-actor-priority_d.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/examples/s4u/app-bittorrent/s4u-bittorrent.hpp b/examples/s4u/app-bittorrent/s4u-bittorrent.hpp index a3b296a2af..61e64bda80 100644 --- a/examples/s4u/app-bittorrent/s4u-bittorrent.hpp +++ b/examples/s4u/app-bittorrent/s4u-bittorrent.hpp @@ -44,7 +44,7 @@ #define MESSAGE_CANCEL_SIZE 17 /** Types of messages exchanged between two peers. */ -typedef enum { +enum e_message_type { MESSAGE_HANDSHAKE, MESSAGE_CHOKE, MESSAGE_UNCHOKE, @@ -55,7 +55,7 @@ typedef enum { MESSAGE_REQUEST, MESSAGE_PIECE, MESSAGE_CANCEL -} e_message_type; +}; class Message { public: diff --git a/examples/s4u/app-bittorrent/s4u-peer.cpp b/examples/s4u/app-bittorrent/s4u-peer.cpp index 8f57ee9942..8f9bc799cc 100644 --- a/examples/s4u/app-bittorrent/s4u-peer.cpp +++ b/examples/s4u/app-bittorrent/s4u-peer.cpp @@ -3,6 +3,7 @@ /* 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 #include @@ -20,7 +21,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_bt_peer, "Messages specific for the peers"); #define BLOCK_SIZE 16384 /** Number of blocks asked by each request */ -#define BLOCKS_REQUESTED 2 +#define BLOCKS_REQUESTED 2UL #define ENABLE_END_GAME_MODE 1 #define SLEEP_DURATION 1 @@ -128,13 +129,13 @@ void Peer::sendHandshakeToAllPeers() void Peer::sendMessage(simgrid::s4u::MailboxPtr mailbox, e_message_type type, uint64_t size) { const char* type_names[6] = {"HANDSHAKE", "CHOKE", "UNCHOKE", "INTERESTED", "NOTINTERESTED", "CANCEL"}; - XBT_DEBUG("Sending %s to %s", type_names[type], mailbox->getName()); + XBT_DEBUG("Sending %s to %s", type_names[type], mailbox->getCname()); mailbox->put_init(new Message(type, id, bitfield_, mailbox_), size)->detach(); } void Peer::sendBitfield(simgrid::s4u::MailboxPtr mailbox) { - XBT_DEBUG("Sending a BITFIELD to %s", mailbox->getName()); + XBT_DEBUG("Sending a BITFIELD to %s", mailbox->getCname()); mailbox ->put_init(new Message(MESSAGE_BITFIELD, id, bitfield_, mailbox_), MESSAGE_BITFIELD_SIZE + BITS_TO_BYTES(FILE_PIECES)) @@ -144,7 +145,7 @@ void Peer::sendBitfield(simgrid::s4u::MailboxPtr mailbox) void Peer::sendPiece(simgrid::s4u::MailboxPtr mailbox, unsigned int piece, int block_index, int block_length) { xbt_assert(not hasNotPiece(piece), "Tried to send a unavailable piece."); - XBT_DEBUG("Sending the PIECE %u (%d,%d) to %s", piece, block_index, block_length, mailbox->getName()); + XBT_DEBUG("Sending the PIECE %u (%d,%d) to %s", piece, block_index, block_length, mailbox->getCname()); mailbox->put_init(new Message(MESSAGE_PIECE, id, mailbox_, piece, block_index, block_length), BLOCK_SIZE)->detach(); } @@ -163,8 +164,8 @@ void Peer::sendRequestTo(Connection* remote_peer, unsigned int piece) xbt_assert(remote_peer->hasPiece(piece)); int block_index = getFirstMissingBlockFrom(piece); if (block_index != -1) { - int block_length = MIN(BLOCKS_REQUESTED, PIECES_BLOCKS - block_index); - XBT_DEBUG("Sending a REQUEST to %s for piece %u (%d,%d)", remote_peer->mailbox_->getName(), piece, block_index, + int block_length = std::min(BLOCKS_REQUESTED, PIECES_BLOCKS - block_index); + XBT_DEBUG("Sending a REQUEST to %s for piece %u (%d,%d)", remote_peer->mailbox_->getCname(), piece, block_index, block_length); remote_peer->mailbox_ ->put_init(new Message(MESSAGE_REQUEST, id, mailbox_, piece, block_index, block_length), MESSAGE_REQUEST_SIZE) @@ -233,7 +234,7 @@ void Peer::leech() /* Send a "handshake" message to all the peers it got (since it couldn't have gotten more than 50 peers) */ sendHandshakeToAllPeers(); - XBT_DEBUG("Starting main leech loop listening on mailbox: %s", mailbox_->getName()); + XBT_DEBUG("Starting main leech loop listening on mailbox: %s", mailbox_->getCname()); void* data = nullptr; while (simgrid::s4u::Engine::getClock() < deadline && countPieces(bitfield_) < FILE_PIECES) { @@ -299,7 +300,7 @@ void Peer::handleMessage() const char* type_names[10] = {"HANDSHAKE", "CHOKE", "UNCHOKE", "INTERESTED", "NOTINTERESTED", "HAVE", "BITFIELD", "REQUEST", "PIECE", "CANCEL"}; - XBT_DEBUG("Received a %s message from %s", type_names[message->type], message->return_mailbox->getName()); + XBT_DEBUG("Received a %s message from %s", type_names[message->type], message->return_mailbox->getCname()); auto known_peer = connected_peers.find(message->peer_id); Connection* remote_peer = (known_peer == connected_peers.end()) ? nullptr : known_peer->second; diff --git a/examples/s4u/app-bittorrent/s4u-tracker.cpp b/examples/s4u/app-bittorrent/s4u-tracker.cpp index d45095179c..129667980e 100644 --- a/examples/s4u/app-bittorrent/s4u-tracker.cpp +++ b/examples/s4u/app-bittorrent/s4u-tracker.cpp @@ -5,6 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "s4u-tracker.hpp" +#include #include XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_bt_tracker, "Messages specific for the tracker"); @@ -48,7 +49,7 @@ void Tracker::operator()() TrackerAnswer* ta = new TrackerAnswer(TRACKER_QUERY_INTERVAL); std::set::iterator next_peer; int nb_known_peers = known_peers.size(); - int max_tries = MIN(MAXIMUM_PEERS, nb_known_peers); + int max_tries = std::min(MAXIMUM_PEERS, nb_known_peers); int tried = 0; while (tried < max_tries) { do { diff --git a/examples/s4u/app-masterworker/s4u-app-masterworker.cpp b/examples/s4u/app-masterworker/s4u-app-masterworker.cpp index e21badf55c..199299ae05 100644 --- a/examples/s4u/app-masterworker/s4u-app-masterworker.cpp +++ b/examples/s4u/app-masterworker/s4u-app-masterworker.cpp @@ -37,7 +37,7 @@ public: if (number_of_tasks < 10000 || i % 10000 == 0) XBT_INFO("Sending \"%s\" (of %ld) to mailbox \"%s\"", (std::string("Task_") + std::to_string(i)).c_str(), - number_of_tasks, mailbox->getName()); + number_of_tasks, mailbox->getCname()); /* - Send the computation amount to the @ref worker */ mailbox->put(new double(comp_size), comm_size); diff --git a/examples/s4u/app-token-ring/s4u-app-token-ring.cpp b/examples/s4u/app-token-ring/s4u-app-token-ring.cpp index 7f242e4eab..388e19f6fe 100644 --- a/examples/s4u/app-token-ring/s4u-app-token-ring.cpp +++ b/examples/s4u/app-token-ring/s4u-app-token-ring.cpp @@ -38,15 +38,15 @@ public: if (rank == 0) { /* The root process (rank 0) first sends the token then waits to receive it back */ - XBT_INFO("Host \"%u\" send 'Token' to Host \"%s\"", rank, neighbor_mailbox->getName()); - neighbor_mailbox->put(xbt_strdup("Token"), task_comm_size); - char* res = static_cast(my_mailbox->get()); - XBT_INFO("Host \"%u\" received \"%s\"", rank, res); - xbt_free(res); + XBT_INFO("Host \"%u\" send 'Token' to Host \"%s\"", rank, neighbor_mailbox->getCname()); + std::string msg = "Token"; + neighbor_mailbox->put(&msg, task_comm_size); + std::string* res = static_cast(my_mailbox->get()); + XBT_INFO("Host \"%u\" received \"%s\"", rank, res->c_str()); } else { - char* res = static_cast(my_mailbox->get()); - XBT_INFO("Host \"%u\" received \"%s\"", rank, res); - XBT_INFO("Host \"%u\" send 'Token' to Host \"%s\"", rank, neighbor_mailbox->getName()); + std::string* res = static_cast(my_mailbox->get()); + XBT_INFO("Host \"%u\" received \"%s\"", rank, res->c_str()); + XBT_INFO("Host \"%u\" send 'Token' to Host \"%s\"", rank, neighbor_mailbox->getCname()); neighbor_mailbox->put(res, task_comm_size); } } diff --git a/examples/s4u/async-wait/s4u-async-wait.cpp b/examples/s4u/async-wait/s4u-async-wait.cpp index 7742ccaabc..f7b1968af6 100644 --- a/examples/s4u/async-wait/s4u-async-wait.cpp +++ b/examples/s4u/async-wait/s4u-async-wait.cpp @@ -14,6 +14,7 @@ #include "simgrid/s4u.hpp" #include #include +#include XBT_LOG_NEW_DEFAULT_CATEGORY(msg_async_wait, "Messages specific for this s4u example"); @@ -40,11 +41,11 @@ public: std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName); std::string msgName = std::string("Message ") + std::to_string(i); - char* payload = xbt_strdup(msgName.c_str()); // copy the data we send: 'msgName' is not a stable storage location - + std::string* payload = new std::string(msgName); // copy the data we send: + // 'msgName' is not a stable storage location XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str()); /* Create a communication representing the ongoing communication */ - simgrid::s4u::CommPtr comm = mbox->put_async((void*)payload, msg_size); + simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size); /* Add this comm to the vector of all known comms */ pending_comms.push_back(comm); } @@ -53,9 +54,9 @@ public: for (int i = 0; i < receivers_count; i++) { std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName); - char* payload = xbt_strdup("finalize"); // Make a copy of the data we will send + std::string* payload = new std::string("finalize"); // Make a copy of the data we will send - simgrid::s4u::CommPtr comm = mbox->put_async((void*)payload, 0); + simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0); pending_comms.push_back(comm); XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count); } @@ -87,15 +88,12 @@ public: void operator()() { XBT_INFO("Wait for my first message"); - while (1) { - char* received = static_cast(mbox->get()); - XBT_INFO("I got a '%s'.", received); - if (std::strcmp(received, "finalize") == 0) { /* If it's a finalize message, we're done */ - xbt_free(received); - break; - } - /* Otherwise receiving the message was all we were supposed to do */ - xbt_free(received); + for (bool cont = true; cont;) { + std::string* received = static_cast(mbox->get()); + XBT_INFO("I got a '%s'.", received->c_str()); + cont = (*received != "finalize"); // If it's a finalize message, we're done + // Receiving the message was all we were supposed to do + delete received; } } }; diff --git a/examples/s4u/async-waitall/s4u-async-waitall.cpp b/examples/s4u/async-waitall/s4u-async-waitall.cpp index 270894fe6e..7e611d79ee 100644 --- a/examples/s4u/async-waitall/s4u-async-waitall.cpp +++ b/examples/s4u/async-waitall/s4u-async-waitall.cpp @@ -15,6 +15,7 @@ #include "simgrid/s4u.hpp" #include #include +#include XBT_LOG_NEW_DEFAULT_CATEGORY(msg_async_waitall, "Messages specific for this s4u example"); @@ -41,11 +42,11 @@ public: std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName); std::string msgName = std::string("Message ") + std::to_string(i); - char* payload = xbt_strdup(msgName.c_str()); // copy the data we send: 'msgName' is not a stable storage location - + std::string* payload = new std::string(msgName); // copy the data we send: + // 'msgName' is not a stable storage location XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str()); /* Create a communication representing the ongoing communication */ - simgrid::s4u::CommPtr comm = mbox->put_async((void*)payload, msg_size); + simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size); /* Add this comm to the vector of all known comms */ pending_comms.push_back(comm); } @@ -54,9 +55,9 @@ public: for (int i = 0; i < receivers_count; i++) { std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName); - char* payload = xbt_strdup("finalize"); // Make a copy of the data we will send + std::string* payload = new std::string("finalize"); // Make a copy of the data we will send - simgrid::s4u::CommPtr comm = mbox->put_async((void*)payload, 0); + simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0); pending_comms.push_back(comm); XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count); } @@ -83,15 +84,12 @@ public: void operator()() { XBT_INFO("Wait for my first message"); - while (1) { - char* received = static_cast(mbox->get()); - XBT_INFO("I got a '%s'.", received); - if (std::strcmp(received, "finalize") == 0) { /* If it's a finalize message, we're done */ - xbt_free(received); - break; - } - /* Otherwise receiving the message was all we were supposed to do */ - xbt_free(received); + for (bool cont = true; cont;) { + std::string* received = static_cast(mbox->get()); + XBT_INFO("I got a '%s'.", received->c_str()); + cont = (*received != "finalize"); // If it's a finalize message, we're done + // Receiving the message was all we were supposed to do + delete received; } } }; diff --git a/examples/s4u/async-waitany/s4u-async-waitany.cpp b/examples/s4u/async-waitany/s4u-async-waitany.cpp index d94b036523..eff5ae28eb 100644 --- a/examples/s4u/async-waitany/s4u-async-waitany.cpp +++ b/examples/s4u/async-waitany/s4u-async-waitany.cpp @@ -20,6 +20,7 @@ #include "simgrid/s4u.hpp" #include #include +#include XBT_LOG_NEW_DEFAULT_CATEGORY(msg_async_waitall, "Messages specific for this msg example"); @@ -46,11 +47,11 @@ public: std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName); std::string msgName = std::string("Message ") + std::to_string(i); - char* payload = xbt_strdup(msgName.c_str()); // copy the data we send: 'msgName' is not a stable storage location - + std::string* payload = new std::string(msgName); // copy the data we send: + // 'msgName' is not a stable storage location XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str()); /* Create a communication representing the ongoing communication */ - simgrid::s4u::CommPtr comm = mbox->put_async((void*)payload, msg_size); + simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size); /* Add this comm to the vector of all known comms */ pending_comms.push_back(comm); } @@ -59,9 +60,9 @@ public: for (int i = 0; i < receivers_count; i++) { std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::byName(mboxName); - char* payload = xbt_strdup("finalize"); // Make a copy of the data we will send + std::string* payload = new std::string("finalize"); // Make a copy of the data we will send - simgrid::s4u::CommPtr comm = mbox->put_async((void*)payload, 0); + simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0); pending_comms.push_back(comm); XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count); } @@ -99,15 +100,12 @@ public: void operator()() { XBT_INFO("Wait for my first message"); - while (1) { - char* received = static_cast(mbox->get()); - XBT_INFO("I got a '%s'.", received); - if (std::strcmp(received, "finalize") == 0) { /* If it's a finalize message, we're done */ - xbt_free(received); - break; - } - /* Otherwise receiving the message was all we were supposed to do */ - xbt_free(received); + for (bool cont = true; cont;) { + std::string* received = static_cast(mbox->get()); + XBT_INFO("I got a '%s'.", received->c_str()); + cont = (*received != "finalize"); // If it's a finalize message, we're done + // Receiving the message was all we were supposed to do + delete received; } } }; diff --git a/examples/s4u/dht-chord/node.cpp b/examples/s4u/dht-chord/node.cpp index a31877fa62..4a73c0f4e1 100644 --- a/examples/s4u/dht-chord/node.cpp +++ b/examples/s4u/dht-chord/node.cpp @@ -235,7 +235,7 @@ void Node::checkPredecessor() } // receive the answer XBT_DEBUG("Sent 'Predecessor Alive' request to %d, waiting for the answer on my mailbox '%s'", pred_id_, - message->answer_to->getName()); + message->answer_to->getCname()); simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data); try { @@ -280,7 +280,7 @@ int Node::remoteGetPredecessor(int ask_to) // receive the answer XBT_DEBUG("Sent 'Get Predecessor' request to %d, waiting for the answer on my mailbox '%s'", ask_to, - message->answer_to->getName()); + message->answer_to->getCname()); simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data); try { @@ -432,7 +432,7 @@ void Node::handleMessage(ChordMessage* message) message->type = FIND_SUCCESSOR_ANSWER; message->answer_id = fingers_[0]; XBT_DEBUG("Sending back a 'Find Successor Answer' to %s (mailbox %s): the successor of %d is %d", - message->issuer_host_name.c_str(), message->answer_to->getName(), message->request_id, + message->issuer_host_name.c_str(), message->answer_to->getCname(), message->request_id, message->answer_id); message->answer_to->put_init(message, 10)->detach(ChordMessage::destroy); } else { @@ -450,7 +450,7 @@ void Node::handleMessage(ChordMessage* message) message->type = GET_PREDECESSOR_ANSWER; message->answer_id = pred_id_; XBT_DEBUG("Sending back a 'Get Predecessor Answer' to %s via mailbox '%s': my predecessor is %d", - message->issuer_host_name.c_str(), message->answer_to->getName(), message->answer_id); + message->issuer_host_name.c_str(), message->answer_to->getCname(), message->answer_id); message->answer_to->put_init(message, 10)->detach(ChordMessage::destroy); break; @@ -488,7 +488,7 @@ void Node::handleMessage(ChordMessage* message) XBT_DEBUG("Receiving a 'Predecessor Alive' request from %s", message->issuer_host_name.c_str()); message->type = PREDECESSOR_ALIVE_ANSWER; XBT_DEBUG("Sending back a 'Predecessor Alive Answer' to %s (mailbox %s)", message->issuer_host_name.c_str(), - message->answer_to->getName()); + message->answer_to->getCname()); message->answer_to->put_init(message, 10)->detach(ChordMessage::destroy); break; diff --git a/examples/s4u/dht-chord/s4u-dht-chord.hpp b/examples/s4u/dht-chord/s4u-dht-chord.hpp index 4c44d8fc98..ff05252d82 100644 --- a/examples/s4u/dht-chord/s4u-dht-chord.hpp +++ b/examples/s4u/dht-chord/s4u-dht-chord.hpp @@ -42,7 +42,7 @@ public: }; /* Types of tasks exchanged between nodes. */ -typedef enum { +enum e_message_type_t { FIND_SUCCESSOR, FIND_SUCCESSOR_ANSWER, GET_PREDECESSOR, @@ -52,7 +52,7 @@ typedef enum { PREDECESSOR_LEAVING, PREDECESSOR_ALIVE, PREDECESSOR_ALIVE_ANSWER -} e_message_type_t; +}; class ChordMessage { public: diff --git a/examples/s4u/energy-link/s4u-energy-link.cpp b/examples/s4u/energy-link/s4u-energy-link.cpp new file mode 100644 index 0000000000..94de986637 --- /dev/null +++ b/examples/s4u/energy-link/s4u-energy-link.cpp @@ -0,0 +1,143 @@ +/* Copyright (c) 2017. 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/plugins/energy.h" +#include "xbt/log.h" +#include + +#include + +/* Parameters of the random generation of the flow size */ +static const unsigned long int min_size = 1e6; +static const unsigned long int max_size = 1e9; + +XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_energyconsumption, "Messages specific for this s4u example"); + +static void sender(std::vector args) +{ + xbt_assert(args.size() == 2, "The master function expects 2 arguments."); + int flow_amount = std::stoi(args.at(0)); + double comm_size = std::stod(args.at(1)); + XBT_INFO("Send %.0f bytes, in %d flows", comm_size, flow_amount); + + simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::string("message")); + + simgrid::s4u::this_actor::sleep_for(10); + + /* - Send the task to the @ref worker */ + char* payload = bprintf("%f", comm_size); + + if (flow_amount == 1) { + mailbox->put(payload, comm_size); + } else { + // Start all comms in parallel + std::vector comms; + for (int i = 0; i < flow_amount; i++) + comms.push_back(mailbox->put_async(const_cast("message"), comm_size)); + + // And now, wait for all comms. Manually since wait_all is not part of this_actor yet + for (int i = 0; i < flow_amount; i++) { + simgrid::s4u::CommPtr comm = comms.at(i); + comm->wait(); + } + comms.clear(); + } + XBT_INFO("sender done."); +} + +static void receiver(std::vector args) +{ + int flow_amount = std::stoi(args.at(0)); + + XBT_INFO("Receiving %d flows ...", flow_amount); + + simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::string("message")); + + if (flow_amount == 1) { + void* res = mailbox->get(); + xbt_free(res); + } else { + void* ignored; + + // Start all comms in parallel + std::vector comms; + for (int i = 0; i < flow_amount; i++) + comms.push_back(mailbox->get_async(&ignored)); + + // And now, wait for all comms. Manually since wait_all is not part of this_actor yet + for (int i = 0; i < flow_amount; i++) + comms.at(i)->wait(); + comms.clear(); + } + XBT_INFO("receiver done."); +} + +int main(int argc, char* argv[]) +{ + + simgrid::s4u::Engine e(&argc, argv); + + /* Check if we got --NS3 on the command line, and activate ecofen if so */ + bool NS3 = false; + for (int i = 0; i < argc; i++) { + if (strcmp(argv[i], "--NS3") == 0) + NS3 = true; + if (NS3) // Found the --NS3 parameter previously; shift the rest of the line + argv[i] = argv[i + 1]; + } + if (NS3) { + xbt_die("No Ecofen in this build"); + // XBT_INFO("Activating the Ecofen energy plugin"); + // ns3_link_energy_plugin_init(); + // xbt_cfg_set_parse("network/model:NS3"); + // argc -= 1; // We removed it from the parameters + } else { + XBT_INFO("Activating the SimGrid link energy plugin"); + sg_link_energy_plugin_init(); + } + + xbt_assert(argc > 1, "\nUsage: %s platform_file [flowCount [datasize]] [--NS3]\n" + "\tExample: %s s4uplatform.xml \n" + "\tIf you add NS3 as last parameter, this will try to activate the ecofen plugin.\n" + "\tWithout it, it will use the SimGrid link energy plugin.\n", + argv[0], argv[0]); + e.loadPlatform(argv[1]); + + /* prepare to launch the actors */ + std::vector argSender; + std::vector argReceiver; + if (argc > 2) { + argSender.push_back(argv[2]); // Take the amount of flows from the command line + argReceiver.push_back(argv[2]); + } else { + argSender.push_back("1"); // Default value + argReceiver.push_back("1"); + } + if (argc > 3) { + if (strcmp(argv[3], "random") == 0) { // We're asked to get a random size + /* Initialize the random number generator */ + std::random_device rd; + std::default_random_engine generator(rd()); + + /* Distribution on which to apply the generator */ + std::uniform_int_distribution distribution(min_size, max_size); + + char* size = bprintf("%lu", distribution(generator)); + argSender.push_back(std::string(size)); + xbt_free(size); + } else { // Not "random" ? Then it should be the size to use + argSender.push_back(argv[3]); // Take the datasize from the command line + } + } else { // No parameter at all? Then use the default value + argSender.push_back("25000"); + } + simgrid::s4u::Actor::createActor("sender", simgrid::s4u::Host::by_name("MyHost1"), sender, argSender); + simgrid::s4u::Actor::createActor("receiver", simgrid::s4u::Host::by_name("MyHost2"), receiver, argReceiver); + + /* And now, launch the simulation */ + e.run(); + + return 0; +} diff --git a/examples/s4u/energy-link/s4u-energy-link.tesh b/examples/s4u/energy-link/s4u-energy-link.tesh new file mode 100644 index 0000000000..2622a4b76c --- /dev/null +++ b/examples/s4u/energy-link/s4u-energy-link.tesh @@ -0,0 +1,28 @@ +#! ./tesh + +p Testing the mechanism for computing link energy consumption (using CM02 as a network model) + +$ ${bindir:=.}/s4u-energy-link$EXEEXT ${srcdir:=.}/../platforms/energy_platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=network/model:CM02 --cfg=network/crosstraffic:no +> [ 0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02' +> [ 0.000000] (0:maestro@) Configuration change: Set 'network/crosstraffic' to 'no' +> [ 0.000000] (0:maestro@) Activating the SimGrid link energy plugin +> [ 0.000000] (1:sender@MyHost1) Send 25000 bytes, in 1 flows +> [ 0.000000] (2:receiver@MyHost2) Receiving 1 flows ... +> [ 10.250000] (2:receiver@MyHost2) receiver done. +> [ 10.250000] (1:sender@MyHost1) sender done. +> [ 10.250000] (0:maestro@) Link 'bus' total consumption: 10.750000 +> [ 10.250000] (0:maestro@) Total energy over all links: 10.750000 + +p And now test with 500000 bytes + +$ ${bindir:=.}/s4u-energy-link$EXEEXT ${srcdir:=.}/../platforms/energy_platform.xml 1 50000000 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=network/model:CM02 --cfg=network/crosstraffic:no +> [ 0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02' +> [ 0.000000] (0:maestro@) Configuration change: Set 'network/crosstraffic' to 'no' +> [ 0.000000] (0:maestro@) Activating the SimGrid link energy plugin +> [ 0.000000] (1:sender@MyHost1) Send 50000000 bytes, in 1 flows +> [ 0.000000] (2:receiver@MyHost2) Receiving 1 flows ... +> [510.000000] (2:receiver@MyHost2) receiver done. +> [510.000000] (1:sender@MyHost1) sender done. +> [510.000000] (0:maestro@) Link 'bus' total consumption: 1510.000000 +> [510.000000] (0:maestro@) Total energy over all links: 1510.000000 + diff --git a/examples/s4u/io/s4u-io.cpp b/examples/s4u/io/s4u-io.cpp index fb4bc28113..46a50133c6 100644 --- a/examples/s4u/io/s4u-io.cpp +++ b/examples/s4u/io/s4u-io.cpp @@ -3,6 +3,7 @@ /* 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 #include "simgrid/s4u.hpp" @@ -24,7 +25,7 @@ public: sg_size_t used_size = storage->getSizeUsed(); sg_size_t size = storage->getSize(); - XBT_INFO(" %s (%s) Used: %llu; Free: %llu; Total: %llu.", storage->getName(), mountpoint.c_str(), used_size, + XBT_INFO(" %s (%s) Used: %llu; Free: %llu; Total: %llu.", storage->getCname(), mountpoint.c_str(), used_size, free_size, size); } } @@ -63,21 +64,22 @@ public: file->move(newpath); // Test attaching some user data to the file - file->setUserdata(xbt_strdup("777")); - XBT_INFO("User data attached to the file: %s", static_cast(file->getUserdata())); - xbt_free(file->getUserdata()); + file->setUserdata(new std::string("777")); + std::string* file_data = static_cast(file->getUserdata()); + XBT_INFO("User data attached to the file: %s", file_data->c_str()); + delete file_data; // Close the file delete file; // Now attach some user data to disk1 - XBT_INFO("Get/set data for storage element: %s", storage->getName()); + XBT_INFO("Get/set data for storage element: %s", storage->getCname()); XBT_INFO(" Uninitialized storage data: '%s'", static_cast(storage->getUserdata())); - storage->setUserdata(xbt_strdup("Some user data")); - XBT_INFO(" Set and get data: '%s'", static_cast(storage->getUserdata())); - - xbt_free(storage->getUserdata()); + storage->setUserdata(new std::string("Some user data")); + std::string* storage_data = static_cast(storage->getUserdata()); + XBT_INFO(" Set and get data: '%s'", storage_data->c_str()); + delete storage_data; } }; diff --git a/examples/simdag/daxload/sd_daxload.c b/examples/simdag/daxload/sd_daxload.c index 8276fc92da..e268452deb 100644 --- a/examples/simdag/daxload/sd_daxload.c +++ b/examples/simdag/daxload/sd_daxload.c @@ -7,7 +7,9 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "simgrid/simdag.h" -#include "xbt/file.h" + +#include +#include XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Logging specific to this SimDag example"); @@ -79,9 +81,8 @@ int main(int argc, char **argv) XBT_INFO("------------------- Run the schedule ---------------------------"); SD_simulate(-1); XBT_INFO("------------------- Produce the trace file---------------------------"); - char * basename = xbt_basename(tracefilename); - XBT_INFO("Producing the trace of the run into %s", basename); - free(basename); + char* basename = strrchr(tracefilename, '/'); + XBT_INFO("Producing the trace of the run into %s", basename ? basename + 1 : tracefilename); FILE *out = fopen(tracefilename, "w"); xbt_assert(out, "Cannot write to %s", tracefilename); free(tracefilename); diff --git a/examples/simdag/test/sd_test.cpp b/examples/simdag/test/sd_test.cpp index f5fad58579..affd7b6c08 100644 --- a/examples/simdag/test/sd_test.cpp +++ b/examples/simdag/test/sd_test.cpp @@ -40,7 +40,7 @@ int main(int argc, char **argv) XBT_INFO("Route between %s and %s:", h1->getCname(), h2->getCname()); std::vector route; double latency = 0; - h1->routeTo(h2, &route, &latency); + h1->routeTo(h2, route, &latency); for (auto const& link : route) XBT_INFO(" Link %s: latency = %f, bandwidth = %f", sg_link_name(link), sg_link_latency(link), diff --git a/examples/smpi/mc/bugged1_liveness.c b/examples/smpi/mc/bugged1_liveness.c index 2bf4f879a3..0a527ab28e 100644 --- a/examples/smpi/mc/bugged1_liveness.c +++ b/examples/smpi/mc/bugged1_liveness.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015. The SimGrid Team. +/* Copyright (c) 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -26,7 +26,8 @@ #define REQUEST_TAG 1 #define RELEASE_TAG 2 -int r, cs; +int r; +int cs; int main(int argc, char **argv){ int size; diff --git a/examples/smpi/replay/replay.tesh b/examples/smpi/replay/replay.tesh index 1f2c89f477..5c702a0f34 100644 --- a/examples/smpi/replay/replay.tesh +++ b/examples/smpi/replay/replay.tesh @@ -155,19 +155,16 @@ $ tail -n +3 ./simgrid.trace > 5 5 2 smpi_replay_run_init "0 1 0" > 6 0 2 1 0 "rank-1" > 6 0 3 1 0 "rank-2" -> 12 0 2 1 4 > 12 0 2 1 5 > 13 0 2 1 -> 12 0 2 2 4 > 12 0 2 2 5 > 13 0 2 2 -> 12 0 2 3 4 > 12 0 2 3 5 > 13 0 2 3 > 5 6 2 action_bcast "0 0.78 0.39" > 12 0 2 1 6 -> 12 0 2 3 6 > 12 0 2 2 6 +> 12 0 2 3 6 > 13 0 2 1 > 12 0 2 1 4 > 13 0.015036 2 2 diff --git a/examples/smpi/replay_multiple/replay_multiple.c b/examples/smpi/replay_multiple/replay_multiple.c index a7cfeb5a96..ebb03f3d7f 100644 --- a/examples/smpi/replay_multiple/replay_multiple.c +++ b/examples/smpi/replay_multiple/replay_multiple.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2015. The SimGrid Team. +/* Copyright (c) 2009-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -7,6 +7,9 @@ #include "simgrid/msg.h" #include "mpi.h" +#include +#include + XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example"); static int smpi_replay(int argc, char *argv[]) { @@ -29,10 +32,10 @@ int main(int argc, char *argv[]){ FILE* fp = fopen(argv[1], "r"); if (fp == NULL) xbt_die("Cannot open %s", argv[1]); - char *line = NULL; - size_t n = 0; + char line[2048]; const char* instance_id = NULL; - while (xbt_getline(&line, &n, fp) != -1 ){ + while (fgets(line, sizeof line, fp)) { + xbt_assert(1 + strlen(line) < sizeof line, "input buffer too short (read: %s)", line); xbt_dynar_t elems = xbt_str_split_quoted_in_place(line); if(xbt_dynar_length(elems)<3){ xbt_die ("Not enough elements in the line"); @@ -47,7 +50,6 @@ int main(int argc, char *argv[]){ xbt_free(line_char); } - xbt_free(line); fclose(fp); diff --git a/examples/smpi/replay_multiple/replay_multiple.tesh b/examples/smpi/replay_multiple/replay_multiple.tesh index 3e2ab0a404..d4ba9d26ed 100644 --- a/examples/smpi/replay_multiple/replay_multiple.tesh +++ b/examples/smpi/replay_multiple/replay_multiple.tesh @@ -10,5 +10,5 @@ $ ./replay_multiple description_file ${srcdir:=.}/../../platforms/small_platform > [0.000000] [msg_test/INFO] Initializing instance 1 of size 32 > [0.000000] [msg_test/INFO] Initializing instance 2 of size 32 > [0.000000] [smpi_kernel/INFO] You did not set the power of the host running the simulation. The timings will certainly not be accurate. Use the option "--cfg=smpi/host-speed:" to set its value.Check http://simgrid.org/simgrid/latest/doc/options.html#options_smpi_bench for more information. -> [Jupiter:2:(52) 1140688.493796] [smpi_replay/INFO] Simulation time 1124371.141124 -> [1140688.493796] [msg_test/INFO] Simulation time 1.14069e+06 +> [Jupiter:2:(62) 1140698.106357] [smpi_replay/INFO] Simulation time 1124380.753685 +> [1140698.106357] [msg_test/INFO] Simulation time 1.1407e+06 diff --git a/examples/smpi/trace_simple/trace_simple.tesh b/examples/smpi/trace_simple/trace_simple.tesh index c3c37738be..c6ce7bbca5 100644 --- a/examples/smpi/trace_simple/trace_simple.tesh +++ b/examples/smpi/trace_simple/trace_simple.tesh @@ -14,11 +14,8 @@ $ ../../../smpi_script/bin/smpirun -hostfile ${srcdir:=.}/hostfile -platform ${s p Testing grouped tracing $ ../../../smpi_script/bin/smpirun -trace -trace-grouped -trace-file smpi_trace.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../platforms/small_platform.xml --cfg=path:${srcdir:=.}/../msg -np 3 ./smpi_trace_simple --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning -p Testing generation of viva configuration files -$ ../../../smpi_script/bin/smpirun -trace -trace-resource -trace-viva -trace-file smpi_trace.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../platforms/small_platform.xml --cfg=path:${srcdir:=.}/../msg --cfg=smpi/simulate-computation:no -np 3 ./smpi_trace_simple --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning -> [0.003952] [instr_config/INFO] No categories declared, ignoring generation of viva graph configuration p Testing with parameters but without activating them with the safe switch (-trace) -$ ../../../smpi_script/bin/smpirun -trace-resource -trace-viva -trace-file smpi_trace.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../platforms/small_platform.xml --cfg=path:${srcdir:=.}/../msg -np 3 ./smpi_trace_simple --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning +$ ../../../smpi_script/bin/smpirun -trace-resource -trace-file smpi_trace.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../platforms/small_platform.xml --cfg=path:${srcdir:=.}/../msg -np 3 ./smpi_trace_simple --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning -$ rm -f smpi_trace.trace smpi_uncat.plist smpi_cat.plist +$ rm -f smpi_trace.trace \ No newline at end of file diff --git a/include/simgrid/chrono.hpp b/include/simgrid/chrono.hpp index d3759cad03..8f5b48088c 100644 --- a/include/simgrid/chrono.hpp +++ b/include/simgrid/chrono.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2016-2017. 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. */ @@ -37,7 +37,8 @@ namespace simgrid { * @endcode * */ -struct SimulationClock { +class SimulationClock { +public: using rep = double; using period = std::ratio<1>; using duration = std::chrono::duration; diff --git a/include/simgrid/forward.h b/include/simgrid/forward.h index 45a0af22d4..9a996b94cc 100644 --- a/include/simgrid/forward.h +++ b/include/simgrid/forward.h @@ -56,7 +56,6 @@ namespace surf { class HostImpl; class StorageImpl; class StorageType; - class FileImpl; } namespace trace_mgr { class trace; @@ -80,7 +79,7 @@ typedef simgrid::kernel::context::Context* smx_context_t; typedef simgrid::simix::ActorImpl* smx_actor_t; typedef simgrid::simix::MutexImpl* smx_mutex_t; typedef simgrid::kernel::activity::MailboxImpl* smx_mailbox_t; -typedef simgrid::surf::FileImpl* surf_file_t; +typedef simgrid::surf::StorageImpl* surf_storage_t; #else @@ -98,6 +97,9 @@ typedef struct Trace tmgr_Trace; typedef struct s_smx_context* smx_context_t; typedef struct s_smx_actor* smx_actor_t; +typedef struct s_smx_mutex* smx_mutex_t; +typedef struct s_smx_mailbox* smx_mailbox_t; +typedef struct s_surf_storage* surf_storage_t; #endif diff --git a/include/simgrid/jedule/jedule.hpp b/include/simgrid/jedule/jedule.hpp index ebb956ed2e..eb25b52fbe 100644 --- a/include/simgrid/jedule/jedule.hpp +++ b/include/simgrid/jedule/jedule.hpp @@ -14,9 +14,6 @@ #if SIMGRID_HAVE_JEDULE -XBT_ATTRIB_UNUSED static std::unordered_map host2_simgrid_parent_container; -XBT_ATTRIB_UNUSED static std::unordered_map container_name2container; - namespace simgrid { namespace jedule{ @@ -36,11 +33,9 @@ public: } } -SG_BEGIN_DECL() - +extern "C" { typedef simgrid::jedule::Jedule *jedule_t; - -SG_END_DECL() +} #endif #endif /* JEDULE_HPP_ */ diff --git a/include/simgrid/jedule/jedule_events.hpp b/include/simgrid/jedule/jedule_events.hpp index aa1609959d..704d4f6d22 100644 --- a/include/simgrid/jedule/jedule_events.hpp +++ b/include/simgrid/jedule/jedule_events.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014-2016. The SimGrid Team. +/* Copyright (c) 2010-2012, 2014-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -40,11 +40,9 @@ XBT_PUBLIC_CLASS Event{ } } -SG_BEGIN_DECL() - +extern "C" { typedef simgrid::jedule::Event * jed_event_t; - -SG_END_DECL() +} #endif diff --git a/include/simgrid/jedule/jedule_platform.hpp b/include/simgrid/jedule/jedule_platform.hpp index caaf67225b..9510ad01b0 100644 --- a/include/simgrid/jedule/jedule_platform.hpp +++ b/include/simgrid/jedule/jedule_platform.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014-2016. The SimGrid Team. +/* Copyright (c) 2010-2012, 2014-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -50,12 +50,11 @@ public: } } -SG_BEGIN_DECL() +extern "C" { typedef simgrid::jedule::Container * jed_container_t; typedef simgrid::jedule::Subset * jed_subset_t; void get_resource_selection_by_hosts(std::vector* subset_list, std::vector *host_list); - -SG_END_DECL() +} #endif diff --git a/include/simgrid/kernel/future.hpp b/include/simgrid/kernel/future.hpp index 766d425338..a4db6ece20 100644 --- a/include/simgrid/kernel/future.hpp +++ b/include/simgrid/kernel/future.hpp @@ -207,7 +207,7 @@ public: template void bindPromise(Promise promise, Future future) { - struct PromiseBinder { + class PromiseBinder { public: PromiseBinder(Promise promise) : promise_(std::move(promise)) {} void operator()(Future future) diff --git a/include/simgrid/msg.h b/include/simgrid/msg.h index c6217599bb..b3284ad436 100644 --- a/include/simgrid/msg.h +++ b/include/simgrid/msg.h @@ -51,7 +51,7 @@ typedef sg_host_t msg_host_t; XBT_PUBLIC_DATA(int) sg_storage_max_file_descriptors; /* ******************************** Task ************************************ */ -typedef struct simdata_task *simdata_task_t; +typedef struct s_simdata_task_t* simdata_task_t; typedef struct msg_task { char *name; /**< @brief task name if any */ @@ -169,44 +169,47 @@ XBT_PUBLIC(const char*) MSG_zone_get_property_value(msg_netzone_t as, const char XBT_PUBLIC(void) MSG_zone_set_property_value(msg_netzone_t netzone, const char* name, char* value); XBT_PUBLIC(void) MSG_zone_get_hosts(msg_netzone_t zone, xbt_dynar_t whereto); -static inline XBT_ATTRIB_DEPRECATED_v319("Use MSG_zone_get_root() instead: v3.19 will turn this warning into an error.") - msg_netzone_t MSG_environment_get_routing_root() +XBT_ATTRIB_DEPRECATED_v319( + "Use MSG_zone_get_root() instead: v3.19 will turn this warning into an error.") static inline msg_netzone_t + MSG_environment_get_routing_root() { return MSG_zone_get_root(); } -static inline XBT_ATTRIB_DEPRECATED_v319("Use MSG_zone_get_name() instead: v3.19 will turn this warning into an error.") - const char* MSG_environment_as_get_name(msg_netzone_t zone) +XBT_ATTRIB_DEPRECATED_v319( + "Use MSG_zone_get_name() instead: v3.19 will turn this warning into an error.") static inline const + char* MSG_environment_as_get_name(msg_netzone_t zone) { return MSG_zone_get_name(zone); } -static inline XBT_ATTRIB_DEPRECATED_v319( - "Use MSG_zone_get_by_name() instead: v3.19 will turn this warning into an error.") msg_netzone_t +XBT_ATTRIB_DEPRECATED_v319( + "Use MSG_zone_get_by_name() instead: v3.19 will turn this warning into an error.") static inline msg_netzone_t MSG_environment_as_get_by_name(const char* name) { return MSG_zone_get_by_name(name); } -static inline XBT_ATTRIB_DEPRECATED_v319("Use MSG_zone_get_sons() instead: v3.19 will turn this warning into an error.") - xbt_dict_t MSG_environment_as_get_routing_sons(msg_netzone_t zone) +XBT_ATTRIB_DEPRECATED_v319( + "Use MSG_zone_get_sons() instead: v3.19 will turn this warning into an error.") static inline xbt_dict_t + MSG_environment_as_get_routing_sons(msg_netzone_t zone) { xbt_dict_t res = xbt_dict_new_homogeneous(NULL); MSG_zone_get_sons(zone, res); return res; } -static inline XBT_ATTRIB_DEPRECATED_v319( - "Use MSG_zone_get_property_value() instead: v3.19 will turn this warning into an error.") const +XBT_ATTRIB_DEPRECATED_v319( + "Use MSG_zone_get_property_value() instead: v3.19 will turn this warning into an error.") static inline const char* MSG_environment_as_get_property_value(msg_netzone_t zone, const char* name) { return MSG_zone_get_property_value(zone, name); } -static inline XBT_ATTRIB_DEPRECATED_v319( +XBT_ATTRIB_DEPRECATED_v319( "Use MSG_zone_set_property_value() instead: v3.19 will remove MSG_environment_as_set_property_value() " - "completely.") void MSG_environment_as_set_property_value(msg_netzone_t zone, const char* name, char* value) + "completely.") static inline void MSG_environment_as_set_property_value(msg_netzone_t zone, const char* name, + char* value) { MSG_zone_set_property_value(zone, name, value); } -static inline XBT_ATTRIB_DEPRECATED_v319( - "Use MSG_zone_get_hosts() instead: v3.19 will remove MSG_environment_as_get_hosts() completely.") xbt_dynar_t - MSG_environment_as_get_hosts(msg_netzone_t zone) +XBT_ATTRIB_DEPRECATED_v319("Use MSG_zone_get_hosts() instead: v3.19 will remove MSG_environment_as_get_hosts() " + "completely.") static inline xbt_dynar_t MSG_environment_as_get_hosts(msg_netzone_t zone) { xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), NULL); MSG_zone_get_hosts(zone, res); @@ -262,15 +265,13 @@ XBT_PUBLIC(void) MSG_host_get_process_list(msg_host_t h, xbt_dynar_t whereto); XBT_PUBLIC(int) MSG_host_is_on(msg_host_t h); XBT_PUBLIC(int) MSG_host_is_off(msg_host_t h); -static inline double - XBT_ATTRIB_DEPRECATED_v319("Use MSG_host_get_speed(): v3.19 will drop MSG_get_host_speed() completely.") - MSG_get_host_speed(msg_host_t host) +XBT_ATTRIB_DEPRECATED_v319("Use MSG_host_get_speed(): v3.19 will drop MSG_get_host_speed() " + "completely.") static inline double MSG_get_host_speed(msg_host_t host) { return MSG_host_get_speed(host); } -static inline double XBT_ATTRIB_DEPRECATED_v320( - "Use MSG_host_get_speed(): v3.20 will drop MSG_host_get_current_power_peak() completely.") - MSG_host_get_current_power_peak(msg_host_t host) +XBT_ATTRIB_DEPRECATED_v320("Use MSG_host_get_speed(): v3.20 will drop MSG_host_get_current_power_peak() " + "completely.") static inline double MSG_host_get_current_power_peak(msg_host_t host) { return MSG_host_get_speed(host); } @@ -378,9 +379,15 @@ XBT_PUBLIC(msg_error_t) MSG_process_join(msg_process_t process, double timeout); XBT_PUBLIC(msg_error_t) MSG_process_sleep(double nb_sec); XBT_PUBLIC(void) MSG_task_set_flops_amount(msg_task_t task, double flops_amount); -XBT_PUBLIC(double) MSG_task_get_flops_amount(msg_task_t task); +XBT_ATTRIB_DEPRECATED_v321("Use MSG_task_get_initial_flops_amount if you want to get initial amounts of flops, or " + "Use MSG_task_get_remaining_work_ratio to get task progress (in order " + "to compute progress in flops)") XBT_PUBLIC(double) + MSG_task_get_flops_amount(msg_task_t task); +XBT_PUBLIC(double) MSG_task_get_initial_flops_amount(msg_task_t task); +XBT_PUBLIC(double) MSG_task_get_remaining_work_ratio(msg_task_t task); XBT_PUBLIC(void) MSG_task_set_bytes_amount(msg_task_t task, double bytes_amount); + XBT_PUBLIC(double) MSG_task_get_remaining_communication(msg_task_t task); XBT_PUBLIC(int) MSG_task_is_latency_bounded(msg_task_t task); XBT_PUBLIC(double) MSG_task_get_bytes_amount(msg_task_t task); @@ -402,11 +409,10 @@ XBT_PUBLIC(msg_error_t) MSG_task_receive_bounded(msg_task_t * task, const char * XBT_PUBLIC(msg_comm_t) MSG_task_isend(msg_task_t task, const char *alias); XBT_PUBLIC(msg_comm_t) MSG_task_isend_bounded(msg_task_t task, const char *alias, double maxrate); -XBT_PUBLIC(msg_comm_t) XBT_ATTRIB_DEPRECATED_v320( "This function will be removed from SimGrid v3.20. If you really need this function, please speak up quickly.") - MSG_task_isend_with_matching(msg_task_t task, const char* alias, int (*match_fun)(void*, void*, void*), - void* match_data); + XBT_PUBLIC(msg_comm_t) MSG_task_isend_with_matching(msg_task_t task, const char* alias, + int (*match_fun)(void*, void*, void*), void* match_data); XBT_PUBLIC(void) MSG_task_dsend(msg_task_t task, const char *alias, void_f_pvoid_t cleanup); XBT_PUBLIC(void) MSG_task_dsend_bounded(msg_task_t task, const char *alias, void_f_pvoid_t cleanup, double maxrate); @@ -449,7 +455,8 @@ XBT_PUBLIC(void) MSG_action_exit(); * @ingroup msg_synchro * @hideinitializer */ -typedef struct s_smx_sem *msg_sem_t; // Yeah that's a rename of the smx_sem_t which doesnt require smx_sem_t to be declared here +typedef struct s_smx_sem_t* msg_sem_t; // Yeah that's a rename of the smx_sem_t which doesnt require smx_sem_t to be + // declared here XBT_PUBLIC(msg_sem_t) MSG_sem_init(int initial_value); XBT_PUBLIC(void) MSG_sem_acquire(msg_sem_t sem); XBT_PUBLIC(msg_error_t) MSG_sem_acquire_timeout(msg_sem_t sem, double timeout); @@ -464,7 +471,7 @@ XBT_PUBLIC(int) MSG_sem_would_block(msg_sem_t sem); */ #define MSG_BARRIER_SERIAL_PROCESS -1 -typedef struct s_msg_bar* msg_bar_t; +typedef struct s_msg_bar_t* msg_bar_t; XBT_PUBLIC(msg_bar_t) MSG_barrier_init( unsigned int count); XBT_PUBLIC(void) MSG_barrier_destroy(msg_bar_t bar); XBT_PUBLIC(int) MSG_barrier_wait(msg_bar_t bar); diff --git a/include/simgrid/plugins/energy.h b/include/simgrid/plugins/energy.h index 2a697abfd8..a5663c04bb 100644 --- a/include/simgrid/plugins/energy.h +++ b/include/simgrid/plugins/energy.h @@ -18,6 +18,9 @@ XBT_PUBLIC(double) sg_host_get_wattmin_at(sg_host_t host, int pstate); XBT_PUBLIC(double) sg_host_get_wattmax_at(sg_host_t host, int pstate); XBT_PUBLIC(double) sg_host_get_current_consumption(sg_host_t host); +XBT_PUBLIC(void) sg_link_energy_plugin_init(); +XBT_PUBLIC(double) sg_link_get_consumed_energy(sg_link_t link); + #define MSG_host_energy_plugin_init() sg_host_energy_plugin_init() #define MSG_host_get_consumed_energy(host) sg_host_get_consumed_energy(host) #define MSG_host_get_wattmin_at(host,pstate) sg_host_get_wattmin_at(host,pstate) diff --git a/include/simgrid/s4u/Activity.hpp b/include/simgrid/s4u/Activity.hpp index d0c8b548fc..4568e529ad 100644 --- a/include/simgrid/s4u/Activity.hpp +++ b/include/simgrid/s4u/Activity.hpp @@ -9,7 +9,7 @@ #include #include -typedef enum { inited = 0, started, canceled, errored, finished } e_s4u_activity_state_t; +enum e_s4u_activity_state_t { inited = 0, started, canceled, errored, finished }; namespace simgrid { namespace s4u { diff --git a/include/simgrid/s4u/Actor.hpp b/include/simgrid/s4u/Actor.hpp index b4e58c9ece..92fc4852ce 100644 --- a/include/simgrid/s4u/Actor.hpp +++ b/include/simgrid/s4u/Actor.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-2017. 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. */ @@ -109,17 +109,17 @@ namespace s4u { * * * - * - * + * + * * * * * * - * + * * - * - * + * - * INPI inside an XML PI - * VALUE1 inside a '...'-delimited literal - * VALUE2 inside a "..."-delimited literal - * CDATA inside a section. - * ROOT_ expect root element - * AL_ inside the attribute list for - * IN_ inside a with element contents (ready for end tag) - * IMPOSSIBLE dummy to permit disabling rules; must be last + * PROLOG the XML prolog of the document before + * DOCTYPE the XML prolog of the document after + * EPILOG after the root element + * INCOMMENT inside an XML comment + * INPI inside an XML PI + * VALUE1 inside a '...'-delimited literal + * VALUE2 inside a "..."-delimited literal + * CDATA inside a section. + * ROOT_ expect root element + * AL_ inside the attribute list for + * IN_ inside a with element contents (ready for end tag) + * IMPOSSIBLE dummy to permit disabling rules; must be last */ /* State names. */ @@ -1642,7 +1627,7 @@ FILE *dax_get_out (void ); void dax_set_out (FILE * _out_str ); -yy_size_t dax_get_leng (void ); + int dax_get_leng (void ); char *dax_get_text (void ); @@ -1663,7 +1648,7 @@ extern int dax_wrap (void ); #endif #ifndef YY_NO_UNPUT - + #endif #ifndef yytext_ptr @@ -1687,11 +1672,11 @@ static int input (void ); static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = NULL; - + static void yy_push_state (int _new_state ); - + static void yy_pop_state (void ); - + /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ @@ -1707,7 +1692,7 @@ static int input (void ); /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( dax_text, dax_leng, 1, dax_out )) {} } while (0) +#define ECHO do { if (fwrite( dax_text, (size_t) dax_leng, 1, dax_out )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -1715,33 +1700,33 @@ static int input (void ); */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( dax_in )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( dax_in ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, dax_in))==0 && ferror(dax_in)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(dax_in); \ - } \ - }\ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + ssize_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( dax_in )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( dax_in ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, max_size, dax_in))==0 && ferror(dax_in)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(dax_in); \ + } \ + }\ \ #endif @@ -1790,43 +1775,43 @@ extern int dax_lex (void); #endif #define YY_RULE_SETUP \ - YY_USER_ACTION + YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - - if ( !(yy_init) ) - { - (yy_init) = 1; + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) + { + (yy_init) = 1; #ifdef YY_USER_INIT - YY_USER_INIT; + YY_USER_INIT; #endif - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ - if ( ! dax_in ) - dax_in = stdin; + if ( ! dax_in ) + dax_in = stdin; - if ( ! dax_out ) - dax_out = stdout; + if ( ! dax_out ) + dax_out = stdout; - if ( ! YY_CURRENT_BUFFER ) { - dax_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - dax__create_buffer(dax_in,YY_BUF_SIZE ); - } + if ( ! YY_CURRENT_BUFFER ) { + dax_ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + dax__create_buffer(dax_in,YY_BUF_SIZE ); + } - dax__load_buffer_state( ); - } + dax__load_buffer_state( ); + } - { + { /* Bypass Flex's default INITIAL state and begin by parsing the XML prolog. */ SET(PROLOG); @@ -1890,146 +1875,146 @@ YY_DECL /* COMMENTS and PIs: handled uniformly for efficiency. */ - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); - /* Support of dax_text. */ - *yy_cp = (yy_hold_char); + /* Support of dax_text. */ + *yy_cp = (yy_hold_char); - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; - yy_current_state = (yy_start); + yy_current_state = (yy_start); yy_match: - do - { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - 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 >= 775 ) - 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] != 2135 ); + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + 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 >= 775 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 2135 ); yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) - { - yy_size_t yyl; - for ( yyl = 0; yyl < dax_leng; ++yyl ) - if ( dax_text[yyl] == '\n' ) - + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + unsigned int yyl; + for ( yyl = 0; yyl < dax_leng; ++yyl ) + if ( dax_text[yyl] == '\n' ) + dax_lineno++; ; - } + } -do_action: /* This label is used only to access EOF actions. */ +do_action: /* This label is used only to access EOF actions. */ - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; case 1: YY_RULE_SETUP ENTER(INCOMMENT); - YY_BREAK + YY_BREAK case 2: YY_RULE_SETUP ENTER(INPI); - YY_BREAK + YY_BREAK case 3: YY_RULE_SETUP LEAVE; - YY_BREAK + YY_BREAK case 4: case 5: case 6: /* rule 6 can match eol */ YY_RULE_SETUP SKIP; - YY_BREAK + YY_BREAK case YY_STATE_EOF(INCOMMENT): FAIL("EOF in comment."); - YY_BREAK + YY_BREAK case 7: YY_RULE_SETUP LEAVE; - YY_BREAK + YY_BREAK case 8: case 9: /* rule 9 can match eol */ YY_RULE_SETUP SKIP; - YY_BREAK + YY_BREAK case YY_STATE_EOF(INPI): FAIL("EOF in PI (processing instruction)."); - YY_BREAK + YY_BREAK /* SPACES: skipped uniformly */ case 10: /* rule 10 can match eol */ YY_RULE_SETUP SKIP; - YY_BREAK + YY_BREAK /* PROLOG: determine root element and process it. */ case 11: /* rule 11 can match eol */ YY_RULE_SETUP -SET(ROOT_dax__adag); - YY_BREAK +SET(ROOT_dax__adag); + YY_BREAK case 12: /* rule 12 can match eol */ YY_RULE_SETUP FAIL("Bad declaration %s.",dax_text); - YY_BREAK + YY_BREAK case 13: /* rule 13 can match eol */ YY_RULE_SETUP SET(ROOT_dax__adag); - YY_BREAK + YY_BREAK case 14: /* rule 14 can match eol */ YY_RULE_SETUP FAIL("Bad declaration %s.",dax_text); - YY_BREAK + YY_BREAK case 15: YY_RULE_SETUP FAIL("Unexpected character `%c' in prolog.", dax_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(PROLOG): case YY_STATE_EOF(DOCTYPE): FAIL("EOF in prolog."); - YY_BREAK + YY_BREAK /* RULES DERIVED FROM DTD. */ /* */ @@ -2037,7 +2022,7 @@ case 16: /* rule 16 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 17: /* rule 17 can match eol */ YY_RULE_SETUP @@ -2064,114 +2049,114 @@ YY_RULE_SETUP dax__adag_xsi_c_schemaLocation_isset = 0; ENTER(AL_dax__adag); pushbuffer(0); } - YY_BREAK + YY_BREAK case 18: /* rule 18 can match eol */ YY_RULE_SETUP if (dax__adag_childCount_isset != 0) {FAIL("Multiple definition of attribute childCount in ");} dax__adag_childCount_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_childCount); - YY_BREAK + YY_BREAK case 19: /* rule 19 can match eol */ YY_RULE_SETUP if (dax__adag_childCount_isset != 0) {FAIL("Multiple definition of attribute childCount in ");} dax__adag_childCount_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_childCount); - YY_BREAK + YY_BREAK case 20: /* rule 20 can match eol */ YY_RULE_SETUP if (dax__adag_count_isset != 0) {FAIL("Multiple definition of attribute count in ");} dax__adag_count_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_count); - YY_BREAK + YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP if (dax__adag_count_isset != 0) {FAIL("Multiple definition of attribute count in ");} dax__adag_count_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_count); - YY_BREAK + YY_BREAK case 22: /* rule 22 can match eol */ YY_RULE_SETUP if (dax__adag_fileCount_isset != 0) {FAIL("Multiple definition of attribute fileCount in ");} dax__adag_fileCount_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_fileCount); - YY_BREAK + YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP if (dax__adag_fileCount_isset != 0) {FAIL("Multiple definition of attribute fileCount in ");} dax__adag_fileCount_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_fileCount); - YY_BREAK + YY_BREAK case 24: /* rule 24 can match eol */ YY_RULE_SETUP if (dax__adag_index_isset != 0) {FAIL("Multiple definition of attribute index in ");} dax__adag_index_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_index); - YY_BREAK + YY_BREAK case 25: /* rule 25 can match eol */ YY_RULE_SETUP if (dax__adag_index_isset != 0) {FAIL("Multiple definition of attribute index in ");} dax__adag_index_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_index); - YY_BREAK + YY_BREAK case 26: /* rule 26 can match eol */ YY_RULE_SETUP if (dax__adag_jobCount_isset != 0) {FAIL("Multiple definition of attribute jobCount in ");} dax__adag_jobCount_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_jobCount); - YY_BREAK + YY_BREAK case 27: /* rule 27 can match eol */ YY_RULE_SETUP if (dax__adag_jobCount_isset != 0) {FAIL("Multiple definition of attribute jobCount in ");} dax__adag_jobCount_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_jobCount); - YY_BREAK + YY_BREAK case 28: /* rule 28 can match eol */ YY_RULE_SETUP if (dax__adag_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} dax__adag_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_name); - YY_BREAK + YY_BREAK case 29: /* rule 29 can match eol */ YY_RULE_SETUP if (dax__adag_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} dax__adag_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_name); - YY_BREAK + YY_BREAK case 30: /* rule 30 can match eol */ YY_RULE_SETUP if (dax__adag_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} dax__adag_version_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_version); - YY_BREAK + YY_BREAK case 31: /* rule 31 can match eol */ YY_RULE_SETUP if (dax__adag_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} dax__adag_version_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_version); - YY_BREAK + YY_BREAK case 32: /* rule 32 can match eol */ YY_RULE_SETUP if (dax__adag_xmlns_isset != 0) {FAIL("Multiple definition of attribute xmlns in ");} dax__adag_xmlns_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_xmlns); - YY_BREAK + YY_BREAK case 33: /* rule 33 can match eol */ YY_RULE_SETUP if (dax__adag_xmlns_isset != 0) {FAIL("Multiple definition of attribute xmlns in ");} dax__adag_xmlns_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_xmlns); - YY_BREAK + YY_BREAK case 34: /* rule 34 can match eol */ YY_RULE_SETUP if (dax__adag_xmlns_c_xsi_isset != 0) {FAIL("Multiple definition of attribute xmlns:xsi in ");} dax__adag_xmlns_c_xsi_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_xmlns_c_xsi); - YY_BREAK + YY_BREAK case 35: /* rule 35 can match eol */ YY_RULE_SETUP if (dax__adag_xmlns_c_xsi_isset != 0) {FAIL("Multiple definition of attribute xmlns:xsi in ");} dax__adag_xmlns_c_xsi_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_xmlns_c_xsi); - YY_BREAK + YY_BREAK case 36: /* rule 36 can match eol */ YY_RULE_SETUP if (dax__adag_xsi_c_schemaLocation_isset != 0) {FAIL("Multiple definition of attribute xsi:schemaLocation in ");} dax__adag_xsi_c_schemaLocation_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__adag_xsi_c_schemaLocation); - YY_BREAK + YY_BREAK case 37: /* rule 37 can match eol */ YY_RULE_SETUP if (dax__adag_xsi_c_schemaLocation_isset != 0) {FAIL("Multiple definition of attribute xsi:schemaLocation in ");} dax__adag_xsi_c_schemaLocation_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__adag_xsi_c_schemaLocation); - YY_BREAK + YY_BREAK case 38: YY_RULE_SETUP { LEAVE; STag_dax__adag();dax__pcdata_ix = 0; ENTER(S_dax__adag); } - YY_BREAK + YY_BREAK case 39: YY_RULE_SETUP { @@ -2180,18 +2165,18 @@ YY_RULE_SETUP case ROOT_dax__adag: SET(EPILOG); break; } } - YY_BREAK + YY_BREAK case 40: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of adag element.", dax_text[0]); - YY_BREAK + YY_BREAK case 41: YY_RULE_SETUP FAIL("Bad attribute `%s' in `adag' element start tag.",dax_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_dax__adag): FAIL("EOF in attribute list of `adag' element."); - YY_BREAK + YY_BREAK case 42: /* rule 42 can match eol */ @@ -2204,29 +2189,29 @@ YY_RULE_SETUP case ROOT_dax__adag: SET(EPILOG); break; } } - YY_BREAK + YY_BREAK case 43: /* rule 43 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",dax_text); - YY_BREAK + YY_BREAK case 44: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_dax__adag): case YY_STATE_EOF(S_dax__adag): case YY_STATE_EOF(S_dax__adag_1): case YY_STATE_EOF(S_dax__adag_3): case YY_STATE_EOF(S_dax__adag_5): FAIL("Premature EOF: `' expected."); - YY_BREAK + YY_BREAK case 45: /* rule 45 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 46: /* rule 46 can match eol */ YY_RULE_SETUP @@ -2235,25 +2220,25 @@ YY_RULE_SETUP dax__child_ref_isset = 0; ENTER(AL_dax__child); pushbuffer(0); } - YY_BREAK + YY_BREAK case 47: /* rule 47 can match eol */ YY_RULE_SETUP if (dax__child_ref_isset != 0) {FAIL("Multiple definition of attribute ref in ");} dax__child_ref_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__child_ref); - YY_BREAK + YY_BREAK case 48: /* rule 48 can match eol */ YY_RULE_SETUP if (dax__child_ref_isset != 0) {FAIL("Multiple definition of attribute ref in ");} dax__child_ref_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__child_ref); - YY_BREAK + YY_BREAK case 49: 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; ENTER(S_dax__child); } - YY_BREAK + YY_BREAK case 50: YY_RULE_SETUP { @@ -2263,18 +2248,18 @@ YY_RULE_SETUP case S_dax__adag: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag_4: case S_dax__adag_5: SET(S_dax__adag_5); break; } } - YY_BREAK + YY_BREAK case 51: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of child element.", dax_text[0]); - YY_BREAK + YY_BREAK case 52: YY_RULE_SETUP FAIL("Bad attribute `%s' in `child' element start tag.",dax_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_dax__child): FAIL("EOF in attribute list of `child' element."); - YY_BREAK + YY_BREAK case 53: /* rule 53 can match eol */ @@ -2287,27 +2272,27 @@ YY_RULE_SETUP case S_dax__adag: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag_4: case S_dax__adag_5: SET(S_dax__adag_5); break; } } - YY_BREAK + YY_BREAK case 54: /* rule 54 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",dax_text); - YY_BREAK + YY_BREAK case 55: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_dax__child): case YY_STATE_EOF(S_dax__child): case YY_STATE_EOF(S_dax__child_2): FAIL("Premature EOF: `' expected."); - YY_BREAK + YY_BREAK case 56: /* rule 56 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 57: /* rule 57 can match eol */ YY_RULE_SETUP @@ -2326,68 +2311,68 @@ YY_RULE_SETUP dax__job_version_isset = 0; ENTER(AL_dax__job); pushbuffer(0); } - YY_BREAK + YY_BREAK case 58: /* rule 58 can match eol */ YY_RULE_SETUP if (dax__job_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} dax__job_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__job_id); - YY_BREAK + YY_BREAK case 59: /* rule 59 can match eol */ YY_RULE_SETUP if (dax__job_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} dax__job_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__job_id); - YY_BREAK + YY_BREAK case 60: /* rule 60 can match eol */ YY_RULE_SETUP if (dax__job_level_isset != 0) {FAIL("Multiple definition of attribute level in ");} dax__job_level_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__job_level); - YY_BREAK + YY_BREAK case 61: /* rule 61 can match eol */ YY_RULE_SETUP if (dax__job_level_isset != 0) {FAIL("Multiple definition of attribute level in ");} dax__job_level_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__job_level); - YY_BREAK + YY_BREAK case 62: /* rule 62 can match eol */ YY_RULE_SETUP if (dax__job_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} dax__job_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__job_name); - YY_BREAK + YY_BREAK case 63: /* rule 63 can match eol */ YY_RULE_SETUP if (dax__job_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} dax__job_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__job_name); - YY_BREAK + YY_BREAK case 64: /* rule 64 can match eol */ YY_RULE_SETUP if (dax__job_namespace_isset != 0) {FAIL("Multiple definition of attribute namespace in ");} dax__job_namespace_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__job_namespace); - YY_BREAK + YY_BREAK case 65: /* rule 65 can match eol */ YY_RULE_SETUP if (dax__job_namespace_isset != 0) {FAIL("Multiple definition of attribute namespace in ");} dax__job_namespace_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__job_namespace); - YY_BREAK + YY_BREAK case 66: /* rule 66 can match eol */ YY_RULE_SETUP if (dax__job_runtime_isset != 0) {FAIL("Multiple definition of attribute runtime in ");} dax__job_runtime_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__job_runtime); - YY_BREAK + YY_BREAK case 67: /* rule 67 can match eol */ YY_RULE_SETUP if (dax__job_runtime_isset != 0) {FAIL("Multiple definition of attribute runtime in ");} dax__job_runtime_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__job_runtime); - YY_BREAK + YY_BREAK case 68: /* rule 68 can match eol */ YY_RULE_SETUP if (dax__job_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} dax__job_version_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__job_version); - YY_BREAK + YY_BREAK case 69: /* rule 69 can match eol */ YY_RULE_SETUP if (dax__job_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} dax__job_version_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__job_version); - YY_BREAK + YY_BREAK case 70: YY_RULE_SETUP { @@ -2396,7 +2381,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; ENTER(S_dax__job); } - YY_BREAK + YY_BREAK case 71: YY_RULE_SETUP { @@ -2408,18 +2393,18 @@ YY_RULE_SETUP case S_dax__adag: case S_dax__adag_2: case S_dax__adag_3: SET(S_dax__adag_3); break; } } - YY_BREAK + YY_BREAK case 72: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of job element.", dax_text[0]); - YY_BREAK + YY_BREAK case 73: YY_RULE_SETUP FAIL("Bad attribute `%s' in `job' element start tag.",dax_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_dax__job): FAIL("EOF in attribute list of `job' element."); - YY_BREAK + YY_BREAK case 74: /* rule 74 can match eol */ @@ -2432,27 +2417,27 @@ YY_RULE_SETUP case S_dax__adag: case S_dax__adag_2: case S_dax__adag_3: SET(S_dax__adag_3); break; } } - YY_BREAK + YY_BREAK case 75: /* rule 75 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",dax_text); - YY_BREAK + YY_BREAK case 76: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_dax__job): case YY_STATE_EOF(S_dax__job): case YY_STATE_EOF(S_dax__job_2): FAIL("Premature EOF: `' expected."); - YY_BREAK + YY_BREAK case 77: /* rule 77 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 78: /* rule 78 can match eol */ YY_RULE_SETUP @@ -2461,25 +2446,25 @@ YY_RULE_SETUP dax__parent_ref_isset = 0; ENTER(AL_dax__parent); pushbuffer(0); } - YY_BREAK + YY_BREAK case 79: /* rule 79 can match eol */ YY_RULE_SETUP if (dax__parent_ref_isset != 0) {FAIL("Multiple definition of attribute ref in ");} dax__parent_ref_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__parent_ref); - YY_BREAK + YY_BREAK case 80: /* rule 80 can match eol */ YY_RULE_SETUP if (dax__parent_ref_isset != 0) {FAIL("Multiple definition of attribute ref in ");} dax__parent_ref_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__parent_ref); - YY_BREAK + YY_BREAK case 81: YY_RULE_SETUP { if (!AX_dax__parent_ref) FAIL("Required attribute `ref' not set for `parent' element."); LEAVE; STag_dax__parent();dax__pcdata_ix = 0; ENTER(E_dax__parent); } - YY_BREAK + YY_BREAK case 82: YY_RULE_SETUP { @@ -2489,18 +2474,18 @@ YY_RULE_SETUP case S_dax__child: case S_dax__child_1: case S_dax__child_2: SET(S_dax__child_2); break; } } - YY_BREAK + YY_BREAK case 83: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of parent element.", dax_text[0]); - YY_BREAK + YY_BREAK case 84: YY_RULE_SETUP FAIL("Bad attribute `%s' in `parent' element start tag.",dax_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_dax__parent): FAIL("EOF in attribute list of `parent' element."); - YY_BREAK + YY_BREAK case 85: /* rule 85 can match eol */ @@ -2513,19 +2498,19 @@ YY_RULE_SETUP case S_dax__child: case S_dax__child_1: case S_dax__child_2: SET(S_dax__child_2); break; } } - YY_BREAK + YY_BREAK case 86: /* rule 86 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",dax_text); - YY_BREAK + YY_BREAK case 87: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_dax__parent): FAIL("Premature EOF: `' expected."); - YY_BREAK + YY_BREAK /* * */ @@ -2533,7 +2518,7 @@ case 88: /* rule 88 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 89: /* rule 89 can match eol */ YY_RULE_SETUP @@ -2554,94 +2539,94 @@ YY_RULE_SETUP dax__uses_type_isset = 0; ENTER(AL_dax__uses); pushbuffer(0); } - YY_BREAK + YY_BREAK case 90: /* rule 90 can match eol */ YY_RULE_SETUP if (dax__uses_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} dax__uses_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__uses_file); - YY_BREAK + YY_BREAK case 91: /* rule 91 can match eol */ YY_RULE_SETUP if (dax__uses_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} dax__uses_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__uses_file); - YY_BREAK + YY_BREAK case 92: /* rule 92 can match eol */ case 93: /* rule 93 can match eol */ YY_RULE_SETUP A_dax__uses_link = A_dax__uses_link_input; - YY_BREAK + YY_BREAK case 94: /* rule 94 can match eol */ case 95: /* rule 95 can match eol */ YY_RULE_SETUP A_dax__uses_link = A_dax__uses_link_output; - YY_BREAK + YY_BREAK case 96: /* rule 96 can match eol */ case 97: /* rule 97 can match eol */ YY_RULE_SETUP A_dax__uses_optional = A_dax__uses_optional_false; - YY_BREAK + YY_BREAK case 98: /* rule 98 can match eol */ case 99: /* rule 99 can match eol */ YY_RULE_SETUP A_dax__uses_optional = A_dax__uses_optional_true; - YY_BREAK + YY_BREAK case 100: /* rule 100 can match eol */ case 101: /* rule 101 can match eol */ YY_RULE_SETUP A_dax__uses_register = A_dax__uses_register_false; - YY_BREAK + YY_BREAK case 102: /* rule 102 can match eol */ case 103: /* rule 103 can match eol */ YY_RULE_SETUP A_dax__uses_register = A_dax__uses_register_true; - YY_BREAK + YY_BREAK case 104: /* rule 104 can match eol */ YY_RULE_SETUP if (dax__uses_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} dax__uses_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__uses_size); - YY_BREAK + YY_BREAK case 105: /* rule 105 can match eol */ YY_RULE_SETUP if (dax__uses_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} dax__uses_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__uses_size); - YY_BREAK + YY_BREAK case 106: /* rule 106 can match eol */ case 107: /* rule 107 can match eol */ YY_RULE_SETUP A_dax__uses_transfer = A_dax__uses_transfer_false; - YY_BREAK + YY_BREAK case 108: /* rule 108 can match eol */ case 109: /* rule 109 can match eol */ YY_RULE_SETUP A_dax__uses_transfer = A_dax__uses_transfer_true; - YY_BREAK + YY_BREAK case 110: /* rule 110 can match eol */ YY_RULE_SETUP if (dax__uses_type_isset != 0) {FAIL("Multiple definition of attribute type in ");} dax__uses_type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_dax__uses_type); - YY_BREAK + YY_BREAK case 111: /* rule 111 can match eol */ YY_RULE_SETUP if (dax__uses_type_isset != 0) {FAIL("Multiple definition of attribute type in ");} dax__uses_type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_dax__uses_type); - YY_BREAK + YY_BREAK case 112: YY_RULE_SETUP { @@ -2649,7 +2634,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; ENTER(E_dax__uses); } - YY_BREAK + YY_BREAK case 113: YY_RULE_SETUP { @@ -2660,18 +2645,18 @@ YY_RULE_SETUP case S_dax__job: case S_dax__job_1: case S_dax__job_2: SET(S_dax__job_2); break; } } - YY_BREAK + YY_BREAK case 114: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of uses element.", dax_text[0]); - YY_BREAK + YY_BREAK case 115: YY_RULE_SETUP FAIL("Bad attribute `%s' in `uses' element start tag.",dax_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_dax__uses): FAIL("EOF in attribute list of `uses' element."); - YY_BREAK + YY_BREAK case 116: /* rule 116 can match eol */ @@ -2684,29 +2669,29 @@ YY_RULE_SETUP case S_dax__job: case S_dax__job_1: case S_dax__job_2: SET(S_dax__job_2); break; } } - YY_BREAK + YY_BREAK case 117: /* rule 117 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",dax_text); - YY_BREAK + YY_BREAK case 118: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_dax__uses): FAIL("Premature EOF: `' expected."); - YY_BREAK + YY_BREAK /* EPILOG: after the root element. */ case 119: YY_RULE_SETUP {SET(PROLOG); yyless(0); CLEANUP; return -1;} - YY_BREAK + YY_BREAK case YY_STATE_EOF(EPILOG): SUCCEED; - YY_BREAK + YY_BREAK /* CHARACTER DATA. */ @@ -2714,32 +2699,32 @@ SUCCEED; case 120: YY_RULE_SETUP BUFFERPUTC('&'); - YY_BREAK + YY_BREAK case 121: YY_RULE_SETUP BUFFERPUTC('<'); - YY_BREAK + YY_BREAK case 122: YY_RULE_SETUP BUFFERPUTC('>'); - YY_BREAK + YY_BREAK case 123: YY_RULE_SETUP BUFFERPUTC('\''); - YY_BREAK + YY_BREAK case 124: YY_RULE_SETUP BUFFERPUTC('"'); - YY_BREAK + YY_BREAK /* Character entities. */ case 125: YY_RULE_SETUP BUFFERPUTC((unsigned char)atoi(dax_text+2)); - YY_BREAK + YY_BREAK case 126: YY_RULE_SETUP BUFFERPUTC((unsigned char)strtol(dax_text+3,NULL,16)); - YY_BREAK + YY_BREAK case 127: /* rule 127 can match eol */ @@ -2751,55 +2736,55 @@ case 130: /* rule 130 can match eol */ YY_RULE_SETUP BUFFERPUTC('\n'); - YY_BREAK + YY_BREAK case 131: YY_RULE_SETUP ENTER(CDATA); - YY_BREAK + YY_BREAK case 132: YY_RULE_SETUP FAIL("Unexpected `]""]>' in character data."); - YY_BREAK + YY_BREAK case 133: YY_RULE_SETUP BUFFERDONE; LEAVE; - YY_BREAK + YY_BREAK case YY_STATE_EOF(VALUE1): FAIL("EOF in literal (\"'\" expected)."); - YY_BREAK + YY_BREAK case 134: YY_RULE_SETUP BUFFERDONE; LEAVE; - YY_BREAK + YY_BREAK case YY_STATE_EOF(VALUE2): FAIL("EOF in literal (`\"' expected)."); - YY_BREAK + YY_BREAK case 135: /* rule 135 can match eol */ YY_RULE_SETUP BUFFERPUTC(dax_text[0]); - YY_BREAK + YY_BREAK case 136: YY_RULE_SETUP FAIL("Spurious `%c' in character data.",dax_text[0]); - YY_BREAK + YY_BREAK case 137: YY_RULE_SETUP LEAVE; - YY_BREAK -/* "]""]" BUFFERPUTC(dax_text[0]); BUFFERPUTC(dax_text[1]); */ + YY_BREAK +/* "]""]" BUFFERPUTC(dax_text[0]); BUFFERPUTC(dax_text[1]); */ case 138: YY_RULE_SETUP BUFFERPUTC(dax_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(CDATA): FAIL("EOF in CDATA section."); - YY_BREAK + YY_BREAK /* Impossible rules to avoid warnings from flex(1). */ /* Ideally, this should be replaced by code in flexml.pl that @@ -2809,12 +2794,12 @@ case 139: /* rule 139 can match eol */ YY_RULE_SETUP FAIL("Syntax error on character `%c'.", dax_text[0]); - YY_BREAK + YY_BREAK case 140: YY_RULE_SETUP ECHO; - YY_BREAK + YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(ROOT_dax__adag): case YY_STATE_EOF(S_dax__adag_2): @@ -2822,332 +2807,332 @@ case YY_STATE_EOF(S_dax__adag_4): case YY_STATE_EOF(S_dax__child_1): case YY_STATE_EOF(S_dax__job_1): case YY_STATE_EOF(IMPOSSIBLE): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed dax_in at a new source and called - * dax_lex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = dax_in; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( dax_wrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * dax_text, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed dax_in at a new source and called + * dax_lex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = dax_in; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( dax_wrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * dax_text, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of dax_lex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = (yytext_ptr); - yy_size_t number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - - else - { - yy_size_t num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - yy_size_t new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - dax_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ( (yy_n_chars) == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - dax_restart(dax_in ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((int) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) dax_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + dax_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + dax_restart(dax_in ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) dax_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; + return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { - yy_state_type yy_current_state; - char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - 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 >= 775 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; + yy_state_type yy_current_state; + char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + 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 >= 775 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + } + + return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis - * next_state = yy_try_NUL_trans( current_state ); + * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { - int yy_is_jam; - char *yy_cp = (yy_c_buf_p); - - YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - 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 >= 775 ) - 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 == 774); - - return yy_is_jam ? 0 : yy_current_state; + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + 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 >= 775 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + yy_is_jam = (yy_current_state == 774); + + return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT @@ -3162,185 +3147,185 @@ static int yy_get_next_buffer (void) #endif { - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - dax_restart(dax_in ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( dax_wrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + dax_restart(dax_in ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( dax_wrap( ) ) + return 0; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; #ifdef __cplusplus - return yyinput(); + return yyinput(); #else - return input(); + return input(); #endif - } + } - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } - - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve dax_text */ - (yy_hold_char) = *++(yy_c_buf_p); + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } - if ( c == '\n' ) + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve dax_text */ + (yy_hold_char) = *++(yy_c_buf_p); + if ( c == '\n' ) + dax_lineno++; ; - return c; + return c; } -#endif /* ifndef YY_NO_INPUT */ +#endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. - * + * * @note This function does not reset the start condition to @c INITIAL . */ void dax_restart (FILE * input_file ) { - - if ( ! YY_CURRENT_BUFFER ){ + + if ( ! YY_CURRENT_BUFFER ){ dax_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = + YY_CURRENT_BUFFER_LVALUE = dax__create_buffer(dax_in,YY_BUF_SIZE ); - } + } - dax__init_buffer(YY_CURRENT_BUFFER,input_file ); - dax__load_buffer_state( ); + dax__init_buffer(YY_CURRENT_BUFFER,input_file ); + dax__load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. - * + * */ void dax__switch_to_buffer (YY_BUFFER_STATE new_buffer ) { - - /* TODO. We should be able to replace this entire function body - * with - * dax_pop_buffer_state(); - * dax_push_buffer_state(new_buffer); + + /* TODO. We should be able to replace this entire function body + * with + * dax_pop_buffer_state(); + * dax_push_buffer_state(new_buffer); */ - dax_ensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - dax__load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (dax_wrap()) processing, but the only time this flag - * is looked at is after dax_wrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; + dax_ensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + dax__load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (dax_wrap()) processing, but the only time this flag + * is looked at is after dax_wrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; } static void dax__load_buffer_state (void) { - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - dax_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + dax_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * + * * @return the allocated buffer state. */ YY_BUFFER_STATE dax__create_buffer (FILE * file, int size ) { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) dax_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in dax__create_buffer()" ); + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) dax_alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in dax__create_buffer()" ); - b->yy_buf_size = (yy_size_t)size; + b->yy_buf_size = (yy_size_t)size; - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) dax_alloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in dax__create_buffer()" ); + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) dax_alloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in dax__create_buffer()" ); - b->yy_is_our_buffer = 1; + b->yy_is_our_buffer = 1; - dax__init_buffer(b,file ); + dax__init_buffer(b,file ); - return b; + return b; } /** Destroy the buffer. * @param b a buffer created with dax__create_buffer() - * + * */ void dax__delete_buffer (YY_BUFFER_STATE b ) { + + if ( ! b ) + return; - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - if ( b->yy_is_our_buffer ) - dax_free((void *) b->yy_ch_buf ); + if ( b->yy_is_our_buffer ) + dax_free((void *) b->yy_ch_buf ); - dax_free((void *) b ); + dax_free((void *) b ); } /* Initializes or reinitializes a buffer. @@ -3350,12 +3335,12 @@ static void dax__load_buffer_state (void) static void dax__init_buffer (YY_BUFFER_STATE b, FILE * file ) { - int oerrno = errno; + int oerrno = errno; + + dax__flush_buffer(b ); - dax__flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; + b->yy_input_file = file; + b->yy_fill_buffer = 1; /* If b is the current buffer, then dax__init_buffer was _probably_ * called from dax_restart() or through yy_get_next_buffer. @@ -3367,87 +3352,87 @@ static void dax__load_buffer_state (void) } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; + + errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * + * */ void dax__flush_buffer (YY_BUFFER_STATE b ) { - if ( ! b ) - return; + if ( ! b ) + return; - b->yy_n_chars = 0; + b->yy_n_chars = 0; - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - b->yy_buf_pos = &b->yy_ch_buf[0]; + b->yy_buf_pos = &b->yy_ch_buf[0]; - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == YY_CURRENT_BUFFER ) - dax__load_buffer_state( ); + if ( b == YY_CURRENT_BUFFER ) + dax__load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. - * + * */ void dax_push_buffer_state (YY_BUFFER_STATE new_buffer ) { - if (new_buffer == NULL) - return; + if (new_buffer == NULL) + return; - dax_ensure_buffer_stack(); + dax_ensure_buffer_stack(); - /* This block is copied from dax__switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } + /* This block is copied from dax__switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; - /* copied from dax__switch_to_buffer. */ - dax__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; + /* copied from dax__switch_to_buffer. */ + dax__load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. - * + * */ void dax_pop_buffer_state (void) { - if (!YY_CURRENT_BUFFER) - return; + if (!YY_CURRENT_BUFFER) + return; - dax__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); + dax__delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); - if (YY_CURRENT_BUFFER) { - dax__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } + if (YY_CURRENT_BUFFER) { + dax__load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } } /* Allocates the stack if it does not exist. @@ -3455,205 +3440,205 @@ void dax_pop_buffer_state (void) */ static void dax_ensure_buffer_stack (void) { - yy_size_t num_to_alloc; - - if (!(yy_buffer_stack)) { + int num_to_alloc; + + if (!(yy_buffer_stack)) { - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - (yy_buffer_stack) = (struct yy_buffer_state**)dax_alloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in dax_ensure_buffer_stack()" ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)dax_realloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in dax_ensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + (yy_buffer_stack) = (struct yy_buffer_state**)dax_alloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in dax_ensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)dax_realloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in dax_ensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer - * + * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE dax__scan_buffer (char * base, yy_size_t size ) { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) dax_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in dax__scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - dax__switch_to_buffer(b ); - - return b; + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE) dax_alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in dax__scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + dax__switch_to_buffer(b ); + + return b; } /** Setup the input buffer state to scan a string. The next call to dax_lex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan - * + * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * dax__scan_bytes() instead. */ YY_BUFFER_STATE dax__scan_string (yyconst char * yystr ) { - - return dax__scan_bytes(yystr,strlen(yystr) ); + + return dax__scan_bytes(yystr,(int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to dax_lex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. - * + * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE dax__scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - yy_size_t i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) dax_alloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in dax__scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = dax__scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in dax__scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; +YY_BUFFER_STATE dax__scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) dax_alloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in dax__scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = dax__scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in dax__scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; } static void yy_push_state (int _new_state ) { - if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) - { - yy_size_t new_size; + if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) + { + yy_size_t new_size; - (yy_start_stack_depth) += YY_START_STACK_INCR; - new_size = (yy_start_stack_depth) * sizeof( int ); + (yy_start_stack_depth) += YY_START_STACK_INCR; + new_size = (yy_size_t) (yy_start_stack_depth) * sizeof( int ); - if ( ! (yy_start_stack) ) - (yy_start_stack) = (int *) dax_alloc(new_size ); + if ( ! (yy_start_stack) ) + (yy_start_stack) = (int *) dax_alloc(new_size ); - else - (yy_start_stack) = (int *) dax_realloc((void *) (yy_start_stack),new_size ); + else + (yy_start_stack) = (int *) dax_realloc((void *) (yy_start_stack),new_size ); - if ( ! (yy_start_stack) ) - YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); - } + if ( ! (yy_start_stack) ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); + } - (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; + (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; - BEGIN(_new_state); + BEGIN(_new_state); } static void yy_pop_state (void) { - if ( --(yy_start_stack_ptr) < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); + if ( --(yy_start_stack_ptr) < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); - BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); + BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) +static void yynoreturn yy_fatal_error (yyconst char* msg ) { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ - do \ - { \ - /* Undo effects of setting up dax_text. */ \ + do \ + { \ + /* Undo effects of setting up dax_text. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ - dax_text[dax_leng] = (yy_hold_char); \ - (yy_c_buf_p) = dax_text + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - dax_leng = yyless_macro_arg; \ - } \ - while ( 0 ) + dax_text[dax_leng] = (yy_hold_char); \ + (yy_c_buf_p) = dax_text + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + dax_leng = yyless_macro_arg; \ + } \ + while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. - * + * */ int dax_get_lineno (void) { - + return dax_lineno; } /** Get the input stream. - * + * */ FILE *dax_get_in (void) { @@ -3661,7 +3646,7 @@ FILE *dax_get_in (void) } /** Get the output stream. - * + * */ FILE *dax_get_out (void) { @@ -3669,15 +3654,15 @@ FILE *dax_get_out (void) } /** Get the length of the current token. - * + * */ -yy_size_t dax_get_leng (void) +int dax_get_leng (void) { return dax_leng; } /** Get the current token. - * + * */ char *dax_get_text (void) @@ -3687,18 +3672,18 @@ char *dax_get_text (void) /** Set the current line number. * @param _line_number line number - * + * */ void dax_set_lineno (int _line_number ) { - + dax_lineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. - * + * * @see dax__switch_to_buffer */ void dax_set_in (FILE * _in_str ) @@ -3729,11 +3714,11 @@ static int yy_init_globals (void) /* We do not touch dax_lineno unless the option is enabled. */ dax_lineno = 1; - - (yy_buffer_stack) = 0; + + (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; + (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; @@ -3746,8 +3731,8 @@ static int yy_init_globals (void) dax_in = stdin; dax_out = stdout; #else - dax_in = (FILE *) 0; - dax_out = (FILE *) 0; + dax_in = NULL; + dax_out = NULL; #endif /* For future reference: Set errno on error, since we are called by @@ -3759,17 +3744,17 @@ static int yy_init_globals (void) /* dax_lex_destroy is for both reentrant and non-reentrant scanners. */ int dax_lex_destroy (void) { - + /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - dax__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - dax_pop_buffer_state(); - } + while(YY_CURRENT_BUFFER){ + dax__delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + dax_pop_buffer_state(); + } - /* Destroy the stack itself. */ - dax_free((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; + /* Destroy the stack itself. */ + dax_free((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; /* Destroy the start condition stack. */ dax_free((yy_start_stack) ); @@ -3789,45 +3774,45 @@ int dax_lex_destroy (void) #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { - - int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { - int n; - for ( n = 0; s[n]; ++n ) - ; + int n; + for ( n = 0; s[n]; ++n ) + ; - return n; + return n; } #endif void *dax_alloc (yy_size_t size ) { - return (void *) malloc( size ); + return malloc(size); } void *dax_realloc (void * ptr, yy_size_t size ) { - - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); } void dax_free (void * ptr ) { - free( (char *) ptr ); /* see dax_realloc() for (char *) cast */ + free( (char *) ptr ); /* see dax_realloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" @@ -3836,8 +3821,8 @@ void dax_free (void * ptr ) int dax__element_context(int i) { return (0 @@ -14,11 +14,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_daxparse, sd, "Parsing DAX files"); extern "C" { -# undef CLEANUP -# include "dax_dtd.h" -# define register /* g++ don't like register, so don't say it */ -# include "dax_dtd.c" -# undef register +#include "dax_dtd.h" +#include "dax_dtd.c" } /* Ensure that transfer tasks have unique names even though a file is used several times */ @@ -244,9 +241,8 @@ xbt_dynar_t SD_daxload(const char *filename) } if (not acyclic_graph_detail(result)) { - char* base = xbt_basename(filename); - XBT_ERROR("The DAX described in %s is not a DAG. It contains a cycle.", base); - free(base); + std::string base = simgrid::xbt::Path(filename).getBasename(); + XBT_ERROR("The DAX described in %s is not a DAG. It contains a cycle.", base.c_str()); xbt_dynar_foreach(result, cpt, file) SD_task_destroy(file); xbt_dynar_free_container(&result); diff --git a/src/simdag/sd_dotloader.cpp b/src/simdag/sd_dotloader.cpp index 8e3f73676e..b4f8b3b733 100644 --- a/src/simdag/sd_dotloader.cpp +++ b/src/simdag/sd_dotloader.cpp @@ -7,7 +7,7 @@ #include "simdag_private.hpp" #include "simgrid/simdag.h" #include "src/internal_config.h" -#include "xbt/file.h" +#include "xbt/file.hpp" #include #include @@ -238,9 +238,8 @@ xbt_dynar_t SD_dotload_generic(const char* filename, bool sequential, bool sched } if (result && not acyclic_graph_detail(result)) { - char* base = xbt_basename(filename); - XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", base); - free(base); + std::string base = simgrid::xbt::Path(filename).getBasename(); + XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", base.c_str()); xbt_dynar_free(&result); result = nullptr; } diff --git a/src/simdag/sd_task.cpp b/src/simdag/sd_task.cpp index 978bb6b1ba..42b7142230 100644 --- a/src/simdag/sd_task.cpp +++ b/src/simdag/sd_task.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2016. The SimGrid Team. +/* Copyright (c) 2006-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -7,6 +7,7 @@ #include "simdag_private.hpp" #include "src/surf/HostImpl.hpp" #include "src/surf/surf_interface.hpp" +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_task, sd, "Logging specific to SimDag (task)"); @@ -798,20 +799,16 @@ void SD_task_run(SD_task_t task) /* Copy the elements of the task into the action */ int host_nb = task->allocation->size(); - sg_host_t *hosts = xbt_new(sg_host_t, host_nb); - int i =0; - for (auto const& host : *task->allocation) { - hosts[i] = host; - i++; - } + sg_host_t* hosts = new sg_host_t[host_nb]; + std::copy_n(task->allocation->begin(), host_nb, hosts); - double *flops_amount = xbt_new0(double, host_nb); - double *bytes_amount = xbt_new0(double, host_nb * host_nb); + double* flops_amount = new double[host_nb](); + double* bytes_amount = new double[host_nb * host_nb](); if(task->flops_amount) - memcpy(flops_amount, task->flops_amount, sizeof(double) * host_nb); + std::copy_n(task->flops_amount, host_nb, flops_amount); if(task->bytes_amount) - memcpy(bytes_amount, task->bytes_amount, sizeof(double) * host_nb * host_nb); + std::copy_n(task->bytes_amount, host_nb * host_nb, bytes_amount); task->surf_action = surf_host_model->executeParallelTask(host_nb, hosts, flops_amount, bytes_amount, task->rate); @@ -885,7 +882,8 @@ void SD_task_build_MxN_1D_block_matrix(SD_task_t task, int src_nb, int dst_nb){ XBT_VERB("(%d->%d): (%.2f, %.2f)-> (%.2f, %.2f)", i, j, src_start, src_end, dst_start, dst_end); task->bytes_amount[i*(src_nb+dst_nb)+src_nb+j]=0.0; if ((src_end > dst_start) && (dst_end > src_start)) { /* There is something to send */ - task->bytes_amount[i*(src_nb+dst_nb)+src_nb+j] = MIN(src_end, dst_end)- MAX(src_start, dst_start); + task->bytes_amount[i * (src_nb + dst_nb) + src_nb + j] = + std::min(src_end, dst_end) - std::max(src_start, dst_start); XBT_VERB("==> %.2f", task->bytes_amount[i*(src_nb+dst_nb)+src_nb+j]); } } @@ -973,12 +971,12 @@ void SD_task_schedulev(SD_task_t task, int count, const sg_host_t * list) void SD_task_schedulel(SD_task_t task, int count, ...) { va_list ap; - sg_host_t *list = xbt_new(sg_host_t, count); + sg_host_t* list = new sg_host_t[count]; va_start(ap, count); for (int i=0; i #include #include -#include "simgrid/simdag.h" -#include "surf/surf.h" #ifndef SIMDAG_PRIVATE_HPP #define SIMDAG_PRIVATE_HPP @@ -34,11 +34,11 @@ std::set* simulate (double how_long); } } -SG_BEGIN_DECL() +extern "C" { extern XBT_PRIVATE simgrid::sd::Global *sd_global; /* Task */ -typedef struct SD_task { +struct s_SD_task_t { e_SD_task_state_t state; void *data; /* user data */ char *name; @@ -63,7 +63,7 @@ typedef struct SD_task { double *flops_amount; double *bytes_amount; double rate; -} s_SD_task_t; +}; /* SimDag private functions */ XBT_PRIVATE void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state); @@ -71,5 +71,5 @@ XBT_PRIVATE void SD_task_run(SD_task_t task); XBT_PRIVATE bool acyclic_graph_detail(xbt_dynar_t dag); XBT_PRIVATE void uniq_transfer_task_name(SD_task_t task); XBT_PRIVATE const char *__get_state_name(e_SD_task_state_t state); -SG_END_DECL() +} #endif diff --git a/src/simgrid/host.cpp b/src/simgrid/host.cpp index 3d528ae554..51da4ba691 100644 --- a/src/simgrid/host.cpp +++ b/src/simgrid/host.cpp @@ -12,7 +12,7 @@ #include "xbt/dict.h" #include "src/kernel/routing/NetPoint.hpp" -#include "src/simix/smx_host_private.h" +#include "src/simix/smx_host_private.hpp" #include "src/surf/HostImpl.hpp" #include "src/surf/cpu_interface.hpp" @@ -126,7 +126,7 @@ xbt_dict_t sg_host_get_mounted_storage_list(sg_host_t host){ for (auto const& elm : host->getMountedStorages()) { const char* mount_name = elm.first.c_str(); sg_storage_t storage = elm.second; - xbt_dict_set(res, mount_name, (void*)storage->getName(), nullptr); + xbt_dict_set(res, mount_name, (void*)storage->getCname(), nullptr); } return res; @@ -217,7 +217,7 @@ void sg_host_set_property_value(sg_host_t host, const char* name, const char* va void sg_host_route(sg_host_t from, sg_host_t to, xbt_dynar_t links) { std::vector vlinks; - from->routeTo(to, &vlinks, nullptr); + from->routeTo(to, vlinks, nullptr); for (auto const& link : vlinks) xbt_dynar_push(links, &link); } @@ -231,7 +231,7 @@ double sg_host_route_latency(sg_host_t from, sg_host_t to) { std::vector vlinks; double res = 0; - from->routeTo(to, &vlinks, &res); + from->routeTo(to, vlinks, &res); return res; } /** @@ -245,7 +245,7 @@ double sg_host_route_bandwidth(sg_host_t from, sg_host_t to) double min_bandwidth = -1.0; std::vector vlinks; - from->routeTo(to, &vlinks, nullptr); + from->routeTo(to, vlinks, nullptr); for (auto const& link : vlinks) { double bandwidth = link->bandwidth(); if (bandwidth < min_bandwidth || min_bandwidth < 0.0) diff --git a/src/simgrid/sg_config.cpp b/src/simgrid/sg_config.cpp index 0c10cd45fb..281feaa58c 100644 --- a/src/simgrid/sg_config.cpp +++ b/src/simgrid/sg_config.cpp @@ -1,27 +1,26 @@ -/* Copyright (c) 2009-2010, 2012-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2017. 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. */ -/* sg_config: configuration infrastructure for the simulation world */ +/* sg_config: configuration infrastructure for the simulation world */ -#include "xbt/misc.h" +#include "simgrid/sg_config.h" +#include "instr/instr_interface.h" +#include "mc/mc.h" +#include "simgrid/instr.h" +#include "simgrid/simix.h" +#include "simgrid_config.h" /* what was compiled in? */ +#include "src/mc/mc_replay.hpp" +#include "src/surf/surf_interface.hpp" +#include "surf/maxmin.hpp" +#include "surf/surf.hpp" #include "xbt/config.h" #include "xbt/config.hpp" #include "xbt/log.h" #include "xbt/mallocator.h" +#include "xbt/misc.h" #include "xbt/sysdep.h" -#include "surf/surf.h" -#include "surf/maxmin.h" -#include "instr/instr_interface.h" -#include "simgrid/simix.h" -#include "simgrid/sg_config.h" -#include "simgrid_config.h" /* what was compiled in? */ -#include "mc/mc.h" -#include "simgrid/instr.h" -#include "src/mc/mc_replay.h" -#include "src/surf/surf_interface.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_config, surf, "About the configuration of SimGrid"); @@ -112,11 +111,11 @@ static void _sg_cfg_cb__plugin(const char *name) { xbt_assert(_sg_cfg_init_status < 2, "Cannot load a plugin after the initialization"); - char *val = xbt_cfg_get_string(name); - if (val==nullptr || val[0] == '\0') + std::string val = xbt_cfg_get_string(name); + if (val.empty()) return; - if (not strcmp(val, "help")) { + if (val == "help") { model_help("plugin", surf_plugin_description); sg_cfg_exit_early(); } @@ -130,8 +129,8 @@ static void _sg_cfg_cb__host_model(const char *name) { xbt_assert(_sg_cfg_init_status < 2, "Cannot change the model after the initialization"); - char *val = xbt_cfg_get_string(name); - if (not strcmp(val, "help")) { + std::string val = xbt_cfg_get_string(name); + if (val == "help") { model_help("host", surf_host_model_description); sg_cfg_exit_early(); } @@ -145,8 +144,8 @@ static void _sg_cfg_cb__cpu_model(const char *name) { xbt_assert(_sg_cfg_init_status < 2, "Cannot change the model after the initialization"); - char *val = xbt_cfg_get_string(name); - if (not strcmp(val, "help")) { + std::string val = xbt_cfg_get_string(name); + if (val == "help") { model_help("CPU", surf_cpu_model_description); sg_cfg_exit_early(); } @@ -160,8 +159,8 @@ static void _sg_cfg_cb__optimization_mode(const char *name) { xbt_assert(_sg_cfg_init_status < 2, "Cannot change the model after the initialization"); - char *val = xbt_cfg_get_string(name); - if (not strcmp(val, "help")) { + std::string val = xbt_cfg_get_string(name); + if (val == "help") { model_help("optimization", surf_optimization_mode_description); sg_cfg_exit_early(); } @@ -175,8 +174,8 @@ static void _sg_cfg_cb__storage_mode(const char *name) { xbt_assert(_sg_cfg_init_status < 2, "Cannot change the model after the initialization"); - char *val = xbt_cfg_get_string(name); - if (not strcmp(val, "help")) { + std::string val = xbt_cfg_get_string(name); + if (val == "help") { model_help("storage", surf_storage_model_description); sg_cfg_exit_early(); } @@ -189,8 +188,8 @@ static void _sg_cfg_cb__network_model(const char *name) { xbt_assert(_sg_cfg_init_status < 2, "Cannot change the model after the initialization"); - char *val = xbt_cfg_get_string(name); - if (not strcmp(val, "help")) { + std::string val = xbt_cfg_get_string(name); + if (val == "help") { model_help("network", surf_network_model_description); sg_cfg_exit_early(); } @@ -203,8 +202,6 @@ static void _sg_cfg_cb__network_model(const char *name) static void _sg_cfg_cb_model_check_replay(const char *name) { MC_record_path = xbt_cfg_get_string(name); - if (MC_record_path[0] == '\0') - MC_record_path = nullptr; } #if SIMGRID_HAVE_MC @@ -250,15 +247,14 @@ static void _sg_cfg_cb_contexts_parallel_threshold(const char *name) static void _sg_cfg_cb_contexts_parallel_mode(const char *name) { - const char* mode_name = xbt_cfg_get_string(name); - if (not strcmp(mode_name, "posix")) { + std::string mode_name = xbt_cfg_get_string(name); + if (mode_name == "posix") { SIMIX_context_set_parallel_mode(XBT_PARMAP_POSIX); - } else if (not strcmp(mode_name, "futex")) { + } else if (mode_name == "futex") { SIMIX_context_set_parallel_mode(XBT_PARMAP_FUTEX); - } else if (not strcmp(mode_name, "busy_wait")) { + } else if (mode_name == "busy_wait") { SIMIX_context_set_parallel_mode(XBT_PARMAP_BUSY_WAIT); - } - else { + } else { xbt_die("Command line setting of the parallel synchronization mode should " "be one of \"posix\", \"futex\" or \"busy_wait\""); } @@ -300,7 +296,7 @@ void sg_config_init(int *argc, char **argv) /* Plugins configuration */ describe_model(description, descsize, surf_plugin_description, "plugin", "The plugins"); - xbt_cfg_register_string("plugin", nullptr, &_sg_cfg_cb__plugin, description); + xbt_cfg_register_string("plugin", "", &_sg_cfg_cb__plugin, description); describe_model(description, descsize, surf_cpu_model_description, "model", "The model to use for the CPU"); xbt_cfg_register_string("cpu/model", "Cas01", &_sg_cfg_cb__cpu_model, description); @@ -555,13 +551,8 @@ void sg_config_init(int *argc, char **argv) "Whether to cleanup SimGrid at exit. Disable it if your code segfaults after its end."); xbt_cfg_register_alias("clean-atexit","clean_atexit"); - if (surf_path.empty()) { - /* retrieves the current directory of the current process */ - const char *initial_path = __surf_get_initial_path(); - xbt_assert((initial_path), "__surf_get_initial_path() failed! Can't resolve current Windows directory"); - - xbt_cfg_setdefault_string("path", initial_path); - } + if (surf_path.empty()) + xbt_cfg_setdefault_string("path", "./"); _sg_cfg_init_status = 1; diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 49d14cbada..ed204c90b5 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -20,13 +20,13 @@ #include "mc/mc.h" -#include "smx_private.h" +#include "smx_private.hpp" #include "src/kernel/activity/SleepImpl.hpp" #include "src/kernel/activity/SynchroIo.hpp" #include "src/kernel/activity/SynchroRaw.hpp" -#include "src/mc/mc_replay.h" +#include "src/mc/mc_replay.hpp" #include "src/mc/remote/Client.hpp" -#include "src/msg/msg_private.h" +#include "src/msg/msg_private.hpp" #include "src/surf/cpu_interface.hpp" #include "src/surf/surf_interface.hpp" @@ -169,7 +169,7 @@ void ActorImpl::daemonize() simgrid::s4u::Actor* ActorImpl::restart() { - XBT_DEBUG("Restarting process %s on %s", cname(), host->getCname()); + XBT_DEBUG("Restarting process %s on %s", getCname(), host->getCname()); // retrieve the arguments of the old process // FIXME: Factorize this with SIMIX_host_add_auto_restart_process ? @@ -346,12 +346,12 @@ smx_actor_t SIMIX_process_create(const char* name, std::function code, v /* Now insert it in the global process list and in the process to run list */ simix_global->process_list[process->pid] = process; - XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->getCname()); + XBT_DEBUG("Inserting %s(%s) in the to_run list", process->getCname(), host->getCname()); simix_global->process_to_run.push_back(process); intrusive_ptr_add_ref(process); /* Tracing the process creation */ - TRACE_msg_process_create(process->cname(), process->pid, process->host); + TRACE_msg_process_create(process->getName(), process->pid, process->host); return process; } @@ -410,11 +410,11 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn /* Now insert it in the global process list and in the process to run list */ simix_global->process_list[process->pid] = process; - XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->getCname()); + XBT_DEBUG("Inserting %s(%s) in the to_run list", process->getCname(), host->getCname()); simix_global->process_to_run.push_back(process); /* Tracing the process creation */ - TRACE_msg_process_create(process->cname(), process->pid, process->host); + TRACE_msg_process_create(process->getName(), process->pid, process->host); auto context = dynamic_cast(process->context); if (not context) @@ -464,7 +464,7 @@ void SIMIX_process_runall() */ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { - XBT_DEBUG("Killing process %s@%s", process->cname(), process->host->getCname()); + XBT_DEBUG("Killing process %s@%s", process->getCname(), process->host->getCname()); process->context->iwannadie = 1; process->blocked = 0; @@ -718,7 +718,7 @@ void SIMIX_process_sleep_destroy(smx_activity_t synchro) */ void SIMIX_process_yield(smx_actor_t self) { - XBT_DEBUG("Yield actor '%s'", self->cname()); + XBT_DEBUG("Yield actor '%s'", self->getCname()); /* Go into sleep and return control to maestro */ self->context->suspend(); @@ -738,11 +738,11 @@ void SIMIX_process_yield(smx_actor_t self) SIMIX_process_on_exit_runall(self); /* Add the process to the list of process to restart, only if the host is down */ if (self->auto_restart && self->host->isOff()) { - SIMIX_host_add_auto_restart_process(self->host, self->cname(), self->code, self->userdata, + SIMIX_host_add_auto_restart_process(self->host, self->getCname(), self->code, self->userdata, SIMIX_timer_get_date(self->kill_timer), self->getProperties(), self->auto_restart); } - XBT_DEBUG("Process %s@%s is dead", self->cname(), self->host->getCname()); + XBT_DEBUG("Process %s@%s is dead", self->getCname(), self->host->getCname()); self->context->stop(); } diff --git a/src/simix/ActorImpl.hpp b/src/simix/ActorImpl.hpp index dcdea7a9d1..06d42dc7da 100644 --- a/src/simix/ActorImpl.hpp +++ b/src/simix/ActorImpl.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2017. 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. */ @@ -7,17 +7,16 @@ #define SIMIX_ACTORIMPL_H #include "simgrid/s4u/Actor.hpp" -#include "src/simix/popping_private.h" +#include "src/simix/popping_private.hpp" #include "src/surf/PropertyHolder.hpp" #include "xbt/swag.h" #include #include -typedef struct s_smx_process_exit_fun { +struct s_smx_process_exit_fun_t { int_f_pvoid_pvoid_t fun; void *arg; -} s_smx_process_exit_fun_t; -typedef s_smx_process_exit_fun_t* smx_process_exit_fun_t; +}; namespace simgrid { namespace simix { @@ -47,7 +46,8 @@ public: aid_t pid = 0; aid_t ppid = -1; simgrid::xbt::string name; - const char* cname() { return name.c_str(); } + const simgrid::xbt::string& getName() const { return name; } + const char* getCname() const { return name.c_str(); } s4u::Host* host = nullptr; /* the host on which the process is running */ smx_context_t context = nullptr; /* the context (uctx/raw/thread) that executes the user function */ @@ -122,7 +122,7 @@ typedef simgrid::simix::ProcessArg *smx_process_arg_t; typedef simgrid::simix::ActorImpl* smx_actor_t; -SG_BEGIN_DECL() +extern "C" { XBT_PRIVATE smx_actor_t SIMIX_process_create(const char* name, std::function code, void* data, sg_host_t host, std::map* properties, @@ -142,8 +142,7 @@ XBT_PRIVATE smx_actor_t SIMIX_process_get_by_name(const char* name); XBT_PRIVATE void SIMIX_process_auto_restart_set(smx_actor_t process, int auto_restart); extern void (*SMPI_switch_data_segment)(int dest); - -SG_END_DECL() +} XBT_PRIVATE void SIMIX_process_sleep_destroy(smx_activity_t synchro); XBT_PRIVATE smx_activity_t SIMIX_process_join(smx_actor_t issuer, smx_actor_t process, double timeout); diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index b26dcb7393..6af48805e9 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -5,8 +5,7 @@ /* */ /* This is somehow the "libc" of SimGrid */ -/* Copyright (c) 2010-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. 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. */ @@ -19,12 +18,12 @@ #include "simgrid/s4u/VirtualMachine.hpp" #include "simgrid/simix.hpp" #include "simgrid/simix/blocking_simcall.hpp" -#include "smx_private.h" +#include "smx_private.hpp" #include "src/kernel/activity/CommImpl.hpp" #include "src/mc/mc_forward.hpp" -#include "src/mc/mc_replay.h" +#include "src/mc/mc_replay.hpp" #include "src/plugins/vm/VirtualMachineImpl.hpp" -#include "src/simix/smx_host_private.h" +#include "src/simix/smx_host_private.hpp" #include "xbt/ex.h" #include "xbt/functional.hpp" @@ -35,7 +34,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix); void simcall_call(smx_actor_t actor) { if (actor != simix_global->maestro_process) { - XBT_DEBUG("Yield actor '%s' on simcall %s (%d)", actor->cname(), SIMIX_simcall_name(actor->simcall.call), + XBT_DEBUG("Yield actor '%s' on simcall %s (%d)", actor->getCname(), SIMIX_simcall_name(actor->simcall.call), (int)actor->simcall.call); SIMIX_process_yield(actor); } else { @@ -242,7 +241,7 @@ void simcall_process_set_kill_time(smx_actor_t process, double kill_time) if (kill_time <= SIMIX_get_clock() || simix_global->kill_process_function == nullptr) return; - XBT_DEBUG("Set kill time %f for process %s@%s", kill_time, process->cname(), process->host->getCname()); + XBT_DEBUG("Set kill time %f for process %s@%s", kill_time, process->getCname(), process->host->getCname()); process->kill_timer = SIMIX_timer_set(kill_time, [process] { simix_global->kill_process_function(process); process->kill_timer=nullptr; @@ -506,9 +505,7 @@ void simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex) * \ingroup simix_synchro_management * */ -void simcall_cond_wait_timeout(smx_cond_t cond, - smx_mutex_t mutex, - double timeout) +void simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) { xbt_assert(std::isfinite(timeout), "timeout is not finite!"); simcall_BODY_cond_wait_timeout(cond, mutex, timeout); @@ -542,22 +539,14 @@ void simcall_sem_acquire_timeout(smx_sem_t sem, double timeout) simcall_BODY_sem_acquire_timeout(sem, timeout); } -/** - * \ingroup simix_file_management - * - */ -sg_size_t simcall_file_read(surf_file_t fd, sg_size_t size) +sg_size_t simcall_storage_read(surf_storage_t st, sg_size_t size) { - return simcall_BODY_file_read(fd, size); + return simcall_BODY_storage_read(st, size); } -/** - * \ingroup simix_file_management - * - */ -sg_size_t simcall_file_write(surf_file_t fd, sg_size_t size) +sg_size_t simcall_storage_write(surf_storage_t st, sg_size_t size) { - return simcall_BODY_file_write(fd, size); + return simcall_BODY_storage_write(st, size); } void simcall_run_kernel(std::function const& code) diff --git a/src/simix/popping.cpp b/src/simix/popping.cpp index 6210e32576..2672a4a86c 100644 --- a/src/simix/popping.cpp +++ b/src/simix/popping.cpp @@ -3,10 +3,10 @@ /* 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 "smx_private.h" +#include "smx_private.hpp" #include "xbt/xbt_os_thread.h" #if SIMGRID_HAVE_MC -#include "src/mc/mc_private.h" +#include "src/mc/mc_private.hpp" #endif #include "src/kernel/activity/CommImpl.hpp" diff --git a/src/simix/popping_accessors.h b/src/simix/popping_accessors.hpp similarity index 88% rename from src/simix/popping_accessors.h rename to src/simix/popping_accessors.hpp index a101a80017..020056e3f0 100644 --- a/src/simix/popping_accessors.h +++ b/src/simix/popping_accessors.hpp @@ -14,7 +14,7 @@ * That's not about http://en.wikipedia.org/wiki/Poop, despite the odor :) */ -#include "src/simix/popping_private.h" +#include "src/simix/popping_private.hpp" static inline int simcall_process_killall__get__reset_pid(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->args[0]); @@ -86,8 +86,9 @@ static inline int simcall_process_join__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_process_join__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_process_join__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } static inline double simcall_process_sleep__get__duration(smx_simcall_t simcall) @@ -110,8 +111,9 @@ static inline int simcall_process_sleep__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_process_sleep__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_process_sleep__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } static inline const char* simcall_execution_start__get__name(smx_simcall_t simcall) @@ -162,8 +164,7 @@ static inline void simcall_execution_start__set__bound(smx_simcall_t simcall, do { simgrid::simix::marshal(simcall->args[3], arg); } -static inline boost::intrusive_ptr -simcall_execution_start__get__result(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_execution_start__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->result); } @@ -171,9 +172,7 @@ static inline simgrid::kernel::activity::ExecImpl* simcall_execution_start__getr { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void -simcall_execution_start__set__result(smx_simcall_t simcall, - boost::intrusive_ptr result) +static inline void simcall_execution_start__set__result(smx_simcall_t simcall, boost::intrusive_ptr result) { simgrid::simix::marshal>(simcall->result, result); } @@ -262,25 +261,20 @@ static inline void simcall_execution_parallel_start__set__timeout(smx_simcall_t { simgrid::simix::marshal(simcall->args[6], arg); } -static inline boost::intrusive_ptr -simcall_execution_parallel_start__get__result(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_execution_parallel_start__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->result); } -static inline simgrid::kernel::activity::ExecImpl* -simcall_execution_parallel_start__getraw__result(smx_simcall_t simcall) +static inline simgrid::kernel::activity::ExecImpl* simcall_execution_parallel_start__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void -simcall_execution_parallel_start__set__result(smx_simcall_t simcall, - boost::intrusive_ptr result) +static inline void simcall_execution_parallel_start__set__result(smx_simcall_t simcall, boost::intrusive_ptr result) { simgrid::simix::marshal>(simcall->result, result); } -static inline boost::intrusive_ptr -simcall_execution_wait__get__execution(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_execution_wait__get__execution(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->args[0]); } @@ -288,9 +282,7 @@ static inline simgrid::kernel::activity::ActivityImpl* simcall_execution_wait__g { return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void -simcall_execution_wait__set__execution(smx_simcall_t simcall, - boost::intrusive_ptr arg) +static inline void simcall_execution_wait__set__execution(smx_simcall_t simcall, boost::intrusive_ptr arg) { simgrid::simix::marshal>(simcall->args[0], arg); } @@ -302,8 +294,9 @@ static inline int simcall_execution_wait__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_execution_wait__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_execution_wait__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } static inline smx_actor_t simcall_process_on_exit__get__process(smx_simcall_t simcall) @@ -391,8 +384,7 @@ static inline void simcall_comm_iprobe__set__data(smx_simcall_t simcall, void* a { simgrid::simix::marshal(simcall->args[3], arg); } -static inline boost::intrusive_ptr -simcall_comm_iprobe__get__result(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_comm_iprobe__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->result); } @@ -400,9 +392,7 @@ static inline simgrid::kernel::activity::ActivityImpl* simcall_comm_iprobe__getr { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void -simcall_comm_iprobe__set__result(smx_simcall_t simcall, - boost::intrusive_ptr result) +static inline void simcall_comm_iprobe__set__result(smx_simcall_t simcall, boost::intrusive_ptr result) { simgrid::simix::marshal>(simcall->result, result); } @@ -660,8 +650,7 @@ static inline void simcall_comm_isend__set__detached(smx_simcall_t simcall, int { simgrid::simix::marshal(simcall->args[10], arg); } -static inline boost::intrusive_ptr -simcall_comm_isend__get__result(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_comm_isend__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->result); } @@ -669,8 +658,7 @@ static inline simgrid::kernel::activity::ActivityImpl* simcall_comm_isend__getra { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_comm_isend__set__result(smx_simcall_t simcall, - boost::intrusive_ptr result) +static inline void simcall_comm_isend__set__result(smx_simcall_t simcall, boost::intrusive_ptr result) { simgrid::simix::marshal>(simcall->result, result); } @@ -880,8 +868,7 @@ static inline void simcall_comm_irecv__set__rate(smx_simcall_t simcall, double a { simgrid::simix::marshal(simcall->args[7], arg); } -static inline boost::intrusive_ptr -simcall_comm_irecv__get__result(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_comm_irecv__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->result); } @@ -889,8 +876,7 @@ static inline simgrid::kernel::activity::ActivityImpl* simcall_comm_irecv__getra { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_comm_irecv__set__result(smx_simcall_t simcall, - boost::intrusive_ptr result) +static inline void simcall_comm_irecv__set__result(smx_simcall_t simcall, boost::intrusive_ptr result) { simgrid::simix::marshal>(simcall->result, result); } @@ -927,12 +913,12 @@ static inline int simcall_comm_waitany__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } -static inline boost::intrusive_ptr -simcall_comm_wait__get__comm(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_comm_wait__get__comm(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->args[0]); } @@ -940,8 +926,7 @@ static inline simgrid::kernel::activity::ActivityImpl* simcall_comm_wait__getraw { return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void simcall_comm_wait__set__comm(smx_simcall_t simcall, - boost::intrusive_ptr arg) +static inline void simcall_comm_wait__set__comm(smx_simcall_t simcall, boost::intrusive_ptr arg) { simgrid::simix::marshal>(simcall->args[0], arg); } @@ -958,8 +943,7 @@ static inline void simcall_comm_wait__set__timeout(smx_simcall_t simcall, double simgrid::simix::marshal(simcall->args[1], arg); } -static inline boost::intrusive_ptr -simcall_comm_test__get__comm(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_comm_test__get__comm(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->args[0]); } @@ -967,8 +951,7 @@ static inline simgrid::kernel::activity::ActivityImpl* simcall_comm_test__getraw { return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void simcall_comm_test__set__comm(smx_simcall_t simcall, - boost::intrusive_ptr arg) +static inline void simcall_comm_test__set__comm(smx_simcall_t simcall, boost::intrusive_ptr arg) { simgrid::simix::marshal>(simcall->args[0], arg); } @@ -980,12 +963,12 @@ static inline int simcall_comm_test__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_comm_test__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_comm_test__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } -static inline boost::intrusive_ptr* -simcall_comm_testany__get__comms(smx_simcall_t simcall) +static inline boost::intrusive_ptr* simcall_comm_testany__get__comms(smx_simcall_t simcall) { return simgrid::simix::unmarshal*>(simcall->args[0]); } @@ -993,8 +976,7 @@ static inline simgrid::kernel::activity::ActivityImpl** simcall_comm_testany__ge { return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void simcall_comm_testany__set__comms(smx_simcall_t simcall, - boost::intrusive_ptr* arg) +static inline void simcall_comm_testany__set__comms(smx_simcall_t simcall, boost::intrusive_ptr* arg) { simgrid::simix::marshal*>(simcall->args[0], arg); } @@ -1018,8 +1000,9 @@ static inline int simcall_comm_testany__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_comm_testany__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_comm_testany__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } static inline smx_mutex_t simcall_mutex_lock__get__mutex(smx_simcall_t simcall) @@ -1055,8 +1038,9 @@ static inline int simcall_mutex_trylock__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_mutex_trylock__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_mutex_trylock__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } static inline smx_mutex_t simcall_mutex_unlock__get__mutex(smx_simcall_t simcall) @@ -1080,8 +1064,9 @@ static inline smx_cond_t simcall_cond_init__getraw__result(smx_simcall_t simcall { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_cond_init__set__result(smx_simcall_t simcall, smx_cond_t result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_cond_init__set__result(smx_simcall_t simcall, smx_cond_t result) +{ + simgrid::simix::marshal(simcall->result, result); } static inline smx_cond_t simcall_cond_signal__get__cond(smx_simcall_t simcall) @@ -1210,76 +1195,78 @@ static inline void simcall_sem_acquire_timeout__set__timeout(smx_simcall_t simca simgrid::simix::marshal(simcall->args[1], arg); } -static inline surf_file_t simcall_file_read__get__fd(smx_simcall_t simcall) +static inline surf_storage_t simcall_storage_read__get__st(smx_simcall_t simcall) { - return simgrid::simix::unmarshal(simcall->args[0]); + return simgrid::simix::unmarshal(simcall->args[0]); } -static inline surf_file_t simcall_file_read__getraw__fd(smx_simcall_t simcall) +static inline surf_storage_t simcall_storage_read__getraw__st(smx_simcall_t simcall) { - return simgrid::simix::unmarshal_raw(simcall->args[0]); + return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void simcall_file_read__set__fd(smx_simcall_t simcall, surf_file_t arg) +static inline void simcall_storage_read__set__st(smx_simcall_t simcall, surf_storage_t arg) { - simgrid::simix::marshal(simcall->args[0], arg); + simgrid::simix::marshal(simcall->args[0], arg); } -static inline sg_size_t simcall_file_read__get__size(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_read__get__size(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->args[1]); } -static inline sg_size_t simcall_file_read__getraw__size(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_read__getraw__size(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->args[1]); } -static inline void simcall_file_read__set__size(smx_simcall_t simcall, sg_size_t arg) +static inline void simcall_storage_read__set__size(smx_simcall_t simcall, sg_size_t arg) { simgrid::simix::marshal(simcall->args[1], arg); } -static inline sg_size_t simcall_file_read__get__result(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_read__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->result); } -static inline sg_size_t simcall_file_read__getraw__result(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_read__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_file_read__set__result(smx_simcall_t simcall, sg_size_t result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_storage_read__set__result(smx_simcall_t simcall, sg_size_t result) +{ + simgrid::simix::marshal(simcall->result, result); } -static inline surf_file_t simcall_file_write__get__fd(smx_simcall_t simcall) +static inline surf_storage_t simcall_storage_write__get__st(smx_simcall_t simcall) { - return simgrid::simix::unmarshal(simcall->args[0]); + return simgrid::simix::unmarshal(simcall->args[0]); } -static inline surf_file_t simcall_file_write__getraw__fd(smx_simcall_t simcall) +static inline surf_storage_t simcall_storage_write__getraw__st(smx_simcall_t simcall) { - return simgrid::simix::unmarshal_raw(simcall->args[0]); + return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void simcall_file_write__set__fd(smx_simcall_t simcall, surf_file_t arg) +static inline void simcall_storage_write__set__st(smx_simcall_t simcall, surf_storage_t arg) { - simgrid::simix::marshal(simcall->args[0], arg); + simgrid::simix::marshal(simcall->args[0], arg); } -static inline sg_size_t simcall_file_write__get__size(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_write__get__size(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->args[1]); } -static inline sg_size_t simcall_file_write__getraw__size(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_write__getraw__size(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->args[1]); } -static inline void simcall_file_write__set__size(smx_simcall_t simcall, sg_size_t arg) +static inline void simcall_storage_write__set__size(smx_simcall_t simcall, sg_size_t arg) { simgrid::simix::marshal(simcall->args[1], arg); } -static inline sg_size_t simcall_file_write__get__result(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_write__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->result); } -static inline sg_size_t simcall_file_write__getraw__result(smx_simcall_t simcall) +static inline sg_size_t simcall_storage_write__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_file_write__set__result(smx_simcall_t simcall, sg_size_t result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_storage_write__set__result(smx_simcall_t simcall, sg_size_t result) +{ + simgrid::simix::marshal(simcall->result, result); } static inline int simcall_mc_random__get__min(smx_simcall_t simcall) @@ -1314,12 +1301,12 @@ static inline int simcall_mc_random__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_mc_random__set__result(smx_simcall_t simcall, int result){ - simgrid::simix::marshal(simcall->result, result); +static inline void simcall_mc_random__set__result(smx_simcall_t simcall, int result) +{ + simgrid::simix::marshal(simcall->result, result); } -static inline boost::intrusive_ptr -simcall_set_category__get__synchro(smx_simcall_t simcall) +static inline boost::intrusive_ptr simcall_set_category__get__synchro(smx_simcall_t simcall) { return simgrid::simix::unmarshal>(simcall->args[0]); } @@ -1327,8 +1314,7 @@ static inline simgrid::kernel::activity::ActivityImpl* simcall_set_category__get { return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void simcall_set_category__set__synchro(smx_simcall_t simcall, - boost::intrusive_ptr arg) +static inline void simcall_set_category__set__synchro(smx_simcall_t simcall, boost::intrusive_ptr arg) { simgrid::simix::marshal>(simcall->args[0], arg); } @@ -1377,35 +1363,17 @@ XBT_PRIVATE void simcall_HANDLER_process_killall(smx_simcall_t simcall, int rese XBT_PRIVATE void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t process); XBT_PRIVATE void simcall_HANDLER_process_join(smx_simcall_t simcall, smx_actor_t process, double timeout); XBT_PRIVATE void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration); -XBT_PRIVATE boost::intrusive_ptr -simcall_HANDLER_execution_start(smx_simcall_t simcall, const char* name, double flops_amount, double priority, - double bound); -XBT_PRIVATE void -simcall_HANDLER_execution_wait(smx_simcall_t simcall, - boost::intrusive_ptr execution); -XBT_PRIVATE boost::intrusive_ptr -simcall_HANDLER_comm_iprobe(smx_simcall_t simcall, smx_mailbox_t mbox, int type, simix_match_func_t match_fun, - void* data); +XBT_PRIVATE boost::intrusive_ptr simcall_HANDLER_execution_start(smx_simcall_t simcall, const char* name, double flops_amount, double priority, double bound); +XBT_PRIVATE void simcall_HANDLER_execution_wait(smx_simcall_t simcall, boost::intrusive_ptr execution); +XBT_PRIVATE boost::intrusive_ptr simcall_HANDLER_comm_iprobe(smx_simcall_t simcall, smx_mailbox_t mbox, int type, simix_match_func_t match_fun, void* data); XBT_PRIVATE void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout); -XBT_PRIVATE boost::intrusive_ptr -simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, - void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, - simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, - int detached); +XBT_PRIVATE boost::intrusive_ptr simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, int detached); XBT_PRIVATE void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout, double rate); -XBT_PRIVATE boost::intrusive_ptr -simcall_HANDLER_comm_irecv(smx_simcall_t simcall, smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, - size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, - void* data, double rate); +XBT_PRIVATE boost::intrusive_ptr simcall_HANDLER_comm_irecv(smx_simcall_t simcall, smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double rate); XBT_PRIVATE void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t comms, double timeout); -XBT_PRIVATE void simcall_HANDLER_comm_wait(smx_simcall_t simcall, - boost::intrusive_ptr comm, - double timeout); -XBT_PRIVATE void simcall_HANDLER_comm_test(smx_simcall_t simcall, - boost::intrusive_ptr comm); -XBT_PRIVATE void simcall_HANDLER_comm_testany(smx_simcall_t simcall, - boost::intrusive_ptr* comms, - size_t count); +XBT_PRIVATE void simcall_HANDLER_comm_wait(smx_simcall_t simcall, boost::intrusive_ptr comm, double timeout); +XBT_PRIVATE void simcall_HANDLER_comm_test(smx_simcall_t simcall, boost::intrusive_ptr comm); +XBT_PRIVATE void simcall_HANDLER_comm_testany(smx_simcall_t simcall, boost::intrusive_ptr* comms, size_t count); XBT_PRIVATE void simcall_HANDLER_mutex_lock(smx_simcall_t simcall, smx_mutex_t mutex); XBT_PRIVATE int simcall_HANDLER_mutex_trylock(smx_simcall_t simcall, smx_mutex_t mutex); XBT_PRIVATE void simcall_HANDLER_mutex_unlock(smx_simcall_t simcall, smx_mutex_t mutex); @@ -1413,6 +1381,6 @@ XBT_PRIVATE void simcall_HANDLER_cond_wait(smx_simcall_t simcall, smx_cond_t con XBT_PRIVATE void simcall_HANDLER_cond_wait_timeout(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex, double timeout); XBT_PRIVATE void simcall_HANDLER_sem_acquire(smx_simcall_t simcall, smx_sem_t sem); XBT_PRIVATE void simcall_HANDLER_sem_acquire_timeout(smx_simcall_t simcall, smx_sem_t sem, double timeout); -XBT_PRIVATE void simcall_HANDLER_file_read(smx_simcall_t simcall, surf_file_t fd, sg_size_t size); -XBT_PRIVATE void simcall_HANDLER_file_write(smx_simcall_t simcall, surf_file_t fd, sg_size_t size); +XBT_PRIVATE void simcall_HANDLER_storage_read(smx_simcall_t simcall, surf_storage_t st, sg_size_t size); +XBT_PRIVATE void simcall_HANDLER_storage_write(smx_simcall_t simcall, surf_storage_t st, sg_size_t size); XBT_PRIVATE int simcall_HANDLER_mc_random(smx_simcall_t simcall, int min, int max); \ No newline at end of file diff --git a/src/simix/popping_bodies.cpp b/src/simix/popping_bodies.cpp index 4f3e9a7ef1..dd9b622781 100644 --- a/src/simix/popping_bodies.cpp +++ b/src/simix/popping_bodies.cpp @@ -14,10 +14,10 @@ * That's not about http://en.wikipedia.org/wiki/Poop, despite the odor :) */ -#include -#include "smx_private.h" +#include "smx_private.hpp" #include "src/mc/mc_forward.hpp" #include "xbt/ex.h" +#include #include /** @cond */ // Please Doxygen, don't look at this @@ -36,247 +36,240 @@ inline static R simcall(e_smx_simcall_t call, T const&... t) return simgrid::simix::unmarshal(self->simcall.result); } -inline static void simcall_BODY_process_killall(int reset_pid) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_process_killall(&SIMIX_process_self()->simcall, reset_pid); - return simcall(SIMCALL_PROCESS_KILLALL, reset_pid); - } +inline static void simcall_BODY_process_killall(int reset_pid) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_process_killall(&SIMIX_process_self()->simcall, reset_pid); + return simcall(SIMCALL_PROCESS_KILLALL, reset_pid); +} -inline static void simcall_BODY_process_cleanup(smx_actor_t process) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_process_cleanup(process); - return simcall(SIMCALL_PROCESS_CLEANUP, process); - } +inline static void simcall_BODY_process_cleanup(smx_actor_t process) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_process_cleanup(process); + return simcall(SIMCALL_PROCESS_CLEANUP, process); +} -inline static void simcall_BODY_process_suspend(smx_actor_t process) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_process_suspend(&SIMIX_process_self()->simcall, process); - return simcall(SIMCALL_PROCESS_SUSPEND, process); - } +inline static void simcall_BODY_process_suspend(smx_actor_t process) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_process_suspend(&SIMIX_process_self()->simcall, process); + return simcall(SIMCALL_PROCESS_SUSPEND, process); +} -inline static int simcall_BODY_process_join(smx_actor_t process, double timeout) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_process_join(&SIMIX_process_self()->simcall, process, timeout); - return simcall(SIMCALL_PROCESS_JOIN, process, timeout); - } +inline static int simcall_BODY_process_join(smx_actor_t process, double timeout) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_process_join(&SIMIX_process_self()->simcall, process, timeout); + return simcall(SIMCALL_PROCESS_JOIN, process, timeout); +} -inline static int simcall_BODY_process_sleep(double duration) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_process_sleep(&SIMIX_process_self()->simcall, duration); - return simcall(SIMCALL_PROCESS_SLEEP, duration); - } +inline static int simcall_BODY_process_sleep(double duration) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_process_sleep(&SIMIX_process_self()->simcall, duration); + return simcall(SIMCALL_PROCESS_SLEEP, duration); +} - inline static boost::intrusive_ptr - simcall_BODY_execution_start(const char* name, double flops_amount, double priority, double bound) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_execution_start(&SIMIX_process_self()->simcall, name, flops_amount, priority, bound); - return simcall, const char*, double, double, double>( - SIMCALL_EXECUTION_START, name, flops_amount, priority, bound); - } +inline static boost::intrusive_ptr simcall_BODY_execution_start(const char* name, double flops_amount, double priority, double bound) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_execution_start(&SIMIX_process_self()->simcall, name, flops_amount, priority, bound); + return simcall, const char*, double, double, double>(SIMCALL_EXECUTION_START, name, flops_amount, priority, bound); +} - inline static boost::intrusive_ptr - simcall_BODY_execution_parallel_start(const char* name, int host_nb, sg_host_t* host_list, double* flops_amount, - double* bytes_amount, double rate, double timeout) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) - SIMIX_execution_parallel_start(name, host_nb, host_list, flops_amount, bytes_amount, rate, timeout); - return simcall, const char*, int, sg_host_t*, double*, - double*, double, double>(SIMCALL_EXECUTION_PARALLEL_START, name, host_nb, host_list, flops_amount, - bytes_amount, rate, timeout); - } +inline static boost::intrusive_ptr simcall_BODY_execution_parallel_start(const char* name, int host_nb, sg_host_t* host_list, double* flops_amount, double* bytes_amount, double rate, double timeout) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_execution_parallel_start(name, host_nb, host_list, flops_amount, bytes_amount, rate, timeout); + return simcall, const char*, int, sg_host_t*, double*, double*, double, double>(SIMCALL_EXECUTION_PARALLEL_START, name, host_nb, host_list, flops_amount, bytes_amount, rate, timeout); +} - inline static int simcall_BODY_execution_wait(boost::intrusive_ptr execution) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_execution_wait(&SIMIX_process_self()->simcall, execution); - return simcall>(SIMCALL_EXECUTION_WAIT, - execution); - } +inline static int simcall_BODY_execution_wait(boost::intrusive_ptr execution) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_execution_wait(&SIMIX_process_self()->simcall, execution); + return simcall>(SIMCALL_EXECUTION_WAIT, execution); +} -inline static void simcall_BODY_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_process_on_exit(process, fun, data); - return simcall(SIMCALL_PROCESS_ON_EXIT, process, fun, data); - } +inline static void simcall_BODY_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_process_on_exit(process, fun, data); + return simcall(SIMCALL_PROCESS_ON_EXIT, process, fun, data); +} - inline static boost::intrusive_ptr - simcall_BODY_comm_iprobe(smx_mailbox_t mbox, int type, simix_match_func_t match_fun, void* data) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) - simcall_HANDLER_comm_iprobe(&SIMIX_process_self()->simcall, mbox, type, match_fun, data); - return simcall, smx_mailbox_t, int, - simix_match_func_t, void*>(SIMCALL_COMM_IPROBE, mbox, type, match_fun, data); - } +inline static boost::intrusive_ptr simcall_BODY_comm_iprobe(smx_mailbox_t mbox, int type, simix_match_func_t match_fun, void* data) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_iprobe(&SIMIX_process_self()->simcall, mbox, type, match_fun, data); + return simcall, smx_mailbox_t, int, simix_match_func_t, void*>(SIMCALL_COMM_IPROBE, mbox, type, match_fun, data); +} -inline static void simcall_BODY_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_send(&SIMIX_process_self()->simcall, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, copy_data_fun, data, timeout); - return simcall(SIMCALL_COMM_SEND, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, copy_data_fun, data, timeout); - } +inline static void simcall_BODY_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_send(&SIMIX_process_self()->simcall, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, copy_data_fun, data, timeout); + return simcall(SIMCALL_COMM_SEND, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, copy_data_fun, data, timeout); +} - inline static boost::intrusive_ptr - simcall_BODY_comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, - size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, - simix_copy_data_func_t copy_data_fun, void* data, int detached) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_isend(&SIMIX_process_self()->simcall, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, clean_fun, copy_data_fun, data, detached); - return simcall, smx_actor_t, smx_mailbox_t, double, - double, void*, size_t, simix_match_func_t, simix_clean_func_t, simix_copy_data_func_t, void*, int>( - SIMCALL_COMM_ISEND, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, clean_fun, copy_data_fun, - data, detached); - } +inline static boost::intrusive_ptr simcall_BODY_comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, int detached) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_isend(&SIMIX_process_self()->simcall, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, clean_fun, copy_data_fun, data, detached); + return simcall, smx_actor_t, smx_mailbox_t, double, double, void*, size_t, simix_match_func_t, simix_clean_func_t, simix_copy_data_func_t, void*, int>(SIMCALL_COMM_ISEND, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, clean_fun, copy_data_fun, data, detached); +} -inline static void simcall_BODY_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout, double rate) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_recv(&SIMIX_process_self()->simcall, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, timeout, rate); - return simcall(SIMCALL_COMM_RECV, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, timeout, rate); - } +inline static void simcall_BODY_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout, double rate) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_recv(&SIMIX_process_self()->simcall, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, timeout, rate); + return simcall(SIMCALL_COMM_RECV, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, timeout, rate); +} - inline static boost::intrusive_ptr - simcall_BODY_comm_irecv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, - simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double rate) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_irecv(&SIMIX_process_self()->simcall, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate); - return simcall, smx_actor_t, smx_mailbox_t, void*, - size_t*, simix_match_func_t, simix_copy_data_func_t, void*, double>( - SIMCALL_COMM_IRECV, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate); - } +inline static boost::intrusive_ptr simcall_BODY_comm_irecv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double rate) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_irecv(&SIMIX_process_self()->simcall, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate); + return simcall, smx_actor_t, smx_mailbox_t, void*, size_t*, simix_match_func_t, simix_copy_data_func_t, void*, double>(SIMCALL_COMM_IRECV, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate); +} -inline static int simcall_BODY_comm_waitany(xbt_dynar_t comms, double timeout) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_waitany(&SIMIX_process_self()->simcall, comms, timeout); - return simcall(SIMCALL_COMM_WAITANY, comms, timeout); - } +inline static int simcall_BODY_comm_waitany(xbt_dynar_t comms, double timeout) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_waitany(&SIMIX_process_self()->simcall, comms, timeout); + return simcall(SIMCALL_COMM_WAITANY, comms, timeout); +} - inline static void simcall_BODY_comm_wait(boost::intrusive_ptr comm, - double timeout) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_wait(&SIMIX_process_self()->simcall, comm, timeout); - return simcall, double>(SIMCALL_COMM_WAIT, comm, - timeout); - } +inline static void simcall_BODY_comm_wait(boost::intrusive_ptr comm, double timeout) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_wait(&SIMIX_process_self()->simcall, comm, timeout); + return simcall, double>(SIMCALL_COMM_WAIT, comm, timeout); +} - inline static int simcall_BODY_comm_test(boost::intrusive_ptr comm) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_test(&SIMIX_process_self()->simcall, comm); - return simcall>(SIMCALL_COMM_TEST, comm); - } +inline static int simcall_BODY_comm_test(boost::intrusive_ptr comm) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_test(&SIMIX_process_self()->simcall, comm); + return simcall>(SIMCALL_COMM_TEST, comm); +} - inline static int simcall_BODY_comm_testany(boost::intrusive_ptr* comms, - size_t count) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_comm_testany(&SIMIX_process_self()->simcall, comms, count); - return simcall*, size_t>(SIMCALL_COMM_TESTANY, - comms, count); - } +inline static int simcall_BODY_comm_testany(boost::intrusive_ptr* comms, size_t count) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_comm_testany(&SIMIX_process_self()->simcall, comms, count); + return simcall*, size_t>(SIMCALL_COMM_TESTANY, comms, count); +} -inline static void simcall_BODY_mutex_lock(smx_mutex_t mutex) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_mutex_lock(&SIMIX_process_self()->simcall, mutex); - return simcall(SIMCALL_MUTEX_LOCK, mutex); - } +inline static void simcall_BODY_mutex_lock(smx_mutex_t mutex) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_mutex_lock(&SIMIX_process_self()->simcall, mutex); + return simcall(SIMCALL_MUTEX_LOCK, mutex); +} -inline static int simcall_BODY_mutex_trylock(smx_mutex_t mutex) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_mutex_trylock(&SIMIX_process_self()->simcall, mutex); - return simcall(SIMCALL_MUTEX_TRYLOCK, mutex); - } +inline static int simcall_BODY_mutex_trylock(smx_mutex_t mutex) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_mutex_trylock(&SIMIX_process_self()->simcall, mutex); + return simcall(SIMCALL_MUTEX_TRYLOCK, mutex); +} -inline static void simcall_BODY_mutex_unlock(smx_mutex_t mutex) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_mutex_unlock(&SIMIX_process_self()->simcall, mutex); - return simcall(SIMCALL_MUTEX_UNLOCK, mutex); - } +inline static void simcall_BODY_mutex_unlock(smx_mutex_t mutex) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_mutex_unlock(&SIMIX_process_self()->simcall, mutex); + return simcall(SIMCALL_MUTEX_UNLOCK, mutex); +} -inline static smx_cond_t simcall_BODY_cond_init() { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_cond_init(); - return simcall(SIMCALL_COND_INIT); - } +inline static smx_cond_t simcall_BODY_cond_init() +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_cond_init(); + return simcall(SIMCALL_COND_INIT); +} -inline static void simcall_BODY_cond_signal(smx_cond_t cond) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_cond_signal(cond); - return simcall(SIMCALL_COND_SIGNAL, cond); - } +inline static void simcall_BODY_cond_signal(smx_cond_t cond) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_cond_signal(cond); + return simcall(SIMCALL_COND_SIGNAL, cond); +} -inline static void simcall_BODY_cond_wait(smx_cond_t cond, smx_mutex_t mutex) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_cond_wait(&SIMIX_process_self()->simcall, cond, mutex); - return simcall(SIMCALL_COND_WAIT, cond, mutex); - } +inline static void simcall_BODY_cond_wait(smx_cond_t cond, smx_mutex_t mutex) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_cond_wait(&SIMIX_process_self()->simcall, cond, mutex); + return simcall(SIMCALL_COND_WAIT, cond, mutex); +} -inline static void simcall_BODY_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_cond_wait_timeout(&SIMIX_process_self()->simcall, cond, mutex, timeout); - return simcall(SIMCALL_COND_WAIT_TIMEOUT, cond, mutex, timeout); - } +inline static void simcall_BODY_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_cond_wait_timeout(&SIMIX_process_self()->simcall, cond, mutex, timeout); + return simcall(SIMCALL_COND_WAIT_TIMEOUT, cond, mutex, timeout); +} -inline static void simcall_BODY_cond_broadcast(smx_cond_t cond) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_cond_broadcast(cond); - return simcall(SIMCALL_COND_BROADCAST, cond); - } +inline static void simcall_BODY_cond_broadcast(smx_cond_t cond) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_cond_broadcast(cond); + return simcall(SIMCALL_COND_BROADCAST, cond); +} -inline static void simcall_BODY_sem_acquire(smx_sem_t sem) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_sem_acquire(&SIMIX_process_self()->simcall, sem); - return simcall(SIMCALL_SEM_ACQUIRE, sem); - } +inline static void simcall_BODY_sem_acquire(smx_sem_t sem) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_sem_acquire(&SIMIX_process_self()->simcall, sem); + return simcall(SIMCALL_SEM_ACQUIRE, sem); +} -inline static void simcall_BODY_sem_acquire_timeout(smx_sem_t sem, double timeout) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_sem_acquire_timeout(&SIMIX_process_self()->simcall, sem, timeout); - return simcall(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem, timeout); - } +inline static void simcall_BODY_sem_acquire_timeout(smx_sem_t sem, double timeout) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_sem_acquire_timeout(&SIMIX_process_self()->simcall, sem, timeout); + return simcall(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem, timeout); +} - inline static sg_size_t simcall_BODY_file_read(surf_file_t fd, sg_size_t size) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) - simcall_HANDLER_file_read(&SIMIX_process_self()->simcall, fd, size); - return simcall(SIMCALL_FILE_READ, fd, size); - } +inline static sg_size_t simcall_BODY_storage_read(surf_storage_t st, sg_size_t size) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_storage_read(&SIMIX_process_self()->simcall, st, size); + return simcall(SIMCALL_STORAGE_READ, st, size); +} - inline static sg_size_t simcall_BODY_file_write(surf_file_t fd, sg_size_t size) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) - simcall_HANDLER_file_write(&SIMIX_process_self()->simcall, fd, size); - return simcall(SIMCALL_FILE_WRITE, fd, size); - } +inline static sg_size_t simcall_BODY_storage_write(surf_storage_t st, sg_size_t size) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_storage_write(&SIMIX_process_self()->simcall, st, size); + return simcall(SIMCALL_STORAGE_WRITE, st, size); +} -inline static int simcall_BODY_mc_random(int min, int max) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) simcall_HANDLER_mc_random(&SIMIX_process_self()->simcall, min, max); - return simcall(SIMCALL_MC_RANDOM, min, max); - } +inline static int simcall_BODY_mc_random(int min, int max) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + simcall_HANDLER_mc_random(&SIMIX_process_self()->simcall, min, max); + return simcall(SIMCALL_MC_RANDOM, min, max); +} - inline static void simcall_BODY_set_category(boost::intrusive_ptr synchro, - const char* category) - { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_set_category(synchro, category); - return simcall, const char*>( - SIMCALL_SET_CATEGORY, synchro, category); - } +inline static void simcall_BODY_set_category(boost::intrusive_ptr synchro, const char* category) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_set_category(synchro, category); + return simcall, const char*>(SIMCALL_SET_CATEGORY, synchro, category); +} -inline static void simcall_BODY_run_kernel(std::function const* code) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_run_kernel(code); - return simcall const*>(SIMCALL_RUN_KERNEL, code); - } +inline static void simcall_BODY_run_kernel(std::function const* code) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_run_kernel(code); + return simcall const*>(SIMCALL_RUN_KERNEL, code); +} -inline static void simcall_BODY_run_blocking(std::function const* code) { - /* Go to that function to follow the code flow through the simcall barrier */ - if (0) SIMIX_run_blocking(code); - return simcall const*>(SIMCALL_RUN_BLOCKING, code); - }/** @endcond */ +inline static void simcall_BODY_run_blocking(std::function const* code) +{ + if (0) /* Go to that function to follow the code flow through the simcall barrier */ + SIMIX_run_blocking(code); + return simcall const*>(SIMCALL_RUN_BLOCKING, code); +} /** @endcond */ diff --git a/src/simix/popping_enum.h b/src/simix/popping_enum.h index 8e44e9752a..e2a7c49e97 100644 --- a/src/simix/popping_enum.h +++ b/src/simix/popping_enum.h @@ -47,10 +47,11 @@ typedef enum { SIMCALL_COND_BROADCAST, SIMCALL_SEM_ACQUIRE, SIMCALL_SEM_ACQUIRE_TIMEOUT, - SIMCALL_FILE_READ, - SIMCALL_FILE_WRITE, + SIMCALL_STORAGE_READ, + SIMCALL_STORAGE_WRITE, SIMCALL_MC_RANDOM, SIMCALL_SET_CATEGORY, SIMCALL_RUN_KERNEL, - SIMCALL_RUN_BLOCKING, NUM_SIMCALLS + SIMCALL_RUN_BLOCKING, + NUM_SIMCALLS } e_smx_simcall_t; diff --git a/src/simix/popping_generated.cpp b/src/simix/popping_generated.cpp index 7f4fc93b45..1d6a4a6ddc 100644 --- a/src/simix/popping_generated.cpp +++ b/src/simix/popping_generated.cpp @@ -14,8 +14,8 @@ * That's not about http://en.wikipedia.org/wiki/Poop, despite the odor :) */ +#include "smx_private.hpp" #include -#include "smx_private.h" #if SIMGRID_HAVE_MC #include "src/mc/mc_forward.hpp" #endif @@ -53,8 +53,8 @@ const char* simcall_names[] = { "SIMCALL_COND_BROADCAST", "SIMCALL_SEM_ACQUIRE", "SIMCALL_SEM_ACQUIRE_TIMEOUT", - "SIMCALL_FILE_READ", - "SIMCALL_FILE_WRITE", + "SIMCALL_STORAGE_READ", + "SIMCALL_STORAGE_WRITE", "SIMCALL_MC_RANDOM", "SIMCALL_SET_CATEGORY", "SIMCALL_RUN_KERNEL", @@ -73,203 +73,158 @@ void SIMIX_simcall_handle(smx_simcall_t simcall, int value) { return; switch (simcall->call) { case SIMCALL_PROCESS_KILLALL: - simcall_HANDLER_process_killall(simcall, simgrid::simix::unmarshal(simcall->args[0])); - SIMIX_simcall_answer(simcall); - break; + simcall_HANDLER_process_killall(simcall, simgrid::simix::unmarshal(simcall->args[0])); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_PROCESS_CLEANUP: - SIMIX_process_cleanup(simgrid::simix::unmarshal(simcall->args[0])); - SIMIX_simcall_answer(simcall); - break; + SIMIX_process_cleanup(simgrid::simix::unmarshal(simcall->args[0])); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_PROCESS_SUSPEND: - simcall_HANDLER_process_suspend(simcall, simgrid::simix::unmarshal(simcall->args[0])); - break; + simcall_HANDLER_process_suspend(simcall, simgrid::simix::unmarshal(simcall->args[0])); + break; case SIMCALL_PROCESS_JOIN: - simcall_HANDLER_process_join(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); - break; + simcall_HANDLER_process_join(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); + break; case SIMCALL_PROCESS_SLEEP: - simcall_HANDLER_process_sleep(simcall, simgrid::simix::unmarshal(simcall->args[0])); - break; + simcall_HANDLER_process_sleep(simcall, simgrid::simix::unmarshal(simcall->args[0])); + break; case SIMCALL_EXECUTION_START: - simgrid::simix::marshal>( - simcall->result, - simcall_HANDLER_execution_start(simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1]), - simgrid::simix::unmarshal(simcall->args[2]), - simgrid::simix::unmarshal(simcall->args[3]))); + simgrid::simix::marshal>(simcall->result, simcall_HANDLER_execution_start(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]))); SIMIX_simcall_answer(simcall); break; case SIMCALL_EXECUTION_PARALLEL_START: - simgrid::simix::marshal>( - simcall->result, - SIMIX_execution_parallel_start( - simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), - simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), - simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), - simgrid::simix::unmarshal(simcall->args[6]))); + simgrid::simix::marshal>(simcall->result, SIMIX_execution_parallel_start(simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), simgrid::simix::unmarshal(simcall->args[6]))); SIMIX_simcall_answer(simcall); break; case SIMCALL_EXECUTION_WAIT: - simcall_HANDLER_execution_wait( - simcall, - simgrid::simix::unmarshal>(simcall->args[0])); + simcall_HANDLER_execution_wait(simcall, simgrid::simix::unmarshal>(simcall->args[0])); break; case SIMCALL_PROCESS_ON_EXIT: - SIMIX_process_on_exit(simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2])); - SIMIX_simcall_answer(simcall); - break; + SIMIX_process_on_exit(simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2])); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_COMM_IPROBE: - simgrid::simix::marshal>( - simcall->result, simcall_HANDLER_comm_iprobe(simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1]), - simgrid::simix::unmarshal(simcall->args[2]), - simgrid::simix::unmarshal(simcall->args[3]))); + simgrid::simix::marshal>(simcall->result, simcall_HANDLER_comm_iprobe(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]))); SIMIX_simcall_answer(simcall); break; case SIMCALL_COMM_SEND: - simcall_HANDLER_comm_send(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), simgrid::simix::unmarshal(simcall->args[6]), simgrid::simix::unmarshal(simcall->args[7]), simgrid::simix::unmarshal(simcall->args[8]), simgrid::simix::unmarshal(simcall->args[9])); - break; + simcall_HANDLER_comm_send(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), simgrid::simix::unmarshal(simcall->args[6]), simgrid::simix::unmarshal(simcall->args[7]), simgrid::simix::unmarshal(simcall->args[8]), simgrid::simix::unmarshal(simcall->args[9])); + break; case SIMCALL_COMM_ISEND: - simgrid::simix::marshal>( - simcall->result, - simcall_HANDLER_comm_isend( - simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1]), - simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), - simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), - simgrid::simix::unmarshal(simcall->args[6]), - simgrid::simix::unmarshal(simcall->args[7]), - simgrid::simix::unmarshal(simcall->args[8]), - simgrid::simix::unmarshal(simcall->args[9]), simgrid::simix::unmarshal(simcall->args[10]))); + simgrid::simix::marshal>(simcall->result, simcall_HANDLER_comm_isend(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), simgrid::simix::unmarshal(simcall->args[6]), simgrid::simix::unmarshal(simcall->args[7]), simgrid::simix::unmarshal(simcall->args[8]), simgrid::simix::unmarshal(simcall->args[9]), simgrid::simix::unmarshal(simcall->args[10]))); SIMIX_simcall_answer(simcall); break; case SIMCALL_COMM_RECV: - simcall_HANDLER_comm_recv(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), simgrid::simix::unmarshal(simcall->args[6]), simgrid::simix::unmarshal(simcall->args[7]), simgrid::simix::unmarshal(simcall->args[8])); - break; + simcall_HANDLER_comm_recv(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), simgrid::simix::unmarshal(simcall->args[6]), simgrid::simix::unmarshal(simcall->args[7]), simgrid::simix::unmarshal(simcall->args[8])); + break; case SIMCALL_COMM_IRECV: - simgrid::simix::marshal>( - simcall->result, simcall_HANDLER_comm_irecv(simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1]), - simgrid::simix::unmarshal(simcall->args[2]), - simgrid::simix::unmarshal(simcall->args[3]), - simgrid::simix::unmarshal(simcall->args[4]), - simgrid::simix::unmarshal(simcall->args[5]), - simgrid::simix::unmarshal(simcall->args[6]), - simgrid::simix::unmarshal(simcall->args[7]))); + simgrid::simix::marshal>(simcall->result, simcall_HANDLER_comm_irecv(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2]), simgrid::simix::unmarshal(simcall->args[3]), simgrid::simix::unmarshal(simcall->args[4]), simgrid::simix::unmarshal(simcall->args[5]), simgrid::simix::unmarshal(simcall->args[6]), simgrid::simix::unmarshal(simcall->args[7]))); SIMIX_simcall_answer(simcall); break; case SIMCALL_COMM_WAITANY: - simcall_HANDLER_comm_waitany(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); - break; + simcall_HANDLER_comm_waitany(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); + break; case SIMCALL_COMM_WAIT: - simcall_HANDLER_comm_wait( - simcall, - simgrid::simix::unmarshal>(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1])); + simcall_HANDLER_comm_wait(simcall, simgrid::simix::unmarshal>(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); break; case SIMCALL_COMM_TEST: - simcall_HANDLER_comm_test( - simcall, - simgrid::simix::unmarshal>(simcall->args[0])); + simcall_HANDLER_comm_test(simcall, simgrid::simix::unmarshal>(simcall->args[0])); break; case SIMCALL_COMM_TESTANY: - simcall_HANDLER_comm_testany( - simcall, - simgrid::simix::unmarshal*>(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1])); + simcall_HANDLER_comm_testany(simcall, simgrid::simix::unmarshal*>(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); break; case SIMCALL_MUTEX_LOCK: - simcall_HANDLER_mutex_lock(simcall, simgrid::simix::unmarshal(simcall->args[0])); - break; + simcall_HANDLER_mutex_lock(simcall, simgrid::simix::unmarshal(simcall->args[0])); + break; case SIMCALL_MUTEX_TRYLOCK: - simgrid::simix::marshal(simcall->result, simcall_HANDLER_mutex_trylock(simcall, simgrid::simix::unmarshal(simcall->args[0]))); - SIMIX_simcall_answer(simcall); - break; + simgrid::simix::marshal(simcall->result, simcall_HANDLER_mutex_trylock(simcall, simgrid::simix::unmarshal(simcall->args[0]))); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_MUTEX_UNLOCK: - simcall_HANDLER_mutex_unlock(simcall, simgrid::simix::unmarshal(simcall->args[0])); - SIMIX_simcall_answer(simcall); - break; + simcall_HANDLER_mutex_unlock(simcall, simgrid::simix::unmarshal(simcall->args[0])); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_COND_INIT: - simgrid::simix::marshal(simcall->result, SIMIX_cond_init()); - SIMIX_simcall_answer(simcall); - break; + simgrid::simix::marshal(simcall->result, SIMIX_cond_init()); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_COND_SIGNAL: - SIMIX_cond_signal(simgrid::simix::unmarshal(simcall->args[0])); - SIMIX_simcall_answer(simcall); - break; + SIMIX_cond_signal(simgrid::simix::unmarshal(simcall->args[0])); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_COND_WAIT: - simcall_HANDLER_cond_wait(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); - break; + simcall_HANDLER_cond_wait(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); + break; case SIMCALL_COND_WAIT_TIMEOUT: - simcall_HANDLER_cond_wait_timeout(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2])); - break; + simcall_HANDLER_cond_wait_timeout(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]), simgrid::simix::unmarshal(simcall->args[2])); + break; case SIMCALL_COND_BROADCAST: - SIMIX_cond_broadcast(simgrid::simix::unmarshal(simcall->args[0])); - SIMIX_simcall_answer(simcall); - break; + SIMIX_cond_broadcast(simgrid::simix::unmarshal(simcall->args[0])); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_SEM_ACQUIRE: - simcall_HANDLER_sem_acquire(simcall, simgrid::simix::unmarshal(simcall->args[0])); - break; + simcall_HANDLER_sem_acquire(simcall, simgrid::simix::unmarshal(simcall->args[0])); + break; case SIMCALL_SEM_ACQUIRE_TIMEOUT: - simcall_HANDLER_sem_acquire_timeout(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); - break; + simcall_HANDLER_sem_acquire_timeout(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); + break; -case SIMCALL_FILE_READ: - simcall_HANDLER_file_read(simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1])); +case SIMCALL_STORAGE_READ: + simcall_HANDLER_storage_read(simcall, simgrid::simix::unmarshal(simcall->args[0]), + simgrid::simix::unmarshal(simcall->args[1])); break; -case SIMCALL_FILE_WRITE: - simcall_HANDLER_file_write(simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1])); +case SIMCALL_STORAGE_WRITE: + simcall_HANDLER_storage_write(simcall, simgrid::simix::unmarshal(simcall->args[0]), + simgrid::simix::unmarshal(simcall->args[1])); break; case SIMCALL_MC_RANDOM: - simgrid::simix::marshal(simcall->result, simcall_HANDLER_mc_random(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]))); - SIMIX_simcall_answer(simcall); - break; + simgrid::simix::marshal(simcall->result, simcall_HANDLER_mc_random(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1]))); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_SET_CATEGORY: - SIMIX_set_category( - simgrid::simix::unmarshal>(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1])); + SIMIX_set_category(simgrid::simix::unmarshal>(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); SIMIX_simcall_answer(simcall); break; case SIMCALL_RUN_KERNEL: - SIMIX_run_kernel(simgrid::simix::unmarshal const*>(simcall->args[0])); - SIMIX_simcall_answer(simcall); - break; + SIMIX_run_kernel(simgrid::simix::unmarshal const*>(simcall->args[0])); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_RUN_BLOCKING: - SIMIX_run_blocking(simgrid::simix::unmarshal const*>(simcall->args[0])); - break; + SIMIX_run_blocking(simgrid::simix::unmarshal const*>(simcall->args[0])); + break; case NUM_SIMCALLS: break; case SIMCALL_NONE: @@ -278,6 +233,7 @@ case SIMCALL_RUN_BLOCKING: sg_host_get_name(simcall->issuer->host) ); break; - + default: + THROW_IMPOSSIBLE; } } diff --git a/src/simix/popping_private.h b/src/simix/popping_private.hpp similarity index 70% rename from src/simix/popping_private.h rename to src/simix/popping_private.hpp index 160e55efc4..b7d4b5fa9e 100644 --- a/src/simix/popping_private.h +++ b/src/simix/popping_private.hpp @@ -3,11 +3,11 @@ /* 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. */ -#ifndef SG_POPPING_PRIVATE_H -#define SG_POPPING_PRIVATE_H +#ifndef SG_POPPING_PRIVATE_HPP +#define SG_POPPING_PRIVATE_HPP -#include #include +#include #include #include @@ -15,7 +15,7 @@ #include -SG_BEGIN_DECL() +extern "C" { /********************************* Simcalls *********************************/ XBT_PUBLIC_DATA(const char*) simcall_names[]; /* Name of each simcall */ @@ -24,24 +24,24 @@ XBT_PUBLIC_DATA(const char*) simcall_names[]; /* Name of each simcall */ typedef int (*simix_match_func_t)(void*, void*, simgrid::kernel::activity::CommImpl*); typedef void (*simix_copy_data_func_t)(smx_activity_t, void*, size_t); -typedef void (*simix_clean_func_t)(void *); +typedef void (*simix_clean_func_t)(void*); typedef void (*FPtr)(void); // Hide the ugliness /* Pack all possible scalar types in an union */ union u_smx_scalar { - char c; - short s; - int i; - long l; - long long ll; - unsigned char uc; - unsigned short us; - unsigned int ui; - unsigned long ul; + char c; + short s; + int i; + long l; + long long ll; + unsigned char uc; + unsigned short us; + unsigned int ui; + unsigned long ul; unsigned long long ull; - double d; - void* dp; - FPtr fp; + double d; + void* dp; + FPtr fp; }; /** @@ -52,8 +52,8 @@ struct s_smx_simcall { smx_actor_t issuer; smx_timer_t timer; int mc_value; - union u_smx_scalar args[11]; - union u_smx_scalar result; + u_smx_scalar args[11]; + u_smx_scalar result; }; #define SIMCALL_SET_MC_VALUE(simcall, value) ((simcall)->mc_value = (value)) @@ -64,17 +64,14 @@ struct s_smx_simcall { XBT_PRIVATE void SIMIX_simcall_answer(smx_simcall_t simcall); XBT_PRIVATE void SIMIX_simcall_handle(smx_simcall_t simcall, int value); XBT_PRIVATE void SIMIX_simcall_exit(smx_activity_t synchro); -XBT_PRIVATE const char *SIMIX_simcall_name(e_smx_simcall_t kind); +XBT_PRIVATE const char* SIMIX_simcall_name(e_smx_simcall_t kind); XBT_PRIVATE void SIMIX_run_kernel(std::function const* code); XBT_PRIVATE void SIMIX_run_blocking(std::function const* code); - -SG_END_DECL() - -#ifdef __cplusplus +} /* Defines the marshal/unmarshal functions for each type of parameters. * - * They will be used in popping_accessors.h to define the functions allowing + * They will be used in popping_accessors.hpp to define the functions allowing * to retrieve/set each parameter of each simcall. * * There is a unmarshal_raw() function, which is exactly similar to unmarshal() @@ -89,17 +86,15 @@ SG_END_DECL() namespace simgrid { namespace simix { -template -class type { - constexpr bool operator==(type) const { return true; } - template - constexpr bool operator==(type) const { return false; } - constexpr bool operator!=(type) const { return false; } - template - constexpr bool operator!=(type) const { return true; } +template class type { + constexpr bool operator==(type) const { return true; } + template constexpr bool operator==(type) const { return false; } + constexpr bool operator!=(type) const { return false; } + template constexpr bool operator!=(type) const { return true; } }; -template struct marshal_t {}; +template struct marshal_t { +}; #define SIMIX_MARSHAL(T, field) \ inline void marshal(type, u_smx_scalar& simcall, T value) { simcall.field = value; } \ inline T unmarshal(type, u_smx_scalar const& simcall) { return simcall.field; } \ @@ -129,13 +124,11 @@ inline void unmarshal_raw(type, u_smx_scalar const& simcall) /* Nothing to do for void data */ } -template inline -void marshal(type, u_smx_scalar& simcall, T* value) +template inline void marshal(type, u_smx_scalar& simcall, T* value) { - simcall.dp = (void*) value; + simcall.dp = (void*)value; } -template inline -T* unmarshal(type, u_smx_scalar const& simcall) +template inline T* unmarshal(type, u_smx_scalar const& simcall) { return static_cast(simcall.dp); } @@ -150,8 +143,8 @@ inline void marshal(type>, u_smx_scalar& simcall, boost: if (value.get() == nullptr) { // Sometimes we return nullptr in an intrusive_ptr... simcall.dp = nullptr; } else { - intrusive_ptr_add_ref(&*value); - simcall.dp = static_cast(&*value); + intrusive_ptr_add_ref(value.get()); + simcall.dp = static_cast(value.get()); } } template inline boost::intrusive_ptr unmarshal(type>, u_smx_scalar const& simcall) @@ -165,28 +158,24 @@ template inline T* unmarshal_raw(type>, u_smx_ return static_cast(simcall.dp); } -template inline -void marshal(type, u_smx_scalar& simcall, R(*value)(T...)) +template inline void marshal(type, u_smx_scalar& simcall, R (*value)(T...)) { - simcall.fp = (FPtr) value; + simcall.fp = (FPtr)value; } -template inline -auto unmarshal(type, u_smx_scalar simcall) -> R(*)(T...) +template inline auto unmarshal(type, u_smx_scalar simcall) -> R (*)(T...) { - return (R(*)(T...)) simcall.fp; + return (R(*)(T...))simcall.fp; } template inline auto unmarshal_raw(type, u_smx_scalar simcall) -> R (*)(T...) { return (R(*)(T...))simcall.fp; } -template inline -void marshal(u_smx_scalar& simcall, T const& value) +template inline void marshal(u_smx_scalar& simcall, T const& value) { return marshal(type(), simcall, value); } -template inline -typename std::remove_reference::type unmarshal(u_smx_scalar& simcall) +template inline typename std::remove_reference::type unmarshal(u_smx_scalar& simcall) { return unmarshal(type(), simcall); } @@ -195,37 +184,33 @@ template inline typename std::remove_reference::type unmarshal_raw( return unmarshal(type(), simcall); } -template -inline void marshalArgs(smx_simcall_t simcall) {} +template inline void marshalArgs(smx_simcall_t simcall) +{ + /* Nothing to do when no args */ +} -template -inline void marshalArgs(smx_simcall_t simcall, A const& a) +template inline void marshalArgs(smx_simcall_t simcall, A const& a) { marshal(simcall->args[I], a); } -template -inline void marshalArgs(smx_simcall_t simcall, A const& a, B const&... b) +template inline void marshalArgs(smx_simcall_t simcall, A const& a, B const&... b) { marshal(simcall->args[I], a); - marshalArgs(simcall, b...); + marshalArgs(simcall, b...); } /** Initialize the simcall */ -template inline -void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A const&... a) +template inline void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A const&... a) { simcall->call = call; memset(&simcall->result, 0, sizeof(simcall->result)); memset(simcall->args, 0, sizeof(simcall->args)); marshalArgs<0>(simcall, a...); } - } } -#endif - -#include "popping_accessors.h" +#include "popping_accessors.hpp" #endif diff --git a/src/simix/simcalls.in b/src/simix/simcalls.in index 83970631aa..99e748f348 100644 --- a/src/simix/simcalls.in +++ b/src/simix/simcalls.in @@ -70,8 +70,8 @@ void cond_broadcast(smx_cond_t cond) [[nohandler]]; void sem_acquire(smx_sem_t sem) [[block]]; void sem_acquire_timeout(smx_sem_t sem, double timeout) [[block]]; -sg_size_t file_read(surf_file_t fd, sg_size_t size) [[block]]; -sg_size_t file_write(surf_file_t fd, sg_size_t size) [[block]]; +sg_size_t storage_read(surf_storage_t st, sg_size_t size) [[block]]; +sg_size_t storage_write(surf_storage_t st, sg_size_t size) [[block]]; int mc_random(int min, int max); void set_category(boost::intrusive_ptr synchro, const char* category) [[nohandler]]; diff --git a/src/simix/simcalls.py b/src/simix/simcalls.py index 4465a6420c..f3d123cf8e 100755 --- a/src/simix/simcalls.py +++ b/src/simix/simcalls.py @@ -22,8 +22,8 @@ class Arg(object): return self.type class Simcall(object): - simcalls_BODY = None - simcalls_PRE = None + simcalls_body = None + simcalls_pre = None def __init__(self, name, handler, res, args, call_kind): self.name = name @@ -34,38 +34,40 @@ class Simcall(object): def check(self): # libsmx.c simcall_BODY_ - if self.simcalls_BODY is None: + if self.simcalls_body is None: f = open('libsmx.cpp') - self.simcalls_BODY = set(re.findall(r'simcall_BODY_(.*?)\(', f.read())) + self.simcalls_body = set(re.findall(r'simcall_BODY_(.*?)\(', f.read())) f.close() - if self.name not in self.simcalls_BODY: + if self.name not in self.simcalls_body: print ('# ERROR: No function calling simcall_BODY_%s' % self.name) print ('# Add something like this to libsmx.c:') - print ('%s simcall_%s(%s) {' % (self.res.rettype(), self.name, ', '. + print ('%s simcall_%s(%s)' % (self.res.rettype(), self.name, ', '. join('%s %s' % (arg.rettype(), arg.name) for arg in self.args))) + print ('{') print (' return simcall_BODY_%s(%s);' % (self.name, "...")) print ('}') return False # smx_*.c void simcall_HANDLER_host_on(smx_simcall_t simcall, # smx_host_t h) - if self.simcalls_PRE is None: - self.simcalls_PRE = set() + if self.simcalls_pre is None: + self.simcalls_pre = set() for fn in glob.glob('smx_*') + glob.glob('ActorImpl*') + glob.glob('../mc/*cpp'): f = open(fn) - self.simcalls_PRE |= set(re.findall(r'simcall_HANDLER_(.*?)\(', f.read())) + self.simcalls_pre |= set(re.findall(r'simcall_HANDLER_(.*?)\(', f.read())) f.close() if self.need_handler: - if self.name not in self.simcalls_PRE: + if self.name not in self.simcalls_pre: print ('# ERROR: No function called simcall_HANDLER_%s' % self.name) print ('# Add something like this to the relevant C file (like smx_io.c if it\'s an IO call):') - print ('%s simcall_HANDLER_%s(smx_simcall_t simcall%s) {' % (self.res.rettype(), self.name, ''. + print ('%s simcall_HANDLER_%s(smx_simcall_t simcall%s)' % (self.res.rettype(), self.name, ''. join(', %s %s' % (arg.rettype(), arg.name)for arg in self.args))) + print ('{') print (' // Your code handling the simcall') print ('}') return False else: - if self.name in self.simcalls_PRE: + if self.name in self.simcalls_pre: print ('# ERROR: You have a function called simcall_HANDLER_%s, but that simcall is not using any handler' % self.name) print ('# Either change your simcall definition, or kill that function') return False @@ -98,7 +100,7 @@ class Simcall(object): res.append('static inline void simcall_%s__set__%s(smx_simcall_t simcall, %s arg)' % ( self.name, arg.name, arg.rettype())) res.append('{') - res.append(' simgrid::simix::marshal<%s>(simcall->args[%i], arg);' % (arg.rettype(), i)) + res.append(' simgrid::simix::marshal<%s>(simcall->args[%i], arg);' % (arg.rettype(), i)) res.append('}') # Return value getter/setters @@ -107,16 +109,16 @@ class Simcall(object): res.append( 'static inline %s simcall_%s__get__result(smx_simcall_t simcall)' % (self.res.rettype(), self.name)) res.append('{') - - res.append(' return simgrid::simix::unmarshal<%s>(simcall->result);' % self.res.rettype()) + res.append(' return simgrid::simix::unmarshal<%s>(simcall->result);' % self.res.rettype()) res.append('}') - res.append( - 'static inline %s simcall_%s__getraw__result(smx_simcall_t simcall){' % (rawtype, self.name)) - res.append(' return simgrid::simix::unmarshal_raw<%s>(simcall->result);' % rawtype) + res.append('static inline %s simcall_%s__getraw__result(smx_simcall_t simcall)' % (rawtype, self.name)) + res.append('{') + res.append(' return simgrid::simix::unmarshal_raw<%s>(simcall->result);' % rawtype) res.append('}') res.append( - 'static inline void simcall_%s__set__result(smx_simcall_t simcall, %s result){' % (self.name, self.res.rettype())) - res.append(' simgrid::simix::marshal<%s>(simcall->result, result);' % (self.res.rettype())) + 'static inline void simcall_%s__set__result(smx_simcall_t simcall, %s result)' % (self.name, self.res.rettype())) + res.append('{') + res.append(' simgrid::simix::marshal<%s>(simcall->result, result);' % (self.res.rettype())) res.append('}') return '\n'.join(res) @@ -132,36 +134,36 @@ class Simcall(object): else: call = "SIMIX_%s(%s)" % (self.name, ', '.join(args)) if self.call_kind == 'Func': - res.append(" simgrid::simix::marshal<%s>(simcall->result, %s);" % (self.res.rettype(), call)) + res.append(" simgrid::simix::marshal<%s>(simcall->result, %s);" % (self.res.rettype(), call)) else: - res.append(" " + call + ";"); + res.append(" " + call + ";"); if self.call_kind != 'Blck': - res.append(' SIMIX_simcall_answer(simcall);') - res.append(' break;') + res.append(' SIMIX_simcall_answer(simcall);') + res.append(' break;') res.append('') return '\n'.join(res) def body(self): res = [''] res.append( - 'inline static %s simcall_BODY_%s(%s) {' % (self.res.rettype(), + 'inline static %s simcall_BODY_%s(%s)' % (self.res.rettype(), self.name, ', '.join('%s %s' % (arg.rettype(), arg.name) for arg in self.args))) - res.append( - ' /* Go to that function to follow the code flow through the simcall barrier */') + res.append('{') + res.append(' if (0) /* Go to that function to follow the code flow through the simcall barrier */') if self.need_handler: - res.append(' if (0) simcall_HANDLER_%s(%s);' % (self.name, - ', '.join(["&SIMIX_process_self()->simcall"] + [arg.name for arg in self.args]))) + res.append(' simcall_HANDLER_%s(%s);' % (self.name, + ', '.join(["&SIMIX_process_self()->simcall"] + [arg.name for arg in self.args]))) else: - res.append(' if (0) SIMIX_%s(%s);' % (self.name, + res.append(' SIMIX_%s(%s);' % (self.name, ', '.join(arg.name for arg in self.args))) - res.append(' return simcall<%s%s>(SIMCALL_%s%s);' % ( + res.append(' return simcall<%s%s>(SIMCALL_%s%s);' % ( self.res.rettype(), "".join([ ", " + arg.rettype() for i, arg in enumerate(self.args) ]), self.name.upper(), "".join([ ", " + arg.name for i, arg in enumerate(self.args) ]) )); - res.append(' }') + res.append('}') return '\n'.join(res) def handler_prototype(self): @@ -272,10 +274,10 @@ if __name__ == '__main__': # sys.exit(1) # - # smx_popping_accessors.c + # popping_accessors.hpp # - fd = header('popping_accessors.h') - fd.write('#include "src/simix/popping_private.h"'); + fd = header('popping_accessors.hpp') + fd.write('#include "src/simix/popping_private.hpp"'); handle(fd, Simcall.accessors, simcalls, simcalls_dict) fd.write( "\n\n/* The prototype of all simcall handlers, automatically generated for you */\n\n") @@ -283,7 +285,7 @@ if __name__ == '__main__': fd.close() # - # smx_popping_enum.c + # popping_enum.h # fd = header("popping_enum.h") fd.write('/**\n') @@ -299,13 +301,13 @@ if __name__ == '__main__': fd.close() # - # smx_popping_generated.cpp + # popping_generated.cpp # fd = header("popping_generated.cpp") + fd.write('#include "smx_private.hpp"\n') fd.write('#include \n') - fd.write('#include "smx_private.h"\n') fd.write('#if SIMGRID_HAVE_MC\n') fd.write('#include "src/mc/mc_forward.hpp"\n') fd.write('#endif\n') @@ -324,7 +326,7 @@ if __name__ == '__main__': fd.write('/** @private\n') fd.write( ' * @brief (in kernel mode) unpack the simcall and activate the handler\n') - fd.write(' * \n') + fd.write(' *\n') fd.write(' * This function is generated from src/simix/simcalls.in\n') fd.write(' */\n') fd.write( @@ -347,20 +349,21 @@ if __name__ == '__main__': fd.write(' sg_host_get_name(simcall->issuer->host)\n') fd.write(' );\n') fd.write(' break;\n') - fd.write('\n') + fd.write(' default:\n') + fd.write(' THROW_IMPOSSIBLE;\n') fd.write(' }\n') fd.write('}\n') fd.close() # - # smx_popping_bodies.cpp + # popping_bodies.cpp # fd = header('popping_bodies.cpp') - fd.write('#include \n') - fd.write('#include "smx_private.h"\n') + fd.write('#include "smx_private.hpp"\n') fd.write('#include "src/mc/mc_forward.hpp"\n') fd.write('#include "xbt/ex.h"\n') + fd.write('#include \n') fd.write('#include \n') fd.write("/** @cond */ // Please Doxygen, don't look at this\n") fd.write(''' @@ -380,5 +383,5 @@ inline static R simcall(e_smx_simcall_t call, T const&... t) } ''') handle(fd, Simcall.body, simcalls, simcalls_dict) - fd.write("/** @endcond */\n"); + fd.write(" /** @endcond */\n"); fd.close() diff --git a/src/simix/smx_context.cpp b/src/simix/smx_context.cpp index e3991634b7..8ccd6f3e42 100644 --- a/src/simix/smx_context.cpp +++ b/src/simix/smx_context.cpp @@ -16,15 +16,13 @@ #include #include +#include "simgrid/modelchecker.h" +#include "simgrid/sg_config.h" +#include "smx_private.hpp" #include "src/internal_config.h" #include "xbt/log.h" #include "xbt/swag.h" #include "xbt/xbt_os_thread.h" -#include "smx_private.h" -#include "simgrid/sg_config.h" -#include "src/internal_config.h" -#include "simgrid/modelchecker.h" - #ifdef _WIN32 #include @@ -107,14 +105,13 @@ void SIMIX_context_mod_init() #endif #if defined(__APPLE__) || defined(__NetBSD__) - if (context_factory_name == std::string("thread") && - strcmp(xbt_cfg_get_string("smpi/privatization"), "dlopen") == 0) { + if (context_factory_name == "thread" && xbt_cfg_get_string("smpi/privatization") == "dlopen") { XBT_WARN("dlopen+thread broken on Apple and BSD. Switching to raw contexts."); context_factory_name = "raw"; } #endif #if defined(__FreeBSD__) - if (context_factory_name == std::string("thread") && strcmp(xbt_cfg_get_string("smpi/privatization"), "no") != 0) { + if (context_factory_name == "thread" && xbt_cfg_get_string("smpi/privatization") != "no") { XBT_WARN("mmap broken on FreeBSD, but dlopen+thread broken too. Switching to dlopen+raw contexts."); context_factory_name = "raw"; } diff --git a/src/simix/smx_deployment.cpp b/src/simix/smx_deployment.cpp index 6fad27e09a..18bf778ded 100644 --- a/src/simix/smx_deployment.cpp +++ b/src/simix/smx_deployment.cpp @@ -7,7 +7,7 @@ #include #include "simgrid/s4u/Host.hpp" -#include "smx_private.h" +#include "smx_private.hpp" #include "src/surf/xml/platf_private.hpp" // FIXME: KILLME. There must be a better way than mimicking XML here #include @@ -118,23 +118,18 @@ void SIMIX_process_set_function(const char* process_host, const char* process_fu double process_start_time, double process_kill_time) { s_sg_platf_process_cbarg_t process; - memset(&process,0,sizeof(process)); sg_host_t host = sg_host_by_name(process_host); if (not host) THROWF(arg_error, 0, "Host '%s' unknown", process_host); process.host = process_host; - - process.argc = 1 + xbt_dynar_length(arguments); - process.argv = static_cast(xbt_new(const char*, process.argc + 1)); - process.argv[0] = xbt_strdup(process_function); + process.args.push_back(process_function); /* add arguments */ unsigned int i; char *arg; xbt_dynar_foreach(arguments, i, arg) { - process.argv[i + 1] = xbt_strdup(arg); + process.args.push_back(arg); } - process.argv[process.argc] = nullptr; // Check we know how to handle this function name: simgrid::simix::ActorCodeFactory& parse_code = SIMIX_get_actor_code_factory(process_function); diff --git a/src/simix/smx_environment.cpp b/src/simix/smx_environment.cpp index d0c7d0228c..3332c1d617 100644 --- a/src/simix/smx_environment.cpp +++ b/src/simix/smx_environment.cpp @@ -1,15 +1,15 @@ -/* Copyright (c) 2007-2015. The SimGrid Team. +/* Copyright (c) 2007-2017. 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 "smx_private.h" -#include -#include "xbt/sysdep.h" +#include "smx_private.hpp" +#include "xbt/config.h" #include "xbt/log.h" +#include "xbt/sysdep.h" #include "xbt/xbt_os_time.h" -#include "xbt/config.h" +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_environment, simix, "Logging specific to SIMIX (environment)"); diff --git a/src/simix/smx_global.cpp b/src/simix/smx_global.cpp index 61469fb447..ad2d351fa1 100644 --- a/src/simix/smx_global.cpp +++ b/src/simix/smx_global.cpp @@ -3,6 +3,7 @@ /* 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 #include @@ -12,18 +13,19 @@ #include #include +#include #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" +#include "smx_private.hpp" #include "src/surf/surf_interface.hpp" #include "src/surf/xml/platf.hpp" -#include "smx_private.h" -#include "xbt/ex.h" /* ex_backtrace_display */ +#include "xbt/ex.h" /* ex_backtrace_display */ #include "mc/mc.h" #include "simgrid/sg_config.h" -#include "src/mc/mc_replay.h" +#include "src/mc/mc_replay.hpp" #include "src/surf/StorageImpl.hpp" #include "src/smpi/include/smpi_process.hpp" @@ -35,15 +37,14 @@ #include "src/kernel/activity/SynchroRaw.hpp" #if SIMGRID_HAVE_MC -#include "src/mc/mc_private.h" +#include "src/mc/mc_private.hpp" #include "src/mc/remote/Client.hpp" #include "src/mc/remote/mc_protocol.h" #endif -#include "src/mc/mc_record.h" +#include "src/mc/mc_record.hpp" #if HAVE_SMPI -#include "src/smpi/include/private.h" #include "src/smpi/include/private.hpp" #endif @@ -51,23 +52,27 @@ XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix, "Logging specific to SIMIX (kernel)"); std::unique_ptr simix_global; -static xbt_heap_t simix_timers = nullptr; + +namespace { +typedef std::pair TimerQelt; +boost::heap::fibonacci_heap>> simix_timers; +} /** @brief Timer datatype */ -typedef class s_smx_timer { +class s_smx_timer_t { double date = 0.0; - s_smx_timer() = default; public: + decltype(simix_timers)::handle_type handle_; simgrid::xbt::Task callback; double getDate() { return date; } - s_smx_timer(double date, simgrid::xbt::Task callback) : date(date), callback(std::move(callback)) {} -} s_smx_timer_t; + s_smx_timer_t(double date, simgrid::xbt::Task callback) : date(date), callback(std::move(callback)) {} +}; void (*SMPI_switch_data_segment)(int) = nullptr; int _sg_do_verbose_exit = 1; -static void inthandler(int ignored) +static void inthandler(int) { if ( _sg_do_verbose_exit ) { XBT_INFO("CTRL-C pressed. The current status will be displayed before exit (disable that behavior with option 'verbose-exit')."); @@ -80,7 +85,7 @@ static void inthandler(int ignored) } #ifndef _WIN32 -static void segvhandler(int signum, siginfo_t *siginfo, void *context) +static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/) { if (siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) { fprintf(stderr, "Access violation detected.\n" @@ -157,7 +162,7 @@ static void install_segvhandler() /********************************* SIMIX **************************************/ double SIMIX_timer_next() { - return xbt_heap_size(simix_timers) > 0 ? xbt_heap_maxkey(simix_timers) : -1.0; + return simix_timers.empty() ? -1.0 : simix_timers.top().first; } static void kill_process(smx_actor_t process) @@ -236,16 +241,11 @@ void SIMIX_global_init(int *argc, char **argv) }); simgrid::surf::storageCreatedCallbacks.connect([](simgrid::surf::StorageImpl* storage) { - sg_storage_t s = simgrid::s4u::Storage::byName(storage->cname()); - xbt_assert(s != nullptr, "Storage not found for name %s", storage->cname()); + sg_storage_t s = simgrid::s4u::Storage::byName(storage->getCname()); + xbt_assert(s != nullptr, "Storage not found for name %s", storage->getCname()); }); } - if (not simix_timers) - simix_timers = xbt_heap_new(8, [](void* p) { - delete static_cast(p); - }); - if (xbt_cfg_get_boolean("clean-atexit")) atexit(SIMIX_clean); @@ -265,6 +265,15 @@ void SIMIX_clean() if (smx_cleaned) return; // to avoid double cleaning by java and C + smx_cleaned = 1; + XBT_DEBUG("SIMIX_clean called. Simulation's over."); + if (not simix_global->process_to_run.empty() && SIMIX_get_clock() <= 0.0) { + XBT_CRITICAL(" "); + XBT_CRITICAL("The time is still 0, and you still have processes ready to run."); + XBT_CRITICAL("It seems that you forgot to run the simulation that you setup."); + xbt_die("Bailing out to avoid that stop-before-start madness. Please fix your code."); + } + #if HAVE_SMPI if (SIMIX_process_count()>0){ if(smpi_process()->initialized()){ @@ -276,14 +285,6 @@ void SIMIX_clean() } #endif - smx_cleaned = 1; - XBT_DEBUG("SIMIX_clean called. Simulation's over."); - if (not simix_global->process_to_run.empty() && SIMIX_get_clock() <= 0.0) { - XBT_CRITICAL(" "); - XBT_CRITICAL("The time is still 0, and you still have processes ready to run."); - XBT_CRITICAL("It seems that you forgot to run the simulation that you setup."); - xbt_die("Bailing out to avoid that stop-before-start madness. Please fix your code."); - } /* Kill all processes (but maestro) */ SIMIX_process_killall(simix_global->maestro_process, 1); SIMIX_context_runall(); @@ -292,8 +293,10 @@ void SIMIX_clean() /* Exit the SIMIX network module */ SIMIX_mailbox_exit(); - xbt_heap_free(simix_timers); - simix_timers = nullptr; + while (not simix_timers.empty()) { + delete simix_timers.top().second; + simix_timers.pop(); + } /* Free the remaining data structures */ simix_global->process_to_run.clear(); simix_global->process_that_ran.clear(); @@ -363,18 +366,18 @@ static void SIMIX_wake_processes() static bool SIMIX_execute_timers() { bool result = false; - while (xbt_heap_size(simix_timers) > 0 && SIMIX_get_clock() >= SIMIX_timer_next()) { + while (not simix_timers.empty() && SIMIX_get_clock() >= simix_timers.top().first) { result = true; - //FIXME: make the timers being real callbacks - // (i.e. provide dispatchers that read and expand the args) - smx_timer_t timer = (smx_timer_t) xbt_heap_pop(simix_timers); - try { - timer->callback(); - } - catch(...) { - xbt_die("Exception throwed ouf of timer callback"); - } - delete timer; + // FIXME: make the timers being real callbacks + // (i.e. provide dispatchers that read and expand the args) + smx_timer_t timer = simix_timers.top().second; + simix_timers.pop(); + try { + timer->callback(); + } catch (...) { + xbt_die("Exception thrown ouf of timer callback"); + } + delete timer; } return result; } @@ -411,7 +414,7 @@ static bool SIMIX_execute_tasks() */ void SIMIX_run() { - if (MC_record_path) { + if (not MC_record_path.empty()) { simgrid::mc::replay(MC_record_path); return; } @@ -498,7 +501,7 @@ void SIMIX_run() /* If only daemon processes remain, cancel their actions, mark them to die and reschedule them */ if (simix_global->process_list.size() == simix_global->daemons.size()) for (auto const& dmon : simix_global->daemons) { - XBT_DEBUG("Kill %s", dmon->cname()); + XBT_DEBUG("Kill %s", dmon->getCname()); SIMIX_process_kill(dmon, simix_global->maestro_process); } } @@ -564,20 +567,21 @@ void SIMIX_run() smx_timer_t SIMIX_timer_set(double date, void (*callback)(void*), void *arg) { smx_timer_t timer = new s_smx_timer_t(date, [callback, arg]() { callback(arg); }); - xbt_heap_push(simix_timers, timer, date); + timer->handle_ = simix_timers.emplace(std::make_pair(date, timer)); return timer; } smx_timer_t SIMIX_timer_set(double date, simgrid::xbt::Task callback) { smx_timer_t timer = new s_smx_timer_t(date, std::move(callback)); - xbt_heap_push(simix_timers, timer, date); + timer->handle_ = simix_timers.emplace(std::make_pair(date, timer)); return timer; } /** @brief cancels a timer that was added earlier */ void SIMIX_timer_remove(smx_timer_t timer) { - delete static_cast(xbt_heap_rm_elm(simix_timers, timer, timer->getDate())); + simix_timers.erase(timer->handle_); + delete timer; } /** @brief Returns the date at which the timer will trigger (or 0 if nullptr timer) */ @@ -654,11 +658,11 @@ void SIMIX_display_process_status() synchro_description = "I/O"; XBT_INFO("Process %lu (%s@%s): waiting for %s synchro %p (%s) in state %d to finish", process->pid, - process->cname(), process->host->getCname(), synchro_description, process->waiting_synchro.get(), + process->getCname(), process->host->getCname(), synchro_description, process->waiting_synchro.get(), process->waiting_synchro->name.c_str(), (int)process->waiting_synchro->state); } else { - XBT_INFO("Process %lu (%s@%s)", process->pid, process->cname(), process->host->getCname()); + XBT_INFO("Process %lu (%s@%s)", process->pid, process->getCname(), process->host->getCname()); } } } diff --git a/src/simix/smx_host.cpp b/src/simix/smx_host.cpp index 86985418e0..393256fc27 100644 --- a/src/simix/smx_host.cpp +++ b/src/simix/smx_host.cpp @@ -1,15 +1,16 @@ -/* Copyright (c) 2007-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2017. 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 "mc/mc.h" -#include "smx_private.h" +#include "smx_private.hpp" #include "src/kernel/activity/CommImpl.hpp" -#include "src/mc/mc_replay.h" +#include "src/mc/mc_replay.hpp" #include "src/plugins/vm/VirtualMachineImpl.hpp" #include "src/surf/surf_interface.hpp" #include "xbt/ex.hpp" +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_host, simix, "SIMIX hosts"); @@ -81,8 +82,8 @@ void SIMIX_host_off(sg_host_t h, smx_actor_t issuer) smx_actor_t process = nullptr; xbt_swag_foreach(process, host->process_list) { SIMIX_process_kill(process, issuer); - XBT_DEBUG("Killing %s@%s on behalf of %s which turned off that host.", process->cname(), - process->host->getCname(), issuer->cname()); + XBT_DEBUG("Killing %s@%s on behalf of %s which turned off that host.", process->getCname(), + process->host->getCname(), issuer->getCname()); } } } else { @@ -191,11 +192,6 @@ SIMIX_execution_parallel_start(const char* name, int host_nb, sg_host_t* host_li simgrid::kernel::activity::ExecImplPtr exec = simgrid::kernel::activity::ExecImplPtr(new simgrid::kernel::activity::ExecImpl(name, nullptr)); - /* set surf's synchro */ - sg_host_t *host_list_cpy = xbt_new0(sg_host_t, host_nb); - for (int i = 0; i < host_nb; i++) - host_list_cpy[i] = host_list[i]; - /* Check that we are not mixing VMs and PMs in the parallel task */ bool is_a_vm = (nullptr != dynamic_cast(host_list[0])); for (int i = 1; i < host_nb; i++) { @@ -205,6 +201,9 @@ SIMIX_execution_parallel_start(const char* name, int host_nb, sg_host_t* host_li /* set surf's synchro */ if (not MC_is_active() && not MC_record_replay_is_active()) { + /* set surf's synchro */ + sg_host_t* host_list_cpy = new sg_host_t[host_nb]; + std::copy_n(host_list, host_nb, host_list_cpy); exec->surf_exec = surf_host_model->executeParallelTask(host_nb, host_list_cpy, flops_amount, bytes_amount, rate); exec->surf_exec->setData(exec.get()); if (timeout > 0) { diff --git a/src/simix/smx_host_private.h b/src/simix/smx_host_private.hpp similarity index 74% rename from src/simix/smx_host_private.h rename to src/simix/smx_host_private.hpp index d9a6b57cfe..5f49d3fe1e 100644 --- a/src/simix/smx_host_private.h +++ b/src/simix/smx_host_private.hpp @@ -3,43 +3,43 @@ /* 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. */ -#ifndef SIMIX_HOST_PRIVATE_H -#define SIMIX_HOST_PRIVATE_H +#ifndef SIMIX_HOST_PRIVATE_HPP +#define SIMIX_HOST_PRIVATE_HPP #include #include #include -#include #include +#include +#include "popping_private.hpp" #include "simgrid/simix.h" -#include "popping_private.h" +#include "ActorImpl.hpp" #include "src/kernel/activity/ExecImpl.hpp" /** @brief Host datatype from SIMIX POV */ namespace simgrid { - namespace simix { - class ProcessArg; +namespace simix { - class Host { - public: - static simgrid::xbt::Extension EXTENSION_ID; +class Host { +public: + static simgrid::xbt::Extension EXTENSION_ID; - explicit Host(); - virtual ~Host(); + explicit Host(); + virtual ~Host(); - xbt_swag_t process_list; - std::vector auto_restart_processes; - std::vector boot_processes; + xbt_swag_t process_list; + std::vector auto_restart_processes; + std::vector boot_processes; - void turnOn(); - }; - } + void turnOn(); +}; +} } -SG_BEGIN_DECL() +extern "C" { XBT_PRIVATE void SIMIX_host_add_auto_restart_process(sg_host_t host, const char* name, std::function code, void* data, double kill_time, std::map* properties, int auto_restart); @@ -48,9 +48,8 @@ XBT_PRIVATE void SIMIX_host_autorestart(sg_host_t host); XBT_PRIVATE void SIMIX_execution_finish(simgrid::kernel::activity::ExecImplPtr exec); -XBT_PRIVATE void SIMIX_set_category(smx_activity_t synchro, const char *category); - -SG_END_DECL() +XBT_PRIVATE void SIMIX_set_category(smx_activity_t synchro, const char* category); +} XBT_PRIVATE boost::intrusive_ptr SIMIX_execution_start(smx_actor_t issuer, const char* name, double flops_amount, double priority, double bound); @@ -59,4 +58,3 @@ SIMIX_execution_parallel_start(const char* name, int host_nb, sg_host_t* host_li double* bytes_amount, double rate, double timeout); #endif - diff --git a/src/simix/smx_io.cpp b/src/simix/smx_io.cpp index 14939882e4..39c13a1913 100644 --- a/src/simix/smx_io.cpp +++ b/src/simix/smx_io.cpp @@ -9,30 +9,28 @@ #include "simgrid/s4u/Host.hpp" #include "simgrid/s4u/Storage.hpp" -#include "src/surf/FileImpl.hpp" #include "src/surf/HostImpl.hpp" #include "src/surf/StorageImpl.hpp" -#include "surf/surf.h" +#include "surf/surf.hpp" +#include "smx_private.hpp" #include "src/surf/surf_interface.hpp" -#include "smx_private.h" #include "src/kernel/activity/SynchroIo.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix, "Logging specific to SIMIX (io)"); -//SIMIX FILE READ -void simcall_HANDLER_file_read(smx_simcall_t simcall, surf_file_t fd, sg_size_t size) +void simcall_HANDLER_storage_read(smx_simcall_t simcall, surf_storage_t st, sg_size_t size) { - smx_activity_t synchro = SIMIX_file_read(fd, size); + smx_activity_t synchro = SIMIX_storage_read(st, size); synchro->simcalls.push_back(simcall); simcall->issuer->waiting_synchro = synchro; } -smx_activity_t SIMIX_file_read(surf_file_t file, sg_size_t size) +smx_activity_t SIMIX_storage_read(surf_storage_t st, sg_size_t size) { simgrid::kernel::activity::IoImpl* synchro = new simgrid::kernel::activity::IoImpl(); - synchro->surf_io = file->read(size); + synchro->surf_io = st->read(size); synchro->surf_io->setData(synchro); XBT_DEBUG("Create io synchro %p", synchro); @@ -40,18 +38,17 @@ smx_activity_t SIMIX_file_read(surf_file_t file, sg_size_t size) return synchro; } -//SIMIX FILE WRITE -void simcall_HANDLER_file_write(smx_simcall_t simcall, surf_file_t fd, sg_size_t size) +void simcall_HANDLER_storage_write(smx_simcall_t simcall, surf_storage_t st, sg_size_t size) { - smx_activity_t synchro = SIMIX_file_write(fd, size); + smx_activity_t synchro = SIMIX_storage_write(st, size); synchro->simcalls.push_back(simcall); simcall->issuer->waiting_synchro = synchro; } -smx_activity_t SIMIX_file_write(surf_file_t file, sg_size_t size) +smx_activity_t SIMIX_storage_write(surf_storage_t st, sg_size_t size) { simgrid::kernel::activity::IoImpl* synchro = new simgrid::kernel::activity::IoImpl(); - synchro->surf_io = file->write(size); + synchro->surf_io = st->write(size); synchro->surf_io->setData(synchro); XBT_DEBUG("Create io synchro %p", synchro); diff --git a/src/simix/smx_io_private.h b/src/simix/smx_io_private.hpp similarity index 61% rename from src/simix/smx_io_private.h rename to src/simix/smx_io_private.hpp index db1c66d3af..79581a8ac8 100644 --- a/src/simix/smx_io_private.h +++ b/src/simix/smx_io_private.hpp @@ -3,16 +3,16 @@ /* 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. */ -#ifndef SIMIX_IO_PRIVATE_H -#define SIMIX_IO_PRIVATE_H +#ifndef SIMIX_IO_PRIVATE_HPP +#define SIMIX_IO_PRIVATE_HPP #include +#include "popping_private.hpp" #include "simgrid/simix.h" -#include "popping_private.h" -XBT_PRIVATE smx_activity_t SIMIX_file_read(surf_file_t fd, sg_size_t size); -XBT_PRIVATE smx_activity_t SIMIX_file_write(surf_file_t fd, sg_size_t size); +XBT_PRIVATE smx_activity_t SIMIX_storage_read(surf_storage_t fd, sg_size_t size); +XBT_PRIVATE smx_activity_t SIMIX_storage_write(surf_storage_t fd, sg_size_t size); XBT_PRIVATE void SIMIX_io_destroy(smx_activity_t synchro); XBT_PRIVATE void SIMIX_io_finish(smx_activity_t synchro); diff --git a/src/simix/smx_network.cpp b/src/simix/smx_network.cpp index 591cf58a0c..173e0af9c5 100644 --- a/src/simix/smx_network.cpp +++ b/src/simix/smx_network.cpp @@ -15,8 +15,8 @@ #include "mc/mc.h" #include "simgrid/s4u/Activity.hpp" #include "simgrid/s4u/Mailbox.hpp" -#include "src/mc/mc_replay.h" -#include "src/simix/smx_private.h" +#include "src/mc/mc_replay.hpp" +#include "src/simix/smx_private.hpp" #include "src/surf/cpu_interface.hpp" #include "src/surf/surf_interface.hpp" @@ -84,7 +84,7 @@ XBT_PRIVATE void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_actor_t sr simcall_HANDLER_comm_wait(simcall, comm, timeout); } XBT_PRIVATE smx_activity_t simcall_HANDLER_comm_isend( - smx_simcall_t simcall, smx_actor_t src_proc, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, + smx_simcall_t /*simcall*/, smx_actor_t src_proc, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, int (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), void (*clean_fun)(void*), // used to free the synchro in case of problem after a detached send void (*copy_data_fun)(smx_activity_t, void*, size_t), // used to copy data if not default one @@ -163,8 +163,8 @@ XBT_PRIVATE void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_actor_t re simcall_HANDLER_comm_wait(simcall, comm, timeout); } -XBT_PRIVATE smx_activity_t simcall_HANDLER_comm_irecv(smx_simcall_t simcall, smx_actor_t receiver, smx_mailbox_t mbox, - void* dst_buff, size_t* dst_buff_size, +XBT_PRIVATE smx_activity_t simcall_HANDLER_comm_irecv(smx_simcall_t /*simcall*/, smx_actor_t receiver, + smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, void (*copy_data_fun)(smx_activity_t, void*, size_t), void* data, double rate) @@ -318,7 +318,7 @@ void simcall_HANDLER_comm_wait(smx_simcall_t simcall, smx_activity_t synchro, do } else { /* we need a surf sleep action even when there is no timeout, otherwise surf won't tell us when the host fails */ surf_action_t sleep = simcall->issuer->host->pimpl_cpu->sleep(timeout); - sleep->setData(&*synchro); + sleep->setData(synchro.get()); simgrid::kernel::activity::CommImplPtr comm = boost::static_pointer_cast(synchro); @@ -476,11 +476,11 @@ static inline void SIMIX_comm_start(simgrid::kernel::activity::CommImplPtr comm) if (comm->src_proc->isSuspended()) XBT_DEBUG("The communication is suspended on startup because src (%s@%s) was suspended since it initiated the " "communication", - comm->src_proc->cname(), comm->src_proc->host->getCname()); + comm->src_proc->getCname(), comm->src_proc->host->getCname()); else XBT_DEBUG("The communication is suspended on startup because dst (%s@%s) was suspended since it initiated the " "communication", - comm->dst_proc->cname(), comm->dst_proc->host->getCname()); + comm->dst_proc->getCname(), comm->dst_proc->host->getCname()); comm->surf_comm->suspend(); } @@ -562,7 +562,7 @@ void SIMIX_comm_finish(smx_activity_t synchro) XBT_DEBUG("Link failure in synchro %p between '%s' and '%s': posting an exception to the issuer: %s (%p) " "detached:%d", synchro.get(), comm->src_proc ? comm->src_proc->host->getCname() : nullptr, - comm->dst_proc ? comm->dst_proc->host->getCname() : nullptr, simcall->issuer->cname(), + comm->dst_proc ? comm->dst_proc->host->getCname() : nullptr, simcall->issuer->getCname(), simcall->issuer, comm->detached); if (comm->src_proc == simcall->issuer) { XBT_DEBUG("I'm source"); @@ -690,7 +690,7 @@ void SIMIX_comm_copy_data(smx_activity_t synchro) /* Copy at most dst_buff_size bytes of the message to receiver's buffer */ if (comm->dst_buff_size) - buff_size = MIN(buff_size, *(comm->dst_buff_size)); + buff_size = std::min(buff_size, *(comm->dst_buff_size)); /* Update the receiver's buffer size to the copied amount */ if (comm->dst_buff_size) diff --git a/src/simix/smx_network_private.h b/src/simix/smx_network_private.hpp similarity index 93% rename from src/simix/smx_network_private.h rename to src/simix/smx_network_private.hpp index 0ed901f3dc..0540c7b511 100644 --- a/src/simix/smx_network_private.h +++ b/src/simix/smx_network_private.hpp @@ -3,8 +3,8 @@ /* 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. */ -#ifndef SIMIX_NETWORK_PRIVATE_H -#define SIMIX_NETWORK_PRIVATE_H +#ifndef SIMIX_NETWORK_PRIVATE_HPP +#define SIMIX_NETWORK_PRIVATE_HPP #include "simgrid/s4u/Mailbox.hpp" #include "src/kernel/activity/MailboxImpl.hpp" diff --git a/src/simix/smx_private.h b/src/simix/smx_private.hpp similarity index 66% rename from src/simix/smx_private.h rename to src/simix/smx_private.hpp index f10bf4d126..a14ab8bfd1 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.hpp @@ -3,12 +3,12 @@ /* 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. */ -#ifndef SIMIX_PRIVATE_H -#define SIMIX_PRIVATE_H +#ifndef SIMIX_PRIVATE_HPP +#define SIMIX_PRIVATE_HPP #include "simgrid/s4u/Actor.hpp" #include "src/kernel/context/Context.hpp" -#include +#include #include #include @@ -37,7 +37,7 @@ public: xbt_dynar_t actors_vector = xbt_dynar_new(sizeof(smx_actor_t), nullptr); #endif xbt_swag_t process_to_destroy = nullptr; - smx_actor_t maestro_process = nullptr; + smx_actor_t maestro_process = nullptr; // Maps function names to actor code: std::unordered_map registered_functions; @@ -49,18 +49,17 @@ public: void_pfn_smxprocess_t kill_process_function = nullptr; /** Callback used when killing a SMX_process */ void_pfn_smxprocess_t cleanup_process_function = nullptr; - xbt_os_mutex_t mutex = nullptr; + xbt_os_mutex_t mutex = nullptr; std::vector> tasks; std::vector> tasksTemp; std::vector daemons; }; - } } -SG_BEGIN_DECL() +extern "C" { XBT_PUBLIC_DATA(std::unique_ptr) simix_global; @@ -68,15 +67,15 @@ XBT_PUBLIC(void) SIMIX_clean(); /******************************** Exceptions *********************************/ /** @brief Ask to the provided simix process to raise the provided exception */ -#define SMX_EXCEPTION(issuer, cat, val, msg) \ - if (1) { \ - smx_actor_t _smx_throw_issuer = (issuer); /* evaluate only once */ \ - xbt_ex e(XBT_THROW_POINT, msg); \ - e.category = cat; \ - e.value = val; \ - _smx_throw_issuer->exception = std::make_exception_ptr(e); \ - } else ((void)0) - -SG_END_DECL() +#define SMX_EXCEPTION(issuer, cat, val, msg) \ + if (1) { \ + smx_actor_t _smx_throw_issuer = (issuer); /* evaluate only once */ \ + xbt_ex e(XBT_THROW_POINT, msg); \ + e.category = cat; \ + e.value = val; \ + _smx_throw_issuer->exception = std::make_exception_ptr(e); \ + } else \ + ((void)0) +} #endif diff --git a/src/simix/smx_synchro.cpp b/src/simix/smx_synchro.cpp index c47d04c882..e25a2275d2 100644 --- a/src/simix/smx_synchro.cpp +++ b/src/simix/smx_synchro.cpp @@ -4,7 +4,7 @@ /* 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 "smx_private.h" +#include "smx_private.hpp" #include "src/surf/cpu_interface.hpp" #include "src/surf/surf_interface.hpp" #include @@ -29,7 +29,7 @@ static smx_activity_t SIMIX_synchro_wait(sg_host_t smx_host, double timeout) simgrid::kernel::activity::RawImplPtr sync = simgrid::kernel::activity::RawImplPtr(new simgrid::kernel::activity::RawImpl()); sync->sleep = smx_host->pimpl_cpu->sleep(timeout); - sync->sleep->setData(&*sync); + sync->sleep->setData(sync.get()); XBT_OUT(); return sync; } @@ -168,7 +168,7 @@ void MutexImpl::unlock(smx_actor_t issuer) /* If the mutex is not owned by the issuer, that's not good */ if (issuer != this->owner) THROWF(mismatch_error, 0, "Cannot release that mutex: it was locked by %s (pid:%lu), not by you.", - this->owner->cname(), this->owner->pid); + this->owner->getCname(), this->owner->pid); if (xbt_swag_size(this->sleeping) > 0) { /*process to wake up */ @@ -232,7 +232,7 @@ smx_cond_t SIMIX_cond_init() { XBT_IN("()"); simgrid::simix::ActorImpl p; - smx_cond_t cond = new s_smx_cond(); + smx_cond_t cond = new s_smx_cond_t(); cond->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); cond->refcount_ = 1; XBT_OUT(); @@ -364,14 +364,13 @@ void SIMIX_cond_unref(smx_cond_t cond) void intrusive_ptr_add_ref(s_smx_cond_t *cond) { - auto previous = (cond->refcount_)++; + auto previous = cond->refcount_.fetch_add(1); xbt_assert(previous != 0); } void intrusive_ptr_release(s_smx_cond_t *cond) { - auto count = --(cond->refcount_); - if (count == 0) { + if (cond->refcount_.fetch_sub(1) == 1) { xbt_assert(xbt_swag_size(cond->sleeping) == 0, "Cannot destroy conditional since someone is still using it"); xbt_swag_free(cond->sleeping); @@ -386,7 +385,7 @@ smx_sem_t SIMIX_sem_init(unsigned int value) XBT_IN("(%u)",value); simgrid::simix::ActorImpl p; - smx_sem_t sem = xbt_new0(s_smx_sem_t, 1); + smx_sem_t sem = new s_smx_sem_t; sem->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); sem->value = value; XBT_OUT(); @@ -402,7 +401,7 @@ void SIMIX_sem_destroy(smx_sem_t sem) xbt_assert(xbt_swag_size(sem->sleeping) == 0, "Cannot destroy semaphore since someone is still using it"); xbt_swag_free(sem->sleeping); - xbt_free(sem); + delete sem; } XBT_OUT(); } diff --git a/src/simix/smx_synchro_private.hpp b/src/simix/smx_synchro_private.hpp index 8eb66a5bcb..5846b045f1 100644 --- a/src/simix/smx_synchro_private.hpp +++ b/src/simix/smx_synchro_private.hpp @@ -31,15 +31,12 @@ public: // boost::intrusive_ptr support: friend void intrusive_ptr_add_ref(MutexImpl* mutex) { - // Atomic operation! Do not split in two instructions! - XBT_ATTRIB_UNUSED auto previous = (mutex->refcount_)++; + XBT_ATTRIB_UNUSED auto previous = mutex->refcount_.fetch_add(1); xbt_assert(previous != 0); } friend void intrusive_ptr_release(MutexImpl* mutex) { - // Atomic operation! Do not split in two instructions! - auto count = --(mutex->refcount_); - if (count == 0) + if (mutex->refcount_.fetch_sub(1) == 1) delete mutex; } @@ -52,19 +49,19 @@ private: } } -typedef struct s_smx_cond { - s_smx_cond() : cond_(this) {} +struct s_smx_cond_t { + s_smx_cond_t() : cond_(this) {} std::atomic_int_fast32_t refcount_{1}; smx_mutex_t mutex = nullptr; xbt_swag_t sleeping = nullptr; /* list of sleeping process */ simgrid::s4u::ConditionVariable cond_; -} s_smx_cond_t; +}; -typedef struct s_smx_sem { +struct s_smx_sem_t { unsigned int value; xbt_swag_t sleeping; /* list of sleeping process */ -} s_smx_sem_t; +}; XBT_PRIVATE void SIMIX_post_synchro(smx_activity_t synchro); XBT_PRIVATE void SIMIX_synchro_stop_waiting(smx_actor_t process, smx_simcall_t simcall); diff --git a/src/smpi/bindings/smpi_f77.cpp b/src/smpi/bindings/smpi_f77.cpp index ac716095c0..a482ce2cc9 100644 --- a/src/smpi/bindings/smpi_f77.cpp +++ b/src/smpi/bindings/smpi_f77.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" #include "smpi_op.hpp" diff --git a/src/smpi/bindings/smpi_f77_coll.cpp b/src/smpi/bindings/smpi_f77_coll.cpp index 1d642da9ad..9939a7bcfb 100644 --- a/src/smpi/bindings/smpi_f77_coll.cpp +++ b/src/smpi/bindings/smpi_f77_coll.cpp @@ -3,11 +3,11 @@ /* 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 "private.h" +#include "private.hpp" +#include "smpi_coll.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" #include "smpi_op.hpp" -#include "smpi_coll.hpp" extern "C" { // This should really use the C linkage to be usable from Fortran diff --git a/src/smpi/bindings/smpi_f77_comm.cpp b/src/smpi/bindings/smpi_f77_comm.cpp index f0f56d0d2a..ef0e4f651d 100644 --- a/src/smpi/bindings/smpi_f77_comm.cpp +++ b/src/smpi/bindings/smpi_f77_comm.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_info.hpp" diff --git a/src/smpi/bindings/smpi_f77_request.cpp b/src/smpi/bindings/smpi_f77_request.cpp index f2e77aed6f..3fb234305f 100644 --- a/src/smpi/bindings/smpi_f77_request.cpp +++ b/src/smpi/bindings/smpi_f77_request.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" #include "smpi_request.hpp" diff --git a/src/smpi/bindings/smpi_f77_type.cpp b/src/smpi/bindings/smpi_f77_type.cpp index 1da72486c8..b40ab8060d 100644 --- a/src/smpi/bindings/smpi_f77_type.cpp +++ b/src/smpi/bindings/smpi_f77_type.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" diff --git a/src/smpi/bindings/smpi_mpi.cpp b/src/smpi/bindings/smpi_mpi.cpp index 9c9bdb6796..7d519b1377 100644 --- a/src/smpi/bindings/smpi_mpi.cpp +++ b/src/smpi/bindings/smpi_mpi.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "simgrid/sg_config.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi, "Logging specific to SMPI ,(mpi)"); diff --git a/src/smpi/bindings/smpi_pmpi.cpp b/src/smpi/bindings/smpi_pmpi.cpp index 59561a4699..52dcf73c97 100644 --- a/src/smpi/bindings/smpi_pmpi.cpp +++ b/src/smpi/bindings/smpi_pmpi.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" #include "smpi_comm.hpp" @@ -39,11 +39,9 @@ int PMPI_Init(int *argc, char ***argv) smpi_process()->mark_as_initialized(); int rank = smpi_process()->index(); TRACE_smpi_init(rank); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("init")); + TRACE_smpi_comm_out(rank); TRACE_smpi_computing_init(rank); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_INIT; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); - TRACE_smpi_collective_out(rank, __FUNCTION__); smpi_bench_begin(); } @@ -56,14 +54,12 @@ int PMPI_Finalize() { smpi_bench_end(); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_FINALIZE; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("finalize")); smpi_process()->finalize(); - TRACE_smpi_collective_out(rank, __FUNCTION__); - TRACE_smpi_finalize(smpi_process()->index()); + TRACE_smpi_comm_out(rank); + TRACE_smpi_finalize(rank); return MPI_SUCCESS; } @@ -88,7 +84,7 @@ int PMPI_Get_library_version (char *version,int *len){ return MPI_SUCCESS; } -int PMPI_Init_thread(int *argc, char ***argv, int required, int *provided) +int PMPI_Init_thread(int* argc, char*** argv, int /*required*/, int* provided) { if (provided != nullptr) { *provided = MPI_THREAD_SINGLE; @@ -116,7 +112,7 @@ int PMPI_Is_thread_main(int *flag) } } -int PMPI_Abort(MPI_Comm comm, int errorcode) +int PMPI_Abort(MPI_Comm /*comm*/, int /*errorcode*/) { smpi_bench_end(); // FIXME: should kill all processes in comm instead @@ -186,7 +182,8 @@ int PMPI_Initialized(int* flag) { return MPI_SUCCESS; } -int PMPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr){ +int PMPI_Alloc_mem(MPI_Aint size, MPI_Info /*info*/, void* baseptr) +{ void *ptr = xbt_malloc(size); if(ptr==nullptr) return MPI_ERR_NO_MEM; diff --git a/src/smpi/bindings/smpi_pmpi_coll.cpp b/src/smpi/bindings/smpi_pmpi_coll.cpp index 29c9db411b..aaf32c3441 100644 --- a/src/smpi/bindings/smpi_pmpi_coll.cpp +++ b/src/smpi/bindings/smpi_pmpi_coll.cpp @@ -3,16 +3,15 @@ /* 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 "private.h" -#include "smpi_comm.hpp" +#include "private.hpp" #include "smpi_coll.hpp" +#include "smpi_comm.hpp" #include "smpi_datatype_derived.hpp" #include "smpi_op.hpp" #include "smpi_process.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi); - /* PMPI User level calls */ extern "C" { // Obviously, the C MPI interface should use the C linkage @@ -28,23 +27,15 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c retval = MPI_ERR_ARG; } else { int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_BCAST; - extra->root = root_traced; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = count * dt_size_send; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("bcast", comm->group()->index(root), -1.0, + datatype->is_basic() ? count : count * datatype->size(), -1, + encode_datatype(datatype), "")); if (comm->size() > 1) simgrid::smpi::Colls::bcast(buf, count, datatype, root, comm); retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -59,10 +50,8 @@ int PMPI_Barrier(MPI_Comm comm) if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else { - int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_BARRIER; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + int rank = smpi_process()->index(); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("barrier")); simgrid::smpi::Colls::barrier(comm); @@ -71,7 +60,7 @@ int PMPI_Barrier(MPI_Comm comm) retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -102,28 +91,18 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,void *recvbu sendtmptype=recvtype; } int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_GATHER; - extra->root = root_traced; - int known = 0; - extra->datatype1 = encode_datatype(sendtmptype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = sendtmptype->size(); - extra->send_size = sendtmpcount * dt_size_send; - extra->datatype2 = encode_datatype(recvtype, &known); - int dt_size_recv = 1; - if ((comm->rank() == root) && known == 0) - dt_size_recv = recvtype->size(); - extra->recv_size = recvcount * dt_size_recv; - - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData( + "gather", comm->group()->index(root), -1.0, + sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(), + (comm->rank() != root || recvtype->is_basic()) ? recvcount : recvcount * recvtype->size(), + encode_datatype(sendtmptype), encode_datatype(recvtype))); simgrid::smpi::Colls::gather(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -155,32 +134,23 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recv sendtmptype=recvtype; } - int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - int size = comm->size(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_GATHERV; - extra->num_processes = size; - extra->root = root_traced; - int known = 0; - extra->datatype1 = encode_datatype(sendtmptype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = sendtype->size(); - extra->send_size = sendtmpcount * dt_size_send; - extra->datatype2 = encode_datatype(recvtype, &known); - int dt_size_recv = 1; - if (known == 0) - dt_size_recv = recvtype->size(); + int rank = smpi_process()->index(); + int dt_size_recv = recvtype->is_basic() ? 1 : recvtype->size(); + + std::vector* trace_recvcounts = new std::vector; if (comm->rank() == root) { - extra->recvcounts = xbt_new(int, size); - for (int i = 0; i < size; i++) // copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i] * dt_size_recv; + for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i] * dt_size_recv); } - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData( + "gatherV", comm->group()->index(root), + sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(), nullptr, + dt_size_recv, trace_recvcounts, encode_datatype(sendtmptype), encode_datatype(recvtype))); retval = simgrid::smpi::Colls::gatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts, displs, recvtype, root, comm); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -190,7 +160,7 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recv int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm) { - int retval = 0; + int retval = MPI_SUCCESS; smpi_bench_end(); @@ -209,25 +179,15 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, sendtype=recvtype; } int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLGATHER; - int known = 0; - extra->datatype1 = encode_datatype(sendtype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = sendtype->size(); - extra->send_size = sendcount * dt_size_send; - extra->datatype2 = encode_datatype(recvtype, &known); - int dt_size_recv = 1; - if (known == 0) - dt_size_recv = recvtype->size(); - extra->recv_size = recvcount * dt_size_recv; - - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("allGather", -1, -1.0, + sendtype->is_basic() ? sendcount : sendcount * sendtype->size(), + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), + encode_datatype(sendtype), encode_datatype(recvtype))); simgrid::smpi::Colls::allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm); - retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -256,30 +216,20 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, sendtype=recvtype; } int rank = smpi_process()->index(); - int i = 0; - int size = comm->size(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLGATHERV; - extra->num_processes = size; - int known = 0; - extra->datatype1 = encode_datatype(sendtype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = sendtype->size(); - extra->send_size = sendcount * dt_size_send; - extra->datatype2 = encode_datatype(recvtype, &known); - int dt_size_recv = 1; - if (known == 0) - dt_size_recv = recvtype->size(); - extra->recvcounts = xbt_new(int, size); - for (i = 0; i < size; i++) // copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i] * dt_size_recv; - - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + int dt_size_recv = recvtype->is_basic() ? 1 : recvtype->size(); + + std::vector* trace_recvcounts = new std::vector; + for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i] * dt_size_recv); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData( + "allGatherV", -1, sendtype->is_basic() ? sendcount : sendcount * sendtype->size(), nullptr, + dt_size_recv, trace_recvcounts, encode_datatype(sendtype), encode_datatype(recvtype))); simgrid::smpi::Colls::allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm); retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -308,26 +258,17 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, recvcount = sendcount; } int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_SCATTER; - extra->root = root_traced; - int known = 0; - extra->datatype1 = encode_datatype(sendtype, &known); - int dt_size_send = 1; - if ((comm->rank() == root) && known == 0) - dt_size_send = sendtype->size(); - extra->send_size = sendcount * dt_size_send; - extra->datatype2 = encode_datatype(recvtype, &known); - int dt_size_recv = 1; - if (known == 0) - dt_size_recv = recvtype->size(); - extra->recv_size = recvcount * dt_size_recv; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData( + "scatter", comm->group()->index(root), -1.0, + (comm->rank() != root || sendtype->is_basic()) ? sendcount : sendcount * sendtype->size(), + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), encode_datatype(sendtype), + encode_datatype(recvtype))); simgrid::smpi::Colls::scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -354,32 +295,22 @@ int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, recvcount = sendcounts[comm->rank()]; } int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - int size = comm->size(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_SCATTERV; - extra->num_processes = size; - extra->root = root_traced; - int known = 0; - extra->datatype1 = encode_datatype(sendtype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = sendtype->size(); + int dt_size_send = sendtype->is_basic() ? 1 : sendtype->size(); + + std::vector* trace_sendcounts = new std::vector; if (comm->rank() == root) { - extra->sendcounts = xbt_new(int, size); - for (int i = 0; i < size; i++) // copy data to avoid bad free - extra->sendcounts[i] = sendcounts[i] * dt_size_send; + for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free + trace_sendcounts->push_back(sendcounts[i] * dt_size_send); } - extra->datatype2 = encode_datatype(recvtype, &known); - int dt_size_recv = 1; - if (known == 0) - dt_size_recv = recvtype->size(); - extra->recv_size = recvcount * dt_size_recv; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "scatterV", comm->group()->index(root), dt_size_send, trace_sendcounts, + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), nullptr, + encode_datatype(sendtype), encode_datatype(recvtype))); retval = simgrid::smpi::Colls::scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -398,23 +329,16 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, retval = MPI_ERR_ARG; } else { int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_REDUCE; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = count * dt_size_send; - extra->root = root_traced; - - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("reduce", comm->group()->index(root), 0, + datatype->is_basic() ? count : count * datatype->size(), -1, + encode_datatype(datatype), "")); simgrid::smpi::Colls::reduce(sendbuf, recvbuf, count, datatype, op, root, comm); retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -455,16 +379,11 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatyp simgrid::smpi::Datatype::copy(recvbuf, count, datatype,sendtmpbuf, count, datatype); } int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLREDUCE; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = count * dt_size_send; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("allReduce", -1, 0, + datatype->is_basic() ? count : count * datatype->size(), -1, + encode_datatype(datatype), "")); simgrid::smpi::Colls::allreduce(sendtmpbuf, recvbuf, count, datatype, op, comm); @@ -472,7 +391,7 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatyp xbt_free(sendtmpbuf); retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -493,20 +412,14 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MP retval = MPI_ERR_OP; } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_SCAN; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = count * dt_size_send; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData( + "scan", -1, datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); retval = simgrid::smpi::Colls::scan(sendbuf, recvbuf, count, datatype, op, comm); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -526,24 +439,19 @@ int PMPI_Exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, retval = MPI_ERR_OP; } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_EXSCAN; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = count * dt_size_send; void* sendtmpbuf = sendbuf; if (sendbuf == MPI_IN_PLACE) { sendtmpbuf = static_cast(xbt_malloc(count * datatype->size())); memcpy(sendtmpbuf, recvbuf, count * datatype->size()); } - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData( + "exscan", -1, datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); retval = simgrid::smpi::Colls::exscan(sendtmpbuf, recvbuf, count, datatype, op, comm); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (sendbuf == MPI_IN_PLACE) xbt_free(sendtmpbuf); } @@ -567,34 +475,28 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, MPI_Datat retval = MPI_ERR_ARG; } else { int rank = smpi_process()->index(); - int i = 0; - int size = comm->size(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_REDUCE_SCATTER; - extra->num_processes = size; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = 0; - extra->recvcounts = xbt_new(int, size); + std::vector* trace_recvcounts = new std::vector; + int dt_send_size = datatype->is_basic() ? 1 : datatype->size(); int totalcount = 0; - for (i = 0; i < size; i++) { // copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i] * dt_size_send; + + for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i] * dt_send_size); totalcount += recvcounts[i]; } + void* sendtmpbuf = sendbuf; if (sendbuf == MPI_IN_PLACE) { sendtmpbuf = static_cast(xbt_malloc(totalcount * datatype->size())); memcpy(sendtmpbuf, recvbuf, totalcount * datatype->size()); } - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData("reduceScatter", -1, dt_send_size, nullptr, -1, + trace_recvcounts, encode_datatype(datatype), "")); simgrid::smpi::Colls::reduce_scatter(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm); retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (sendbuf == MPI_IN_PLACE) xbt_free(sendtmpbuf); @@ -622,34 +524,27 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, int count = comm->size(); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_REDUCE_SCATTER; - extra->num_processes = count; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = 0; - extra->recvcounts = xbt_new(int, count); - for (int i = 0; i < count; i++) // copy data to avoid bad free - extra->recvcounts[i] = recvcount * dt_size_send; + int dt_send_size = datatype->is_basic() ? 1 : datatype->size(); + std::vector* trace_recvcounts = new std::vector(recvcount * dt_send_size); // copy data to avoid bad free + void* sendtmpbuf = sendbuf; if (sendbuf == MPI_IN_PLACE) { sendtmpbuf = static_cast(xbt_malloc(recvcount * count * datatype->size())); memcpy(sendtmpbuf, recvbuf, recvcount * count * datatype->size()); } - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData("reduceScatter", -1, 0, nullptr, -1, trace_recvcounts, + encode_datatype(datatype), "")); - int* recvcounts = static_cast(xbt_malloc(count * sizeof(int))); + int* recvcounts = new int[count]; for (int i = 0; i < count; i++) recvcounts[i] = recvcount; simgrid::smpi::Colls::reduce_scatter(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm); - xbt_free(recvcounts); + delete[] recvcounts; retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (sendbuf == MPI_IN_PLACE) xbt_free(sendtmpbuf); @@ -671,9 +566,6 @@ int PMPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* rec retval = MPI_ERR_TYPE; } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLTOALL; - void* sendtmpbuf = static_cast(sendbuf); int sendtmpcount = sendcount; MPI_Datatype sendtmptype = sendtype; @@ -684,23 +576,16 @@ int PMPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* rec sendtmptype = recvtype; } - int known = 0; - extra->datatype1 = encode_datatype(sendtmptype, &known); - if (known == 0) - extra->send_size = sendtmpcount * sendtmptype->size(); - else - extra->send_size = sendtmpcount; - extra->datatype2 = encode_datatype(recvtype, &known); - if (known == 0) - extra->recv_size = recvcount * recvtype->size(); - else - extra->recv_size = recvcount; - - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in( + rank, __FUNCTION__, + new simgrid::instr::CollTIData("allToAll", -1, -1.0, + sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(), + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), + encode_datatype(sendtmptype), encode_datatype(recvtype))); retval = simgrid::smpi::Colls::alltoall(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, comm); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (sendbuf == MPI_IN_PLACE) xbt_free(sendtmpbuf); @@ -726,16 +611,11 @@ int PMPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype retval = MPI_ERR_ARG; } else { int rank = smpi_process()->index(); - int i = 0; int size = comm->size(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLTOALLV; - extra->send_size = 0; - extra->recv_size = 0; - extra->recvcounts = xbt_new(int, size); - extra->sendcounts = xbt_new(int, size); - int known = 0; - extra->datatype2 = encode_datatype(recvtype, &known); + int send_size = 0; + int recv_size = 0; + std::vector* trace_sendcounts = new std::vector; + std::vector* trace_recvcounts = new std::vector; int dt_size_recv = recvtype->size(); void* sendtmpbuf = static_cast(sendbuf); @@ -743,9 +623,9 @@ int PMPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype int* sendtmpdisps = senddisps; MPI_Datatype sendtmptype = sendtype; int maxsize = 0; - for (i = 0; i < size; i++) { // copy data to avoid bad free - extra->recv_size += recvcounts[i] * dt_size_recv; - extra->recvcounts[i] = recvcounts[i] * dt_size_recv; + for (int i = 0; i < size; i++) { // copy data to avoid bad free + recv_size += recvcounts[i] * dt_size_recv; + trace_recvcounts->push_back(recvcounts[i] * dt_size_recv); if (((recvdisps[i] + recvcounts[i]) * dt_size_recv) > maxsize) maxsize = (recvdisps[i] + recvcounts[i]) * dt_size_recv; } @@ -760,18 +640,20 @@ int PMPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype sendtmptype = recvtype; } - extra->datatype1 = encode_datatype(sendtmptype, &known); int dt_size_send = sendtmptype->size(); - for (i = 0; i < size; i++) { // copy data to avoid bad free - extra->send_size += sendtmpcounts[i] * dt_size_send; - extra->sendcounts[i] = sendtmpcounts[i] * dt_size_send; + for (int i = 0; i < size; i++) { // copy data to avoid bad free + send_size += sendtmpcounts[i] * dt_size_send; + trace_sendcounts->push_back(sendtmpcounts[i] * dt_size_send); } - extra->num_processes = size; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "allToAllV", -1, send_size, trace_sendcounts, recv_size, + trace_recvcounts, encode_datatype(sendtype), encode_datatype(recvtype))); + retval = simgrid::smpi::Colls::alltoallv(sendtmpbuf, sendtmpcounts, sendtmpdisps, sendtmptype, recvbuf, recvcounts, recvdisps, recvtype, comm); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (sendbuf == MPI_IN_PLACE) { xbt_free(sendtmpbuf); diff --git a/src/smpi/bindings/smpi_pmpi_comm.cpp b/src/smpi/bindings/smpi_pmpi_comm.cpp index f658bfe078..faa15ab219 100644 --- a/src/smpi/bindings/smpi_pmpi_comm.cpp +++ b/src/smpi/bindings/smpi_pmpi_comm.cpp @@ -5,7 +5,7 @@ #include -#include "private.h" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_process.hpp" diff --git a/src/smpi/bindings/smpi_pmpi_group.cpp b/src/smpi/bindings/smpi_pmpi_group.cpp index 587c11bfd0..4f1c188061 100644 --- a/src/smpi/bindings/smpi_pmpi_group.cpp +++ b/src/smpi/bindings/smpi_pmpi_group.cpp @@ -3,9 +3,9 @@ /* 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 "private.h" -#include "smpi_comm.hpp" +#include "private.hpp" #include "smpi_coll.hpp" +#include "smpi_comm.hpp" #include "smpi_datatype_derived.hpp" #include "smpi_op.hpp" #include "smpi_process.hpp" diff --git a/src/smpi/bindings/smpi_pmpi_info.cpp b/src/smpi/bindings/smpi_pmpi_info.cpp index 4cbd21c8f1..ed0c2b3c56 100644 --- a/src/smpi/bindings/smpi_pmpi_info.cpp +++ b/src/smpi/bindings/smpi_pmpi_info.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_info.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi); diff --git a/src/smpi/bindings/smpi_pmpi_op.cpp b/src/smpi/bindings/smpi_pmpi_op.cpp index 013b78007e..4ca50ded06 100644 --- a/src/smpi/bindings/smpi_pmpi_op.cpp +++ b/src/smpi/bindings/smpi_pmpi_op.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_op.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi); diff --git a/src/smpi/bindings/smpi_pmpi_request.cpp b/src/smpi/bindings/smpi_pmpi_request.cpp index a8969916e8..fd9d4a61df 100644 --- a/src/smpi/bindings/smpi_pmpi_request.cpp +++ b/src/smpi/bindings/smpi_pmpi_request.cpp @@ -3,11 +3,11 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" -#include "smpi_request.hpp" #include "smpi_process.hpp" +#include "smpi_request.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi); @@ -158,24 +158,16 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MP } else { int rank = smpi_process()->index(); - int src_traced = comm->group()->index(src); - - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_IRECV; - extra->src = src_traced; - extra->dst = rank; - int known=0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if(known==0) - dt_size_send = datatype->size(); - extra->send_size = count*dt_size_send; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("Irecv", comm->group()->index(src), + datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); *request = simgrid::smpi::Request::irecv(buf, count, datatype, src, tag, comm); retval = MPI_SUCCESS; - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -206,25 +198,19 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MP } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; } else { - int rank = smpi_process()->index(); - int dst_traced = comm->group()->index(dst); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ISEND; - extra->src = rank; - extra->dst = dst_traced; - int known=0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if(known==0) - dt_size_send = datatype->size(); - extra->send_size = count*dt_size_send; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); - TRACE_smpi_send(rank, rank, dst_traced, tag, count*datatype->size()); + int rank = smpi_process()->index(); + int trace_dst = comm->group()->index(dst); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("Isend", trace_dst, + datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); + + TRACE_smpi_send(rank, rank, trace_dst, tag, count * datatype->size()); *request = simgrid::smpi::Request::isend(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -254,25 +240,18 @@ int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, M } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; } else { - int rank = smpi_process()->index(); - int dst_traced = comm->group()->index(dst); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ISSEND; - extra->src = rank; - extra->dst = dst_traced; - int known=0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if(known==0) - dt_size_send = datatype->size(); - extra->send_size = count*dt_size_send; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); - TRACE_smpi_send(rank, rank, dst_traced, tag, count*datatype->size()); + int rank = smpi_process()->index(); + int trace_dst = comm->group()->index(dst); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("ISsend", trace_dst, + datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); + TRACE_smpi_send(rank, rank, trace_dst, tag, count * datatype->size()); *request = simgrid::smpi::Request::issend(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -303,17 +282,10 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI } else { int rank = smpi_process()->index(); int src_traced = comm->group()->index(src); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_RECV; - extra->src = src_traced; - extra->dst = rank; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = datatype->size(); - extra->send_size = count * dt_size_send; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("recv", src_traced, + datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); simgrid::smpi::Request::recv(buf, count, datatype, src, tag, comm, status); retval = MPI_SUCCESS; @@ -325,7 +297,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI TRACE_smpi_recv(src_traced, rank, tag); } } - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -353,18 +325,10 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI } else { int rank = smpi_process()->index(); int dst_traced = comm->group()->index(dst); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_SEND; - extra->src = rank; - extra->dst = dst_traced; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if (known == 0) { - dt_size_send = datatype->size(); - } - extra->send_size = count*dt_size_send; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("send", dst_traced, + datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); if (not TRACE_smpi_view_internals()) { TRACE_smpi_send(rank, rank, dst_traced, tag,count*datatype->size()); } @@ -372,7 +336,7 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI simgrid::smpi::Request::send(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -399,24 +363,16 @@ int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MP } else { int rank = smpi_process()->index(); int dst_traced = comm->group()->index(dst); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_SSEND; - extra->src = rank; - extra->dst = dst_traced; - int known = 0; - extra->datatype1 = encode_datatype(datatype, &known); - int dt_size_send = 1; - if(known == 0) { - dt_size_send = datatype->size(); - } - extra->send_size = count*dt_size_send; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); - TRACE_smpi_send(rank, rank, dst_traced, tag,count*datatype->size()); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("Ssend", dst_traced, + datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); + TRACE_smpi_send(rank, rank, dst_traced, tag, count * datatype->size()); simgrid::smpi::Request::ssend(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -447,35 +403,29 @@ int PMPI_Sendrecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, int dst, } else if((sendtag<0 && sendtag != MPI_ANY_TAG)||(recvtag<0 && recvtag != MPI_ANY_TAG)){ retval = MPI_ERR_TAG; } else { - int rank = smpi_process()->index(); int dst_traced = comm->group()->index(dst); int src_traced = comm->group()->index(src); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_SENDRECV; - extra->src = src_traced; - extra->dst = dst_traced; - int known = 0; - extra->datatype1 = encode_datatype(sendtype, &known); - int dt_size_send = 1; - if (known == 0) - dt_size_send = sendtype->size(); - extra->send_size = sendcount * dt_size_send; - extra->datatype2 = encode_datatype(recvtype, &known); - int dt_size_recv = 1; - if (known == 0) - dt_size_recv = recvtype->size(); - extra->recv_size = recvcount * dt_size_recv; - - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + + // FIXME: Hack the way to trace this one + std::vector* dst_hack = new std::vector; + std::vector* src_hack = new std::vector; + dst_hack->push_back(dst_traced); + src_hack->push_back(src_traced); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData( + "sendRecv", -1, sendtype->is_basic() ? sendcount : sendcount * sendtype->size(), dst_hack, + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), src_hack, + encode_datatype(sendtype), encode_datatype(recvtype))); + TRACE_smpi_send(rank, rank, dst_traced, sendtag, sendcount * sendtype->size()); simgrid::smpi::Request::sendrecv(sendbuf, sendcount, sendtype, dst, sendtag, recvbuf, recvcount, recvtype, src, recvtag, comm, status); retval = MPI_SUCCESS; - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); TRACE_smpi_recv(src_traced, rank, recvtag); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -516,9 +466,7 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status) } else { int rank = ((*request)->comm() != MPI_COMM_NULL) ? smpi_process()->index() : -1; - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_TEST; - TRACE_smpi_testing_in(rank, extra); + TRACE_smpi_testing_in(rank); *flag = simgrid::smpi::Request::test(request,status); @@ -620,15 +568,13 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) int tag_traced= (*request)->tag(); MPI_Comm comm = (*request)->comm(); int is_wait_for_receive = ((*request)->flags() & RECV); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_WAIT; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("wait")); simgrid::smpi::Request::wait(request, status); retval = MPI_SUCCESS; //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE) - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (is_wait_for_receive) { if(src_traced==MPI_ANY_SOURCE) src_traced = (status != MPI_STATUS_IGNORE) ? comm->group()->rank(status->MPI_SOURCE) : src_traced; @@ -650,13 +596,13 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta smpi_bench_end(); //save requests information for tracing - typedef struct { + struct savedvalstype { int src; int dst; int recv; int tag; MPI_Comm comm; - } savedvalstype; + }; savedvalstype* savedvals = xbt_new0(savedvalstype, count); for (int i = 0; i < count; i++) { @@ -666,10 +612,7 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta } } int rank_traced = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_WAITANY; - extra->send_size=count; - TRACE_smpi_ptp_in(rank_traced, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank_traced, __FUNCTION__, new simgrid::instr::CpuTIData("waitAny", static_cast(count))); *index = simgrid::smpi::Request::waitany(count, requests, status); @@ -684,7 +627,7 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta : savedvals[*index].src; TRACE_smpi_recv(src_traced, dst_traced, savedvals[*index].tag); } - TRACE_smpi_ptp_out(rank_traced, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank_traced); } xbt_free(savedvals); @@ -696,14 +639,14 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) { smpi_bench_end(); //save information from requests - typedef struct { + struct savedvalstype { int src; int dst; int recv; int tag; int valid; MPI_Comm comm; - } savedvalstype; + }; savedvalstype* savedvals=xbt_new0(savedvalstype, count); for (int i = 0; i < count; i++) { @@ -715,10 +658,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) } } int rank_traced = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_WAITALL; - extra->send_size=count; - TRACE_smpi_ptp_in(rank_traced, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank_traced, __FUNCTION__, new simgrid::instr::CpuTIData("waitAll", static_cast(count))); int retval = simgrid::smpi::Request::waitall(count, requests, status); @@ -736,7 +676,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) } } } - TRACE_smpi_ptp_out(rank_traced, -1, __FUNCTION__); + TRACE_smpi_comm_out(rank_traced); xbt_free(savedvals); smpi_bench_begin(); diff --git a/src/smpi/bindings/smpi_pmpi_topo.cpp b/src/smpi/bindings/smpi_pmpi_topo.cpp index 6864b0f82e..0be7e5fe34 100644 --- a/src/smpi/bindings/smpi_pmpi_topo.cpp +++ b/src/smpi/bindings/smpi_pmpi_topo.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_comm.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi); diff --git a/src/smpi/bindings/smpi_pmpi_type.cpp b/src/smpi/bindings/smpi_pmpi_type.cpp index e150b2b418..69b7eaa86b 100644 --- a/src/smpi/bindings/smpi_pmpi_type.cpp +++ b/src/smpi/bindings/smpi_pmpi_type.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_datatype_derived.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi); @@ -338,7 +338,7 @@ int PMPI_Pack(void* inbuf, int incount, MPI_Datatype type, void* outbuf, int out return MPI_ERR_TYPE; if(comm==MPI_COMM_NULL) return MPI_ERR_COMM; - return type->pack(inbuf, incount, outbuf,outcount,position, comm); + return type->pack(inbuf == MPI_BOTTOM ? nullptr : inbuf, incount, outbuf, outcount, position, comm); } int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) { diff --git a/src/smpi/bindings/smpi_pmpi_win.cpp b/src/smpi/bindings/smpi_pmpi_win.cpp index 03b8438e66..71d64a19fe 100644 --- a/src/smpi/bindings/smpi_pmpi_win.cpp +++ b/src/smpi/bindings/smpi_pmpi_win.cpp @@ -3,9 +3,9 @@ /* 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 "private.h" -#include "smpi_comm.hpp" +#include "private.hpp" #include "smpi_coll.hpp" +#include "smpi_comm.hpp" #include "smpi_datatype_derived.hpp" #include "smpi_op.hpp" #include "smpi_process.hpp" @@ -77,7 +77,8 @@ int PMPI_Win_attach(MPI_Win win, void *base, MPI_Aint size){ return retval; } -int PMPI_Win_detach(MPI_Win win, void *base){ +int PMPI_Win_detach(MPI_Win win, void* base) +{ int retval = 0; smpi_bench_end(); if(win == MPI_WIN_NULL){ @@ -166,9 +167,9 @@ int PMPI_Win_fence( int assert, MPI_Win win){ retval = MPI_ERR_WIN; } else { int rank = smpi_process()->index(); - TRACE_smpi_collective_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_fence")); retval = win->fence(assert); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -197,12 +198,14 @@ int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int rank = smpi_process()->index(); MPI_Group group; win->get_group(&group); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Get", target_rank, + origin_datatype->is_basic() ? origin_count : origin_count * origin_datatype->size(), + encode_datatype(origin_datatype))); retval = win->get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -234,12 +237,14 @@ int PMPI_Rget( void *origin_addr, int origin_count, MPI_Datatype origin_datatype int rank = smpi_process()->index(); MPI_Group group; win->get_group(&group); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Rget", target_rank, + origin_datatype->is_basic() ? origin_count : origin_count * origin_datatype->size(), + encode_datatype(origin_datatype))); retval = win->get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, request); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -269,13 +274,15 @@ int PMPI_Put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, MPI_Group group; win->get_group(&group); int dst_traced = group->index(target_rank); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Put", dst_traced, + origin_datatype->is_basic() ? origin_count : origin_count * origin_datatype->size(), + encode_datatype(origin_datatype))); TRACE_smpi_send(rank, rank, dst_traced, SMPI_RMA_TAG, origin_count*origin_datatype->size()); retval = win->put( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype); - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -308,13 +315,15 @@ int PMPI_Rput( void *origin_addr, int origin_count, MPI_Datatype origin_datatype MPI_Group group; win->get_group(&group); int dst_traced = group->index(target_rank); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Rput", dst_traced, + origin_datatype->is_basic() ? origin_count : origin_count * origin_datatype->size(), + encode_datatype(origin_datatype))); TRACE_smpi_send(rank, rank, dst_traced, SMPI_RMA_TAG, origin_count*origin_datatype->size()); retval = win->put( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, request); - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -345,11 +354,13 @@ int PMPI_Accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_da int rank = smpi_process()->index(); MPI_Group group; win->get_group(&group); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Accumulate", target_rank, + origin_datatype->is_basic() ? origin_count : origin_count * origin_datatype->size(), + encode_datatype(origin_datatype))); retval = win->accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, op); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -383,12 +394,14 @@ int PMPI_Raccumulate( void *origin_addr, int origin_count, MPI_Datatype origin_d int rank = smpi_process()->index(); MPI_Group group; win->get_group(&group); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Raccumulate", target_rank, + origin_datatype->is_basic() ? origin_count : origin_count * origin_datatype->size(), + encode_datatype(origin_datatype))); retval = win->accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, op, request); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -421,13 +434,15 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){ int rank = smpi_process()->index(); MPI_Group group; win->get_group(&group); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Get_accumulate", target_rank, + target_datatype->is_basic() ? target_count : target_count * target_datatype->size(), + encode_datatype(target_datatype))); retval = win->get_accumulate( origin_addr, origin_count, origin_datatype, result_addr, result_count, result_datatype, target_rank, target_disp, target_count, target_datatype, op); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -464,13 +479,15 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request){ int rank = smpi_process()->index(); MPI_Group group; win->get_group(&group); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Rget_accumulate", target_rank, + target_datatype->is_basic() ? target_count : target_count * target_datatype->size(), + encode_datatype(target_datatype))); retval = win->get_accumulate( origin_addr, origin_count, origin_datatype, result_addr, result_count, result_datatype, target_rank, target_disp, target_count, target_datatype, op, request); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -480,9 +497,9 @@ int PMPI_Fetch_and_op(void *origin_addr, void *result_addr, MPI_Datatype dtype, return PMPI_Get_accumulate(origin_addr, origin_addr==nullptr?0:1, dtype, result_addr, 1, dtype, target_rank, target_disp, 1, dtype, op, win); } -int PMPI_Compare_and_swap(void *origin_addr, void *compare_addr, - void *result_addr, MPI_Datatype datatype, int target_rank, - MPI_Aint target_disp, MPI_Win win){ +int PMPI_Compare_and_swap(void* origin_addr, void* compare_addr, void* result_addr, MPI_Datatype datatype, + int target_rank, MPI_Aint target_disp, MPI_Win win) +{ int retval = 0; smpi_bench_end(); if (win == MPI_WIN_NULL) { @@ -502,12 +519,13 @@ int PMPI_Compare_and_swap(void *origin_addr, void *compare_addr, int rank = smpi_process()->index(); MPI_Group group; win->get_group(&group); - TRACE_smpi_ptp_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Compare_and_swap", target_rank, + datatype->is_basic() ? 1 : datatype->size(), + encode_datatype(datatype))); - retval = win->compare_and_swap( origin_addr, compare_addr, result_addr, datatype, - target_rank, target_disp); + retval = win->compare_and_swap(origin_addr, compare_addr, result_addr, datatype, target_rank, target_disp); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -522,9 +540,9 @@ int PMPI_Win_post(MPI_Group group, int assert, MPI_Win win){ retval = MPI_ERR_GROUP; } else { int rank = smpi_process()->index(); - TRACE_smpi_collective_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_post")); retval = win->post(group,assert); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -539,9 +557,9 @@ int PMPI_Win_start(MPI_Group group, int assert, MPI_Win win){ retval = MPI_ERR_GROUP; } else { int rank = smpi_process()->index(); - TRACE_smpi_collective_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_start")); retval = win->start(group,assert); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -554,11 +572,11 @@ int PMPI_Win_complete(MPI_Win win){ retval = MPI_ERR_WIN; } else { int rank = smpi_process()->index(); - TRACE_smpi_collective_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_complete")); retval = win->complete(); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -571,11 +589,11 @@ int PMPI_Win_wait(MPI_Win win){ retval = MPI_ERR_WIN; } else { int rank = smpi_process()->index(); - TRACE_smpi_collective_in(rank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_wait")); retval = win->wait(); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); } smpi_bench_begin(); return retval; @@ -593,9 +611,9 @@ int PMPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win){ retval = MPI_SUCCESS; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __func__, new simgrid::instr::NoOpTIData("Win_lock")); retval = win->lock(lock_type,rank,assert); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; @@ -610,9 +628,9 @@ int PMPI_Win_unlock(int rank, MPI_Win win){ retval = MPI_SUCCESS; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_unlock")); retval = win->unlock(rank); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; @@ -625,9 +643,9 @@ int PMPI_Win_lock_all(int assert, MPI_Win win){ retval = MPI_ERR_WIN; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_lock_all")); retval = win->lock_all(assert); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; @@ -640,9 +658,9 @@ int PMPI_Win_unlock_all(MPI_Win win){ retval = MPI_ERR_WIN; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_unlock_all")); retval = win->unlock_all(); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; @@ -657,9 +675,9 @@ int PMPI_Win_flush(int rank, MPI_Win win){ retval = MPI_SUCCESS; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_flush")); retval = win->flush(rank); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; @@ -674,9 +692,9 @@ int PMPI_Win_flush_local(int rank, MPI_Win win){ retval = MPI_SUCCESS; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_flush_local")); retval = win->flush_local(rank); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; @@ -689,9 +707,9 @@ int PMPI_Win_flush_all(MPI_Win win){ retval = MPI_ERR_WIN; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_flush_all")); retval = win->flush_all(); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; @@ -704,9 +722,9 @@ int PMPI_Win_flush_local_all(MPI_Win win){ retval = MPI_ERR_WIN; } else { int myrank = smpi_process()->index(); - TRACE_smpi_collective_in(myrank, __FUNCTION__, nullptr); + TRACE_smpi_comm_in(myrank, __FUNCTION__, new simgrid::instr::NoOpTIData("Win_flush_local_all")); retval = win->flush_local_all(); - TRACE_smpi_collective_out(myrank, __FUNCTION__); + TRACE_smpi_comm_out(myrank); } smpi_bench_begin(); return retval; diff --git a/src/smpi/colls/allgather/allgather-2dmesh.cpp b/src/smpi/colls/allgather/allgather-2dmesh.cpp index 724373c86e..d1362f6479 100644 --- a/src/smpi/colls/allgather/allgather-2dmesh.cpp +++ b/src/smpi/colls/allgather/allgather-2dmesh.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allgather/allgather-3dmesh.cpp b/src/smpi/colls/allgather/allgather-3dmesh.cpp index 58927c9dbb..118dc79b87 100644 --- a/src/smpi/colls/allgather/allgather-3dmesh.cpp +++ b/src/smpi/colls/allgather/allgather-3dmesh.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allgather/allgather-GB.cpp b/src/smpi/colls/allgather/allgather-GB.cpp index e87cae55cc..1303878f91 100644 --- a/src/smpi/colls/allgather/allgather-GB.cpp +++ b/src/smpi/colls/allgather/allgather-GB.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-NTSLR-NB.cpp b/src/smpi/colls/allgather/allgather-NTSLR-NB.cpp index c4785d2c1b..bf07ba83e0 100644 --- a/src/smpi/colls/allgather/allgather-NTSLR-NB.cpp +++ b/src/smpi/colls/allgather/allgather-NTSLR-NB.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-NTSLR.cpp b/src/smpi/colls/allgather/allgather-NTSLR.cpp index a4a4b5e226..df49aadb20 100644 --- a/src/smpi/colls/allgather/allgather-NTSLR.cpp +++ b/src/smpi/colls/allgather/allgather-NTSLR.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-SMP-NTS.cpp b/src/smpi/colls/allgather/allgather-SMP-NTS.cpp index 91eb582fae..bf24b81a1f 100644 --- a/src/smpi/colls/allgather/allgather-SMP-NTS.cpp +++ b/src/smpi/colls/allgather/allgather-SMP-NTS.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-bruck.cpp b/src/smpi/colls/allgather/allgather-bruck.cpp index f9b53fe4cb..af61164288 100644 --- a/src/smpi/colls/allgather/allgather-bruck.cpp +++ b/src/smpi/colls/allgather/allgather-bruck.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allgather/allgather-loosely-lr.cpp b/src/smpi/colls/allgather/allgather-loosely-lr.cpp index ddb11c298d..1994579c70 100644 --- a/src/smpi/colls/allgather/allgather-loosely-lr.cpp +++ b/src/smpi/colls/allgather/allgather-loosely-lr.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-mvapich-smp.cpp b/src/smpi/colls/allgather/allgather-mvapich-smp.cpp index e30e455f18..60efc284ed 100644 --- a/src/smpi/colls/allgather/allgather-mvapich-smp.cpp +++ b/src/smpi/colls/allgather/allgather-mvapich-smp.cpp @@ -34,7 +34,7 @@ * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ - #include "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp b/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp index 4f2707e700..08705f94f1 100644 --- a/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp +++ b/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp @@ -62,7 +62,7 @@ * [5] [5] [5] [5] [5] [5] */ - #include "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-pair.cpp b/src/smpi/colls/allgather/allgather-pair.cpp index 932d8262e8..d5151281dd 100644 --- a/src/smpi/colls/allgather/allgather-pair.cpp +++ b/src/smpi/colls/allgather/allgather-pair.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allgather/allgather-rdb.cpp b/src/smpi/colls/allgather/allgather-rdb.cpp index 5e1d47b398..d932ee11a3 100644 --- a/src/smpi/colls/allgather/allgather-rdb.cpp +++ b/src/smpi/colls/allgather/allgather-rdb.cpp @@ -3,7 +3,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #include "smpi_status.hpp" namespace simgrid{ diff --git a/src/smpi/colls/allgather/allgather-rhv.cpp b/src/smpi/colls/allgather/allgather-rhv.cpp index 1c50923087..11d2a4413c 100644 --- a/src/smpi/colls/allgather/allgather-rhv.cpp +++ b/src/smpi/colls/allgather/allgather-rhv.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-ring.cpp b/src/smpi/colls/allgather/allgather-ring.cpp index 66903fab3b..d3af9e6918 100644 --- a/src/smpi/colls/allgather/allgather-ring.cpp +++ b/src/smpi/colls/allgather/allgather-ring.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allgather/allgather-smp-simple.cpp b/src/smpi/colls/allgather/allgather-smp-simple.cpp index 42dad102d3..3d666a7a76 100644 --- a/src/smpi/colls/allgather/allgather-smp-simple.cpp +++ b/src/smpi/colls/allgather/allgather-smp-simple.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgather/allgather-spreading-simple.cpp b/src/smpi/colls/allgather/allgather-spreading-simple.cpp index df47969e70..9ad92aae59 100644 --- a/src/smpi/colls/allgather/allgather-spreading-simple.cpp +++ b/src/smpi/colls/allgather/allgather-spreading-simple.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allgatherv/allgatherv-GB.cpp b/src/smpi/colls/allgatherv/allgatherv-GB.cpp index 2701c23595..09636066fe 100644 --- a/src/smpi/colls/allgatherv/allgatherv-GB.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-GB.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp b/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp index 9226be163e..9174ad8731 100644 --- a/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp @@ -6,8 +6,9 @@ /* Short or medium size message and power-of-two no. of processes. Use * recursive doubling algorithm */ -#include "../colls_private.h" +#include "../colls_private.hpp" #include "smpi_status.hpp" +#include namespace simgrid{ namespace smpi{ @@ -48,7 +49,7 @@ int Coll_allgatherv_mpich_rdb::allgatherv ( recvtype->extent(&recvtype_true_lb, &recvtype_true_extent); - tmp_buf_rl= (void*)smpi_get_tmp_sendbuffer(total_count*(MAX(recvtype_true_extent,recvtype_extent))); + tmp_buf_rl = (void*)smpi_get_tmp_sendbuffer(total_count * std::max(recvtype_true_extent, recvtype_extent)); /* adjust for potential negative lower bound in datatype */ tmp_buf = (void *)((char*)tmp_buf_rl - recvtype_true_lb); diff --git a/src/smpi/colls/allgatherv/allgatherv-mpich-ring.cpp b/src/smpi/colls/allgatherv/allgatherv-mpich-ring.cpp index e2e973ab71..18608b8c94 100644 --- a/src/smpi/colls/allgatherv/allgatherv-mpich-ring.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-mpich-ring.cpp @@ -10,7 +10,7 @@ * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: allgather_mpich_ring diff --git a/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp b/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp index 8ae33f0983..d57fd3f633 100644 --- a/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp @@ -20,7 +20,7 @@ * Additional copyrights may follow */ -#include "../colls_private.h" +#include "../colls_private.hpp" /* * ompi_coll_tuned_allgatherv_intra_bruck * @@ -89,8 +89,6 @@ int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount, { int sendto, recvfrom, blockcount, i; unsigned int distance; - int *new_rcounts = NULL, *new_rdispls = NULL; - int *new_scounts = NULL, *new_sdispls = NULL; ptrdiff_t slb, rlb, sext, rext; char *tmpsend = NULL, *tmprecv = NULL; MPI_Datatype new_rdtype = MPI_DATATYPE_NULL, new_sdtype = MPI_DATATYPE_NULL; @@ -126,10 +124,10 @@ int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount, - blockcount doubles until the last step when only the remaining data is exchanged. */ - new_rcounts = (int*) calloc(4*size, sizeof(int)); - new_rdispls = new_rcounts + size; - new_scounts = new_rdispls + size; - new_sdispls = new_scounts + size; + int* new_rcounts = new int[4 * size]; + int* new_rdispls = new_rcounts + size; + int* new_scounts = new_rdispls + size; + int* new_sdispls = new_scounts + size; for (distance = 1; distance < size; distance<<=1) { @@ -170,7 +168,7 @@ int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount, } - free(new_rcounts); + delete[] new_rcounts; return MPI_SUCCESS; diff --git a/src/smpi/colls/allgatherv/allgatherv-ompi-neighborexchange.cpp b/src/smpi/colls/allgatherv/allgatherv-ompi-neighborexchange.cpp index e88c1882d0..6fd6ee34ee 100644 --- a/src/smpi/colls/allgatherv/allgatherv-ompi-neighborexchange.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-ompi-neighborexchange.cpp @@ -63,7 +63,7 @@ * [5] [5] [5] [5] [5] [5] */ - #include "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allgatherv/allgatherv-pair.cpp b/src/smpi/colls/allgatherv/allgatherv-pair.cpp index 9f1c95e648..37bf8592de 100644 --- a/src/smpi/colls/allgatherv/allgatherv-pair.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-pair.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allgatherv/allgatherv-ring.cpp b/src/smpi/colls/allgatherv/allgatherv-ring.cpp index 8f4e17e397..fc63b11f47 100644 --- a/src/smpi/colls/allgatherv/allgatherv-ring.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-ring.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/allreduce/allreduce-lr.cpp b/src/smpi/colls/allreduce/allreduce-lr.cpp index c9e10abef4..871f1a66e8 100644 --- a/src/smpi/colls/allreduce/allreduce-lr.cpp +++ b/src/smpi/colls/allreduce/allreduce-lr.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific all-reduce operation designed bandwidth optimally diff --git a/src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp b/src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp index cc9e89b0ff..32b254865c 100644 --- a/src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp +++ b/src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp @@ -21,7 +21,9 @@ * */ -#include "../colls_private.h" +#include "../colls_private.hpp" +#include + namespace simgrid{ namespace smpi{ int Coll_allreduce_mvapich2_rs::allreduce(void *sendbuf, @@ -53,7 +55,7 @@ int Coll_allreduce_mvapich2_rs::allreduce(void *sendbuf, datatype->extent(&true_lb, &true_extent); extent = datatype->get_extent(); - tmp_buf_free= smpi_get_tmp_recvbuffer(count * (MAX(extent, true_extent))); + tmp_buf_free = smpi_get_tmp_recvbuffer(count * std::max(extent, true_extent)); /* adjust for potential negative lower bound in datatype */ tmp_buf = (void *) ((char *) tmp_buf_free - true_lb); diff --git a/src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp b/src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp index 730307b0c1..aaece0d99b 100644 --- a/src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp +++ b/src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp @@ -35,7 +35,7 @@ * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" +#include "../colls_private.hpp" #define MPIR_Allreduce_pt2pt_rd_MV2 Coll_allreduce_rdb::allreduce #define MPIR_Allreduce_pt2pt_rs_MV2 Coll_allreduce_mvapich2_rs::allreduce diff --git a/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp b/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp index 2736daf63e..ebccf62d17 100644 --- a/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp +++ b/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp @@ -153,7 +153,7 @@ EARLY_BLOCK_COUNT = EARLY_BLOCK_COUNT + 1; \ } \ -#include "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allreduce/allreduce-rab-rdb.cpp b/src/smpi/colls/allreduce/allreduce-rab-rdb.cpp index 9cfbf1ad4d..ea216ccb20 100644 --- a/src/smpi/colls/allreduce/allreduce-rab-rdb.cpp +++ b/src/smpi/colls/allreduce/allreduce-rab-rdb.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ int Coll_allreduce_rab_rdb::allreduce(void *sbuff, void *rbuff, int count, diff --git a/src/smpi/colls/allreduce/allreduce-rab1.cpp b/src/smpi/colls/allreduce/allreduce-rab1.cpp index 8f26894bb8..31cd8d584d 100644 --- a/src/smpi/colls/allreduce/allreduce-rab1.cpp +++ b/src/smpi/colls/allreduce/allreduce-rab1.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" //#include namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allreduce/allreduce-rab2.cpp b/src/smpi/colls/allreduce/allreduce-rab2.cpp index ca9603bb66..6978a46f7d 100644 --- a/src/smpi/colls/allreduce/allreduce-rab2.cpp +++ b/src/smpi/colls/allreduce/allreduce-rab2.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" //#include namespace simgrid{ @@ -23,7 +23,7 @@ int Coll_allreduce_rab2::allreduce(void *sbuff, void *rbuff, MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; #else MPI_User_function *uop; - struct MPIR_OP *op_ptr; + MPIR_OP *op_ptr; op_ptr = MPIR_ToPointer(op); uop = op_ptr->op; #endif diff --git a/src/smpi/colls/allreduce/allreduce-rdb.cpp b/src/smpi/colls/allreduce/allreduce-rdb.cpp index 552698a0d8..a7ee1d169d 100644 --- a/src/smpi/colls/allreduce/allreduce-rdb.cpp +++ b/src/smpi/colls/allreduce/allreduce-rdb.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" //#include namespace simgrid{ namespace smpi{ @@ -21,7 +21,7 @@ int Coll_allreduce_rdb::allreduce(void *sbuff, void *rbuff, int count, MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; #else MPI_User_function *uop; - struct MPIR_OP *op_ptr; + MPIR_OP *op_ptr; op_ptr = MPIR_ToPointer(op); uop = op_ptr->op; #endif diff --git a/src/smpi/colls/allreduce/allreduce-redbcast.cpp b/src/smpi/colls/allreduce/allreduce-redbcast.cpp index 9ed2084a73..6d72e76563 100644 --- a/src/smpi/colls/allreduce/allreduce-redbcast.cpp +++ b/src/smpi/colls/allreduce/allreduce-redbcast.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ int Coll_allreduce_redbcast::allreduce(void *buf, void *buf2, int count, diff --git a/src/smpi/colls/allreduce/allreduce-smp-binomial-pipeline.cpp b/src/smpi/colls/allreduce/allreduce-smp-binomial-pipeline.cpp index e372373093..b14baa5f41 100644 --- a/src/smpi/colls/allreduce/allreduce-smp-binomial-pipeline.cpp +++ b/src/smpi/colls/allreduce/allreduce-smp-binomial-pipeline.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific (however, number of cores/node need to be changed) all-reduce operation designed for smp clusters diff --git a/src/smpi/colls/allreduce/allreduce-smp-binomial.cpp b/src/smpi/colls/allreduce/allreduce-smp-binomial.cpp index ff4e5d0f37..52df999814 100644 --- a/src/smpi/colls/allreduce/allreduce-smp-binomial.cpp +++ b/src/smpi/colls/allreduce/allreduce-smp-binomial.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific (however, number of cores/node need to be changed) all-reduce operation designed for smp clusters diff --git a/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp b/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp index 52453c263d..e94211af5d 100644 --- a/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp +++ b/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific (however, number of cores/node need to be changed) all-reduce operation designed for smp clusters @@ -49,7 +49,7 @@ int Coll_allreduce_smp_rdb::allreduce(void *send_buf, void *recv_buf, int count, MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; #else MPI_User_function *uop; - struct MPIR_OP *op_ptr; + MPIR_OP *op_ptr; op_ptr = MPIR_ToPointer(op); uop = op_ptr->op; #endif diff --git a/src/smpi/colls/allreduce/allreduce-smp-rsag-lr.cpp b/src/smpi/colls/allreduce/allreduce-smp-rsag-lr.cpp index afc21e8ca1..4b9b0cff29 100644 --- a/src/smpi/colls/allreduce/allreduce-smp-rsag-lr.cpp +++ b/src/smpi/colls/allreduce/allreduce-smp-rsag-lr.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" //#include /* @@ -37,7 +37,7 @@ int Coll_allreduce_smp_rsag_lr::allreduce(void *send_buf, void *recv_buf, MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; #else MPI_User_function *uop; - struct MPIR_OP *op_ptr; + MPIR_OP *op_ptr; op_ptr = MPIR_ToPointer(op); uop = op_ptr->op; #endif diff --git a/src/smpi/colls/allreduce/allreduce-smp-rsag-rab.cpp b/src/smpi/colls/allreduce/allreduce-smp-rsag-rab.cpp index c0915a00ba..275c7bd81c 100644 --- a/src/smpi/colls/allreduce/allreduce-smp-rsag-rab.cpp +++ b/src/smpi/colls/allreduce/allreduce-smp-rsag-rab.cpp @@ -7,7 +7,7 @@ /* * implemented by Pitch Patarasuk, 07/01/2007 */ -#include "../colls_private.h" +#include "../colls_private.hpp" //#include diff --git a/src/smpi/colls/allreduce/allreduce-smp-rsag.cpp b/src/smpi/colls/allreduce/allreduce-smp-rsag.cpp index ea08353f8f..c86b16abc4 100644 --- a/src/smpi/colls/allreduce/allreduce-smp-rsag.cpp +++ b/src/smpi/colls/allreduce/allreduce-smp-rsag.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /* This fucntion performs all-reduce operation as follow. @@ -36,7 +36,7 @@ int Coll_allreduce_smp_rsag::allreduce(void *send_buf, void *recv_buf, MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; #else MPI_User_function *uop; - struct MPIR_OP *op_ptr; + MPIR_OP *op_ptr; op_ptr = MPIR_ToPointer(op); uop = op_ptr->op; #endif diff --git a/src/smpi/colls/alltoall/alltoall-2dmesh.cpp b/src/smpi/colls/alltoall/alltoall-2dmesh.cpp index e75003a81c..9a1def0b4a 100644 --- a/src/smpi/colls/alltoall/alltoall-2dmesh.cpp +++ b/src/smpi/colls/alltoall/alltoall-2dmesh.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #include /***************************************************************************** diff --git a/src/smpi/colls/alltoall/alltoall-3dmesh.cpp b/src/smpi/colls/alltoall/alltoall-3dmesh.cpp index 85baad3b65..e8c5347b6a 100644 --- a/src/smpi/colls/alltoall/alltoall-3dmesh.cpp +++ b/src/smpi/colls/alltoall/alltoall-3dmesh.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #include /***************************************************************************** diff --git a/src/smpi/colls/alltoall/alltoall-basic-linear.cpp b/src/smpi/colls/alltoall/alltoall-basic-linear.cpp index 9b1b1a2aad..01aba9cbec 100644 --- a/src/smpi/colls/alltoall/alltoall-basic-linear.cpp +++ b/src/smpi/colls/alltoall/alltoall-basic-linear.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /*Naive and simple basic alltoall implementation. */ diff --git a/src/smpi/colls/alltoall/alltoall-bruck.cpp b/src/smpi/colls/alltoall/alltoall-bruck.cpp index fe000c3357..f8e15a51ea 100644 --- a/src/smpi/colls/alltoall/alltoall-bruck.cpp +++ b/src/smpi/colls/alltoall/alltoall-bruck.cpp @@ -25,7 +25,7 @@ ****************************************************************************/ -#include "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp b/src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp index 674525263b..bb5edb4fab 100644 --- a/src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp +++ b/src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp @@ -41,7 +41,7 @@ //correct on stampede #define MV2_ALLTOALL_THROTTLE_FACTOR 4 -#include "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ int Coll_alltoall_mvapich2_scatter_dest::alltoall( diff --git a/src/smpi/colls/alltoall/alltoall-pair-light-barrier.cpp b/src/smpi/colls/alltoall/alltoall-pair-light-barrier.cpp index fff723c6b8..80c6c94b50 100644 --- a/src/smpi/colls/alltoall/alltoall-pair-light-barrier.cpp +++ b/src/smpi/colls/alltoall/alltoall-pair-light-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_pair_light_barrier diff --git a/src/smpi/colls/alltoall/alltoall-pair-mpi-barrier.cpp b/src/smpi/colls/alltoall/alltoall-pair-mpi-barrier.cpp index d9f0aed3b1..cbe69d8c0b 100644 --- a/src/smpi/colls/alltoall/alltoall-pair-mpi-barrier.cpp +++ b/src/smpi/colls/alltoall/alltoall-pair-mpi-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_pair_mpi_barrier diff --git a/src/smpi/colls/alltoall/alltoall-pair-one-barrier.cpp b/src/smpi/colls/alltoall/alltoall-pair-one-barrier.cpp index f87779ccf7..10dc6567f9 100644 --- a/src/smpi/colls/alltoall/alltoall-pair-one-barrier.cpp +++ b/src/smpi/colls/alltoall/alltoall-pair-one-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_pair diff --git a/src/smpi/colls/alltoall/alltoall-pair.cpp b/src/smpi/colls/alltoall/alltoall-pair.cpp index 2dd6e00c81..2519526516 100644 --- a/src/smpi/colls/alltoall/alltoall-pair.cpp +++ b/src/smpi/colls/alltoall/alltoall-pair.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #include "smpi_win.hpp" /***************************************************************************** diff --git a/src/smpi/colls/alltoall/alltoall-rdb.cpp b/src/smpi/colls/alltoall/alltoall-rdb.cpp index 5067aa75ff..31e521f727 100644 --- a/src/smpi/colls/alltoall/alltoall-rdb.cpp +++ b/src/smpi/colls/alltoall/alltoall-rdb.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #include "smpi_status.hpp" /***************************************************************************** diff --git a/src/smpi/colls/alltoall/alltoall-ring-light-barrier.cpp b/src/smpi/colls/alltoall/alltoall-ring-light-barrier.cpp index 4cc7ee6f77..48ac6b082c 100644 --- a/src/smpi/colls/alltoall/alltoall-ring-light-barrier.cpp +++ b/src/smpi/colls/alltoall/alltoall-ring-light-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring_light_barrier diff --git a/src/smpi/colls/alltoall/alltoall-ring-mpi-barrier.cpp b/src/smpi/colls/alltoall/alltoall-ring-mpi-barrier.cpp index add58faa03..fd9287efa4 100644 --- a/src/smpi/colls/alltoall/alltoall-ring-mpi-barrier.cpp +++ b/src/smpi/colls/alltoall/alltoall-ring-mpi-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring_mpi_barrier diff --git a/src/smpi/colls/alltoall/alltoall-ring-one-barrier.cpp b/src/smpi/colls/alltoall/alltoall-ring-one-barrier.cpp index 8ebeab337d..099c7efdb5 100644 --- a/src/smpi/colls/alltoall/alltoall-ring-one-barrier.cpp +++ b/src/smpi/colls/alltoall/alltoall-ring-one-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring diff --git a/src/smpi/colls/alltoall/alltoall-ring.cpp b/src/smpi/colls/alltoall/alltoall-ring.cpp index 5065e1df76..bd648e7060 100644 --- a/src/smpi/colls/alltoall/alltoall-ring.cpp +++ b/src/smpi/colls/alltoall/alltoall-ring.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring diff --git a/src/smpi/colls/alltoallv/alltoallv-bruck.cpp b/src/smpi/colls/alltoallv/alltoallv-bruck.cpp index 41b4abde39..fd69acefd1 100644 --- a/src/smpi/colls/alltoallv/alltoallv-bruck.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-bruck.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /** * Alltoall Bruck diff --git a/src/smpi/colls/alltoallv/alltoallv-ompi-basic-linear.cpp b/src/smpi/colls/alltoallv/alltoallv-ompi-basic-linear.cpp index 8c9bc2902a..cbfd6e05a3 100644 --- a/src/smpi/colls/alltoallv/alltoallv-ompi-basic-linear.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-ompi-basic-linear.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /* * Linear functions are copied from the basic coll module. For * some small number of nodes and/or small data sizes they are just as diff --git a/src/smpi/colls/alltoallv/alltoallv-pair-light-barrier.cpp b/src/smpi/colls/alltoallv/alltoallv-pair-light-barrier.cpp index 738e2a58ea..19ecc4cbec 100644 --- a/src/smpi/colls/alltoallv/alltoallv-pair-light-barrier.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-pair-light-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_pair_light_barrier diff --git a/src/smpi/colls/alltoallv/alltoallv-pair-mpi-barrier.cpp b/src/smpi/colls/alltoallv/alltoallv-pair-mpi-barrier.cpp index c440013aa5..98dac23fae 100644 --- a/src/smpi/colls/alltoallv/alltoallv-pair-mpi-barrier.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-pair-mpi-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_pair_mpi_barrier diff --git a/src/smpi/colls/alltoallv/alltoallv-pair-one-barrier.cpp b/src/smpi/colls/alltoallv/alltoallv-pair-one-barrier.cpp index 6dec9cd5d4..eff63ca4ef 100644 --- a/src/smpi/colls/alltoallv/alltoallv-pair-one-barrier.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-pair-one-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_pair diff --git a/src/smpi/colls/alltoallv/alltoallv-pair.cpp b/src/smpi/colls/alltoallv/alltoallv-pair.cpp index e706a7944e..36290d658b 100644 --- a/src/smpi/colls/alltoallv/alltoallv-pair.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-pair.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/alltoallv/alltoallv-ring-light-barrier.cpp b/src/smpi/colls/alltoallv/alltoallv-ring-light-barrier.cpp index 501c236382..a68f4c8efc 100644 --- a/src/smpi/colls/alltoallv/alltoallv-ring-light-barrier.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-ring-light-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring_light_barrier diff --git a/src/smpi/colls/alltoallv/alltoallv-ring-mpi-barrier.cpp b/src/smpi/colls/alltoallv/alltoallv-ring-mpi-barrier.cpp index 38bf38c846..7e14f3f544 100644 --- a/src/smpi/colls/alltoallv/alltoallv-ring-mpi-barrier.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-ring-mpi-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring_mpi_barrier diff --git a/src/smpi/colls/alltoallv/alltoallv-ring-one-barrier.cpp b/src/smpi/colls/alltoallv/alltoallv-ring-one-barrier.cpp index 2d3996fcf4..5f7025a873 100644 --- a/src/smpi/colls/alltoallv/alltoallv-ring-one-barrier.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-ring-one-barrier.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring diff --git a/src/smpi/colls/alltoallv/alltoallv-ring.cpp b/src/smpi/colls/alltoallv/alltoallv-ring.cpp index ddc591b507..79dadaf8c1 100644 --- a/src/smpi/colls/alltoallv/alltoallv-ring.cpp +++ b/src/smpi/colls/alltoallv/alltoallv-ring.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** * Function: alltoall_ring diff --git a/src/smpi/colls/barrier/barrier-mvapich2-pair.cpp b/src/smpi/colls/barrier/barrier-mvapich2-pair.cpp index e5f743d890..0a9b3b4ee8 100644 --- a/src/smpi/colls/barrier/barrier-mvapich2-pair.cpp +++ b/src/smpi/colls/barrier/barrier-mvapich2-pair.cpp @@ -39,8 +39,8 @@ * */ -#include "../colls_private.h" -#include "../coll_tuned_topo.h" +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ int Coll_barrier_mvapich2_pair::barrier(MPI_Comm comm) diff --git a/src/smpi/colls/barrier/barrier-ompi.cpp b/src/smpi/colls/barrier/barrier-ompi.cpp index 12c3af3a2c..0f4eec52f9 100644 --- a/src/smpi/colls/barrier/barrier-ompi.cpp +++ b/src/smpi/colls/barrier/barrier-ompi.cpp @@ -20,9 +20,8 @@ * Additional copyrights may follow */ -#include "../colls_private.h" -#include "../coll_tuned_topo.h" - +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" /* * Barrier is ment to be a synchronous operation, as some BTLs can mark @@ -266,7 +265,7 @@ int Coll_barrier_ompi_basic_linear::barrier(MPI_Comm comm) else { MPI_Request* requests; - requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) ); + requests = new MPI_Request[size]; for (i = 1; i < size; ++i) { requests[i] = Request::irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE, COLL_TAG_BARRIER, comm @@ -281,7 +280,7 @@ int Coll_barrier_ompi_basic_linear::barrier(MPI_Comm comm) ); } Request::waitall( size-1, requests+1, MPI_STATUSES_IGNORE ); - free( requests ); + delete[] requests; } /* All done */ diff --git a/src/smpi/colls/bcast/bcast-NTSB.cpp b/src/smpi/colls/bcast/bcast-NTSB.cpp index 9e1e974fa6..3055371940 100644 --- a/src/smpi/colls/bcast/bcast-NTSB.cpp +++ b/src/smpi/colls/bcast/bcast-NTSB.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" int bcast_NTSB_segment_size_in_byte = 8192; namespace simgrid{ diff --git a/src/smpi/colls/bcast/bcast-NTSL-Isend.cpp b/src/smpi/colls/bcast/bcast-NTSL-Isend.cpp index df3cf2b891..0a3c948bab 100644 --- a/src/smpi/colls/bcast/bcast-NTSL-Isend.cpp +++ b/src/smpi/colls/bcast/bcast-NTSL-Isend.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" static int bcast_NTSL_segment_size_in_byte = 8192; diff --git a/src/smpi/colls/bcast/bcast-NTSL.cpp b/src/smpi/colls/bcast/bcast-NTSL.cpp index a9d3b83f50..957c80cf3b 100644 --- a/src/smpi/colls/bcast/bcast-NTSL.cpp +++ b/src/smpi/colls/bcast/bcast-NTSL.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" static int bcast_NTSL_segment_size_in_byte = 8192; diff --git a/src/smpi/colls/bcast/bcast-SMP-binary.cpp b/src/smpi/colls/bcast/bcast-SMP-binary.cpp index f4eb6a216f..bcec2292a4 100644 --- a/src/smpi/colls/bcast/bcast-SMP-binary.cpp +++ b/src/smpi/colls/bcast/bcast-SMP-binary.cpp @@ -4,8 +4,7 @@ /* 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 "../colls_private.h" - +#include "../colls_private.hpp" int bcast_SMP_binary_segment_byte = 8192; namespace simgrid{ diff --git a/src/smpi/colls/bcast/bcast-SMP-binomial.cpp b/src/smpi/colls/bcast/bcast-SMP-binomial.cpp index 3d6eb0bca8..dab6961627 100644 --- a/src/smpi/colls/bcast/bcast-SMP-binomial.cpp +++ b/src/smpi/colls/bcast/bcast-SMP-binomial.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ int Coll_bcast_SMP_binomial::bcast(void *buf, int count, diff --git a/src/smpi/colls/bcast/bcast-SMP-linear.cpp b/src/smpi/colls/bcast/bcast-SMP-linear.cpp index 691706ecce..a63e9058a4 100644 --- a/src/smpi/colls/bcast/bcast-SMP-linear.cpp +++ b/src/smpi/colls/bcast/bcast-SMP-linear.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" int bcast_SMP_linear_segment_byte = 8192; namespace simgrid{ diff --git a/src/smpi/colls/bcast/bcast-arrival-pattern-aware-wait.cpp b/src/smpi/colls/bcast/bcast-arrival-pattern-aware-wait.cpp index 3256363a12..21a549a523 100644 --- a/src/smpi/colls/bcast/bcast-arrival-pattern-aware-wait.cpp +++ b/src/smpi/colls/bcast/bcast-arrival-pattern-aware-wait.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" int bcast_arrival_pattern_aware_wait_segment_size_in_byte = 8192; diff --git a/src/smpi/colls/bcast/bcast-arrival-pattern-aware.cpp b/src/smpi/colls/bcast/bcast-arrival-pattern-aware.cpp index 102be48d22..484ba793fa 100644 --- a/src/smpi/colls/bcast/bcast-arrival-pattern-aware.cpp +++ b/src/smpi/colls/bcast/bcast-arrival-pattern-aware.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" static int bcast_NTSL_segment_size_in_byte = 8192; diff --git a/src/smpi/colls/bcast/bcast-arrival-scatter.cpp b/src/smpi/colls/bcast/bcast-arrival-scatter.cpp index 3ecba94976..c74408803c 100644 --- a/src/smpi/colls/bcast/bcast-arrival-scatter.cpp +++ b/src/smpi/colls/bcast/bcast-arrival-scatter.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #ifndef BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE #define BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE 128 diff --git a/src/smpi/colls/bcast/bcast-binomial-tree.cpp b/src/smpi/colls/bcast/bcast-binomial-tree.cpp index b8bc0e0e6c..027b4b9681 100644 --- a/src/smpi/colls/bcast/bcast-binomial-tree.cpp +++ b/src/smpi/colls/bcast/bcast-binomial-tree.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /***************************************************************************** diff --git a/src/smpi/colls/bcast/bcast-flattree-pipeline.cpp b/src/smpi/colls/bcast/bcast-flattree-pipeline.cpp index f03eb3aaae..db597a5b67 100644 --- a/src/smpi/colls/bcast/bcast-flattree-pipeline.cpp +++ b/src/smpi/colls/bcast/bcast-flattree-pipeline.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" int flattree_segment_in_byte = 8192; namespace simgrid{ diff --git a/src/smpi/colls/bcast/bcast-flattree.cpp b/src/smpi/colls/bcast/bcast-flattree.cpp index f89bd94f34..79e9fe70f9 100644 --- a/src/smpi/colls/bcast/bcast-flattree.cpp +++ b/src/smpi/colls/bcast/bcast-flattree.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ int diff --git a/src/smpi/colls/bcast/bcast-mvapich-smp.cpp b/src/smpi/colls/bcast/bcast-mvapich-smp.cpp index b0c0f31a8c..17e9ca041d 100644 --- a/src/smpi/colls/bcast/bcast-mvapich-smp.cpp +++ b/src/smpi/colls/bcast/bcast-mvapich-smp.cpp @@ -34,8 +34,8 @@ * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" +#include "../colls_private.hpp" extern int (*MV2_Bcast_function) (void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm_ptr); diff --git a/src/smpi/colls/bcast/bcast-ompi-pipeline.cpp b/src/smpi/colls/bcast/bcast-ompi-pipeline.cpp index 425fcab111..0de5fffa22 100644 --- a/src/smpi/colls/bcast/bcast-ompi-pipeline.cpp +++ b/src/smpi/colls/bcast/bcast-ompi-pipeline.cpp @@ -4,8 +4,8 @@ /* 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 "../colls_private.h" - #include "../coll_tuned_topo.h" +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" #define MAXTREEFANOUT 32 @@ -85,7 +85,7 @@ int Coll_bcast_ompi_pipeline::bcast( void* buffer, tmpbuf = (char *) buffer; if( tree->tree_nextsize != 0 ) { - send_reqs = xbt_new(MPI_Request, tree->tree_nextsize ); + send_reqs = new MPI_Request[tree->tree_nextsize]; } /* Root code */ @@ -205,8 +205,8 @@ int Coll_bcast_ompi_pipeline::bcast( void* buffer, Request::wait( &recv_reqs[req_index], MPI_STATUS_IGNORE ); } - if( NULL != send_reqs ) free(send_reqs); - xbt_free(tree); + delete[] send_reqs; + ompi_coll_tuned_topo_destroy_tree(&tree); return (MPI_SUCCESS); } diff --git a/src/smpi/colls/bcast/bcast-ompi-split-bintree.cpp b/src/smpi/colls/bcast/bcast-ompi-split-bintree.cpp index 52ad605112..2ab6c7d5b0 100644 --- a/src/smpi/colls/bcast/bcast-ompi-split-bintree.cpp +++ b/src/smpi/colls/bcast/bcast-ompi-split-bintree.cpp @@ -55,9 +55,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "../colls_private.h" - #include "../coll_tuned_topo.h" - #define MAXTREEFANOUT 32 +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" +#define MAXTREEFANOUT 32 namespace simgrid{ namespace smpi{ @@ -296,7 +296,7 @@ Coll_bcast_ompi_split_bintree::bcast ( void* buffer, comm, MPI_STATUS_IGNORE); } } - xbt_free(tree); + ompi_coll_tuned_topo_destroy_tree(&tree); return (MPI_SUCCESS); diff --git a/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp b/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp index 6b304ade5f..6b7936d32b 100644 --- a/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp +++ b/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp @@ -3,7 +3,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #include "smpi_status.hpp" /***************************************************************************** diff --git a/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp b/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp index f48e31a536..df78b16451 100644 --- a/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp +++ b/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp @@ -3,7 +3,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" #include "smpi_status.hpp" namespace simgrid{ diff --git a/src/smpi/colls/coll_tuned_topo.cpp b/src/smpi/colls/coll_tuned_topo.cpp index db88a997bb..7138c7ed90 100644 --- a/src/smpi/colls/coll_tuned_topo.cpp +++ b/src/smpi/colls/coll_tuned_topo.cpp @@ -19,8 +19,8 @@ * Additional copyrights may follow */ -#include "colls_private.h" -#include "coll_tuned_topo.h" +#include "coll_tuned_topo.hpp" +#include "colls_private.hpp" /* * Some static helpers. */ @@ -101,7 +101,7 @@ ompi_coll_tuned_topo_build_tree( int fanout, size = comm->size(); rank = comm->rank(); - tree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t)); + tree = new ompi_coll_tree_t; if (not tree) { XBT_DEBUG("coll:tuned:topo_build_tree PANIC::out of memory"); return NULL; @@ -201,7 +201,7 @@ ompi_coll_tuned_topo_build_in_order_bintree( MPI_Comm comm ) size = comm->size(); rank = comm->rank(); - tree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t)); + tree = new ompi_coll_tree_t; if (not tree) { XBT_DEBUG("coll:tuned:topo_build_tree PANIC::out of memory"); return NULL; @@ -304,7 +304,7 @@ int ompi_coll_tuned_topo_destroy_tree( ompi_coll_tree_t** tree ) ptr = *tree; - free (ptr); + delete ptr; *tree = NULL; /* mark tree as gone */ return MPI_SUCCESS; @@ -345,7 +345,7 @@ ompi_coll_tuned_topo_build_bmtree( MPI_Comm comm, index = rank -root; - bmtree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t)); + bmtree = new ompi_coll_tree_t; if (not bmtree) { XBT_DEBUG("coll:tuned:topo:build_bmtree PANIC out of memory"); return NULL; @@ -424,7 +424,7 @@ ompi_coll_tree_t* ompi_coll_tuned_topo_build_in_order_bmtree(MPI_Comm comm, int vrank = (rank - root + size) % size; - bmtree = (ompi_coll_tree_t*)xbt_malloc(sizeof(ompi_coll_tree_t)); + bmtree = new ompi_coll_tree_t; if (not bmtree) { XBT_DEBUG("coll:tuned:topo:build_bmtree PANIC out of memory"); return NULL; @@ -494,7 +494,7 @@ ompi_coll_tuned_topo_build_chain( int fanout, /* * Allocate space for topology arrays if needed */ - chain = (ompi_coll_tree_t*)malloc( sizeof(ompi_coll_tree_t) ); + chain = new ompi_coll_tree_t; if (not chain) { XBT_DEBUG("coll:tuned:topo:build_chain PANIC out of memory"); fflush(stdout); diff --git a/src/smpi/colls/coll_tuned_topo.h b/src/smpi/colls/coll_tuned_topo.h deleted file mode 100644 index 907fdecf70..0000000000 --- a/src/smpi/colls/coll_tuned_topo.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (c) 2013-2017. 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. */ - -/* - * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana - * University Research and Technology - * Corporation. All rights reserved. - * Copyright (c) 2004-2005 The University of Tennessee and The University - * of Tennessee Research Foundation. All rights - * reserved. - * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, - * University of Stuttgart. All rights reserved. - * Copyright (c) 2004-2005 The Regents of the University of California. - * All rights reserved. - * - * Additional copyrights may follow - */ - -#ifndef MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED -#define MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED - -#include "colls_private.h" - -#define MAXTREEFANOUT 32 - -#define COLL_TUNED_COMPUTED_SEGCOUNT(SEGSIZE, TYPELNG, SEGCOUNT) \ - if( ((SEGSIZE) >= (TYPELNG)) && \ - ((SEGSIZE) < ((TYPELNG) * (SEGCOUNT))) ) { \ - size_t residual; \ - (SEGCOUNT) = (int)((SEGSIZE) / (TYPELNG)); \ - residual = (SEGSIZE) - (SEGCOUNT) * (TYPELNG); \ - if( residual > ((TYPELNG) >> 1) ) \ - (SEGCOUNT)++; \ - } \ - - - typedef struct ompi_coll_tree_t { - int32_t tree_root; - int32_t tree_fanout; - int32_t tree_bmtree; - int32_t tree_prev; - int32_t tree_next[MAXTREEFANOUT]; - int32_t tree_nextsize; - } ompi_coll_tree_t; - - ompi_coll_tree_t* - ompi_coll_tuned_topo_build_tree( int fanout, - MPI_Comm com, - int root ); - ompi_coll_tree_t* - ompi_coll_tuned_topo_build_in_order_bintree( MPI_Comm comm ); - - ompi_coll_tree_t* - ompi_coll_tuned_topo_build_bmtree( MPI_Comm comm, - int root ); - ompi_coll_tree_t* ompi_coll_tuned_topo_build_in_order_bmtree(MPI_Comm comm, int root); - ompi_coll_tree_t* - ompi_coll_tuned_topo_build_chain( int fanout, - MPI_Comm com, - int root ); - - int ompi_coll_tuned_topo_destroy_tree( ompi_coll_tree_t** tree ); - - /* debugging stuff, will be removed later */ - int ompi_coll_tuned_topo_dump_tree (ompi_coll_tree_t* tree, int rank); - -#endif /* MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED */ - diff --git a/src/smpi/colls/coll_tuned_topo.hpp b/src/smpi/colls/coll_tuned_topo.hpp new file mode 100644 index 0000000000..e6ff4b409c --- /dev/null +++ b/src/smpi/colls/coll_tuned_topo.hpp @@ -0,0 +1,58 @@ +/* Copyright (c) 2013-2017. 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. */ + +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2005 The University of Tennessee and The University + * of Tennessee Research Foundation. All rights + * reserved. + * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, + * University of Stuttgart. All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * + * Additional copyrights may follow + */ + +#ifndef MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED +#define MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED + +#include "colls_private.hpp" + +#define MAXTREEFANOUT 32 + +#define COLL_TUNED_COMPUTED_SEGCOUNT(SEGSIZE, TYPELNG, SEGCOUNT) \ + if (((SEGSIZE) >= (TYPELNG)) && ((SEGSIZE) < ((TYPELNG) * (SEGCOUNT)))) { \ + size_t residual; \ + (SEGCOUNT) = (int)((SEGSIZE) / (TYPELNG)); \ + residual = (SEGSIZE) - (SEGCOUNT) * (TYPELNG); \ + if (residual > ((TYPELNG) >> 1)) \ + (SEGCOUNT)++; \ + } + +struct ompi_coll_tree_t { + int32_t tree_root; + int32_t tree_fanout; + int32_t tree_bmtree; + int32_t tree_prev; + int32_t tree_next[MAXTREEFANOUT]; + int32_t tree_nextsize; +}; + +ompi_coll_tree_t* ompi_coll_tuned_topo_build_tree(int fanout, MPI_Comm com, int root); +ompi_coll_tree_t* ompi_coll_tuned_topo_build_in_order_bintree(MPI_Comm comm); + +ompi_coll_tree_t* ompi_coll_tuned_topo_build_bmtree(MPI_Comm comm, int root); +ompi_coll_tree_t* ompi_coll_tuned_topo_build_in_order_bmtree(MPI_Comm comm, int root); +ompi_coll_tree_t* ompi_coll_tuned_topo_build_chain(int fanout, MPI_Comm com, int root); + +int ompi_coll_tuned_topo_destroy_tree(ompi_coll_tree_t** tree); + +/* debugging stuff, will be removed later */ +int ompi_coll_tuned_topo_dump_tree(ompi_coll_tree_t* tree, int rank); + +#endif /* MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED */ diff --git a/src/smpi/colls/colls_private.h b/src/smpi/colls/colls_private.hpp similarity index 81% rename from src/smpi/colls/colls_private.h rename to src/smpi/colls/colls_private.hpp index fc28459fbd..63ff65c229 100644 --- a/src/smpi/colls/colls_private.h +++ b/src/smpi/colls/colls_private.hpp @@ -3,17 +3,17 @@ /* 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. */ -#ifndef SMPI_COLLS_PRIVATE_H -#define SMPI_COLLS_PRIVATE_H +#ifndef SMPI_COLLS_PRIVATE_HPP +#define SMPI_COLLS_PRIVATE_HPP -#include +#include "private.hpp" #include "smpi/mpi.h" -#include "private.h" #include "smpi_coll.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" #include "smpi_op.hpp" #include "smpi_request.hpp" +#include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_colls); diff --git a/src/smpi/colls/gather/gather-mvapich.cpp b/src/smpi/colls/gather/gather-mvapich.cpp index 9cc9a36259..2ebd387a9f 100644 --- a/src/smpi/colls/gather/gather-mvapich.cpp +++ b/src/smpi/colls/gather/gather-mvapich.cpp @@ -35,11 +35,8 @@ * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" - - - - +#include "../colls_private.hpp" +#include #define MPIR_Gather_MV2_Direct Coll_gather_ompi_basic_linear::gather #define MPIR_Gather_MV2_two_level_Direct Coll_gather_ompi_basic_linear::gather @@ -227,12 +224,9 @@ int Coll_gather_mvapich2_two_level::gather(void *sendbuf, if (local_rank == 0) { /* Node leader, allocate tmp_buffer */ if (rank == root) { - tmp_buf = smpi_get_tmp_recvbuffer(recvcnt * MAX(recvtype_extent, - recvtype_true_extent) * local_size); + tmp_buf = smpi_get_tmp_recvbuffer(recvcnt * std::max(recvtype_extent, recvtype_true_extent) * local_size); } else { - tmp_buf = smpi_get_tmp_sendbuffer(sendcnt * MAX(sendtype_extent, - sendtype_true_extent) * - local_size); + tmp_buf = smpi_get_tmp_sendbuffer(sendcnt * std::max(sendtype_extent, sendtype_true_extent) * local_size); } if (tmp_buf == NULL) { mpi_errno = MPI_ERR_OTHER; @@ -295,10 +289,10 @@ int Coll_gather_mvapich2_two_level::gather(void *sendbuf, * is the same as leader_root */ if (rank == root) { leader_gather_buf = - smpi_get_tmp_recvbuffer(recvcnt * MAX(recvtype_extent, recvtype_true_extent) * comm_size); + smpi_get_tmp_recvbuffer(recvcnt * std::max(recvtype_extent, recvtype_true_extent) * comm_size); } else { leader_gather_buf = - smpi_get_tmp_sendbuffer(sendcnt * MAX(sendtype_extent, sendtype_true_extent) * comm_size); + smpi_get_tmp_sendbuffer(sendcnt * std::max(sendtype_extent, sendtype_true_extent) * comm_size); } if (leader_gather_buf == NULL) { mpi_errno = MPI_ERR_OTHER; diff --git a/src/smpi/colls/gather/gather-ompi.cpp b/src/smpi/colls/gather/gather-ompi.cpp index 6190e56669..3e4e65c83e 100644 --- a/src/smpi/colls/gather/gather-ompi.cpp +++ b/src/smpi/colls/gather/gather-ompi.cpp @@ -19,8 +19,8 @@ * Additional copyrights may follow */ -#include "../colls_private.h" -#include "../coll_tuned_topo.h" +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ @@ -181,7 +181,7 @@ int Coll_gather_ompi_binomial::gather(void* sbuf, int scount, MPI_Datatype sdtyp /* other non-leaf nodes */ smpi_free_tmp_buffer(tempbuf); } - xbt_free(bmtree); + ompi_coll_tuned_topo_destroy_tree(&bmtree); return MPI_SUCCESS; err_hndl: @@ -266,8 +266,8 @@ int Coll_gather_ompi_linear_sync::gather(void *sbuf, int scount, - Waitall for all the second segments to complete. */ char* ptmp; - MPI_Request *reqs = NULL, first_segment_req; - reqs = (MPI_Request*)calloc(size, sizeof(MPI_Request)); + MPI_Request first_segment_req; + MPI_Request* reqs = new (std::nothrow) MPI_Request[size]; if (NULL == reqs) { ret = -1; line = __LINE__; @@ -319,7 +319,7 @@ int Coll_gather_ompi_linear_sync::gather(void *sbuf, int scount, ret = Request::waitall(size, reqs, MPI_STATUSES_IGNORE); if (ret != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } - free(reqs); + delete[] reqs; } /* All done */ diff --git a/src/smpi/colls/reduce/reduce-NTSL.cpp b/src/smpi/colls/reduce/reduce-NTSL.cpp index b15c4f7056..b11c99d4f6 100644 --- a/src/smpi/colls/reduce/reduce-NTSL.cpp +++ b/src/smpi/colls/reduce/reduce-NTSL.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" //#include int reduce_NTSL_segment_size_in_byte = 8192; diff --git a/src/smpi/colls/reduce/reduce-arrival-pattern-aware.cpp b/src/smpi/colls/reduce/reduce-arrival-pattern-aware.cpp index 91a371f256..a25a1c625f 100644 --- a/src/smpi/colls/reduce/reduce-arrival-pattern-aware.cpp +++ b/src/smpi/colls/reduce/reduce-arrival-pattern-aware.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" //#include int reduce_arrival_pattern_aware_segment_size_in_byte = 8192; diff --git a/src/smpi/colls/reduce/reduce-binomial.cpp b/src/smpi/colls/reduce/reduce-binomial.cpp index 7321767499..07abde4fdc 100644 --- a/src/smpi/colls/reduce/reduce-binomial.cpp +++ b/src/smpi/colls/reduce/reduce-binomial.cpp @@ -4,7 +4,8 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" +#include //#include namespace simgrid{ @@ -47,7 +48,7 @@ int Coll_reduce_binomial::reduce(void *sendbuf, void *recvbuf, int count, /* If I'm not the root, then my recvbuf may not be valid, therefore I have to allocate a temporary one */ if (rank != root) { - recvbuf = (void *) smpi_get_tmp_recvbuffer(count*(MAX(extent,true_extent))); + recvbuf = (void*)smpi_get_tmp_recvbuffer(count * std::max(extent, true_extent)); recvbuf = (void *)((char*)recvbuf - true_lb); } if ((rank != root) || (sendbuf != MPI_IN_PLACE)) { diff --git a/src/smpi/colls/reduce/reduce-flat-tree.cpp b/src/smpi/colls/reduce/reduce-flat-tree.cpp index c4c2e7fd21..225b456d12 100644 --- a/src/smpi/colls/reduce/reduce-flat-tree.cpp +++ b/src/smpi/colls/reduce/reduce-flat-tree.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" //#include namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/reduce/reduce-mvapich-knomial.cpp b/src/smpi/colls/reduce/reduce-mvapich-knomial.cpp index 2ab0774f80..90619c286f 100644 --- a/src/smpi/colls/reduce/reduce-mvapich-knomial.cpp +++ b/src/smpi/colls/reduce/reduce-mvapich-knomial.cpp @@ -38,7 +38,9 @@ * */ -#include "../colls_private.h" +#include "../colls_private.hpp" +#include + extern int mv2_reduce_intra_knomial_factor; extern int mv2_reduce_inter_knomial_factor; @@ -150,7 +152,7 @@ int Coll_reduce_mvapich2_knomial::reduce ( is_commutative = (op==MPI_OP_NULL || op->is_commutative()); if (rank != root) { - recvbuf=(void *)smpi_get_tmp_recvbuffer(count*(MAX(extent,true_extent))); + recvbuf = (void*)smpi_get_tmp_recvbuffer(count * std::max(extent, true_extent)); recvbuf = (void *)((char*)recvbuf - true_lb); } @@ -177,7 +179,7 @@ int Coll_reduce_mvapich2_knomial::reduce ( tmp_buf = static_cast(xbt_malloc(sizeof(void *)*expected_recv_count)); requests = static_cast(xbt_malloc(sizeof(MPI_Request)*expected_recv_count)); for(k=0; k < expected_recv_count; k++ ) { - tmp_buf[k] = smpi_get_tmp_sendbuffer(count*(MAX(extent,true_extent))); + tmp_buf[k] = smpi_get_tmp_sendbuffer(count * std::max(extent, true_extent)); tmp_buf[k] = (void *)((char*)tmp_buf[k] - true_lb); } diff --git a/src/smpi/colls/reduce/reduce-mvapich-two-level.cpp b/src/smpi/colls/reduce/reduce-mvapich-two-level.cpp index 6d031e0363..7a14eb4d38 100644 --- a/src/smpi/colls/reduce/reduce-mvapich-two-level.cpp +++ b/src/smpi/colls/reduce/reduce-mvapich-two-level.cpp @@ -35,7 +35,9 @@ * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" +#include "../colls_private.hpp" +#include + #define MV2_INTRA_SHMEM_REDUCE_MSG 2048 #define mv2_g_shmem_coll_max_msg_size (1 << 17) @@ -117,15 +119,14 @@ int Coll_reduce_mvapich2_two_level::reduce( void *sendbuf, datatype->extent(&true_lb, &true_extent); extent =datatype->get_extent(); - stride = count * MAX(extent, true_extent); + stride = count * std::max(extent, true_extent); if (local_size == total_size) { /* First handle the case where there is only one node */ if (stride <= MV2_INTRA_SHMEM_REDUCE_MSG && is_commutative == 1) { if (local_rank == 0 ) { - tmp_buf=(void *)smpi_get_tmp_sendbuffer( count * - (MAX(extent, true_extent))); + tmp_buf = (void*)smpi_get_tmp_sendbuffer(count * std::max(extent, true_extent)); tmp_buf = (void *) ((char *) tmp_buf - true_lb); } @@ -150,7 +151,7 @@ int Coll_reduce_mvapich2_two_level::reduce( void *sendbuf, out_buf = NULL; } - if (count * (MAX(extent, true_extent)) < SHMEM_COLL_BLOCK_SIZE) { + if (count * (std::max(extent, true_extent)) < SHMEM_COLL_BLOCK_SIZE) { mpi_errno = MPIR_Reduce_shmem_MV2(in_buf, out_buf, count, datatype, op, 0, shmem_comm); } else { mpi_errno = MPIR_Reduce_intra_knomial_wrapper_MV2(in_buf, out_buf, count, datatype, op, 0, shmem_comm); @@ -189,8 +190,7 @@ int Coll_reduce_mvapich2_two_level::reduce( void *sendbuf, } leader_comm_size = leader_comm->size(); leader_comm_rank = leader_comm->rank(); - tmp_buf=(void *)smpi_get_tmp_sendbuffer(count * - (MAX(extent, true_extent))); + tmp_buf = (void*)smpi_get_tmp_sendbuffer(count * std::max(extent, true_extent)); tmp_buf = (void *) ((char *) tmp_buf - true_lb); } if (sendbuf != MPI_IN_PLACE) { @@ -214,7 +214,7 @@ int Coll_reduce_mvapich2_two_level::reduce( void *sendbuf, *this step*/ if (MV2_Reduce_intra_function == & MPIR_Reduce_shmem_MV2) { - if (is_commutative == 1 && (count * (MAX(extent, true_extent)) < SHMEM_COLL_BLOCK_SIZE)) { + if (is_commutative == 1 && (count * (std::max(extent, true_extent)) < SHMEM_COLL_BLOCK_SIZE)) { mpi_errno = MV2_Reduce_intra_function(in_buf, out_buf, count, datatype, op, intra_node_root, shmem_comm); } else { mpi_errno = MPIR_Reduce_intra_knomial_wrapper_MV2(in_buf, out_buf, count, diff --git a/src/smpi/colls/reduce/reduce-ompi.cpp b/src/smpi/colls/reduce/reduce-ompi.cpp index f5d593d1af..a4b540e809 100644 --- a/src/smpi/colls/reduce/reduce-ompi.cpp +++ b/src/smpi/colls/reduce/reduce-ompi.cpp @@ -19,8 +19,8 @@ * Additional copyrights may follow */ -#include "../colls_private.h" -#include "../coll_tuned_topo.h" +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ @@ -261,10 +261,7 @@ int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int origi else { int creq = 0; - MPI_Request* sreq = NULL; - - sreq = (MPI_Request*) calloc( max_outstanding_reqs, - sizeof(MPI_Request ) ); + MPI_Request* sreq = new (std::nothrow) MPI_Request[max_outstanding_reqs]; if (NULL == sreq) { line = __LINE__; ret = -1; goto error_hndl; } /* post first group of requests */ @@ -303,10 +300,10 @@ int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int origi MPI_STATUSES_IGNORE ); /* free requests */ - free(sreq); + delete[] sreq; } } - free(tree); + ompi_coll_tuned_topo_destroy_tree(&tree); return MPI_SUCCESS; error_hndl: /* error handler */ diff --git a/src/smpi/colls/reduce/reduce-rab.cpp b/src/smpi/colls/reduce/reduce-rab.cpp index b2c90e06b0..5b2f4b20fb 100644 --- a/src/smpi/colls/reduce/reduce-rab.cpp +++ b/src/smpi/colls/reduce/reduce-rab.cpp @@ -9,7 +9,7 @@ * but this header must not be removed. */ -#include "../colls_private.h" +#include "../colls_private.hpp" #include #include @@ -409,13 +409,31 @@ Benchmark results on CRAY T3E #endif #endif -typedef enum {MPIM_SHORT, MPIM_INT, MPIM_LONG, MPIM_UNSIGNED_SHORT, - MPIM_UNSIGNED, MPIM_UNSIGNED_LONG, MPIM_UNSIGNED_LONG_LONG, MPIM_FLOAT, - MPIM_DOUBLE, MPIM_BYTE} MPIM_Datatype; - -typedef enum {MPIM_MAX, MPIM_MIN, MPIM_SUM, MPIM_PROD, - MPIM_LAND, MPIM_BAND, MPIM_LOR, MPIM_BOR, - MPIM_LXOR, MPIM_BXOR} MPIM_Op; +enum MPIM_Datatype { + MPIM_SHORT, + MPIM_INT, + MPIM_LONG, + MPIM_UNSIGNED_SHORT, + MPIM_UNSIGNED, + MPIM_UNSIGNED_LONG, + MPIM_UNSIGNED_LONG_LONG, + MPIM_FLOAT, + MPIM_DOUBLE, + MPIM_BYTE +}; + +enum MPIM_Op { + MPIM_MAX, + MPIM_MIN, + MPIM_SUM, + MPIM_PROD, + MPIM_LAND, + MPIM_BAND, + MPIM_LOR, + MPIM_BOR, + MPIM_LXOR, + MPIM_BXOR +}; #define MPI_I_DO_OP_C_INTEGER(MPI_I_do_op_TYPE,TYPE) \ static void MPI_I_do_op_TYPE(TYPE* b1,TYPE* b2,TYPE* rslt, int cnt,MPIM_Op op)\ { int i; \ @@ -595,14 +613,14 @@ static int MPI_I_anyReduce(void* Sendbuf, void* Recvbuf, int count, MPI_Datatype MPI_Type_extent(mpi_datatype, &typelng); scrlng = typelng * count; #ifdef NO_CACHE_OPTIMIZATION - scr1buf = static_cast(xbt_malloc(scrlng)); - scr2buf = static_cast(xbt_malloc(scrlng)); - scr3buf = static_cast(xbt_malloc(scrlng)); + scr1buf = new char[scrlng]; + scr2buf = new char[scrlng]; + scr3buf = new char[scrlng]; #else # ifdef SCR_LNG_OPTIM scrlng = SCR_LNG_OPTIM(scrlng); # endif - scr2buf = static_cast(xbt_malloc(3*scrlng)); /* To test cache problems. */ + scr2buf = new char[3 * scrlng]; /* To test cache problems. */ scr1buf = scr2buf + 1*scrlng; /* scr1buf and scr3buf must not*/ scr3buf = scr2buf + 2*scrlng; /* be used for malloc because */ /* they are interchanged below.*/ @@ -914,9 +932,11 @@ static int MPI_I_anyReduce(void* Sendbuf, void* Recvbuf, int count, MPI_Datatype } # ifdef NO_CACHE_TESTING - xbt_free(scr1buf); xbt_free(scr2buf); xbt_free(scr3buf); + delete[] scr1buf; + delete[] scr2buf; + delete[] scr3buf; # else - xbt_free(scr2buf); /* scr1buf and scr3buf are part of scr2buf */ + delete[] scr2buf; /* scr1buf and scr3buf are part of scr2buf */ # endif return(MPI_SUCCESS); } /* new_prot */ diff --git a/src/smpi/colls/reduce/reduce-scatter-gather.cpp b/src/smpi/colls/reduce/reduce-scatter-gather.cpp index 4b987aa2f9..fc55a39c80 100644 --- a/src/smpi/colls/reduce/reduce-scatter-gather.cpp +++ b/src/smpi/colls/reduce/reduce-scatter-gather.cpp @@ -4,7 +4,7 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" /* reduce diff --git a/src/smpi/colls/reduce_scatter/reduce_scatter-mpich.cpp b/src/smpi/colls/reduce_scatter/reduce_scatter-mpich.cpp index 39128a2e9f..8061733e42 100644 --- a/src/smpi/colls/reduce_scatter/reduce_scatter-mpich.cpp +++ b/src/smpi/colls/reduce_scatter/reduce_scatter-mpich.cpp @@ -4,7 +4,8 @@ /* 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 "../colls_private.h" +#include "../colls_private.hpp" +#include static inline int MPIU_Mirror_permutation(unsigned int x, int bits) { @@ -64,7 +65,7 @@ int Coll_reduce_scatter_mpich_pair::reduce_scatter(void *sendbuf, void *recvbuf, } /* allocate temporary buffer to store incoming data */ - tmp_recvbuf = (void*)smpi_get_tmp_recvbuffer(recvcounts[rank]*(MAX(true_extent,extent))+1); + tmp_recvbuf = (void*)smpi_get_tmp_recvbuffer(recvcounts[rank] * std::max(true_extent, extent) + 1); /* adjust for potential negative lower bound in datatype */ tmp_recvbuf = (void *)((char*)tmp_recvbuf - true_lb); @@ -295,13 +296,13 @@ int Coll_reduce_scatter_mpich_rdb::reduce_scatter(void *sendbuf, void *recvbuf, /* noncommutative and (non-pof2 or block irregular), use recursive doubling. */ /* need to allocate temporary buffer to receive incoming data*/ - tmp_recvbuf= (void *) smpi_get_tmp_recvbuffer( total_count*(MAX(true_extent,extent))); + tmp_recvbuf= (void*)smpi_get_tmp_recvbuffer(total_count * std::max(true_extent, extent)); /* adjust for potential negative lower bound in datatype */ tmp_recvbuf = (void *)((char*)tmp_recvbuf - true_lb); /* need to allocate another temporary buffer to accumulate results */ - tmp_results = (void *)smpi_get_tmp_sendbuffer( total_count*(MAX(true_extent,extent))); + tmp_results = (void*)smpi_get_tmp_sendbuffer(total_count * std::max(true_extent, extent)); /* adjust for potential negative lower bound in datatype */ tmp_results = (void *)((char*)tmp_results - true_lb); diff --git a/src/smpi/colls/reduce_scatter/reduce_scatter-ompi.cpp b/src/smpi/colls/reduce_scatter/reduce_scatter-ompi.cpp index 8a28d8854a..1bc913c448 100644 --- a/src/smpi/colls/reduce_scatter/reduce_scatter-ompi.cpp +++ b/src/smpi/colls/reduce_scatter/reduce_scatter-ompi.cpp @@ -21,8 +21,8 @@ * Additional copyrights may follow */ -#include "../colls_private.h" -#include "../coll_tuned_topo.h" +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" /* * Recursive-halving function is (*mostly*) copied from the BASIC coll module. diff --git a/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp b/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp index cd701f5f58..16f3781b78 100644 --- a/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp +++ b/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp @@ -34,7 +34,7 @@ * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" +#include "../colls_private.hpp" #define MPIR_Scatter_MV2_Binomial Coll_scatter_ompi_binomial::scatter #define MPIR_Scatter_MV2_Direct Coll_scatter_ompi_basic_linear::scatter diff --git a/src/smpi/colls/scatter/scatter-ompi.cpp b/src/smpi/colls/scatter/scatter-ompi.cpp index 5a2da7fa8f..6c14004a71 100644 --- a/src/smpi/colls/scatter/scatter-ompi.cpp +++ b/src/smpi/colls/scatter/scatter-ompi.cpp @@ -19,9 +19,8 @@ * Additional copyrights may follow */ - -#include "../colls_private.h" -#include "../coll_tuned_topo.h" +#include "../coll_tuned_topo.hpp" +#include "../colls_private.hpp" namespace simgrid{ namespace smpi{ @@ -160,7 +159,7 @@ int Coll_scatter_ompi_binomial::scatter(void* sbuf, int scount, MPI_Datatype sdt if (NULL != tempbuf) smpi_free_tmp_buffer(tempbuf); // not FIXME : store the tree, as done in ompi, instead of calculating it each time ? - xbt_free(bmtree); + ompi_coll_tuned_topo_destroy_tree(&bmtree); return MPI_SUCCESS; diff --git a/src/smpi/colls/smpi_automatic_selector.cpp b/src/smpi/colls/smpi_automatic_selector.cpp index b6b3693767..9710f2e7ea 100644 --- a/src/smpi/colls/smpi_automatic_selector.cpp +++ b/src/smpi/colls/smpi_automatic_selector.cpp @@ -5,26 +5,20 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include - #include -#include "colls_private.h" +#include "colls_private.hpp" #include "smpi_process.hpp" - //attempt to do a quick autotuning version of the collective, - #define TRACE_AUTO_COLL(cat) \ if (TRACE_is_enabled()) { \ - simgrid::instr::Type* type = PJ_type_get_root()->getChildOrNull(#cat); \ - if (not type) { \ - type = simgrid::instr::Type::eventNew(#cat, PJ_type_get_root()); \ - } \ - char cont_name[25]; \ - snprintf(cont_name, 25, "rank-%d", smpi_process()->index()); \ - simgrid::instr::Value* val = \ - simgrid::instr::Value::get_or_new(Colls::mpi_coll_##cat##_description[i].name, "1.0 1.0 1.0", type); \ - new simgrid::instr::NewEvent(SIMIX_get_clock(), PJ_container_get(cont_name), type, val); \ + simgrid::instr::EventType* type = simgrid::instr::Container::getRoot()->type_->getOrCreateEventType(#cat); \ + \ + std::string cont_name = std::string("rank-" + std::to_string(smpi_process()->index())); \ + type->addEntityValue(Colls::mpi_coll_##cat##_description[i].name, "1.0 1.0 1.0"); \ + new simgrid::instr::NewEvent(SIMIX_get_clock(), simgrid::instr::Container::byName(cont_name), type, \ + type->getEntityValue(Colls::mpi_coll_##cat##_description[i].name)); \ } #define AUTOMATIC_COLL_BENCH(cat, ret, args, args2) \ diff --git a/src/smpi/colls/smpi_coll.cpp b/src/smpi/colls/smpi_coll.cpp index a0760feabf..360603840a 100644 --- a/src/smpi/colls/smpi_coll.cpp +++ b/src/smpi/colls/smpi_coll.cpp @@ -5,8 +5,8 @@ /* 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 "private.h" #include "smpi_coll.hpp" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" #include "smpi_op.hpp" @@ -14,22 +14,21 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, "Logging specific to SMPI (coll)"); -#define COLL_SETTER(cat, ret, args, args2)\ -int (*Colls::cat ) args;\ -void Colls::set_##cat (const char * name){\ - int id = find_coll_description(mpi_coll_## cat ##_description,\ - name,#cat);\ - cat = reinterpret_cast\ - (mpi_coll_## cat ##_description[id].coll);\ - if (cat == nullptr)\ - xbt_die("Collective "#cat" set to nullptr!");\ -} +#define COLL_SETTER(cat, ret, args, args2) \ + int(*Colls::cat) args; \ + void Colls::set_##cat(std::string name) \ + { \ + int id = find_coll_description(mpi_coll_##cat##_description, name, #cat); \ + cat = reinterpret_cast(mpi_coll_##cat##_description[id].coll); \ + if (cat == nullptr) \ + xbt_die("Collective " #cat " set to nullptr!"); \ + } -#define SET_COLL(coll)\ - name = xbt_cfg_get_string("smpi/"#coll);\ - if (name==nullptr || name[0] == '\0')\ - name = selector_name;\ - set_##coll(name); +#define SET_COLL(coll) \ + name = xbt_cfg_get_string("smpi/" #coll); \ + if (name.empty()) \ + name = selector_name; \ + set_##coll(name); namespace simgrid{ namespace smpi{ @@ -68,30 +67,25 @@ void Colls::coll_help(const char *category, s_mpi_coll_description_t * table) XBT_WARN(" %s: %s\n", table[i].name, table[i].description); } -int Colls::find_coll_description(s_mpi_coll_description_t * table, const char *name, const char *desc) +int Colls::find_coll_description(s_mpi_coll_description_t* table, std::string name, const char* desc) { - char *name_list = nullptr; for (int i = 0; table[i].name; i++) - if (not strcmp(name, table[i].name)) { + if (name == table[i].name) { if (strcmp(table[i].name,"default")) XBT_INFO("Switch to algorithm %s for collective %s",table[i].name,desc); return i; } if (not table[0].name) - xbt_die("No collective is valid for '%s'! This is a bug.",name); - name_list = xbt_strdup(table[0].name); - for (int i = 1; table[i].name; i++) { - name_list = static_cast(xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3)); - strncat(name_list, ", ",2); - strncat(name_list, table[i].name, strlen(table[i].name)); - } - xbt_die("Collective '%s' is invalid! Valid collectives are: %s.", name, name_list); + xbt_die("No collective is valid for '%s'! This is a bug.", name.c_str()); + std::string name_list = std::string(table[0].name); + for (int i = 1; table[i].name; i++) + name_list = name_list + ", " + table[i].name; + + xbt_die("Collective '%s' is invalid! Valid collectives are: %s.", name.c_str(), name_list.c_str()); return -1; } - - COLL_APPLY(COLL_SETTER,COLL_GATHER_SIG,""); COLL_APPLY(COLL_SETTER,COLL_ALLGATHER_SIG,""); COLL_APPLY(COLL_SETTER,COLL_ALLGATHERV_SIG,""); @@ -106,23 +100,23 @@ COLL_APPLY(COLL_SETTER,COLL_ALLTOALLV_SIG,""); void Colls::set_collectives(){ - const char* selector_name = static_cast(xbt_cfg_get_string("smpi/coll-selector")); - if (selector_name==nullptr || selector_name[0] == '\0') - selector_name = "default"; - - const char* name; - - SET_COLL(gather); - SET_COLL(allgather); - SET_COLL(allgatherv); - SET_COLL(allreduce); - SET_COLL(alltoall); - SET_COLL(alltoallv); - SET_COLL(reduce); - SET_COLL(reduce_scatter); - SET_COLL(scatter); - SET_COLL(bcast); - SET_COLL(barrier); + std::string selector_name = xbt_cfg_get_string("smpi/coll-selector"); + if (selector_name.empty()) + selector_name = "default"; + + std::string name; + + SET_COLL(gather); + SET_COLL(allgather); + SET_COLL(allgatherv); + SET_COLL(allreduce); + SET_COLL(alltoall); + SET_COLL(alltoallv); + SET_COLL(reduce); + SET_COLL(reduce_scatter); + SET_COLL(scatter); + SET_COLL(bcast); + SET_COLL(barrier); } diff --git a/src/smpi/colls/smpi_default_selector.cpp b/src/smpi/colls/smpi_default_selector.cpp index f218a4efcb..f48c4bfe80 100644 --- a/src/smpi/colls/smpi_default_selector.cpp +++ b/src/smpi/colls/smpi_default_selector.cpp @@ -6,7 +6,7 @@ /* 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 "colls_private.h" +#include "colls_private.hpp" #include "smpi_process.hpp" namespace simgrid{ diff --git a/src/smpi/colls/smpi_intel_mpi_selector.cpp b/src/smpi/colls/smpi_intel_mpi_selector.cpp index 6bec031ed8..8c6630bf31 100644 --- a/src/smpi/colls/smpi_intel_mpi_selector.cpp +++ b/src/smpi/colls/smpi_intel_mpi_selector.cpp @@ -6,7 +6,7 @@ /* 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 "colls_private.h" +#include "colls_private.hpp" // This selector is based on information gathered on the Stampede cluster, with Intel MPI 4.1.3.049, and from the intel reference manual. The data was gathered launching runs with 1,2,4,8,16 processes per node. @@ -14,21 +14,21 @@ #define INTEL_MAX_NB_NUMPROCS 12 #define INTEL_MAX_NB_PPN 5 /* 1 2 4 8 16 ppn */ -typedef struct { +struct intel_tuning_table_size_element { unsigned int max_size; int algo; -} intel_tuning_table_size_element; +}; -typedef struct { +struct intel_tuning_table_numproc_element { int max_num_proc; int num_elems; intel_tuning_table_size_element elems[INTEL_MAX_NB_THRESHOLDS]; -} intel_tuning_table_numproc_element; +}; -typedef struct { +struct intel_tuning_table_element { int ppn; intel_tuning_table_numproc_element elems[INTEL_MAX_NB_NUMPROCS]; -} intel_tuning_table_element; +}; /* I_MPI_ADJUST_ALLREDUCE diff --git a/src/smpi/colls/smpi_mpich_selector.cpp b/src/smpi/colls/smpi_mpich_selector.cpp index b5a0858c6e..758a9e43ff 100644 --- a/src/smpi/colls/smpi_mpich_selector.cpp +++ b/src/smpi/colls/smpi_mpich_selector.cpp @@ -6,7 +6,7 @@ /* 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 "colls_private.h" +#include "colls_private.hpp" /* This is the default implementation of allreduce. The algorithm is: diff --git a/src/smpi/colls/smpi_mvapich2_selector.cpp b/src/smpi/colls/smpi_mvapich2_selector.cpp index 1d6978c3a1..2d60cf160f 100644 --- a/src/smpi/colls/smpi_mvapich2_selector.cpp +++ b/src/smpi/colls/smpi_mvapich2_selector.cpp @@ -6,9 +6,9 @@ /* 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 "colls_private.h" +#include "colls_private.hpp" -#include "smpi_mvapich2_selector_stampede.h" +#include "smpi_mvapich2_selector_stampede.hpp" namespace simgrid{ namespace smpi{ @@ -795,7 +795,7 @@ int Coll_reduce_scatter_mvapich2::reduce_scatter(void *sendbuf, void *recvbuf, i int range = 0; int range_threshold = 0; int is_commutative = 0; - int *disps = static_cast(xbt_malloc(comm_size * sizeof (int))); + int* disps = new int[comm_size]; if(mv2_red_scat_thresholds_table==NULL) init_mv2_reduce_scatter_tables_stampede(); @@ -853,7 +853,7 @@ int Coll_reduce_scatter_mvapich2::reduce_scatter(void *sendbuf, void *recvbuf, i recvcnts, datatype, op, comm); } - xbt_free(disps); + delete[] disps; return mpi_errno; } @@ -998,28 +998,27 @@ int Coll_scatter_mvapich2::scatter(void *sendbuf, void smpi_coll_cleanup_mvapich2() { - int i = 0; if (mv2_alltoall_thresholds_table) - xbt_free(mv2_alltoall_thresholds_table[i]); - xbt_free(mv2_alltoall_thresholds_table); - xbt_free(mv2_size_alltoall_tuning_table); - xbt_free(mv2_alltoall_table_ppn_conf); + delete[] mv2_alltoall_thresholds_table[0]; + delete[] mv2_alltoall_thresholds_table; + delete[] mv2_size_alltoall_tuning_table; + delete[] mv2_alltoall_table_ppn_conf; - xbt_free(mv2_gather_thresholds_table); + delete[] mv2_gather_thresholds_table; if (mv2_allgather_thresholds_table) - xbt_free(mv2_allgather_thresholds_table[0]); - xbt_free(mv2_size_allgather_tuning_table); - xbt_free(mv2_allgather_table_ppn_conf); - xbt_free(mv2_allgather_thresholds_table); - - xbt_free(mv2_allgatherv_thresholds_table); - xbt_free(mv2_reduce_thresholds_table); - xbt_free(mv2_red_scat_thresholds_table); - xbt_free(mv2_allreduce_thresholds_table); - xbt_free(mv2_bcast_thresholds_table); + delete[] mv2_allgather_thresholds_table[0]; + delete[] mv2_size_allgather_tuning_table; + delete[] mv2_allgather_table_ppn_conf; + delete[] mv2_allgather_thresholds_table; + + delete[] mv2_allgatherv_thresholds_table; + delete[] mv2_reduce_thresholds_table; + delete[] mv2_red_scat_thresholds_table; + delete[] mv2_allreduce_thresholds_table; + delete[] mv2_bcast_thresholds_table; if (mv2_scatter_thresholds_table) - xbt_free(mv2_scatter_thresholds_table[0]); - xbt_free(mv2_scatter_thresholds_table); - xbt_free(mv2_size_scatter_tuning_table); - xbt_free(mv2_scatter_table_ppn_conf); + delete[] mv2_scatter_thresholds_table[0]; + delete[] mv2_scatter_thresholds_table; + delete[] mv2_size_scatter_tuning_table; + delete[] mv2_scatter_table_ppn_conf; } diff --git a/src/smpi/colls/smpi_mvapich2_selector_stampede.h b/src/smpi/colls/smpi_mvapich2_selector_stampede.h deleted file mode 100644 index ca81613bf4..0000000000 --- a/src/smpi/colls/smpi_mvapich2_selector_stampede.h +++ /dev/null @@ -1,1987 +0,0 @@ -/* selector for collective algorithms based on mvapich decision logic, with calibration from Stampede cluster at TACC*/ -/* This is the tuning used by MVAPICH for Stampede platform based on (MV2_ARCH_INTEL_XEON_E5_2680_16, MV2_HCA_MLX_CX_FDR) */ - -/* Copyright (c) 2009-2017. 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. */ - -/************ Alltoall variables and initializers */ - -#define MV2_MAX_NB_THRESHOLDS 32 - - -XBT_PUBLIC(void) smpi_coll_cleanup_mvapich2(void); - -typedef struct { - int min; - int max; - int (*MV2_pt_Alltoall_function) (void *sendbuf, int sendcount, MPI_Datatype sendtype, - void *recvbuf, int recvcount, MPI_Datatype recvtype, - MPI_Comm comm_ptr ); -} mv2_alltoall_tuning_element; - -typedef struct { - int numproc; - int size_table; - mv2_alltoall_tuning_element algo_table[MV2_MAX_NB_THRESHOLDS]; - mv2_alltoall_tuning_element in_place_algo_table[MV2_MAX_NB_THRESHOLDS]; -} mv2_alltoall_tuning_table; - -int (*MV2_Alltoall_function) (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm_ptr)=NULL; - -/* Indicates number of processes per node */ -int *mv2_alltoall_table_ppn_conf = NULL; -/* Indicates total number of configurations */ -int mv2_alltoall_num_ppn_conf = 1; -int *mv2_size_alltoall_tuning_table = NULL; -mv2_alltoall_tuning_table **mv2_alltoall_thresholds_table = NULL; - - -#define MPIR_Alltoall_bruck_MV2 simgrid::smpi::Coll_alltoall_bruck::alltoall -#define MPIR_Alltoall_RD_MV2 simgrid::smpi::Coll_alltoall_rdb::alltoall -#define MPIR_Alltoall_Scatter_dest_MV2 simgrid::smpi::Coll_alltoall_mvapich2_scatter_dest::alltoall -#define MPIR_Alltoall_pairwise_MV2 simgrid::smpi::Coll_alltoall_pair::alltoall -#define MPIR_Alltoall_inplace_MV2 simgrid::smpi::Coll_alltoall_ring::alltoall - - -static void init_mv2_alltoall_tables_stampede(){ - int i; - int agg_table_sum = 0; - mv2_alltoall_tuning_table **table_ptrs = NULL; - mv2_alltoall_num_ppn_conf = 3; - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - mv2_alltoall_thresholds_table = static_cast(xbt_malloc(sizeof(mv2_alltoall_tuning_table *) - * mv2_alltoall_num_ppn_conf)); - table_ptrs = static_cast(xbt_malloc(sizeof(mv2_alltoall_tuning_table *) - * mv2_alltoall_num_ppn_conf)); - mv2_size_alltoall_tuning_table = static_cast(xbt_malloc(sizeof(int) * - mv2_alltoall_num_ppn_conf)); - mv2_alltoall_table_ppn_conf = static_cast(xbt_malloc(mv2_alltoall_num_ppn_conf * sizeof(int))); - mv2_alltoall_table_ppn_conf[0] = 1; - mv2_size_alltoall_tuning_table[0] = 6; - mv2_alltoall_tuning_table mv2_tmp_alltoall_thresholds_table_1ppn[] = { - {2, - 1, - {{0, -1, &MPIR_Alltoall_pairwise_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {4, - 2, - {{0, 262144, &MPIR_Alltoall_Scatter_dest_MV2}, - {262144, -1, &MPIR_Alltoall_pairwise_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {8, - 2, - {{0, 8, &MPIR_Alltoall_RD_MV2}, - {8, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {16, - 3, - {{0, 64, &MPIR_Alltoall_RD_MV2}, - {64, 512, &MPIR_Alltoall_bruck_MV2}, - {512, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0,-1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {32, - 3, - {{0, 32, &MPIR_Alltoall_RD_MV2}, - {32, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {64, - 3, - {{0, 8, &MPIR_Alltoall_RD_MV2}, - {8, 1024, &MPIR_Alltoall_bruck_MV2}, - {1024, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - }; - table_ptrs[0] = mv2_tmp_alltoall_thresholds_table_1ppn; - mv2_alltoall_table_ppn_conf[1] = 2; - mv2_size_alltoall_tuning_table[1] = 6; - mv2_alltoall_tuning_table mv2_tmp_alltoall_thresholds_table_2ppn[] = { - {4, - 2, - {{0, 32, &MPIR_Alltoall_RD_MV2}, - {32, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {8, - 2, - {{0, 64, &MPIR_Alltoall_RD_MV2}, - {64, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {16, - 3, - {{0, 64, &MPIR_Alltoall_RD_MV2}, - {64, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0,-1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {32, - 3, - {{0, 16, &MPIR_Alltoall_RD_MV2}, - {16, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {64, - 3, - {{0, 8, &MPIR_Alltoall_RD_MV2}, - {8, 1024, &MPIR_Alltoall_bruck_MV2}, - {1024, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {128, - 3, - {{0, 4, &MPIR_Alltoall_RD_MV2}, - {4, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{0, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - }; - table_ptrs[1] = mv2_tmp_alltoall_thresholds_table_2ppn; - mv2_alltoall_table_ppn_conf[2] = 16; - mv2_size_alltoall_tuning_table[2] = 7; - mv2_alltoall_tuning_table mv2_tmp_alltoall_thresholds_table_16ppn[] = { - {16, - 2, - {{0, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{32768, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {32, - 2, - {{0, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, - }, - - {{16384, -1, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {64, - 3, - {{0, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, 16384, &MPIR_Alltoall_Scatter_dest_MV2}, - {16384, -1, &MPIR_Alltoall_pairwise_MV2}, - }, - - {{32768, 131072, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {128, - 2, - {{0, 2048, &MPIR_Alltoall_bruck_MV2}, - {2048, -1, &MPIR_Alltoall_pairwise_MV2}, - }, - - {{16384,65536, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {256, - 2, - {{0, 1024, &MPIR_Alltoall_bruck_MV2}, - {1024, -1, &MPIR_Alltoall_pairwise_MV2}, - }, - - {{16384, 65536, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - {512, - 2, - {{0, 1024, &MPIR_Alltoall_bruck_MV2}, - {1024, -1, &MPIR_Alltoall_pairwise_MV2}, - }, - - {{16384, 65536, &MPIR_Alltoall_inplace_MV2}, - }, - }, - {1024, - 2, - {{0, 1024, &MPIR_Alltoall_bruck_MV2}, - {1024, -1, &MPIR_Alltoall_pairwise_MV2}, - }, - - {{16384, 65536, &MPIR_Alltoall_inplace_MV2}, - }, - }, - - }; - table_ptrs[2] = mv2_tmp_alltoall_thresholds_table_16ppn; - agg_table_sum = 0; - for (i = 0; i < mv2_alltoall_num_ppn_conf; i++) { - agg_table_sum += mv2_size_alltoall_tuning_table[i]; - } - mv2_alltoall_thresholds_table[0] = - static_cast(xbt_malloc(agg_table_sum * sizeof (mv2_alltoall_tuning_table))); - memcpy(mv2_alltoall_thresholds_table[0], table_ptrs[0], - (sizeof(mv2_alltoall_tuning_table) - * mv2_size_alltoall_tuning_table[0])); - for (i = 1; i < mv2_alltoall_num_ppn_conf; i++) { - mv2_alltoall_thresholds_table[i] = - mv2_alltoall_thresholds_table[i - 1] - + mv2_size_alltoall_tuning_table[i - 1]; - memcpy(mv2_alltoall_thresholds_table[i], table_ptrs[i], - (sizeof(mv2_alltoall_tuning_table) - * mv2_size_alltoall_tuning_table[i])); - } - xbt_free(table_ptrs); - - -} - - -/************ Allgather variables and initializers */ - -typedef struct { - int min; - int max; - int (*MV2_pt_Allgatherction)(void *sendbuf, - int sendcount, - MPI_Datatype sendtype, - void *recvbuf, - int recvcount, - MPI_Datatype recvtype, MPI_Comm comm_ptr); -} mv2_allgather_tuning_element; - -typedef struct { - int numproc; - int two_level[MV2_MAX_NB_THRESHOLDS]; - int size_inter_table; - mv2_allgather_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; -} mv2_allgather_tuning_table; - -int (*MV2_Allgatherction)(void *sendbuf, - int sendcount, - MPI_Datatype sendtype, - void *recvbuf, - int recvcount, - MPI_Datatype recvtype, MPI_Comm comm); - -int *mv2_allgather_table_ppn_conf = NULL; -int mv2_allgather_num_ppn_conf = 1; -int *mv2_size_allgather_tuning_table = NULL; -mv2_allgather_tuning_table **mv2_allgather_thresholds_table = NULL; - -static int MPIR_Allgather_RD_Allgather_Comm_MV2( void *sendbuf, - int sendcount, - MPI_Datatype sendtype, - void *recvbuf, - int recvcount, - MPI_Datatype recvtype, MPI_Comm comm_ptr) -{ - return 0; -} - -#define MPIR_Allgather_Bruck_MV2 simgrid::smpi::Coll_allgather_bruck::allgather -#define MPIR_Allgather_RD_MV2 simgrid::smpi::Coll_allgather_rdb::allgather -#define MPIR_Allgather_Ring_MV2 simgrid::smpi::Coll_allgather_ring::allgather -#define MPIR_2lvl_Allgather_MV2 simgrid::smpi::Coll_allgather_mvapich2_smp::allgather - -static void init_mv2_allgather_tables_stampede(){ - int i; - int agg_table_sum = 0; - - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - mv2_allgather_tuning_table **table_ptrs = NULL; - mv2_allgather_num_ppn_conf = 3; - mv2_allgather_thresholds_table - = static_cast(xbt_malloc(sizeof(mv2_allgather_tuning_table *) - * mv2_allgather_num_ppn_conf)); - table_ptrs = static_cast(xbt_malloc(sizeof(mv2_allgather_tuning_table *) - * mv2_allgather_num_ppn_conf)); - mv2_size_allgather_tuning_table = static_cast(xbt_malloc(sizeof(int) * - mv2_allgather_num_ppn_conf)); - mv2_allgather_table_ppn_conf - = static_cast(xbt_malloc(mv2_allgather_num_ppn_conf * sizeof(int))); - mv2_allgather_table_ppn_conf[0] = 1; - mv2_size_allgather_tuning_table[0] = 6; - mv2_allgather_tuning_table mv2_tmp_allgather_thresholds_table_1ppn[] = { - { - 2, - {0}, - 1, - { - {0, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 4, - {0,0}, - 2, - { - {0, 262144, &MPIR_Allgather_RD_MV2}, - {262144, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 8, - {0,0}, - 2, - { - {0, 131072, &MPIR_Allgather_RD_MV2}, - {131072, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 16, - {0,0}, - 2, - { - {0, 131072, &MPIR_Allgather_RD_MV2}, - {131072, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 32, - {0,0}, - 2, - { - {0, 65536, &MPIR_Allgather_RD_MV2}, - {65536, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 64, - {0,0}, - 2, - { - {0, 32768, &MPIR_Allgather_RD_MV2}, - {32768, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - }; - table_ptrs[0] = mv2_tmp_allgather_thresholds_table_1ppn; - mv2_allgather_table_ppn_conf[1] = 2; - mv2_size_allgather_tuning_table[1] = 6; - mv2_allgather_tuning_table mv2_tmp_allgather_thresholds_table_2ppn[] = { - { - 4, - {0,0}, - 2, - { - {0, 524288, &MPIR_Allgather_RD_MV2}, - {524288, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 8, - {0,1,0}, - 2, - { - {0, 32768, &MPIR_Allgather_RD_MV2}, - {32768, 524288, &MPIR_Allgather_Ring_MV2}, - {524288, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 16, - {0,1,0}, - 2, - { - {0, 16384, &MPIR_Allgather_RD_MV2}, - {16384, 524288, &MPIR_Allgather_Ring_MV2}, - {524288, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 32, - {1,1,0}, - 2, - { - {0, 65536, &MPIR_Allgather_RD_MV2}, - {65536, 524288, &MPIR_Allgather_Ring_MV2}, - {524288, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 64, - {1,1,0}, - 2, - { - {0, 32768, &MPIR_Allgather_RD_MV2}, - {32768, 524288, &MPIR_Allgather_Ring_MV2}, - {524288, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 128, - {1,1,0}, - 2, - { - {0, 65536, &MPIR_Allgather_RD_MV2}, - {65536, 524288, &MPIR_Allgather_Ring_MV2}, - {524288, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - }; - table_ptrs[1] = mv2_tmp_allgather_thresholds_table_2ppn; - mv2_allgather_table_ppn_conf[2] = 16; - mv2_size_allgather_tuning_table[2] = 6; - mv2_allgather_tuning_table mv2_tmp_allgather_thresholds_table_16ppn[] = { - { - 16, - {0,0}, - 2, - { - {0, 1024, &MPIR_Allgather_RD_MV2}, - {1024, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 32, - {0,0}, - 2, - { - {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, - {1024, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 64, - {0,0}, - 2, - { - {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, - {1024, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 128, - {0,0}, - 2, - { - {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, - {1024, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 256, - {0,0}, - 2, - { - {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, - {1024, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - { - 512, - {0,0}, - 2, - { - {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, - {1024, -1, &MPIR_Allgather_Ring_MV2}, - }, - }, - - }; - table_ptrs[2] = mv2_tmp_allgather_thresholds_table_16ppn; - agg_table_sum = 0; - for (i = 0; i < mv2_allgather_num_ppn_conf; i++) { - agg_table_sum += mv2_size_allgather_tuning_table[i]; - } - mv2_allgather_thresholds_table[0] = - static_cast(xbt_malloc(agg_table_sum * sizeof (mv2_allgather_tuning_table))); - memcpy(mv2_allgather_thresholds_table[0], table_ptrs[0], - (sizeof(mv2_allgather_tuning_table) - * mv2_size_allgather_tuning_table[0])); - for (i = 1; i < mv2_allgather_num_ppn_conf; i++) { - mv2_allgather_thresholds_table[i] = - mv2_allgather_thresholds_table[i - 1] - + mv2_size_allgather_tuning_table[i - 1]; - memcpy(mv2_allgather_thresholds_table[i], table_ptrs[i], - (sizeof(mv2_allgather_tuning_table) - * mv2_size_allgather_tuning_table[i])); - } - xbt_free(table_ptrs); -} - - -/************ Gather variables and initializers */ - -typedef struct { - int min; - int max; - int (*MV2_pt_Gather_function)(void *sendbuf, int sendcnt, - MPI_Datatype sendtype, void *recvbuf, int recvcnt, - MPI_Datatype recvtype, int root, MPI_Comm comm_ptr); -} mv2_gather_tuning_element; - - -typedef struct { - int numproc; - int size_inter_table; - mv2_gather_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; - int size_intra_table; - mv2_gather_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; -} mv2_gather_tuning_table; - -int mv2_size_gather_tuning_table=7; -mv2_gather_tuning_table * mv2_gather_thresholds_table=NULL; - -typedef int (*MV2_Gather_function_ptr) (void *sendbuf, - int sendcnt, - MPI_Datatype sendtype, - void *recvbuf, - int recvcnt, - MPI_Datatype recvtype, - int root, MPI_Comm comm); - -MV2_Gather_function_ptr MV2_Gather_inter_leader_function = NULL; -MV2_Gather_function_ptr MV2_Gather_intra_node_function = NULL; - - - -#define MPIR_Gather_MV2_Direct simgrid::smpi::Coll_gather_ompi_basic_linear::gather -#define MPIR_Gather_MV2_two_level_Direct simgrid::smpi::Coll_gather_mvapich2_two_level::gather -#define MPIR_Gather_intra simgrid::smpi::Coll_gather_mpich::gather - - -static void init_mv2_gather_tables_stampede(){ - - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - mv2_size_gather_tuning_table=7; - mv2_gather_thresholds_table = static_cast(xbt_malloc(mv2_size_gather_tuning_table* - sizeof (mv2_gather_tuning_table))); - mv2_gather_tuning_table mv2_tmp_gather_thresholds_table[]={ - {16, - 2,{{0, 524288, &MPIR_Gather_MV2_Direct}, - {524288, -1, &MPIR_Gather_intra}}, - 1,{{0, -1, &MPIR_Gather_MV2_Direct}}}, - {32, - 3,{{0, 16384, &MPIR_Gather_MV2_Direct}, - {16384, 131072, &MPIR_Gather_intra}, - {131072, -1, &MPIR_Gather_MV2_two_level_Direct}}, - 1,{{0, -1, &MPIR_Gather_intra}}}, - {64, - 3,{{0, 256, &MPIR_Gather_MV2_two_level_Direct}, - {256, 16384, &MPIR_Gather_MV2_Direct}, - {256, -1, &MPIR_Gather_MV2_two_level_Direct}}, - 1,{{0, -1, &MPIR_Gather_intra}}}, - {128, - 3,{{0, 512, &MPIR_Gather_MV2_two_level_Direct}, - {512, 16384, &MPIR_Gather_MV2_Direct}, - {16384, -1, &MPIR_Gather_MV2_two_level_Direct}}, - 1,{{0, -1, &MPIR_Gather_intra}}}, - {256, - 3,{{0, 512, &MPIR_Gather_MV2_two_level_Direct}, - {512, 16384, &MPIR_Gather_MV2_Direct}, - {16384, -1, &MPIR_Gather_MV2_two_level_Direct}}, - 1,{{0, -1, &MPIR_Gather_intra}}}, - {512, - 3,{{0, 512, &MPIR_Gather_MV2_two_level_Direct}, - {512, 16384, &MPIR_Gather_MV2_Direct}, - {8196, -1, &MPIR_Gather_MV2_two_level_Direct}}, - 1,{{0, -1, &MPIR_Gather_intra}}}, - {1024, - 3,{{0, 512, &MPIR_Gather_MV2_two_level_Direct}, - {512, 16384, &MPIR_Gather_MV2_Direct}, - {8196, -1, &MPIR_Gather_MV2_two_level_Direct}}, - 1,{{0, -1, &MPIR_Gather_intra}}}, - }; - - memcpy(mv2_gather_thresholds_table, mv2_tmp_gather_thresholds_table, - mv2_size_gather_tuning_table * sizeof (mv2_gather_tuning_table)); - -} - - -/************ Allgatherv variables and initializers */ - -typedef struct { - int min; - int max; - int (*MV2_pt_Allgatherv_function)(void *sendbuf, - int sendcount, - MPI_Datatype sendtype, - void *recvbuf, - int *recvcounts, - int *displs, - MPI_Datatype recvtype, - MPI_Comm commg); -} mv2_allgatherv_tuning_element; - -typedef struct { - int numproc; - int size_inter_table; - mv2_allgatherv_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; -} mv2_allgatherv_tuning_table; - -int (*MV2_Allgatherv_function)(void *sendbuf, - int sendcount, - MPI_Datatype sendtype, - void *recvbuf, - int *recvcounts, - int *displs, - MPI_Datatype recvtype, - MPI_Comm comm); - -int mv2_size_allgatherv_tuning_table = 0; -mv2_allgatherv_tuning_table *mv2_allgatherv_thresholds_table = NULL; - -#define MPIR_Allgatherv_Rec_Doubling_MV2 simgrid::smpi::Coll_allgatherv_mpich_rdb::allgatherv -#define MPIR_Allgatherv_Bruck_MV2 simgrid::smpi::Coll_allgatherv_ompi_bruck::allgatherv -#define MPIR_Allgatherv_Ring_MV2 simgrid::smpi::Coll_allgatherv_mpich_ring::allgatherv - - -static void init_mv2_allgatherv_tables_stampede(){ - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - mv2_size_allgatherv_tuning_table = 6; - mv2_allgatherv_thresholds_table = static_cast(xbt_malloc(mv2_size_allgatherv_tuning_table * - sizeof (mv2_allgatherv_tuning_table))); - mv2_allgatherv_tuning_table mv2_tmp_allgatherv_thresholds_table[] = { - { - 16, - 2, - { - {0, 512, &MPIR_Allgatherv_Rec_Doubling_MV2}, - {512, -1, &MPIR_Allgatherv_Ring_MV2}, - }, - }, - { - 32, - 2, - { - {0, 512, &MPIR_Allgatherv_Rec_Doubling_MV2}, - {512, -1, &MPIR_Allgatherv_Ring_MV2}, - }, - }, - { - 64, - 2, - { - {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, - {256, -1, &MPIR_Allgatherv_Ring_MV2}, - }, - }, - { - 128, - 2, - { - {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, - {256, -1, &MPIR_Allgatherv_Ring_MV2}, - }, - }, - { - 256, - 2, - { - {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, - {256, -1, &MPIR_Allgatherv_Ring_MV2}, - }, - }, - { - 512, - 2, - { - {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, - {256, -1, &MPIR_Allgatherv_Ring_MV2}, - }, - }, - - }; - memcpy(mv2_allgatherv_thresholds_table, mv2_tmp_allgatherv_thresholds_table, - mv2_size_allgatherv_tuning_table * sizeof (mv2_allgatherv_tuning_table)); -} - - -/************ Allreduce variables and initializers */ - -typedef struct { - int min; - int max; - int (*MV2_pt_Allreducection)(void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm); -} mv2_allreduce_tuning_element; - -typedef struct { - int numproc; - int mcast_enabled; - int is_two_level_allreduce[MV2_MAX_NB_THRESHOLDS]; - int size_inter_table; - mv2_allreduce_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; - int size_intra_table; - mv2_allreduce_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; -} mv2_allreduce_tuning_table; - - -int (*MV2_Allreducection)(void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm)=NULL; - - -int (*MV2_Allreduce_intra_function)( void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm)=NULL; - -int mv2_size_allreduce_tuning_table = 0; -mv2_allreduce_tuning_table *mv2_allreduce_thresholds_table = NULL; - - - - - -static int MPIR_Allreduce_mcst_reduce_two_level_helper_MV2( void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm) -{ - return 0; -} - -static int MPIR_Allreduce_mcst_reduce_redscat_gather_MV2( void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm) -{ - return 0; -} - -static int MPIR_Allreduce_reduce_p2p_MV2( void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm) -{ - simgrid::smpi::Colls::reduce(sendbuf,recvbuf,count,datatype,op,0,comm); - return MPI_SUCCESS; -} - -static int MPIR_Allreduce_reduce_shmem_MV2( void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm) -{ - simgrid::smpi::Colls::reduce(sendbuf,recvbuf,count,datatype,op,0,comm); - return MPI_SUCCESS; -} - -#define MPIR_Allreduce_pt2pt_rd_MV2 simgrid::smpi::Coll_allreduce_rdb::allreduce -#define MPIR_Allreduce_pt2pt_rs_MV2 simgrid::smpi::Coll_allreduce_mvapich2_rs::allreduce -#define MPIR_Allreduce_two_level_MV2 simgrid::smpi::Coll_allreduce_mvapich2_two_level::allreduce - - -static void init_mv2_allreduce_tables_stampede(){ - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - mv2_size_allreduce_tuning_table = 8; - mv2_allreduce_thresholds_table = static_cast(xbt_malloc(mv2_size_allreduce_tuning_table * - sizeof (mv2_allreduce_tuning_table))); - mv2_allreduce_tuning_table mv2_tmp_allreduce_thresholds_table[] = { - { - 16, - 0, - {1, 0}, - 2, - { - {0, 1024, &MPIR_Allreduce_pt2pt_rd_MV2}, - {1024, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 1024, &MPIR_Allreduce_reduce_shmem_MV2}, - {1024, -1, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - { - 32, - 0, - {1, 1, 0}, - 3, - { - {0, 1024, &MPIR_Allreduce_pt2pt_rd_MV2}, - {1024, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, - {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 1024, &MPIR_Allreduce_reduce_shmem_MV2}, - {1024, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - { - 64, - 0, - {1, 1, 0}, - 3, - { - {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, - {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, - {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, - {512, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - { - 128, - 0, - {1, 1, 0}, - 3, - { - {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, - {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, - {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, - {512, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - { - 256, - 0, - {1, 1, 0}, - 3, - { - {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, - {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, - {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, - {512, -1, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - { - 512, - 0, - {1, 1, 0}, - 3, - { - {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, - {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, - {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, - {512, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - { - 1024, - 0, - {1, 1, 1, 0}, - 4, - { - {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, - {512, 8192, &MPIR_Allreduce_pt2pt_rd_MV2}, - {8192, 65536, &MPIR_Allreduce_pt2pt_rs_MV2}, - {65536, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, - {512, -1, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - { - 2048, - 0, - {1, 1, 1, 0}, - 4, - { - {0, 64, &MPIR_Allreduce_pt2pt_rd_MV2}, - {64, 512, &MPIR_Allreduce_reduce_p2p_MV2}, - {512, 4096, &MPIR_Allreduce_mcst_reduce_two_level_helper_MV2}, - {4096, 16384, &MPIR_Allreduce_pt2pt_rs_MV2}, - {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, - }, - 2, - { - {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, - {512, -1, &MPIR_Allreduce_reduce_p2p_MV2}, - }, - }, - - }; - memcpy(mv2_allreduce_thresholds_table, mv2_tmp_allreduce_thresholds_table, - mv2_size_allreduce_tuning_table * sizeof (mv2_allreduce_tuning_table)); -} - - - - -typedef struct { - int min; - int max; - int (*MV2_pt_Bcast_function) (void *buf, int count, MPI_Datatype datatype, - int root, MPI_Comm comm_ptr); - int zcpy_pipelined_knomial_factor; -} mv2_bcast_tuning_element; - -typedef struct { - int numproc; - int bcast_segment_size; - int intra_node_knomial_factor; - int inter_node_knomial_factor; - int is_two_level_bcast[MV2_MAX_NB_THRESHOLDS]; - int size_inter_table; - mv2_bcast_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; - int size_intra_table; - mv2_bcast_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; -} mv2_bcast_tuning_table; - -int mv2_size_bcast_tuning_table = 0; -mv2_bcast_tuning_table *mv2_bcast_thresholds_table = NULL; - - -int (*MV2_Bcast_function) (void *buffer, int count, MPI_Datatype datatype, - int root, MPI_Comm comm_ptr) = NULL; - -int (*MV2_Bcast_intra_node_function) (void *buffer, int count, MPI_Datatype datatype, - int root, MPI_Comm comm_ptr) = NULL; - -int zcpy_knomial_factor = 2; -int mv2_pipelined_zcpy_knomial_factor = -1; -int bcast_segment_size = 8192; -int mv2_inter_node_knomial_factor = 4; -int mv2_intra_node_knomial_factor = 4; -#define mv2_bcast_two_level_system_size 64 -#define mv2_bcast_short_msg 16384 -#define mv2_bcast_large_msg 512*1024 - -#define INTRA_NODE_ROOT 0 - -#define MPIR_Pipelined_Bcast_Zcpy_MV2 simgrid::smpi::Coll_bcast_mpich::bcast -#define MPIR_Pipelined_Bcast_MV2 simgrid::smpi::Coll_bcast_mpich::bcast -#define MPIR_Bcast_binomial_MV2 simgrid::smpi::Coll_bcast_binomial_tree::bcast -#define MPIR_Bcast_scatter_ring_allgather_shm_MV2 simgrid::smpi::Coll_bcast_scatter_LR_allgather::bcast -#define MPIR_Bcast_scatter_doubling_allgather_MV2 simgrid::smpi::Coll_bcast_scatter_rdb_allgather::bcast -#define MPIR_Bcast_scatter_ring_allgather_MV2 simgrid::smpi::Coll_bcast_scatter_LR_allgather::bcast -#define MPIR_Shmem_Bcast_MV2 simgrid::smpi::Coll_bcast_mpich::bcast -#define MPIR_Bcast_tune_inter_node_helper_MV2 simgrid::smpi::Coll_bcast_mvapich2_inter_node::bcast -#define MPIR_Bcast_inter_node_helper_MV2 simgrid::smpi::Coll_bcast_mvapich2_inter_node::bcast -#define MPIR_Knomial_Bcast_intra_node_MV2 simgrid::smpi::Coll_bcast_mvapich2_knomial_intra_node::bcast -#define MPIR_Bcast_intra_MV2 simgrid::smpi::Coll_bcast_mvapich2_intra_node::bcast - -static void init_mv2_bcast_tables_stampede(){ - //Stampede, - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - mv2_size_bcast_tuning_table=8; - mv2_bcast_thresholds_table = static_cast(xbt_malloc(mv2_size_bcast_tuning_table * - sizeof (mv2_bcast_tuning_table))); - - mv2_bcast_tuning_table mv2_tmp_bcast_thresholds_table[]={ - { - 16, - 8192, 4, 4, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - 11, - { - {0, 8, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {8, 16, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {16, 1024, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {1024, 8192, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {8192, 16384, &MPIR_Bcast_binomial_MV2, -1}, - {16384, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {32768, 65536, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {65536, 131072, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}, - {131072, 262144, &MPIR_Bcast_scatter_ring_allgather_MV2, -1}, - {262144, 524288, &MPIR_Bcast_scatter_doubling_allgather_MV2, -1}, - {524288, -1, &MPIR_Bcast_scatter_ring_allgather_MV2, -1} - }, - 11, - { - {0, 8, &MPIR_Shmem_Bcast_MV2, 2}, - {8, 16, &MPIR_Shmem_Bcast_MV2, 4}, - {16, 1024, &MPIR_Shmem_Bcast_MV2, 2}, - {1024, 8192, &MPIR_Shmem_Bcast_MV2, 4}, - {8192, 16384, &MPIR_Shmem_Bcast_MV2, -1}, - {16384, 32768, &MPIR_Shmem_Bcast_MV2, 4}, - {32768, 65536, &MPIR_Shmem_Bcast_MV2, 2}, - {65536, 131072, &MPIR_Shmem_Bcast_MV2, -1}, - {131072, 262144, &MPIR_Shmem_Bcast_MV2, -1}, - {262144, 524288, &MPIR_Shmem_Bcast_MV2, -1}, - {524288, -1, &MPIR_Shmem_Bcast_MV2, -1} - } - }, - { - 32, - 8192, 4, 4, - {1, 1, 1, 1, 1, 1, 1, 1}, - 8, - { - {0, 128, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {128, 256, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {256, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {32768, 65536, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {65536, 131072, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {131072, 262144, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {262144, 524288, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {524288, -1, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8} - }, - 8, - { - {0, 128, &MPIR_Shmem_Bcast_MV2, 2}, - {128, 256, &MPIR_Shmem_Bcast_MV2, 4}, - {256, 32768, &MPIR_Shmem_Bcast_MV2, 2}, - {32768, 65536, &MPIR_Shmem_Bcast_MV2, 4}, - {65536, 131072, &MPIR_Shmem_Bcast_MV2, 2}, - {131072, 262144, &MPIR_Shmem_Bcast_MV2, 8}, - {262144, 524288, &MPIR_Shmem_Bcast_MV2, 2}, - {524288, -1, &MPIR_Shmem_Bcast_MV2, 8} - } - }, - { - 64, - 8192, 4, 4, - {1, 1, 1, 1, 1, 1, 1, 1, 1}, - 9, - { - {0, 2, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {2, 4, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {4, 16, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {16, 32, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {32, 128, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {128, 256, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {256, 4096, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {4096, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {32768, -1, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2} - }, - 9, - { - {0, 2, &MPIR_Shmem_Bcast_MV2, 4}, - {2, 4, &MPIR_Shmem_Bcast_MV2, 8}, - {4, 16, &MPIR_Shmem_Bcast_MV2, 4}, - {16, 32, &MPIR_Shmem_Bcast_MV2, 8}, - {32, 128, &MPIR_Shmem_Bcast_MV2, 4}, - {128, 256, &MPIR_Shmem_Bcast_MV2, 8}, - {256, 4096, &MPIR_Shmem_Bcast_MV2, 4}, - {4096, 32768, &MPIR_Shmem_Bcast_MV2, 8}, - {32768, -1, &MPIR_Shmem_Bcast_MV2, 2} - } - }, - { - 128, - 8192, 4, 4, - {1, 1, 1, 0}, - 4, - { - {0, 8192, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {8192, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {16384, 524288, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {524288, -1, &MPIR_Bcast_scatter_ring_allgather_MV2, -1} - }, - 4, - { - {0, 8192, &MPIR_Shmem_Bcast_MV2, 8}, - {8192, 16384, &MPIR_Shmem_Bcast_MV2, 4}, - {16384, 524288, &MPIR_Shmem_Bcast_MV2, 2}, - {524288, -1, NULL, -1} - } - }, - { - 256, - 8192, 4, 4, - {1, 1, 1, 1, 1}, - 5, - { - {0, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {16384, 131072, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {131072, 262144, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}, - {262144, 524288, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {524288, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1} - }, - 5, - { - {0, 16384, &MPIR_Shmem_Bcast_MV2, 4}, - {16384, 131072, &MPIR_Shmem_Bcast_MV2, 2}, - {131072, 262144, &MPIR_Shmem_Bcast_MV2, -1}, - {262144, 524288, &MPIR_Shmem_Bcast_MV2, 2}, - {524288, -1, &MPIR_Shmem_Bcast_MV2, -1} - } - }, - { - 512, - 8192, 4, 4, - {1, 1, 1, 1, 1}, - 5, - { - {0, 4096, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {4096, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {16384, 131072, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {131072, 262144, &MPIR_Pipelined_Bcast_MV2, -1}, - {262144, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1} - }, - 5, - { - {0, 4096, &MPIR_Shmem_Bcast_MV2, 8}, - {4096, 16384, &MPIR_Shmem_Bcast_MV2, 4}, - {16384, 131072, &MPIR_Shmem_Bcast_MV2, 2}, - {131072, 262144, &MPIR_Shmem_Bcast_MV2, -1}, - {262144, -1, &MPIR_Shmem_Bcast_MV2, -1} - } - }, - { - 1024, - 8192, 4, 4, - {1, 1, 1, 1, 1}, - 5, - { - {0, 8192, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {8192, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {16384, 65536, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {65536, 524288, &MPIR_Pipelined_Bcast_MV2, -1}, - {524288, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1} - }, - 5, - { - {0, 8192, &MPIR_Shmem_Bcast_MV2, 8}, - {8192, 16384, &MPIR_Shmem_Bcast_MV2, 4}, - {16384, 65536, &MPIR_Shmem_Bcast_MV2, 2}, - {65536, 524288, &MPIR_Shmem_Bcast_MV2, -1}, - {524288, -1, &MPIR_Shmem_Bcast_MV2, -1} - } - }, - { - 2048, - 8192, 4, 4, - {1, 1, 1, 1, 1, 1, 1}, - 7, - { - {0, 16, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {16, 32, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {32, 4096, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, - {4096, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, - {16384, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, - {32768, 524288, &MPIR_Pipelined_Bcast_MV2, -1}, - {524288, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1} - }, - 7, - { - {0, 16, &MPIR_Shmem_Bcast_MV2, 8}, - {16, 32, &MPIR_Shmem_Bcast_MV2, 4}, - {32, 4096, &MPIR_Shmem_Bcast_MV2, 8}, - {4096, 16384, &MPIR_Shmem_Bcast_MV2, 4}, - {16384, 32768, &MPIR_Shmem_Bcast_MV2, 2}, - {32768, 524288, &MPIR_Shmem_Bcast_MV2, -1}, - {524288, -1, &MPIR_Shmem_Bcast_MV2, -1} - } - } - }; - - memcpy(mv2_bcast_thresholds_table, mv2_tmp_bcast_thresholds_table, - mv2_size_bcast_tuning_table * sizeof (mv2_bcast_tuning_table)); -} - - -/************ Reduce variables and initializers */ - -typedef struct { - int min; - int max; - int (*MV2_pt_Reduce_function)(void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, - int root, - MPI_Comm comm_ptr); -} mv2_reduce_tuning_element; - -typedef struct { - int numproc; - int inter_k_degree; - int intra_k_degree; - int is_two_level_reduce[MV2_MAX_NB_THRESHOLDS]; - int size_inter_table; - mv2_reduce_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; - int size_intra_table; - mv2_reduce_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; -} mv2_reduce_tuning_table; - -int mv2_size_reduce_tuning_table = 0; -mv2_reduce_tuning_table *mv2_reduce_thresholds_table = NULL; - - -int mv2_reduce_intra_knomial_factor = -1; -int mv2_reduce_inter_knomial_factor = -1; - -int (*MV2_Reduce_function)( void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, - int root, - MPI_Comm comm_ptr)=NULL; - -int (*MV2_Reduce_intra_function)( void *sendbuf, - void *recvbuf, - int count, - MPI_Datatype datatype, - MPI_Op op, - int root, - MPI_Comm comm_ptr)=NULL; - - -#define MPIR_Reduce_inter_knomial_wrapper_MV2 simgrid::smpi::Coll_reduce_mvapich2_knomial::reduce -#define MPIR_Reduce_intra_knomial_wrapper_MV2 simgrid::smpi::Coll_reduce_mvapich2_knomial::reduce -#define MPIR_Reduce_binomial_MV2 simgrid::smpi::Coll_reduce_binomial::reduce -#define MPIR_Reduce_redscat_gather_MV2 simgrid::smpi::Coll_reduce_scatter_gather::reduce -#define MPIR_Reduce_shmem_MV2 simgrid::smpi::Coll_reduce_ompi_basic_linear::reduce -#define MPIR_Reduce_two_level_helper_MV2 simgrid::smpi::Coll_reduce_mvapich2_two_level::reduce - - -static void init_mv2_reduce_tables_stampede(){ - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - /*Stampede*/ - mv2_size_reduce_tuning_table = 8; - mv2_reduce_thresholds_table = static_cast(xbt_malloc(mv2_size_reduce_tuning_table * - sizeof (mv2_reduce_tuning_table))); - mv2_reduce_tuning_table mv2_tmp_reduce_thresholds_table[] = { - { - 16, - 4, - 4, - {1, 0, 0}, - 3, - { - {0, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {262144, 1048576, &MPIR_Reduce_binomial_MV2}, - {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, - }, - 2, - { - {0, 65536, &MPIR_Reduce_shmem_MV2}, - {65536,-1, &MPIR_Reduce_binomial_MV2}, - }, - }, - { - 32, - 4, - 4, - {1, 1, 1, 1, 0, 0, 0}, - 7, - { - {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {16384, 32768, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {32768, 65536, &MPIR_Reduce_binomial_MV2}, - {65536, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {262144, 1048576, &MPIR_Reduce_binomial_MV2}, - {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, - }, - 6, - { - {0, 8192, &MPIR_Reduce_shmem_MV2}, - {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {16384, 32768, &MPIR_Reduce_shmem_MV2}, - {32768, 65536, &MPIR_Reduce_shmem_MV2}, - {65536, 262144, &MPIR_Reduce_shmem_MV2}, - {262144,-1, &MPIR_Reduce_binomial_MV2}, - }, - }, - { - 64, - 4, - 4, - {1, 1, 1, 1, 0}, - 5, - { - {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_binomial_MV2}, - {65536, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {262144, -1, &MPIR_Reduce_redscat_gather_MV2}, - }, - 5, - { - {0, 8192, &MPIR_Reduce_shmem_MV2}, - {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_shmem_MV2}, - {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {262144, -1, &MPIR_Reduce_binomial_MV2}, - }, - }, - { - 128, - 4, - 4, - {1, 0, 1, 0, 1, 0}, - 6, - { - {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_binomial_MV2}, - {65536, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {262144, 1048576, &MPIR_Reduce_binomial_MV2}, - {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, - }, - 5, - { - {0, 8192, &MPIR_Reduce_shmem_MV2}, - {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_shmem_MV2}, - {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {262144, -1, &MPIR_Reduce_binomial_MV2}, - }, - }, - { - 256, - 4, - 4, - {1, 1, 1, 0, 1, 1, 0}, - 7, - { - {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {16384, 32768, &MPIR_Reduce_binomial_MV2}, - {32768, 65536, &MPIR_Reduce_binomial_MV2}, - {65536, 262144, &MPIR_Reduce_binomial_MV2}, - {262144, 1048576, &MPIR_Reduce_binomial_MV2}, - {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, - }, - 6, - { - {0, 8192, &MPIR_Reduce_shmem_MV2}, - {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {16384, 32768, &MPIR_Reduce_shmem_MV2}, - {32768, 65536, &MPIR_Reduce_shmem_MV2}, - {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {262144, -1, &MPIR_Reduce_binomial_MV2}, - }, - }, - { - 512, - 4, - 4, - {1, 0, 1, 1, 1, 0}, - 6, - { - {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_binomial_MV2}, - {65536, 262144, &MPIR_Reduce_binomial_MV2}, - {262144, 1048576, &MPIR_Reduce_binomial_MV2}, - {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, - }, - 5, - { - {0, 8192, &MPIR_Reduce_shmem_MV2}, - {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_shmem_MV2}, - {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {262144, -1, &MPIR_Reduce_binomial_MV2}, - }, - }, - { - 1024, - 4, - 4, - {1, 0, 1, 1, 1}, - 5, - { - {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_binomial_MV2}, - {65536, 262144, &MPIR_Reduce_binomial_MV2}, - {262144, -1, &MPIR_Reduce_binomial_MV2}, - }, - 5, - { - {0, 8192, &MPIR_Reduce_shmem_MV2}, - {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {16384, 65536, &MPIR_Reduce_shmem_MV2}, - {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {262144, -1, &MPIR_Reduce_binomial_MV2}, - }, - }, - { - 2048, - 4, - 4, - {1, 0, 1, 1, 1,1}, - 6, - { - {0, 2048, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {2048, 4096, &MPIR_Reduce_inter_knomial_wrapper_MV2}, - {4096, 16384, &MPIR_Reduce_binomial_MV2}, - {16384, 65536, &MPIR_Reduce_binomial_MV2}, - {65536, 131072, &MPIR_Reduce_binomial_MV2}, - {131072, -1, &MPIR_Reduce_binomial_MV2}, - }, - 6, - { - {0, 2048, &MPIR_Reduce_shmem_MV2}, - {2048, 4096, &MPIR_Reduce_shmem_MV2}, - {4096, 16384, &MPIR_Reduce_shmem_MV2}, - {16384, 65536, &MPIR_Reduce_intra_knomial_wrapper_MV2}, - {65536, 131072, &MPIR_Reduce_binomial_MV2}, - {131072, -1, &MPIR_Reduce_shmem_MV2}, - }, - }, - - }; - memcpy(mv2_reduce_thresholds_table, mv2_tmp_reduce_thresholds_table, - mv2_size_reduce_tuning_table * sizeof (mv2_reduce_tuning_table)); -} - -/************ Reduce scatter variables and initializers */ - -typedef struct { - int min; - int max; - int (*MV2_pt_Red_scat_function)(void *sendbuf, - void *recvbuf, - int *recvcnts, - MPI_Datatype datatype, - MPI_Op op, - MPI_Comm comm_ptr); -} mv2_red_scat_tuning_element; - -typedef struct { - int numproc; - int size_inter_table; - mv2_red_scat_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; -} mv2_red_scat_tuning_table; - -int mv2_size_red_scat_tuning_table = 0; -mv2_red_scat_tuning_table *mv2_red_scat_thresholds_table = NULL; - - -int (*MV2_Red_scat_function)(void *sendbuf, - void *recvbuf, - int *recvcnts, - MPI_Datatype datatype, - MPI_Op op, - MPI_Comm comm_ptr); - - - -static int MPIR_Reduce_Scatter_Basic_MV2(void *sendbuf, - void *recvbuf, - int *recvcnts, - MPI_Datatype datatype, - MPI_Op op, - MPI_Comm comm) -{ - simgrid::smpi::Coll_reduce_scatter_default::reduce_scatter(sendbuf,recvbuf,recvcnts,datatype,op,comm); - return MPI_SUCCESS; -} -#define MPIR_Reduce_scatter_non_comm_MV2 simgrid::smpi::Coll_reduce_scatter_mpich_noncomm::reduce_scatter -#define MPIR_Reduce_scatter_Rec_Halving_MV2 simgrid::smpi::Coll_reduce_scatter_ompi_basic_recursivehalving::reduce_scatter -#define MPIR_Reduce_scatter_Pair_Wise_MV2 simgrid::smpi::Coll_reduce_scatter_mpich_pair::reduce_scatter - - - - -static void init_mv2_reduce_scatter_tables_stampede(){ - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - mv2_size_red_scat_tuning_table = 6; - mv2_red_scat_thresholds_table = static_cast(xbt_malloc(mv2_size_red_scat_tuning_table * - sizeof (mv2_red_scat_tuning_table))); - mv2_red_scat_tuning_table mv2_tmp_red_scat_thresholds_table[] = { - { - 16, - 3, - { - {0, 64, &MPIR_Reduce_Scatter_Basic_MV2}, - {64, 65536, &MPIR_Reduce_scatter_Rec_Halving_MV2}, - {65536, -1, &MPIR_Reduce_scatter_Pair_Wise_MV2}, - }, - }, - { - 32, - 3, - { - {0, 64, &MPIR_Reduce_Scatter_Basic_MV2}, - {64, 131072, &MPIR_Reduce_scatter_Rec_Halving_MV2}, - {131072, -1, &MPIR_Reduce_scatter_Pair_Wise_MV2}, - }, - }, - { - 64, - 3, - { - {0, 1024, &MPIR_Reduce_Scatter_Basic_MV2}, - {1024, 262144, &MPIR_Reduce_scatter_Rec_Halving_MV2}, - {262144, -1, &MPIR_Reduce_scatter_Pair_Wise_MV2}, - }, - }, - { - 128, - 2, - { - {0, 128, &MPIR_Reduce_Scatter_Basic_MV2}, - {128, -1, &MPIR_Reduce_scatter_Rec_Halving_MV2}, - }, - }, - { - 256, - 2, - { - {0, 128, &MPIR_Reduce_Scatter_Basic_MV2}, - {128, -1, &MPIR_Reduce_scatter_Rec_Halving_MV2}, - }, - }, - { - 512, - 2, - { - {0, 256, &MPIR_Reduce_Scatter_Basic_MV2}, - {256, -1, &MPIR_Reduce_scatter_Rec_Halving_MV2}, - }, - }, - - }; - memcpy(mv2_red_scat_thresholds_table, mv2_tmp_red_scat_thresholds_table, - mv2_size_red_scat_tuning_table * sizeof (mv2_red_scat_tuning_table)); -} - -/************ Scatter variables and initializers */ - -typedef struct { - int min; - int max; - int (*MV2_pt_Scatter_function)(void *sendbuf, - int sendcnt, - MPI_Datatype sendtype, - void *recvbuf, - int recvcnt, - MPI_Datatype recvtype, - int root, MPI_Comm comm); -} mv2_scatter_tuning_element; - -typedef struct { - int numproc; - int size_inter_table; - mv2_scatter_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; - int size_intra_table; - mv2_scatter_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; -} mv2_scatter_tuning_table; - - -int *mv2_scatter_table_ppn_conf = NULL; -int mv2_scatter_num_ppn_conf = 1; -int *mv2_size_scatter_tuning_table = NULL; -mv2_scatter_tuning_table **mv2_scatter_thresholds_table = NULL; - -int (*MV2_Scatter_function) (void *sendbuf, int sendcount, MPI_Datatype sendtype, - void *recvbuf, int recvcount, MPI_Datatype recvtype, - int root, MPI_Comm comm)=NULL; - -int (*MV2_Scatter_intra_function) (void *sendbuf, int sendcount, MPI_Datatype sendtype, - void *recvbuf, int recvcount, MPI_Datatype recvtype, - int root, MPI_Comm comm)=NULL; -int MPIR_Scatter_mcst_wrap_MV2(void *sendbuf, - int sendcnt, - MPI_Datatype sendtype, - void *recvbuf, - int recvcnt, - MPI_Datatype recvtype, - int root, MPI_Comm comm_ptr); - -int MPIR_Scatter_mcst_wrap_MV2(void *sendbuf, - int sendcnt, - MPI_Datatype sendtype, - void *recvbuf, - int recvcnt, - MPI_Datatype recvtype, - int root, MPI_Comm comm_ptr) -{ - return 0; -} - -#define MPIR_Scatter_MV2_Binomial simgrid::smpi::Coll_scatter_ompi_binomial::scatter -#define MPIR_Scatter_MV2_Direct simgrid::smpi::Coll_scatter_ompi_basic_linear::scatter -#define MPIR_Scatter_MV2_two_level_Binomial simgrid::smpi::Coll_scatter_mvapich2_two_level_binomial::scatter -#define MPIR_Scatter_MV2_two_level_Direct simgrid::smpi::Coll_scatter_mvapich2_two_level_direct::scatter - - - - -static void init_mv2_scatter_tables_stampede(){ - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback==NULL) - simgrid::smpi::Colls::smpi_coll_cleanup_callback=&smpi_coll_cleanup_mvapich2; - - int agg_table_sum = 0; - int i; - mv2_scatter_tuning_table **table_ptrs = NULL; - mv2_scatter_num_ppn_conf = 3; - mv2_scatter_thresholds_table - = static_cast(xbt_malloc(sizeof(mv2_scatter_tuning_table *) - * mv2_scatter_num_ppn_conf)); - table_ptrs = static_cast(xbt_malloc(sizeof(mv2_scatter_tuning_table *) - * mv2_scatter_num_ppn_conf)); - mv2_size_scatter_tuning_table = static_cast(xbt_malloc(sizeof(int) * - mv2_scatter_num_ppn_conf)); - mv2_scatter_table_ppn_conf - = static_cast(xbt_malloc(mv2_scatter_num_ppn_conf * sizeof(int))); - mv2_scatter_table_ppn_conf[0] = 1; - mv2_size_scatter_tuning_table[0] = 6; - mv2_scatter_tuning_table mv2_tmp_scatter_thresholds_table_1ppn[] = { - {2, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - - {4, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - {8, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - {16, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - {32, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - {64, - 2, - { - {0, 32, &MPIR_Scatter_MV2_Binomial}, - {32, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - }; - table_ptrs[0] = mv2_tmp_scatter_thresholds_table_1ppn; - mv2_scatter_table_ppn_conf[1] = 2; - mv2_size_scatter_tuning_table[1] = 6; - mv2_scatter_tuning_table mv2_tmp_scatter_thresholds_table_2ppn[] = { - {4, - 2, - { - {0, 4096, &MPIR_Scatter_MV2_Binomial}, - {4096, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - {8, - 2, - { - {0, 512, &MPIR_Scatter_MV2_two_level_Direct}, - {512, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - - {16, - 2, - { - {0, 2048, &MPIR_Scatter_MV2_two_level_Direct}, - {2048, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - - {32, - 2, - { - {0, 2048, &MPIR_Scatter_MV2_two_level_Direct}, - {2048, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - - {64, - 2, - { - {0, 8192, &MPIR_Scatter_MV2_two_level_Direct}, - {8192, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - - {128, - 4, - { - {0, 16, &MPIR_Scatter_MV2_Binomial}, - {16, 128, &MPIR_Scatter_MV2_two_level_Binomial}, - {128, 16384, &MPIR_Scatter_MV2_two_level_Direct}, - {16384, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - {0, 128, &MPIR_Scatter_MV2_Direct}, - {128, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - }; - table_ptrs[1] = mv2_tmp_scatter_thresholds_table_2ppn; - mv2_scatter_table_ppn_conf[2] = 16; - mv2_size_scatter_tuning_table[2] = 8; - mv2_scatter_tuning_table mv2_tmp_scatter_thresholds_table_16ppn[] = { - { - 16, - 2, - { - {0, 256, &MPIR_Scatter_MV2_Binomial}, - {256, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - { 0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - { - 32, - 2, - { - {0, 512, &MPIR_Scatter_MV2_Binomial}, - {512, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - { 0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - { - 64, - 2, - { - {0, 1024, &MPIR_Scatter_MV2_two_level_Direct}, - {1024, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - { 0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - { - 128, - 4, - { - {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, - {0, 16, &MPIR_Scatter_MV2_two_level_Direct}, - {16, 2048, &MPIR_Scatter_MV2_two_level_Direct}, - {2048, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - { 0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - { - 256, - 4, - { - {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, - {0, 16, &MPIR_Scatter_MV2_two_level_Direct}, - {16, 2048, &MPIR_Scatter_MV2_two_level_Direct}, - {2048, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - { 0, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - - { - 512, - 4, - { - {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, - {16, 16, &MPIR_Scatter_MV2_two_level_Direct}, - {16, 4096, &MPIR_Scatter_MV2_two_level_Direct}, - {4096, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - { 0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - { - 1024, - 5, - { - {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, - {0, 16, &MPIR_Scatter_MV2_Binomial}, - {16, 32, &MPIR_Scatter_MV2_Binomial}, - {32, 4096, &MPIR_Scatter_MV2_two_level_Direct}, - {4096, -1, &MPIR_Scatter_MV2_Direct}, - }, - 1, - { - { 0, -1, &MPIR_Scatter_MV2_Binomial}, - }, - }, - { - 2048, - 7, - { - {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, - {0, 16, &MPIR_Scatter_MV2_two_level_Binomial}, - {16, 128, &MPIR_Scatter_MV2_two_level_Binomial}, - {128, 1024, &MPIR_Scatter_MV2_two_level_Direct}, - {1024, 16384, &MPIR_Scatter_MV2_two_level_Direct}, - {16384, 65536, &MPIR_Scatter_MV2_Direct}, - {65536, -1, &MPIR_Scatter_MV2_two_level_Direct}, - }, - 6, - { - {0, 16, &MPIR_Scatter_MV2_Binomial}, - {16, 128, &MPIR_Scatter_MV2_Binomial}, - {128, 1024, &MPIR_Scatter_MV2_Binomial}, - {1024, 16384, &MPIR_Scatter_MV2_Direct}, - {16384, 65536, &MPIR_Scatter_MV2_Direct}, - {65536, -1, &MPIR_Scatter_MV2_Direct}, - }, - }, - }; - table_ptrs[2] = mv2_tmp_scatter_thresholds_table_16ppn; - agg_table_sum = 0; - for (i = 0; i < mv2_scatter_num_ppn_conf; i++) { - agg_table_sum += mv2_size_scatter_tuning_table[i]; - } - mv2_scatter_thresholds_table[0] = - static_cast(xbt_malloc(agg_table_sum * sizeof (mv2_scatter_tuning_table))); - memcpy(mv2_scatter_thresholds_table[0], table_ptrs[0], - (sizeof(mv2_scatter_tuning_table) - * mv2_size_scatter_tuning_table[0])); - for (i = 1; i < mv2_scatter_num_ppn_conf; i++) { - mv2_scatter_thresholds_table[i] = - mv2_scatter_thresholds_table[i - 1] - + mv2_size_scatter_tuning_table[i - 1]; - memcpy(mv2_scatter_thresholds_table[i], table_ptrs[i], - (sizeof(mv2_scatter_tuning_table) - * mv2_size_scatter_tuning_table[i])); - } - xbt_free(table_ptrs); - -} - diff --git a/src/smpi/colls/smpi_mvapich2_selector_stampede.hpp b/src/smpi/colls/smpi_mvapich2_selector_stampede.hpp new file mode 100644 index 0000000000..24cdf97b2a --- /dev/null +++ b/src/smpi/colls/smpi_mvapich2_selector_stampede.hpp @@ -0,0 +1,1815 @@ +/* selector for collective algorithms based on mvapich decision logic, with calibration from Stampede cluster at TACC*/ +/* This is the tuning used by MVAPICH for Stampede platform based on (MV2_ARCH_INTEL_XEON_E5_2680_16, + * MV2_HCA_MLX_CX_FDR) */ + +/* Copyright (c) 2009-2017. 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. */ + +/************ Alltoall variables and initializers */ + +#ifndef SMPI_MVAPICH2_SELECTOR_STAMPEDE_HPP +#define SMPI_MVAPICH2_SELECTOR_STAMPEDE_HPP + +#include + +#define MV2_MAX_NB_THRESHOLDS 32 + +XBT_PUBLIC(void) smpi_coll_cleanup_mvapich2(void); + +struct mv2_alltoall_tuning_element { + int min; + int max; + int (*MV2_pt_Alltoall_function)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, + MPI_Datatype recvtype, MPI_Comm comm_ptr); +}; + +struct mv2_alltoall_tuning_table { + int numproc; + int size_table; + mv2_alltoall_tuning_element algo_table[MV2_MAX_NB_THRESHOLDS]; + mv2_alltoall_tuning_element in_place_algo_table[MV2_MAX_NB_THRESHOLDS]; +}; + +int (*MV2_Alltoall_function)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, + MPI_Datatype recvtype, MPI_Comm comm_ptr) = NULL; + +/* Indicates number of processes per node */ +int* mv2_alltoall_table_ppn_conf = NULL; +/* Indicates total number of configurations */ +int mv2_alltoall_num_ppn_conf = 1; +int* mv2_size_alltoall_tuning_table = NULL; +mv2_alltoall_tuning_table** mv2_alltoall_thresholds_table = NULL; + +#define MPIR_Alltoall_bruck_MV2 simgrid::smpi::Coll_alltoall_bruck::alltoall +#define MPIR_Alltoall_RD_MV2 simgrid::smpi::Coll_alltoall_rdb::alltoall +#define MPIR_Alltoall_Scatter_dest_MV2 simgrid::smpi::Coll_alltoall_mvapich2_scatter_dest::alltoall +#define MPIR_Alltoall_pairwise_MV2 simgrid::smpi::Coll_alltoall_pair::alltoall +#define MPIR_Alltoall_inplace_MV2 simgrid::smpi::Coll_alltoall_ring::alltoall + +static void init_mv2_alltoall_tables_stampede() +{ + int agg_table_sum = 0; + mv2_alltoall_tuning_table** table_ptrs = NULL; + mv2_alltoall_num_ppn_conf = 3; + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + mv2_alltoall_thresholds_table = new mv2_alltoall_tuning_table*[mv2_alltoall_num_ppn_conf]; + table_ptrs = new mv2_alltoall_tuning_table*[mv2_alltoall_num_ppn_conf]; + mv2_size_alltoall_tuning_table = new int[mv2_alltoall_num_ppn_conf]; + mv2_alltoall_table_ppn_conf = new int[mv2_alltoall_num_ppn_conf]; + mv2_alltoall_table_ppn_conf[0] = 1; + mv2_size_alltoall_tuning_table[0] = 6; + mv2_alltoall_tuning_table mv2_tmp_alltoall_thresholds_table_1ppn[] = { + { + 2, + 1, + { + {0, -1, &MPIR_Alltoall_pairwise_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 4, + 2, + { + {0, 262144, &MPIR_Alltoall_Scatter_dest_MV2}, {262144, -1, &MPIR_Alltoall_pairwise_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 8, + 2, + { + {0, 8, &MPIR_Alltoall_RD_MV2}, {8, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 16, + 3, + { + {0, 64, &MPIR_Alltoall_RD_MV2}, + {64, 512, &MPIR_Alltoall_bruck_MV2}, + {512, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 32, + 3, + { + {0, 32, &MPIR_Alltoall_RD_MV2}, + {32, 2048, &MPIR_Alltoall_bruck_MV2}, + {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 64, + 3, + { + {0, 8, &MPIR_Alltoall_RD_MV2}, + {8, 1024, &MPIR_Alltoall_bruck_MV2}, + {1024, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + }; + table_ptrs[0] = mv2_tmp_alltoall_thresholds_table_1ppn; + mv2_alltoall_table_ppn_conf[1] = 2; + mv2_size_alltoall_tuning_table[1] = 6; + mv2_alltoall_tuning_table mv2_tmp_alltoall_thresholds_table_2ppn[] = { + { + 4, + 2, + { + {0, 32, &MPIR_Alltoall_RD_MV2}, {32, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 8, + 2, + { + {0, 64, &MPIR_Alltoall_RD_MV2}, {64, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 16, + 3, + { + {0, 64, &MPIR_Alltoall_RD_MV2}, + {64, 2048, &MPIR_Alltoall_bruck_MV2}, + {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 32, + 3, + { + {0, 16, &MPIR_Alltoall_RD_MV2}, + {16, 2048, &MPIR_Alltoall_bruck_MV2}, + {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 64, + 3, + { + {0, 8, &MPIR_Alltoall_RD_MV2}, + {8, 1024, &MPIR_Alltoall_bruck_MV2}, + {1024, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 128, + 3, + { + {0, 4, &MPIR_Alltoall_RD_MV2}, + {4, 2048, &MPIR_Alltoall_bruck_MV2}, + {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {0, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + }; + table_ptrs[1] = mv2_tmp_alltoall_thresholds_table_2ppn; + mv2_alltoall_table_ppn_conf[2] = 16; + mv2_size_alltoall_tuning_table[2] = 7; + mv2_alltoall_tuning_table mv2_tmp_alltoall_thresholds_table_16ppn[] = { + { + 16, + 2, + { + {0, 2048, &MPIR_Alltoall_bruck_MV2}, {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {32768, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 32, + 2, + { + {0, 2048, &MPIR_Alltoall_bruck_MV2}, {2048, -1, &MPIR_Alltoall_Scatter_dest_MV2}, + }, + + { + {16384, -1, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 64, + 3, + { + {0, 2048, &MPIR_Alltoall_bruck_MV2}, + {2048, 16384, &MPIR_Alltoall_Scatter_dest_MV2}, + {16384, -1, &MPIR_Alltoall_pairwise_MV2}, + }, + + { + {32768, 131072, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 128, + 2, + { + {0, 2048, &MPIR_Alltoall_bruck_MV2}, {2048, -1, &MPIR_Alltoall_pairwise_MV2}, + }, + + { + {16384, 65536, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 256, + 2, + { + {0, 1024, &MPIR_Alltoall_bruck_MV2}, {1024, -1, &MPIR_Alltoall_pairwise_MV2}, + }, + + { + {16384, 65536, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + { + 512, + 2, + { + {0, 1024, &MPIR_Alltoall_bruck_MV2}, {1024, -1, &MPIR_Alltoall_pairwise_MV2}, + }, + + { + {16384, 65536, &MPIR_Alltoall_inplace_MV2}, + }, + }, + { + 1024, + 2, + { + {0, 1024, &MPIR_Alltoall_bruck_MV2}, {1024, -1, &MPIR_Alltoall_pairwise_MV2}, + }, + + { + {16384, 65536, &MPIR_Alltoall_inplace_MV2}, + }, + }, + + }; + table_ptrs[2] = mv2_tmp_alltoall_thresholds_table_16ppn; + agg_table_sum = 0; + for (int i = 0; i < mv2_alltoall_num_ppn_conf; i++) { + agg_table_sum += mv2_size_alltoall_tuning_table[i]; + } + mv2_alltoall_thresholds_table[0] = new mv2_alltoall_tuning_table[agg_table_sum]; + std::copy_n(table_ptrs[0], mv2_size_alltoall_tuning_table[0], mv2_alltoall_thresholds_table[0]); + for (int i = 1; i < mv2_alltoall_num_ppn_conf; i++) { + mv2_alltoall_thresholds_table[i] = mv2_alltoall_thresholds_table[i - 1] + mv2_size_alltoall_tuning_table[i - 1]; + std::copy_n(table_ptrs[i], mv2_size_alltoall_tuning_table[i], mv2_alltoall_thresholds_table[i]); + } + delete[] table_ptrs; +} + +/************ Allgather variables and initializers */ + +struct mv2_allgather_tuning_element { + int min; + int max; + int (*MV2_pt_Allgatherction)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, + MPI_Datatype recvtype, MPI_Comm comm_ptr); +}; + +struct mv2_allgather_tuning_table { + int numproc; + int two_level[MV2_MAX_NB_THRESHOLDS]; + int size_inter_table; + mv2_allgather_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; +}; + +int (*MV2_Allgatherction)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, + MPI_Datatype recvtype, MPI_Comm comm); + +int* mv2_allgather_table_ppn_conf = NULL; +int mv2_allgather_num_ppn_conf = 1; +int* mv2_size_allgather_tuning_table = NULL; +mv2_allgather_tuning_table** mv2_allgather_thresholds_table = NULL; + +static int MPIR_Allgather_RD_Allgather_Comm_MV2(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, + int recvcount, MPI_Datatype recvtype, MPI_Comm comm_ptr) +{ + return 0; +} + +#define MPIR_Allgather_Bruck_MV2 simgrid::smpi::Coll_allgather_bruck::allgather +#define MPIR_Allgather_RD_MV2 simgrid::smpi::Coll_allgather_rdb::allgather +#define MPIR_Allgather_Ring_MV2 simgrid::smpi::Coll_allgather_ring::allgather +#define MPIR_2lvl_Allgather_MV2 simgrid::smpi::Coll_allgather_mvapich2_smp::allgather + +static void init_mv2_allgather_tables_stampede() +{ + int agg_table_sum = 0; + + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + mv2_allgather_tuning_table** table_ptrs = NULL; + mv2_allgather_num_ppn_conf = 3; + mv2_allgather_thresholds_table = new mv2_allgather_tuning_table*[mv2_allgather_num_ppn_conf]; + table_ptrs = new mv2_allgather_tuning_table*[mv2_allgather_num_ppn_conf]; + mv2_size_allgather_tuning_table = new int[mv2_allgather_num_ppn_conf]; + mv2_allgather_table_ppn_conf = new int[mv2_allgather_num_ppn_conf]; + mv2_allgather_table_ppn_conf[0] = 1; + mv2_size_allgather_tuning_table[0] = 6; + mv2_allgather_tuning_table mv2_tmp_allgather_thresholds_table_1ppn[] = { + { + 2, + {0}, + 1, + { + {0, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 4, + {0, 0}, + 2, + { + {0, 262144, &MPIR_Allgather_RD_MV2}, {262144, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 8, + {0, 0}, + 2, + { + {0, 131072, &MPIR_Allgather_RD_MV2}, {131072, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 16, + {0, 0}, + 2, + { + {0, 131072, &MPIR_Allgather_RD_MV2}, {131072, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 32, + {0, 0}, + 2, + { + {0, 65536, &MPIR_Allgather_RD_MV2}, {65536, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 64, + {0, 0}, + 2, + { + {0, 32768, &MPIR_Allgather_RD_MV2}, {32768, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + }; + table_ptrs[0] = mv2_tmp_allgather_thresholds_table_1ppn; + mv2_allgather_table_ppn_conf[1] = 2; + mv2_size_allgather_tuning_table[1] = 6; + mv2_allgather_tuning_table mv2_tmp_allgather_thresholds_table_2ppn[] = { + { + 4, + {0, 0}, + 2, + { + {0, 524288, &MPIR_Allgather_RD_MV2}, {524288, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 8, + {0, 1, 0}, + 2, + { + {0, 32768, &MPIR_Allgather_RD_MV2}, + {32768, 524288, &MPIR_Allgather_Ring_MV2}, + {524288, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 16, + {0, 1, 0}, + 2, + { + {0, 16384, &MPIR_Allgather_RD_MV2}, + {16384, 524288, &MPIR_Allgather_Ring_MV2}, + {524288, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 32, + {1, 1, 0}, + 2, + { + {0, 65536, &MPIR_Allgather_RD_MV2}, + {65536, 524288, &MPIR_Allgather_Ring_MV2}, + {524288, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 64, + {1, 1, 0}, + 2, + { + {0, 32768, &MPIR_Allgather_RD_MV2}, + {32768, 524288, &MPIR_Allgather_Ring_MV2}, + {524288, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 128, + {1, 1, 0}, + 2, + { + {0, 65536, &MPIR_Allgather_RD_MV2}, + {65536, 524288, &MPIR_Allgather_Ring_MV2}, + {524288, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + }; + table_ptrs[1] = mv2_tmp_allgather_thresholds_table_2ppn; + mv2_allgather_table_ppn_conf[2] = 16; + mv2_size_allgather_tuning_table[2] = 6; + mv2_allgather_tuning_table mv2_tmp_allgather_thresholds_table_16ppn[] = { + { + 16, + {0, 0}, + 2, + { + {0, 1024, &MPIR_Allgather_RD_MV2}, {1024, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 32, + {0, 0}, + 2, + { + {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, {1024, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 64, + {0, 0}, + 2, + { + {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, {1024, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 128, + {0, 0}, + 2, + { + {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, {1024, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 256, + {0, 0}, + 2, + { + {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, {1024, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + { + 512, + {0, 0}, + 2, + { + {0, 1024, &MPIR_Allgather_RD_Allgather_Comm_MV2}, {1024, -1, &MPIR_Allgather_Ring_MV2}, + }, + }, + + }; + table_ptrs[2] = mv2_tmp_allgather_thresholds_table_16ppn; + agg_table_sum = 0; + for (int i = 0; i < mv2_allgather_num_ppn_conf; i++) { + agg_table_sum += mv2_size_allgather_tuning_table[i]; + } + mv2_allgather_thresholds_table[0] = new mv2_allgather_tuning_table[agg_table_sum]; + std::copy_n(table_ptrs[0], mv2_size_allgather_tuning_table[0], mv2_allgather_thresholds_table[0]); + for (int i = 1; i < mv2_allgather_num_ppn_conf; i++) { + mv2_allgather_thresholds_table[i] = mv2_allgather_thresholds_table[i - 1] + mv2_size_allgather_tuning_table[i - 1]; + std::copy_n(table_ptrs[i], mv2_size_allgather_tuning_table[i], mv2_allgather_thresholds_table[i]); + } + delete[] table_ptrs; +} + +/************ Gather variables and initializers */ + +struct mv2_gather_tuning_element { + int min; + int max; + int (*MV2_pt_Gather_function)(void* sendbuf, int sendcnt, MPI_Datatype sendtype, void* recvbuf, int recvcnt, + MPI_Datatype recvtype, int root, MPI_Comm comm_ptr); +}; + +struct mv2_gather_tuning_table { + int numproc; + int size_inter_table; + mv2_gather_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; + int size_intra_table; + mv2_gather_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; +}; + +int mv2_size_gather_tuning_table = 7; +mv2_gather_tuning_table* mv2_gather_thresholds_table = NULL; + +typedef int (*MV2_Gather_function_ptr)(void* sendbuf, int sendcnt, MPI_Datatype sendtype, void* recvbuf, int recvcnt, + MPI_Datatype recvtype, int root, MPI_Comm comm); + +MV2_Gather_function_ptr MV2_Gather_inter_leader_function = NULL; +MV2_Gather_function_ptr MV2_Gather_intra_node_function = NULL; + +#define MPIR_Gather_MV2_Direct simgrid::smpi::Coll_gather_ompi_basic_linear::gather +#define MPIR_Gather_MV2_two_level_Direct simgrid::smpi::Coll_gather_mvapich2_two_level::gather +#define MPIR_Gather_intra simgrid::smpi::Coll_gather_mpich::gather + +static void init_mv2_gather_tables_stampede() +{ + + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + mv2_size_gather_tuning_table = 7; + mv2_gather_thresholds_table = new mv2_gather_tuning_table[mv2_size_gather_tuning_table]; + mv2_gather_tuning_table mv2_tmp_gather_thresholds_table[] = { + {16, + 2, + {{0, 524288, &MPIR_Gather_MV2_Direct}, {524288, -1, &MPIR_Gather_intra}}, + 1, + {{0, -1, &MPIR_Gather_MV2_Direct}}}, + {32, + 3, + {{0, 16384, &MPIR_Gather_MV2_Direct}, + {16384, 131072, &MPIR_Gather_intra}, + {131072, -1, &MPIR_Gather_MV2_two_level_Direct}}, + 1, + {{0, -1, &MPIR_Gather_intra}}}, + {64, + 3, + {{0, 256, &MPIR_Gather_MV2_two_level_Direct}, + {256, 16384, &MPIR_Gather_MV2_Direct}, + {256, -1, &MPIR_Gather_MV2_two_level_Direct}}, + 1, + {{0, -1, &MPIR_Gather_intra}}}, + {128, + 3, + {{0, 512, &MPIR_Gather_MV2_two_level_Direct}, + {512, 16384, &MPIR_Gather_MV2_Direct}, + {16384, -1, &MPIR_Gather_MV2_two_level_Direct}}, + 1, + {{0, -1, &MPIR_Gather_intra}}}, + {256, + 3, + {{0, 512, &MPIR_Gather_MV2_two_level_Direct}, + {512, 16384, &MPIR_Gather_MV2_Direct}, + {16384, -1, &MPIR_Gather_MV2_two_level_Direct}}, + 1, + {{0, -1, &MPIR_Gather_intra}}}, + {512, + 3, + {{0, 512, &MPIR_Gather_MV2_two_level_Direct}, + {512, 16384, &MPIR_Gather_MV2_Direct}, + {8196, -1, &MPIR_Gather_MV2_two_level_Direct}}, + 1, + {{0, -1, &MPIR_Gather_intra}}}, + {1024, + 3, + {{0, 512, &MPIR_Gather_MV2_two_level_Direct}, + {512, 16384, &MPIR_Gather_MV2_Direct}, + {8196, -1, &MPIR_Gather_MV2_two_level_Direct}}, + 1, + {{0, -1, &MPIR_Gather_intra}}}, + }; + + std::copy_n(mv2_tmp_gather_thresholds_table, mv2_size_gather_tuning_table, mv2_gather_thresholds_table); +} + +/************ Allgatherv variables and initializers */ + +struct mv2_allgatherv_tuning_element { + int min; + int max; + int (*MV2_pt_Allgatherv_function)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int* recvcounts, + int* displs, MPI_Datatype recvtype, MPI_Comm commg); +}; + +struct mv2_allgatherv_tuning_table { + int numproc; + int size_inter_table; + mv2_allgatherv_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; +}; + +int (*MV2_Allgatherv_function)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int* recvcounts, + int* displs, MPI_Datatype recvtype, MPI_Comm comm); + +int mv2_size_allgatherv_tuning_table = 0; +mv2_allgatherv_tuning_table* mv2_allgatherv_thresholds_table = NULL; + +#define MPIR_Allgatherv_Rec_Doubling_MV2 simgrid::smpi::Coll_allgatherv_mpich_rdb::allgatherv +#define MPIR_Allgatherv_Bruck_MV2 simgrid::smpi::Coll_allgatherv_ompi_bruck::allgatherv +#define MPIR_Allgatherv_Ring_MV2 simgrid::smpi::Coll_allgatherv_mpich_ring::allgatherv + +static void init_mv2_allgatherv_tables_stampede() +{ + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + mv2_size_allgatherv_tuning_table = 6; + mv2_allgatherv_thresholds_table = new mv2_allgatherv_tuning_table[mv2_size_allgatherv_tuning_table]; + mv2_allgatherv_tuning_table mv2_tmp_allgatherv_thresholds_table[] = { + { + 16, + 2, + { + {0, 512, &MPIR_Allgatherv_Rec_Doubling_MV2}, {512, -1, &MPIR_Allgatherv_Ring_MV2}, + }, + }, + { + 32, + 2, + { + {0, 512, &MPIR_Allgatherv_Rec_Doubling_MV2}, {512, -1, &MPIR_Allgatherv_Ring_MV2}, + }, + }, + { + 64, + 2, + { + {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, {256, -1, &MPIR_Allgatherv_Ring_MV2}, + }, + }, + { + 128, + 2, + { + {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, {256, -1, &MPIR_Allgatherv_Ring_MV2}, + }, + }, + { + 256, + 2, + { + {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, {256, -1, &MPIR_Allgatherv_Ring_MV2}, + }, + }, + { + 512, + 2, + { + {0, 256, &MPIR_Allgatherv_Rec_Doubling_MV2}, {256, -1, &MPIR_Allgatherv_Ring_MV2}, + }, + }, + + }; + std::copy_n(mv2_tmp_allgatherv_thresholds_table, mv2_size_allgatherv_tuning_table, mv2_allgatherv_thresholds_table); +} + +/************ Allreduce variables and initializers */ + +struct mv2_allreduce_tuning_element { + int min; + int max; + int (*MV2_pt_Allreducection)(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm); +}; + +struct mv2_allreduce_tuning_table { + int numproc; + int mcast_enabled; + int is_two_level_allreduce[MV2_MAX_NB_THRESHOLDS]; + int size_inter_table; + mv2_allreduce_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; + int size_intra_table; + mv2_allreduce_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; +}; + +int (*MV2_Allreducection)(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm) = NULL; + +int (*MV2_Allreduce_intra_function)(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm) = NULL; + +int mv2_size_allreduce_tuning_table = 0; +mv2_allreduce_tuning_table* mv2_allreduce_thresholds_table = NULL; + +static int MPIR_Allreduce_mcst_reduce_two_level_helper_MV2(void* sendbuf, void* recvbuf, int count, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + return 0; +} + +static int MPIR_Allreduce_mcst_reduce_redscat_gather_MV2(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, + MPI_Op op, MPI_Comm comm) +{ + return 0; +} + +static int MPIR_Allreduce_reduce_p2p_MV2(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm) +{ + simgrid::smpi::Colls::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm); + return MPI_SUCCESS; +} + +static int MPIR_Allreduce_reduce_shmem_MV2(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm) +{ + simgrid::smpi::Colls::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm); + return MPI_SUCCESS; +} + +#define MPIR_Allreduce_pt2pt_rd_MV2 simgrid::smpi::Coll_allreduce_rdb::allreduce +#define MPIR_Allreduce_pt2pt_rs_MV2 simgrid::smpi::Coll_allreduce_mvapich2_rs::allreduce +#define MPIR_Allreduce_two_level_MV2 simgrid::smpi::Coll_allreduce_mvapich2_two_level::allreduce + +static void init_mv2_allreduce_tables_stampede() +{ + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + mv2_size_allreduce_tuning_table = 8; + mv2_allreduce_thresholds_table = new mv2_allreduce_tuning_table[mv2_size_allreduce_tuning_table]; + mv2_allreduce_tuning_table mv2_tmp_allreduce_thresholds_table[] = { + { + 16, + 0, + {1, 0}, + 2, + { + {0, 1024, &MPIR_Allreduce_pt2pt_rd_MV2}, {1024, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 1024, &MPIR_Allreduce_reduce_shmem_MV2}, {1024, -1, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + { + 32, + 0, + {1, 1, 0}, + 3, + { + {0, 1024, &MPIR_Allreduce_pt2pt_rd_MV2}, + {1024, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, + {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 1024, &MPIR_Allreduce_reduce_shmem_MV2}, {1024, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + { + 64, + 0, + {1, 1, 0}, + 3, + { + {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, + {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, + {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, {512, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + { + 128, + 0, + {1, 1, 0}, + 3, + { + {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, + {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, + {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, {512, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + { + 256, + 0, + {1, 1, 0}, + 3, + { + {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, + {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, + {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, {512, -1, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + { + 512, + 0, + {1, 1, 0}, + 3, + { + {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, + {512, 16384, &MPIR_Allreduce_pt2pt_rd_MV2}, + {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, {512, 16384, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + { + 1024, + 0, + {1, 1, 1, 0}, + 4, + { + {0, 512, &MPIR_Allreduce_pt2pt_rd_MV2}, + {512, 8192, &MPIR_Allreduce_pt2pt_rd_MV2}, + {8192, 65536, &MPIR_Allreduce_pt2pt_rs_MV2}, + {65536, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, {512, -1, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + { + 2048, + 0, + {1, 1, 1, 0}, + 4, + { + {0, 64, &MPIR_Allreduce_pt2pt_rd_MV2}, + {64, 512, &MPIR_Allreduce_reduce_p2p_MV2}, + {512, 4096, &MPIR_Allreduce_mcst_reduce_two_level_helper_MV2}, + {4096, 16384, &MPIR_Allreduce_pt2pt_rs_MV2}, + {16384, -1, &MPIR_Allreduce_pt2pt_rs_MV2}, + }, + 2, + { + {0, 512, &MPIR_Allreduce_reduce_shmem_MV2}, {512, -1, &MPIR_Allreduce_reduce_p2p_MV2}, + }, + }, + + }; + std::copy_n(mv2_tmp_allreduce_thresholds_table, mv2_size_allreduce_tuning_table, mv2_allreduce_thresholds_table); +} + +struct mv2_bcast_tuning_element { + int min; + int max; + int (*MV2_pt_Bcast_function)(void* buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm_ptr); + int zcpy_pipelined_knomial_factor; +}; + +struct mv2_bcast_tuning_table { + int numproc; + int bcast_segment_size; + int intra_node_knomial_factor; + int inter_node_knomial_factor; + int is_two_level_bcast[MV2_MAX_NB_THRESHOLDS]; + int size_inter_table; + mv2_bcast_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; + int size_intra_table; + mv2_bcast_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; +}; + +int mv2_size_bcast_tuning_table = 0; +mv2_bcast_tuning_table* mv2_bcast_thresholds_table = NULL; + +int (*MV2_Bcast_function)(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm_ptr) = NULL; + +int (*MV2_Bcast_intra_node_function)(void* buffer, int count, MPI_Datatype datatype, int root, + MPI_Comm comm_ptr) = NULL; + +int zcpy_knomial_factor = 2; +int mv2_pipelined_zcpy_knomial_factor = -1; +int bcast_segment_size = 8192; +int mv2_inter_node_knomial_factor = 4; +int mv2_intra_node_knomial_factor = 4; +#define mv2_bcast_two_level_system_size 64 +#define mv2_bcast_short_msg 16384 +#define mv2_bcast_large_msg 512 * 1024 + +#define INTRA_NODE_ROOT 0 + +#define MPIR_Pipelined_Bcast_Zcpy_MV2 simgrid::smpi::Coll_bcast_mpich::bcast +#define MPIR_Pipelined_Bcast_MV2 simgrid::smpi::Coll_bcast_mpich::bcast +#define MPIR_Bcast_binomial_MV2 simgrid::smpi::Coll_bcast_binomial_tree::bcast +#define MPIR_Bcast_scatter_ring_allgather_shm_MV2 simgrid::smpi::Coll_bcast_scatter_LR_allgather::bcast +#define MPIR_Bcast_scatter_doubling_allgather_MV2 simgrid::smpi::Coll_bcast_scatter_rdb_allgather::bcast +#define MPIR_Bcast_scatter_ring_allgather_MV2 simgrid::smpi::Coll_bcast_scatter_LR_allgather::bcast +#define MPIR_Shmem_Bcast_MV2 simgrid::smpi::Coll_bcast_mpich::bcast +#define MPIR_Bcast_tune_inter_node_helper_MV2 simgrid::smpi::Coll_bcast_mvapich2_inter_node::bcast +#define MPIR_Bcast_inter_node_helper_MV2 simgrid::smpi::Coll_bcast_mvapich2_inter_node::bcast +#define MPIR_Knomial_Bcast_intra_node_MV2 simgrid::smpi::Coll_bcast_mvapich2_knomial_intra_node::bcast +#define MPIR_Bcast_intra_MV2 simgrid::smpi::Coll_bcast_mvapich2_intra_node::bcast + +static void init_mv2_bcast_tables_stampede() +{ + // Stampede, + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + mv2_size_bcast_tuning_table = 8; + mv2_bcast_thresholds_table = new mv2_bcast_tuning_table[mv2_size_bcast_tuning_table]; + + mv2_bcast_tuning_table mv2_tmp_bcast_thresholds_table[] = { + {16, + 8192, + 4, + 4, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + 11, + {{0, 8, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {8, 16, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {16, 1024, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {1024, 8192, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {8192, 16384, &MPIR_Bcast_binomial_MV2, -1}, + {16384, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {32768, 65536, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {65536, 131072, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}, + {131072, 262144, &MPIR_Bcast_scatter_ring_allgather_MV2, -1}, + {262144, 524288, &MPIR_Bcast_scatter_doubling_allgather_MV2, -1}, + {524288, -1, &MPIR_Bcast_scatter_ring_allgather_MV2, -1}}, + 11, + {{0, 8, &MPIR_Shmem_Bcast_MV2, 2}, + {8, 16, &MPIR_Shmem_Bcast_MV2, 4}, + {16, 1024, &MPIR_Shmem_Bcast_MV2, 2}, + {1024, 8192, &MPIR_Shmem_Bcast_MV2, 4}, + {8192, 16384, &MPIR_Shmem_Bcast_MV2, -1}, + {16384, 32768, &MPIR_Shmem_Bcast_MV2, 4}, + {32768, 65536, &MPIR_Shmem_Bcast_MV2, 2}, + {65536, 131072, &MPIR_Shmem_Bcast_MV2, -1}, + {131072, 262144, &MPIR_Shmem_Bcast_MV2, -1}, + {262144, 524288, &MPIR_Shmem_Bcast_MV2, -1}, + {524288, -1, &MPIR_Shmem_Bcast_MV2, -1}}}, + {32, + 8192, + 4, + 4, + {1, 1, 1, 1, 1, 1, 1, 1}, + 8, + {{0, 128, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {128, 256, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {256, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {32768, 65536, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {65536, 131072, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {131072, 262144, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {262144, 524288, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {524288, -1, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}}, + 8, + {{0, 128, &MPIR_Shmem_Bcast_MV2, 2}, + {128, 256, &MPIR_Shmem_Bcast_MV2, 4}, + {256, 32768, &MPIR_Shmem_Bcast_MV2, 2}, + {32768, 65536, &MPIR_Shmem_Bcast_MV2, 4}, + {65536, 131072, &MPIR_Shmem_Bcast_MV2, 2}, + {131072, 262144, &MPIR_Shmem_Bcast_MV2, 8}, + {262144, 524288, &MPIR_Shmem_Bcast_MV2, 2}, + {524288, -1, &MPIR_Shmem_Bcast_MV2, 8}}}, + {64, + 8192, + 4, + 4, + {1, 1, 1, 1, 1, 1, 1, 1, 1}, + 9, + {{0, 2, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {2, 4, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {4, 16, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {16, 32, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {32, 128, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {128, 256, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {256, 4096, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {4096, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {32768, -1, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}}, + 9, + {{0, 2, &MPIR_Shmem_Bcast_MV2, 4}, + {2, 4, &MPIR_Shmem_Bcast_MV2, 8}, + {4, 16, &MPIR_Shmem_Bcast_MV2, 4}, + {16, 32, &MPIR_Shmem_Bcast_MV2, 8}, + {32, 128, &MPIR_Shmem_Bcast_MV2, 4}, + {128, 256, &MPIR_Shmem_Bcast_MV2, 8}, + {256, 4096, &MPIR_Shmem_Bcast_MV2, 4}, + {4096, 32768, &MPIR_Shmem_Bcast_MV2, 8}, + {32768, -1, &MPIR_Shmem_Bcast_MV2, 2}}}, + {128, + 8192, + 4, + 4, + {1, 1, 1, 0}, + 4, + {{0, 8192, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {8192, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {16384, 524288, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {524288, -1, &MPIR_Bcast_scatter_ring_allgather_MV2, -1}}, + 4, + {{0, 8192, &MPIR_Shmem_Bcast_MV2, 8}, + {8192, 16384, &MPIR_Shmem_Bcast_MV2, 4}, + {16384, 524288, &MPIR_Shmem_Bcast_MV2, 2}, + {524288, -1, NULL, -1}}}, + {256, + 8192, + 4, + 4, + {1, 1, 1, 1, 1}, + 5, + {{0, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {16384, 131072, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {131072, 262144, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}, + {262144, 524288, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {524288, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}}, + 5, + {{0, 16384, &MPIR_Shmem_Bcast_MV2, 4}, + {16384, 131072, &MPIR_Shmem_Bcast_MV2, 2}, + {131072, 262144, &MPIR_Shmem_Bcast_MV2, -1}, + {262144, 524288, &MPIR_Shmem_Bcast_MV2, 2}, + {524288, -1, &MPIR_Shmem_Bcast_MV2, -1}}}, + {512, + 8192, + 4, + 4, + {1, 1, 1, 1, 1}, + 5, + {{0, 4096, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {4096, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {16384, 131072, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {131072, 262144, &MPIR_Pipelined_Bcast_MV2, -1}, + {262144, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}}, + 5, + {{0, 4096, &MPIR_Shmem_Bcast_MV2, 8}, + {4096, 16384, &MPIR_Shmem_Bcast_MV2, 4}, + {16384, 131072, &MPIR_Shmem_Bcast_MV2, 2}, + {131072, 262144, &MPIR_Shmem_Bcast_MV2, -1}, + {262144, -1, &MPIR_Shmem_Bcast_MV2, -1}}}, + {1024, + 8192, + 4, + 4, + {1, 1, 1, 1, 1}, + 5, + {{0, 8192, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {8192, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {16384, 65536, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {65536, 524288, &MPIR_Pipelined_Bcast_MV2, -1}, + {524288, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}}, + 5, + {{0, 8192, &MPIR_Shmem_Bcast_MV2, 8}, + {8192, 16384, &MPIR_Shmem_Bcast_MV2, 4}, + {16384, 65536, &MPIR_Shmem_Bcast_MV2, 2}, + {65536, 524288, &MPIR_Shmem_Bcast_MV2, -1}, + {524288, -1, &MPIR_Shmem_Bcast_MV2, -1}}}, + {2048, + 8192, + 4, + 4, + {1, 1, 1, 1, 1, 1, 1}, + 7, + {{0, 16, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {16, 32, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {32, 4096, &MPIR_Pipelined_Bcast_Zcpy_MV2, 8}, + {4096, 16384, &MPIR_Pipelined_Bcast_Zcpy_MV2, 4}, + {16384, 32768, &MPIR_Pipelined_Bcast_Zcpy_MV2, 2}, + {32768, 524288, &MPIR_Pipelined_Bcast_MV2, -1}, + {524288, -1, &MPIR_Bcast_scatter_ring_allgather_shm_MV2, -1}}, + 7, + {{0, 16, &MPIR_Shmem_Bcast_MV2, 8}, + {16, 32, &MPIR_Shmem_Bcast_MV2, 4}, + {32, 4096, &MPIR_Shmem_Bcast_MV2, 8}, + {4096, 16384, &MPIR_Shmem_Bcast_MV2, 4}, + {16384, 32768, &MPIR_Shmem_Bcast_MV2, 2}, + {32768, 524288, &MPIR_Shmem_Bcast_MV2, -1}, + {524288, -1, &MPIR_Shmem_Bcast_MV2, -1}}}}; + + std::copy_n(mv2_tmp_bcast_thresholds_table, mv2_size_bcast_tuning_table, mv2_bcast_thresholds_table); +} + +/************ Reduce variables and initializers */ + +struct mv2_reduce_tuning_element { + int min; + int max; + int (*MV2_pt_Reduce_function)(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, + MPI_Comm comm_ptr); +}; + +struct mv2_reduce_tuning_table { + int numproc; + int inter_k_degree; + int intra_k_degree; + int is_two_level_reduce[MV2_MAX_NB_THRESHOLDS]; + int size_inter_table; + mv2_reduce_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; + int size_intra_table; + mv2_reduce_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; +}; + +int mv2_size_reduce_tuning_table = 0; +mv2_reduce_tuning_table* mv2_reduce_thresholds_table = NULL; + +int mv2_reduce_intra_knomial_factor = -1; +int mv2_reduce_inter_knomial_factor = -1; + +int (*MV2_Reduce_function)(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, + MPI_Comm comm_ptr) = NULL; + +int (*MV2_Reduce_intra_function)(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, + MPI_Comm comm_ptr) = NULL; + +#define MPIR_Reduce_inter_knomial_wrapper_MV2 simgrid::smpi::Coll_reduce_mvapich2_knomial::reduce +#define MPIR_Reduce_intra_knomial_wrapper_MV2 simgrid::smpi::Coll_reduce_mvapich2_knomial::reduce +#define MPIR_Reduce_binomial_MV2 simgrid::smpi::Coll_reduce_binomial::reduce +#define MPIR_Reduce_redscat_gather_MV2 simgrid::smpi::Coll_reduce_scatter_gather::reduce +#define MPIR_Reduce_shmem_MV2 simgrid::smpi::Coll_reduce_ompi_basic_linear::reduce +#define MPIR_Reduce_two_level_helper_MV2 simgrid::smpi::Coll_reduce_mvapich2_two_level::reduce + +static void init_mv2_reduce_tables_stampede() +{ + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + /*Stampede*/ + mv2_size_reduce_tuning_table = 8; + mv2_reduce_thresholds_table = new mv2_reduce_tuning_table[mv2_size_reduce_tuning_table]; + mv2_reduce_tuning_table mv2_tmp_reduce_thresholds_table[] = { + { + 16, + 4, + 4, + {1, 0, 0}, + 3, + { + {0, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {262144, 1048576, &MPIR_Reduce_binomial_MV2}, + {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, + }, + 2, + { + {0, 65536, &MPIR_Reduce_shmem_MV2}, {65536, -1, &MPIR_Reduce_binomial_MV2}, + }, + }, + { + 32, + 4, + 4, + {1, 1, 1, 1, 0, 0, 0}, + 7, + { + {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {16384, 32768, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {32768, 65536, &MPIR_Reduce_binomial_MV2}, + {65536, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {262144, 1048576, &MPIR_Reduce_binomial_MV2}, + {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, + }, + 6, + { + {0, 8192, &MPIR_Reduce_shmem_MV2}, + {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {16384, 32768, &MPIR_Reduce_shmem_MV2}, + {32768, 65536, &MPIR_Reduce_shmem_MV2}, + {65536, 262144, &MPIR_Reduce_shmem_MV2}, + {262144, -1, &MPIR_Reduce_binomial_MV2}, + }, + }, + { + 64, + 4, + 4, + {1, 1, 1, 1, 0}, + 5, + { + {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_binomial_MV2}, + {65536, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {262144, -1, &MPIR_Reduce_redscat_gather_MV2}, + }, + 5, + { + {0, 8192, &MPIR_Reduce_shmem_MV2}, + {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_shmem_MV2}, + {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {262144, -1, &MPIR_Reduce_binomial_MV2}, + }, + }, + { + 128, + 4, + 4, + {1, 0, 1, 0, 1, 0}, + 6, + { + {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_binomial_MV2}, + {65536, 262144, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {262144, 1048576, &MPIR_Reduce_binomial_MV2}, + {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, + }, + 5, + { + {0, 8192, &MPIR_Reduce_shmem_MV2}, + {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_shmem_MV2}, + {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {262144, -1, &MPIR_Reduce_binomial_MV2}, + }, + }, + { + 256, + 4, + 4, + {1, 1, 1, 0, 1, 1, 0}, + 7, + { + {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {16384, 32768, &MPIR_Reduce_binomial_MV2}, + {32768, 65536, &MPIR_Reduce_binomial_MV2}, + {65536, 262144, &MPIR_Reduce_binomial_MV2}, + {262144, 1048576, &MPIR_Reduce_binomial_MV2}, + {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, + }, + 6, + { + {0, 8192, &MPIR_Reduce_shmem_MV2}, + {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {16384, 32768, &MPIR_Reduce_shmem_MV2}, + {32768, 65536, &MPIR_Reduce_shmem_MV2}, + {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {262144, -1, &MPIR_Reduce_binomial_MV2}, + }, + }, + { + 512, + 4, + 4, + {1, 0, 1, 1, 1, 0}, + 6, + { + {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_binomial_MV2}, + {65536, 262144, &MPIR_Reduce_binomial_MV2}, + {262144, 1048576, &MPIR_Reduce_binomial_MV2}, + {1048576, -1, &MPIR_Reduce_redscat_gather_MV2}, + }, + 5, + { + {0, 8192, &MPIR_Reduce_shmem_MV2}, + {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_shmem_MV2}, + {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {262144, -1, &MPIR_Reduce_binomial_MV2}, + }, + }, + { + 1024, + 4, + 4, + {1, 0, 1, 1, 1}, + 5, + { + {0, 8192, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {8192, 16384, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_binomial_MV2}, + {65536, 262144, &MPIR_Reduce_binomial_MV2}, + {262144, -1, &MPIR_Reduce_binomial_MV2}, + }, + 5, + { + {0, 8192, &MPIR_Reduce_shmem_MV2}, + {8192, 16384, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {16384, 65536, &MPIR_Reduce_shmem_MV2}, + {65536, 262144, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {262144, -1, &MPIR_Reduce_binomial_MV2}, + }, + }, + { + 2048, + 4, + 4, + {1, 0, 1, 1, 1, 1}, + 6, + { + {0, 2048, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {2048, 4096, &MPIR_Reduce_inter_knomial_wrapper_MV2}, + {4096, 16384, &MPIR_Reduce_binomial_MV2}, + {16384, 65536, &MPIR_Reduce_binomial_MV2}, + {65536, 131072, &MPIR_Reduce_binomial_MV2}, + {131072, -1, &MPIR_Reduce_binomial_MV2}, + }, + 6, + { + {0, 2048, &MPIR_Reduce_shmem_MV2}, + {2048, 4096, &MPIR_Reduce_shmem_MV2}, + {4096, 16384, &MPIR_Reduce_shmem_MV2}, + {16384, 65536, &MPIR_Reduce_intra_knomial_wrapper_MV2}, + {65536, 131072, &MPIR_Reduce_binomial_MV2}, + {131072, -1, &MPIR_Reduce_shmem_MV2}, + }, + }, + + }; + std::copy_n(mv2_tmp_reduce_thresholds_table, mv2_size_reduce_tuning_table, mv2_reduce_thresholds_table); +} + +/************ Reduce scatter variables and initializers */ + +struct mv2_red_scat_tuning_element { + int min; + int max; + int (*MV2_pt_Red_scat_function)(void* sendbuf, void* recvbuf, int* recvcnts, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm_ptr); +}; + +struct mv2_red_scat_tuning_table { + int numproc; + int size_inter_table; + mv2_red_scat_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; +}; + +int mv2_size_red_scat_tuning_table = 0; +mv2_red_scat_tuning_table* mv2_red_scat_thresholds_table = NULL; + +int (*MV2_Red_scat_function)(void* sendbuf, void* recvbuf, int* recvcnts, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm_ptr); + +static int MPIR_Reduce_Scatter_Basic_MV2(void* sendbuf, void* recvbuf, int* recvcnts, MPI_Datatype datatype, MPI_Op op, + MPI_Comm comm) +{ + simgrid::smpi::Coll_reduce_scatter_default::reduce_scatter(sendbuf, recvbuf, recvcnts, datatype, op, comm); + return MPI_SUCCESS; +} +#define MPIR_Reduce_scatter_non_comm_MV2 simgrid::smpi::Coll_reduce_scatter_mpich_noncomm::reduce_scatter +#define MPIR_Reduce_scatter_Rec_Halving_MV2 \ + simgrid::smpi::Coll_reduce_scatter_ompi_basic_recursivehalving::reduce_scatter +#define MPIR_Reduce_scatter_Pair_Wise_MV2 simgrid::smpi::Coll_reduce_scatter_mpich_pair::reduce_scatter + +static void init_mv2_reduce_scatter_tables_stampede() +{ + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + mv2_size_red_scat_tuning_table = 6; + mv2_red_scat_thresholds_table = new mv2_red_scat_tuning_table[mv2_size_red_scat_tuning_table]; + mv2_red_scat_tuning_table mv2_tmp_red_scat_thresholds_table[] = { + { + 16, + 3, + { + {0, 64, &MPIR_Reduce_Scatter_Basic_MV2}, + {64, 65536, &MPIR_Reduce_scatter_Rec_Halving_MV2}, + {65536, -1, &MPIR_Reduce_scatter_Pair_Wise_MV2}, + }, + }, + { + 32, + 3, + { + {0, 64, &MPIR_Reduce_Scatter_Basic_MV2}, + {64, 131072, &MPIR_Reduce_scatter_Rec_Halving_MV2}, + {131072, -1, &MPIR_Reduce_scatter_Pair_Wise_MV2}, + }, + }, + { + 64, + 3, + { + {0, 1024, &MPIR_Reduce_Scatter_Basic_MV2}, + {1024, 262144, &MPIR_Reduce_scatter_Rec_Halving_MV2}, + {262144, -1, &MPIR_Reduce_scatter_Pair_Wise_MV2}, + }, + }, + { + 128, + 2, + { + {0, 128, &MPIR_Reduce_Scatter_Basic_MV2}, {128, -1, &MPIR_Reduce_scatter_Rec_Halving_MV2}, + }, + }, + { + 256, + 2, + { + {0, 128, &MPIR_Reduce_Scatter_Basic_MV2}, {128, -1, &MPIR_Reduce_scatter_Rec_Halving_MV2}, + }, + }, + { + 512, + 2, + { + {0, 256, &MPIR_Reduce_Scatter_Basic_MV2}, {256, -1, &MPIR_Reduce_scatter_Rec_Halving_MV2}, + }, + }, + + }; + std::copy_n(mv2_tmp_red_scat_thresholds_table, mv2_size_red_scat_tuning_table, mv2_red_scat_thresholds_table); +} + +/************ Scatter variables and initializers */ + +struct mv2_scatter_tuning_element { + int min; + int max; + int (*MV2_pt_Scatter_function)(void* sendbuf, int sendcnt, MPI_Datatype sendtype, void* recvbuf, int recvcnt, + MPI_Datatype recvtype, int root, MPI_Comm comm); +}; + +struct mv2_scatter_tuning_table { + int numproc; + int size_inter_table; + mv2_scatter_tuning_element inter_leader[MV2_MAX_NB_THRESHOLDS]; + int size_intra_table; + mv2_scatter_tuning_element intra_node[MV2_MAX_NB_THRESHOLDS]; +}; + +int* mv2_scatter_table_ppn_conf = NULL; +int mv2_scatter_num_ppn_conf = 1; +int* mv2_size_scatter_tuning_table = NULL; +mv2_scatter_tuning_table** mv2_scatter_thresholds_table = NULL; + +int (*MV2_Scatter_function)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, + MPI_Datatype recvtype, int root, MPI_Comm comm) = NULL; + +int (*MV2_Scatter_intra_function)(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, + MPI_Datatype recvtype, int root, MPI_Comm comm) = NULL; +int MPIR_Scatter_mcst_wrap_MV2(void* sendbuf, int sendcnt, MPI_Datatype sendtype, void* recvbuf, int recvcnt, + MPI_Datatype recvtype, int root, MPI_Comm comm_ptr); + +int MPIR_Scatter_mcst_wrap_MV2(void* sendbuf, int sendcnt, MPI_Datatype sendtype, void* recvbuf, int recvcnt, + MPI_Datatype recvtype, int root, MPI_Comm comm_ptr) +{ + return 0; +} + +#define MPIR_Scatter_MV2_Binomial simgrid::smpi::Coll_scatter_ompi_binomial::scatter +#define MPIR_Scatter_MV2_Direct simgrid::smpi::Coll_scatter_ompi_basic_linear::scatter +#define MPIR_Scatter_MV2_two_level_Binomial simgrid::smpi::Coll_scatter_mvapich2_two_level_binomial::scatter +#define MPIR_Scatter_MV2_two_level_Direct simgrid::smpi::Coll_scatter_mvapich2_two_level_direct::scatter + +static void init_mv2_scatter_tables_stampede() +{ + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback == NULL) + simgrid::smpi::Colls::smpi_coll_cleanup_callback = &smpi_coll_cleanup_mvapich2; + + int agg_table_sum = 0; + mv2_scatter_tuning_table** table_ptrs = NULL; + mv2_scatter_num_ppn_conf = 3; + mv2_scatter_thresholds_table = new mv2_scatter_tuning_table*[mv2_scatter_num_ppn_conf]; + table_ptrs = new mv2_scatter_tuning_table*[mv2_scatter_num_ppn_conf]; + mv2_size_scatter_tuning_table = new int[mv2_scatter_num_ppn_conf]; + mv2_scatter_table_ppn_conf = new int[mv2_scatter_num_ppn_conf]; + mv2_scatter_table_ppn_conf[0] = 1; + mv2_size_scatter_tuning_table[0] = 6; + mv2_scatter_tuning_table mv2_tmp_scatter_thresholds_table_1ppn[] = { + { + 2, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + + { + 4, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 8, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 16, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 32, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 64, + 2, + { + {0, 32, &MPIR_Scatter_MV2_Binomial}, {32, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + }; + table_ptrs[0] = mv2_tmp_scatter_thresholds_table_1ppn; + mv2_scatter_table_ppn_conf[1] = 2; + mv2_size_scatter_tuning_table[1] = 6; + mv2_scatter_tuning_table mv2_tmp_scatter_thresholds_table_2ppn[] = { + { + 4, + 2, + { + {0, 4096, &MPIR_Scatter_MV2_Binomial}, {4096, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 8, + 2, + { + {0, 512, &MPIR_Scatter_MV2_two_level_Direct}, {512, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + + { + 16, + 2, + { + {0, 2048, &MPIR_Scatter_MV2_two_level_Direct}, {2048, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + + { + 32, + 2, + { + {0, 2048, &MPIR_Scatter_MV2_two_level_Direct}, {2048, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + + { + 64, + 2, + { + {0, 8192, &MPIR_Scatter_MV2_two_level_Direct}, {8192, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + + { + 128, + 4, + { + {0, 16, &MPIR_Scatter_MV2_Binomial}, + {16, 128, &MPIR_Scatter_MV2_two_level_Binomial}, + {128, 16384, &MPIR_Scatter_MV2_two_level_Direct}, + {16384, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, 128, &MPIR_Scatter_MV2_Direct}, {128, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + }; + table_ptrs[1] = mv2_tmp_scatter_thresholds_table_2ppn; + mv2_scatter_table_ppn_conf[2] = 16; + mv2_size_scatter_tuning_table[2] = 8; + mv2_scatter_tuning_table mv2_tmp_scatter_thresholds_table_16ppn[] = { + { + 16, + 2, + { + {0, 256, &MPIR_Scatter_MV2_Binomial}, {256, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 32, + 2, + { + {0, 512, &MPIR_Scatter_MV2_Binomial}, {512, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 64, + 2, + { + {0, 1024, &MPIR_Scatter_MV2_two_level_Direct}, {1024, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 128, + 4, + { + {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, + {0, 16, &MPIR_Scatter_MV2_two_level_Direct}, + {16, 2048, &MPIR_Scatter_MV2_two_level_Direct}, + {2048, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 256, + 4, + { + {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, + {0, 16, &MPIR_Scatter_MV2_two_level_Direct}, + {16, 2048, &MPIR_Scatter_MV2_two_level_Direct}, + {2048, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + + { + 512, + 4, + { + {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, + {16, 16, &MPIR_Scatter_MV2_two_level_Direct}, + {16, 4096, &MPIR_Scatter_MV2_two_level_Direct}, + {4096, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + { + 1024, + 5, + { + {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, + {0, 16, &MPIR_Scatter_MV2_Binomial}, + {16, 32, &MPIR_Scatter_MV2_Binomial}, + {32, 4096, &MPIR_Scatter_MV2_two_level_Direct}, + {4096, -1, &MPIR_Scatter_MV2_Direct}, + }, + 1, + { + {0, -1, &MPIR_Scatter_MV2_Binomial}, + }, + }, + { + 2048, + 7, + { + {0, 16, &MPIR_Scatter_mcst_wrap_MV2}, + {0, 16, &MPIR_Scatter_MV2_two_level_Binomial}, + {16, 128, &MPIR_Scatter_MV2_two_level_Binomial}, + {128, 1024, &MPIR_Scatter_MV2_two_level_Direct}, + {1024, 16384, &MPIR_Scatter_MV2_two_level_Direct}, + {16384, 65536, &MPIR_Scatter_MV2_Direct}, + {65536, -1, &MPIR_Scatter_MV2_two_level_Direct}, + }, + 6, + { + {0, 16, &MPIR_Scatter_MV2_Binomial}, + {16, 128, &MPIR_Scatter_MV2_Binomial}, + {128, 1024, &MPIR_Scatter_MV2_Binomial}, + {1024, 16384, &MPIR_Scatter_MV2_Direct}, + {16384, 65536, &MPIR_Scatter_MV2_Direct}, + {65536, -1, &MPIR_Scatter_MV2_Direct}, + }, + }, + }; + table_ptrs[2] = mv2_tmp_scatter_thresholds_table_16ppn; + agg_table_sum = 0; + for (int i = 0; i < mv2_scatter_num_ppn_conf; i++) { + agg_table_sum += mv2_size_scatter_tuning_table[i]; + } + mv2_scatter_thresholds_table[0] = new mv2_scatter_tuning_table[agg_table_sum]; + std::copy_n(table_ptrs[0], mv2_size_scatter_tuning_table[0], mv2_scatter_thresholds_table[0]); + for (int i = 1; i < mv2_scatter_num_ppn_conf; i++) { + mv2_scatter_thresholds_table[i] = mv2_scatter_thresholds_table[i - 1] + mv2_size_scatter_tuning_table[i - 1]; + std::copy_n(table_ptrs[i], mv2_size_scatter_tuning_table[i], mv2_scatter_thresholds_table[i]); + } + delete[] table_ptrs; +} + +#endif diff --git a/src/smpi/colls/smpi_openmpi_selector.cpp b/src/smpi/colls/smpi_openmpi_selector.cpp index 9770eb0b88..ead3440c83 100644 --- a/src/smpi/colls/smpi_openmpi_selector.cpp +++ b/src/smpi/colls/smpi_openmpi_selector.cpp @@ -6,7 +6,7 @@ /* 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 "colls_private.h" +#include "colls_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/include/SmpiHost.hpp b/src/smpi/include/SmpiHost.hpp index a3667fe8ea..024bb9277d 100644 --- a/src/smpi/include/SmpiHost.hpp +++ b/src/smpi/include/SmpiHost.hpp @@ -6,7 +6,7 @@ #ifndef SMPI_HOST_HPP_ #define SMPI_HOST_HPP_ -#include "src/include/smpi/smpi_utils.hpp" +#include "smpi_utils.hpp" #include "simgrid/s4u/Host.hpp" #include @@ -17,10 +17,6 @@ namespace simgrid { namespace smpi { -void sg_smpi_host_init(); -static void onHostDestruction(simgrid::s4u::Host& host); -static void onCreation(simgrid::s4u::Host& host); - class SmpiHost { private: diff --git a/src/smpi/include/private.h b/src/smpi/include/private.h deleted file mode 100644 index f17eccb30d..0000000000 --- a/src/smpi/include/private.h +++ /dev/null @@ -1,419 +0,0 @@ -/* Copyright (c) 2007-2017. 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. */ - -#ifndef SMPI_PRIVATE_H -#define SMPI_PRIVATE_H - -#include "smpi/smpi.h" -#include "simgrid/msg.h" // msg_bar_t - -SG_BEGIN_DECL() - -#define PERSISTENT 0x1 -#define NON_PERSISTENT 0x2 -#define SEND 0x4 -#define RECV 0x8 -#define RECV_DELETE 0x10 -#define ISEND 0x20 -#define SSEND 0x40 -#define PREPARED 0x80 -#define FINISHED 0x100 -#define RMA 0x200 -#define ACCUMULATE 0x400 - -enum smpi_process_state{ - SMPI_UNINITIALIZED, - SMPI_INITIALIZED, - SMPI_FINALIZED -}; - -#define COLL_TAG_REDUCE -112 -#define COLL_TAG_SCATTER -223 -#define COLL_TAG_SCATTERV -334 -#define COLL_TAG_GATHER -445 -#define COLL_TAG_ALLGATHER -556 -#define COLL_TAG_ALLGATHERV -667 -#define COLL_TAG_BARRIER -778 -#define COLL_TAG_REDUCE_SCATTER -889 -#define COLL_TAG_ALLTOALLV -1000 -#define COLL_TAG_ALLTOALL -1112 -#define COLL_TAG_GATHERV -2223 -#define COLL_TAG_BCAST -3334 -#define COLL_TAG_ALLREDUCE -4445 -//SMPI_RMA_TAG has to be the smallest one, as it will be decremented for accumulate ordering. -#define SMPI_RMA_TAG -6666 - -/* Convert between Fortran and C */ - -#define FORT_BOTTOM(addr) ((*(int*)addr) == -200 ? MPI_BOTTOM : (void*)addr) -#define FORT_IN_PLACE(addr) ((*(int*)addr) == -100 ? MPI_IN_PLACE : (void*)addr) -#define FORT_STATUS_IGNORE(addr) (static_cast((*(int*)addr) == -300 ? MPI_STATUS_IGNORE : (void*)addr)) -#define FORT_STATUSES_IGNORE(addr) (static_cast((*(int*)addr) == -400 ? MPI_STATUSES_IGNORE : (void*)addr)) - -extern XBT_PRIVATE MPI_Comm MPI_COMM_UNINITIALIZED; - -typedef SMPI_Cart_topology *MPIR_Cart_Topology; - -typedef SMPI_Graph_topology *MPIR_Graph_Topology; - -typedef SMPI_Dist_Graph_topology *MPIR_Dist_Graph_Topology; - -XBT_PRIVATE SMPI_Process* smpi_process(); -XBT_PRIVATE SMPI_Process* smpi_process_remote(int index); -XBT_PRIVATE int smpi_process_count(); - -XBT_PRIVATE void smpi_deployment_register_process(const char* instance_id, int rank, int index); -XBT_PRIVATE MPI_Comm* smpi_deployment_comm_world(const char* instance_id); -XBT_PRIVATE msg_bar_t smpi_deployment_finalization_barrier(const char* instance_id); -XBT_PRIVATE void smpi_deployment_cleanup_instances(); - -XBT_PRIVATE void smpi_comm_copy_buffer_callback(smx_activity_t comm, void *buff, size_t buff_size); - -XBT_PRIVATE void smpi_comm_null_copy_buffer_callback(smx_activity_t comm, void *buff, size_t buff_size); - -XBT_PRIVATE int smpi_enabled(); -XBT_PRIVATE void smpi_global_init(); -XBT_PRIVATE void smpi_global_destroy(); -XBT_PRIVATE double smpi_mpi_wtime(); -XBT_PRIVATE void smpi_mpi_init(); - -// utilities -extern XBT_PRIVATE double smpi_cpu_threshold; -extern XBT_PRIVATE double smpi_host_speed; -extern XBT_PRIVATE char* smpi_data_exe_start; // start of the data+bss segment of the executable -extern XBT_PRIVATE int smpi_data_exe_size; // size of the data+bss segment of the executable - -typedef enum { shmalloc_none, shmalloc_local, shmalloc_global } shared_malloc_type; -extern XBT_PRIVATE shared_malloc_type smpi_cfg_shared_malloc; // Whether to activate shared malloc - -XBT_PRIVATE void smpi_switch_data_segment(int dest); -XBT_PRIVATE void smpi_really_switch_data_segment(int dest); -XBT_PRIVATE int smpi_is_privatization_file(char* file); - -XBT_PRIVATE void smpi_get_executable_global_size(); -XBT_PRIVATE void smpi_initialize_global_memory_segments(); -XBT_PRIVATE void smpi_destroy_global_memory_segments(); -XBT_PRIVATE void smpi_bench_destroy(); -XBT_PRIVATE void smpi_bench_begin(); -XBT_PRIVATE void smpi_bench_end(); -XBT_PRIVATE void smpi_shared_destroy(); - -XBT_PRIVATE void* smpi_get_tmp_sendbuffer(int size); -XBT_PRIVATE void* smpi_get_tmp_recvbuffer(int size); -XBT_PRIVATE void smpi_free_tmp_buffer(void* buf); - - -// f77 wrappers -void mpi_init_(int* ierr); -void mpi_finalize_(int* ierr); -void mpi_abort_(int* comm, int* errorcode, int* ierr); -void mpi_comm_rank_(int* comm, int* rank, int* ierr); -void mpi_comm_size_(int* comm, int* size, int* ierr); -double mpi_wtime_(); -double mpi_wtick_(); -void mpi_initialized_(int* flag, int* ierr); - -void mpi_comm_dup_(int* comm, int* newcomm, int* ierr); -void mpi_comm_create_(int* comm, int* group, int* newcomm, int* ierr); -void mpi_comm_free_(int* comm, int* ierr); -void mpi_comm_split_(int* comm, int* color, int* key, int* comm_out, int* ierr); -void mpi_group_incl_(int* group, int* n, int* key, int* group_out, int* ierr) ; -void mpi_comm_group_(int* comm, int* group_out, int* ierr); -void mpi_comm_create_group_ (int* comm, int* group, int, int* comm_out, int* ierr); -void mpi_send_init_(void *buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr); -void mpi_isend_(void *buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr); -void mpi_irsend_(void *buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr); -void mpi_send_(void* buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* ierr); -void mpi_rsend_(void* buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* ierr); -void mpi_recv_init_(void *buf, int* count, int* datatype, int* src, int* tag, int* comm, int* request, int* ierr); -void mpi_irecv_(void *buf, int* count, int* datatype, int* src, int* tag, int* comm, int* request, int* ierr); -void mpi_recv_(void* buf, int* count, int* datatype, int* src, int* tag, int* comm, MPI_Status* status, int* ierr); -void mpi_start_(int* request, int* ierr); -void mpi_startall_(int* count, int* requests, int* ierr); -void mpi_wait_(int* request, MPI_Status* status, int* ierr); -void mpi_waitany_(int* count, int* requests, int* index, MPI_Status* status, int* ierr); -void mpi_waitall_(int* count, int* requests, MPI_Status* status, int* ierr); - -void mpi_barrier_(int* comm, int* ierr); -void mpi_bcast_(void* buf, int* count, int* datatype, int* root, int* comm, int* ierr); -void mpi_reduce_(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* root, int* comm, int* ierr); -void mpi_allreduce_(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr); -void mpi_reduce_scatter_(void* sendbuf, void* recvbuf, int* recvcounts, int* datatype, int* op, int* comm, int* ierr) ; -void mpi_scatter_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, - int* root, int* comm, int* ierr); -void mpi_scatterv_(void* sendbuf, int* sendcounts, int* displs, int* sendtype, - void* recvbuf, int* recvcount, int* recvtype, int* root, int* comm, int* ierr); -void mpi_gather_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, - int* root, int* comm, int* ierr); -void mpi_gatherv_(void* sendbuf, int* sendcount, int* sendtype, - void* recvbuf, int* recvcounts, int* displs, int* recvtype, int* root, int* comm, int* ierr); -void mpi_allgather_(void* sendbuf, int* sendcount, int* sendtype, - void* recvbuf, int* recvcount, int* recvtype, int* comm, int* ierr); -void mpi_allgatherv_(void* sendbuf, int* sendcount, int* sendtype, - void* recvbuf, int* recvcount,int* displs, int* recvtype, int* comm, int* ierr) ; -void mpi_type_size_(int* datatype, int *size, int* ierr); - -void mpi_scan_(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr); -void mpi_alltoall_(void* sendbuf, int* sendcount, int* sendtype, - void* recvbuf, int* recvcount, int* recvtype, int* comm, int* ierr); -void mpi_alltoallv_(void* sendbuf, int* sendcounts, int* senddisps, int* sendtype, - void* recvbuf, int* recvcounts, int* recvdisps, int* recvtype, int* comm, int* ierr); -void mpi_get_processor_name_(char *name, int *resultlen, int* ierr); -void mpi_test_ (int * request, int *flag, MPI_Status * status, int* ierr); -void mpi_testall_ (int* count, int * requests, int *flag, MPI_Status * statuses, int* ierr); -void mpi_get_count_(MPI_Status * status, int* datatype, int *count, int* ierr); -void mpi_type_extent_(int* datatype, MPI_Aint * extent, int* ierr); -void mpi_attr_get_(int* comm, int* keyval, void* attr_value, int* flag, int* ierr ); -void mpi_type_commit_(int* datatype, int* ierr); -void mpi_type_vector_(int* count, int* blocklen, int* stride, int* old_type, int* newtype, int* ierr); -void mpi_type_hvector_(int* count, int* blocklen, MPI_Aint* stride, int* old_type, int* newtype, int* ierr); -void mpi_type_create_hvector_(int* count, int* blocklen, MPI_Aint* stride, int* old_type, int* newtype, int* ierr); -void mpi_type_free_(int* datatype, int* ierr); -void mpi_type_lb_(int* datatype, MPI_Aint * extent, int* ierr); -void mpi_type_ub_(int* datatype, MPI_Aint * extent, int* ierr); -void mpi_win_fence_( int* assert, int* win, int* ierr); -void mpi_win_free_( int* win, int* ierr); -void mpi_win_create_( int *base, MPI_Aint* size, int* disp_unit, int* info, int* comm, int *win, int* ierr); -void mpi_win_set_name_ (int* win, char * name, int* ierr, int size); -void mpi_win_get_name_ (int* win, char * name, int* len, int* ierr); -void mpi_win_post_(int* group, int assert, int* win, int* ierr); -void mpi_win_start_(int* group, int assert, int* win, int* ierr); -void mpi_win_complete_(int* win, int* ierr); -void mpi_win_wait_(int* win, int* ierr); -void mpi_win_allocate_( MPI_Aint* size, int* disp_unit, int* info, int* comm, void* base, int* win, int* ierr); -void mpi_win_attach_(int* win, int* base, MPI_Aint* size, int* ierr); -void mpi_win_create_dynamic_( int* info, int* comm, int *win, int* ierr); -void mpi_win_detach_(int* win, int* base, int* ierr); -void mpi_win_set_info_(int* win, int* info, int* ierr); -void mpi_win_get_info_(int* win, int* info, int* ierr); -void mpi_win_get_group_(int* win, int* group, int* ierr); -void mpi_win_get_attr_(int* win, int* type_keyval, void* attribute_val, int* flag, int* ierr); -void mpi_win_set_attr_(int* win, int* type_keyval, void* att, int* ierr); -void mpi_win_delete_attr_(int* win, int* comm_keyval, int* ierr); -void mpi_win_create_keyval_(void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr); -void mpi_win_free_keyval_(int* keyval, int* ierr); -void mpi_win_lock_(int* lock_type, int* rank, int* assert, int* win, int* ierr); -void mpi_win_lock_all_(int* assert, int* win, int* ierr); -void mpi_win_unlock_(int* rank, int* win, int* ierr); -void mpi_win_unlock_all_(int* win, int* ierr); -void mpi_win_flush_(int* rank, int* win, int* ierr); -void mpi_win_flush_local_(int* rank, int* win, int* ierr); -void mpi_win_flush_all_(int* win, int* ierr); -void mpi_win_flush_local_all_(int* win, int* ierr); -void mpi_info_create_( int *info, int* ierr); -void mpi_info_set_( int *info, char *key, char *value, int* ierr, unsigned int keylen, unsigned int valuelen); -void mpi_info_free_(int* info, int* ierr); -void mpi_get_( int *origin_addr, int* origin_count, int* origin_datatype, int* target_rank, - MPI_Aint* target_disp, int* target_count, int* target_datatype, int* win, int* ierr); -void mpi_put_( int *origin_addr, int* origin_count, int* origin_datatype, int* target_rank, - MPI_Aint* target_disp, int* target_count, int* target_datatype, int* win, int* ierr); -void mpi_rget_( int *origin_addr, int* origin_count, int* origin_datatype, int* target_rank, - MPI_Aint* target_disp, int* target_count, int* target_datatype, int* win, int* request, int* ierr); -void mpi_rput_( int *origin_addr, int* origin_count, int* origin_datatype, int* target_rank, - MPI_Aint* target_disp, int* target_count, int* target_datatype, int* win, int* request, int* ierr); -void mpi_fetch_and_op_( int *origin_addr, int* result_addr, int* datatype, int* target_rank, MPI_Aint* target_disp, int* op, int* win, int* ierr); -void mpi_compare_and_swap_( int *origin_addr, int* compare_addr, int* result_addr, - int* datatype, int* target_rank, MPI_Aint* target_disp, int* win, int* ierr); -void mpi_get_accumulate_(int *origin_addr, int* origin_count, int* origin_datatype, int* result_addr, - int* result_count, int* result_datatype, int* target_rank, MPI_Aint* target_disp, int* target_count, - int* target_datatype, int* op, int* win, int* ierr); -void mpi_rget_accumulate_(int *origin_addr, int* origin_count, int* origin_datatype, int* result_addr, - int* result_count, int* result_datatype, int* target_rank, MPI_Aint* target_disp, int* target_count, - int* target_datatype, int* op, int* win, int* request, int* ierr); -void mpi_accumulate_( int *origin_addr, int* origin_count, int* origin_datatype, int* target_rank, - MPI_Aint* target_disp, int* target_count, int* target_datatype, int* op, int* win, int* ierr); -void mpi_raccumulate_( int *origin_addr, int* origin_count, int* origin_datatype, int* target_rank, - MPI_Aint* target_disp, int* target_count, int* target_datatype, int* op, int* win, int* request, int* ierr); -void mpi_error_string_(int* errorcode, char* string, int* resultlen, int* ierr); -void mpi_sendrecv_(void* sendbuf, int* sendcount, int* sendtype, int* dst, int* sendtag, void *recvbuf, int* recvcount, - int* recvtype, int* src, int* recvtag, int* comm, MPI_Status* status, int* ierr); - -void mpi_finalized_ (int * flag, int* ierr); -void mpi_init_thread_ (int *required, int *provided, int* ierr); -void mpi_query_thread_ (int *provided, int* ierr); -void mpi_is_thread_main_ (int *flag, int* ierr); -void mpi_address_ (void *location, MPI_Aint * address, int* ierr); -void mpi_get_address_ (void *location, MPI_Aint * address, int* ierr); -void mpi_type_dup_ (int* datatype, int* newdatatype, int* ierr); -void mpi_type_set_name_ (int* datatype, char * name, int* ierr, int size); -void mpi_type_get_name_ (int* datatype, char * name, int* len, int* ierr); -void mpi_type_get_attr_ (int* type, int* type_keyval, void *attribute_val, int* flag, int* ierr); -void mpi_type_set_attr_ (int* type, int* type_keyval, void *attribute_val, int* ierr); -void mpi_type_delete_attr_ (int* type, int* type_keyval, int* ierr); -void mpi_type_create_keyval_ (void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr); -void mpi_type_free_keyval_ (int* keyval, int* ierr) ; -void mpi_pcontrol_ (int* level , int* ierr); -void mpi_type_get_extent_ (int* datatype, MPI_Aint * lb, MPI_Aint * extent, int* ierr); -void mpi_type_get_true_extent_ (int* datatype, MPI_Aint * lb, MPI_Aint * extent, int* ierr); -void mpi_op_create_ (void * function, int* commute, int* op, int* ierr); -void mpi_op_free_ (int* op, int* ierr); -void mpi_op_commutative_ (int* op, int* commute, int* ierr); -void mpi_group_free_ (int* group, int* ierr); -void mpi_group_size_ (int* group, int *size, int* ierr); -void mpi_group_rank_ (int* group, int *rank, int* ierr); -void mpi_group_translate_ranks_ (int* group1, int* n, int *ranks1, int* group2, int *ranks2, int* ierr); -void mpi_group_compare_ (int* group1, int* group2, int *result, int* ierr); -void mpi_group_union_ (int* group1, int* group2, int* newgroup, int* ierr); -void mpi_group_intersection_ (int* group1, int* group2, int* newgroup, int* ierr); -void mpi_group_difference_ (int* group1, int* group2, int* newgroup, int* ierr); -void mpi_group_excl_ (int* group, int* n, int *ranks, int* newgroup, int* ierr); -void mpi_group_range_incl_ (int* group, int* n, int ranges[][3], int* newgroup, int* ierr); -void mpi_group_range_excl_ (int* group, int* n, int ranges[][3], int* newgroup, int* ierr); -void mpi_comm_get_attr_ (int* comm, int* comm_keyval, void *attribute_val, int *flag, int* ierr); -void mpi_comm_set_attr_ (int* comm, int* comm_keyval, void *attribute_val, int* ierr); -void mpi_comm_delete_attr_ (int* comm, int* comm_keyval, int* ierr); -void mpi_comm_create_keyval_ (void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr); -void mpi_comm_free_keyval_ (int* keyval, int* ierr) ; -void mpi_comm_get_name_ (int* comm, char* name, int* len, int* ierr); -void mpi_comm_compare_ (int* comm1, int* comm2, int *result, int* ierr); -void mpi_comm_disconnect_ (int* comm, int* ierr); -void mpi_request_free_ (int* request, int* ierr); -void mpi_sendrecv_replace_ (void *buf, int* count, int* datatype, int* dst, int* sendtag, int* src, int* recvtag, - int* comm, MPI_Status* status, int* ierr); -void mpi_testany_ (int* count, int* requests, int *index, int *flag, MPI_Status* status, int* ierr); -void mpi_waitsome_ (int* incount, int* requests, int *outcount, int *indices, MPI_Status* status, int* ierr); -void mpi_reduce_local_ (void *inbuf, void *inoutbuf, int* count, int* datatype, int* op, int* ierr); -void mpi_reduce_scatter_block_ (void *sendbuf, void *recvbuf, int* recvcount, int* datatype, int* op, int* comm, - int* ierr); -void mpi_pack_size_ (int* incount, int* datatype, int* comm, int* size, int* ierr) ; -void mpi_cart_coords_ (int* comm, int* rank, int* maxdims, int* coords, int* ierr) ; -void mpi_cart_create_ (int* comm_old, int* ndims, int* dims, int* periods, int* reorder, int* comm_cart, int* ierr) ; -void mpi_cart_get_ (int* comm, int* maxdims, int* dims, int* periods, int* coords, int* ierr) ; -void mpi_cart_map_ (int* comm_old, int* ndims, int* dims, int* periods, int* newrank, int* ierr) ; -void mpi_cart_rank_ (int* comm, int* coords, int* rank, int* ierr) ; -void mpi_cart_shift_ (int* comm, int* direction, int* displ, int* source, int* dest, int* ierr) ; -void mpi_cart_sub_ (int* comm, int* remain_dims, int* comm_new, int* ierr) ; -void mpi_cartdim_get_ (int* comm, int* ndims, int* ierr) ; -void mpi_graph_create_ (int* comm_old, int* nnodes, int* index, int* edges, int* reorder, int* comm_graph, int* ierr) ; -void mpi_graph_get_ (int* comm, int* maxindex, int* maxedges, int* index, int* edges, int* ierr) ; -void mpi_graph_map_ (int* comm_old, int* nnodes, int* index, int* edges, int* newrank, int* ierr) ; -void mpi_graph_neighbors_ (int* comm, int* rank, int* maxneighbors, int* neighbors, int* ierr) ; -void mpi_graph_neighbors_count_ (int* comm, int* rank, int* nneighbors, int* ierr) ; -void mpi_graphdims_get_ (int* comm, int* nnodes, int* nedges, int* ierr) ; -void mpi_topo_test_ (int* comm, int* top_type, int* ierr) ; -void mpi_error_class_ (int* errorcode, int* errorclass, int* ierr) ; -void mpi_errhandler_create_ (void* function, void* errhandler, int* ierr) ; -void mpi_errhandler_free_ (void* errhandler, int* ierr) ; -void mpi_errhandler_get_ (int* comm, void* errhandler, int* ierr) ; -void mpi_errhandler_set_ (int* comm, void* errhandler, int* ierr) ; -void mpi_comm_set_errhandler_ (int* comm, void* errhandler, int* ierr) ; -void mpi_comm_get_errhandler_ (int* comm, void* errhandler, int* ierr) ; -void mpi_type_contiguous_ (int* count, int* old_type, int* newtype, int* ierr) ; -void mpi_cancel_ (int* request, int* ierr) ; -void mpi_buffer_attach_ (void* buffer, int* size, int* ierr) ; -void mpi_buffer_detach_ (void* buffer, int* size, int* ierr) ; -void mpi_testsome_ (int* incount, int* requests, int* outcount, int* indices, MPI_Status* statuses, int* ierr) ; -void mpi_comm_test_inter_ (int* comm, int* flag, int* ierr) ; -void mpi_unpack_ (void* inbuf, int* insize, int* position, void* outbuf, int* outcount, int* type, int* comm, - int* ierr) ; -void mpi_pack_external_size_ (char *datarep, int* incount, int* datatype, MPI_Aint *size, int* ierr); -void mpi_pack_external_ (char *datarep, void *inbuf, int* incount, int* datatype, void *outbuf, MPI_Aint* outcount, - MPI_Aint *position, int* ierr); -void mpi_unpack_external_ (char *datarep, void *inbuf, MPI_Aint* insize, MPI_Aint *position, void *outbuf, - int* outcount, int* datatype, int* ierr); -void mpi_type_hindexed_ (int* count, int* blocklens, MPI_Aint* indices, int* old_type, int* newtype, int* ierr) ; -void mpi_type_create_hindexed_ (int* count, int* blocklens, MPI_Aint* indices, int* old_type, int* newtype, int* ierr); -void mpi_type_create_hindexed_block_ (int* count, int* blocklength, MPI_Aint* indices, int* old_type, int* newtype, - int* ierr) ; -void mpi_type_indexed_ (int* count, int* blocklens, int* indices, int* old_type, int* newtype, int* ierr) ; -void mpi_type_create_indexed_ (int* count, int* blocklens, int* indices, int* old_type, int* newtype, int* ierr) ; -void mpi_type_create_indexed_block_ (int* count, int* blocklength, int* indices, int* old_type, int*newtype, - int* ierr); -void mpi_type_struct_ (int* count, int* blocklens, MPI_Aint* indices, int* old_types, int* newtype, int* ierr) ; -void mpi_type_create_struct_ (int* count, int* blocklens, MPI_Aint* indices, int* old_types, int* newtype, int* ierr); -void mpi_ssend_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* ierr) ; -void mpi_ssend_init_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr) ; -void mpi_intercomm_create_ (int* local_comm, int* local_leader, int* peer_comm, int* remote_leader, int* tag, - int* comm_out, int* ierr) ; -void mpi_intercomm_merge_ (int* comm, int* high, int* comm_out, int* ierr) ; -void mpi_bsend_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* ierr) ; -void mpi_bsend_init_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr) ; -void mpi_ibsend_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr) ; -void mpi_comm_remote_group_ (int* comm, int* group, int* ierr) ; -void mpi_comm_remote_size_ (int* comm, int* size, int* ierr) ; -void mpi_issend_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr) ; -void mpi_probe_ (int* source, int* tag, int* comm, MPI_Status* status, int* ierr) ; -void mpi_attr_delete_ (int* comm, int* keyval, int* ierr) ; -void mpi_attr_put_ (int* comm, int* keyval, void* attr_value, int* ierr) ; -void mpi_rsend_init_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr) ; -void mpi_keyval_create_ (void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr) ; -void mpi_keyval_free_ (int* keyval, int* ierr) ; -void mpi_test_cancelled_ (MPI_Status* status, int* flag, int* ierr) ; -void mpi_pack_ (void* inbuf, int* incount, int* type, void* outbuf, int* outcount, int* position, int* comm, int* ierr); -void mpi_get_elements_ (MPI_Status* status, int* datatype, int* elements, int* ierr) ; -void mpi_dims_create_ (int* nnodes, int* ndims, int* dims, int* ierr) ; -void mpi_iprobe_ (int* source, int* tag, int* comm, int* flag, MPI_Status* status, int* ierr) ; -void mpi_type_get_envelope_ ( int* datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner, - int* ierr); -void mpi_type_get_contents_ (int* datatype, int* max_integers, int* max_addresses, int* max_datatypes, - int* array_of_integers, MPI_Aint* array_of_addresses, - int*array_of_datatypes, int* ierr); -void mpi_type_create_darray_ (int* size, int* rank, int* ndims, int* array_of_gsizes, int* array_of_distribs, - int* array_of_dargs, int* array_of_psizes, - int* order, int* oldtype, int*newtype, int* ierr) ; -void mpi_type_create_resized_ (int* oldtype,MPI_Aint* lb, MPI_Aint* extent, int*newtype, int* ierr); -void mpi_type_create_subarray_ (int* ndims,int *array_of_sizes, int *array_of_subsizes, int *array_of_starts, - int* order, int* oldtype, int*newtype, int* ierr); -void mpi_type_match_size_ (int* typeclass,int* size,int*datatype, int* ierr); -void mpi_alltoallw_ ( void *sendbuf, int *sendcnts, int *sdispls, int*sendtypes, void *recvbuf, int *recvcnts, - int *rdispls, int*recvtypes, int* comm, int* ierr); -void mpi_exscan_ (void *sendbuf, void *recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr); -void mpi_comm_set_name_ (int* comm, char* name, int* ierr, int size); -void mpi_comm_dup_with_info_ (int* comm, int* info, int* newcomm, int* ierr); -void mpi_comm_split_type_ (int* comm, int* split_type, int* key, int* info, int*newcomm, int* ierr); -void mpi_comm_set_info_ (int* comm, int* info, int* ierr); -void mpi_comm_get_info_ (int* comm, int* info, int* ierr); -void mpi_info_get_ (int* info,char *key,int* valuelen, char *value, int *flag, int* ierr, unsigned int keylen); -void mpi_comm_create_errhandler_ ( void *function, void *errhandler, int* ierr); -void mpi_add_error_class_ ( int *errorclass, int* ierr); -void mpi_add_error_code_ ( int* errorclass, int *errorcode, int* ierr); -void mpi_add_error_string_ ( int* errorcode, char *string, int* ierr); -void mpi_comm_call_errhandler_ (int* comm,int* errorcode, int* ierr); -void mpi_info_dup_ (int* info, int* newinfo, int* ierr); -void mpi_info_get_valuelen_ ( int* info, char *key, int *valuelen, int *flag, int* ierr, unsigned int keylen); -void mpi_info_delete_ (int* info, char *key, int* ierr, unsigned int keylen); -void mpi_info_get_nkeys_ ( int* info, int *nkeys, int* ierr); -void mpi_info_get_nthkey_ ( int* info, int* n, char *key, int* ierr, unsigned int keylen); -void mpi_get_version_ (int *version,int *subversion, int* ierr); -void mpi_get_library_version_ (char *version,int *len, int* ierr); -void mpi_request_get_status_ ( int* request, int *flag, MPI_Status* status, int* ierr); -void mpi_grequest_start_ ( void *query_fn, void *free_fn, void *cancel_fn, void *extra_state, int*request, int* ierr); -void mpi_grequest_complete_ ( int* request, int* ierr); -void mpi_status_set_cancelled_ (MPI_Status* status,int* flag, int* ierr); -void mpi_status_set_elements_ ( MPI_Status* status, int* datatype, int* count, int* ierr); -void mpi_comm_connect_ ( char *port_name, int* info, int* root, int* comm, int* newcomm, int* ierr); -void mpi_publish_name_ ( char *service_name, int* info, char *port_name, int* ierr); -void mpi_unpublish_name_ ( char *service_name, int* info, char *port_name, int* ierr); -void mpi_lookup_name_ ( char *service_name, int* info, char *port_name, int* ierr); -void mpi_comm_join_ ( int* fd, int*intercomm, int* ierr); -void mpi_open_port_ ( int* info, char *port_name, int* ierr); -void mpi_close_port_ ( char *port_name, int* ierr); -void mpi_comm_accept_ ( char *port_name, int* info, int* root, int* comm, int* newcomm, int* ierr); -void mpi_comm_spawn_ ( char *command, char *argv, int* maxprocs, int* info, int* root, int* comm, int*intercomm, - int* array_of_errcodes, int* ierr); -void mpi_comm_spawn_multiple_ ( int* count, char *array_of_commands, char** array_of_argv, int* array_of_maxprocs, - int* array_of_info, int* root, int* comm, int*intercomm, int* array_of_errcodes, int* ierr); -void mpi_comm_get_parent_ ( int*parent, int* ierr); -void mpi_file_close_ ( int* file, int* ierr); -void mpi_file_delete_ ( char* filename, int* info, int* ierr); -void mpi_file_open_ ( int* comm, char* filename, int* amode, int* info, int* fh, int* ierr); -void mpi_file_set_view_ ( int* fh, long long int* offset, int* etype, int* filetype, char* datarep, int* info, int* ierr); -void mpi_file_read_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); -void mpi_file_write_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); - -// TODO, make this static and expose it more cleanly - -typedef struct s_smpi_privatization_region { - void* address; - int file_descriptor; -} s_smpi_privatization_region_t; -typedef s_smpi_privatization_region_t* smpi_privatization_region_t; - -extern XBT_PRIVATE smpi_privatization_region_t smpi_privatization_regions; -extern XBT_PRIVATE int smpi_loaded_page; -extern XBT_PRIVATE int smpi_universe_size; - -SG_END_DECL() -#endif diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index 46825403f9..26c3ea0d75 100644 --- a/src/smpi/include/private.hpp +++ b/src/smpi/include/private.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2017. 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. */ @@ -6,10 +6,415 @@ #ifndef SMPI_PRIVATE_HPP #define SMPI_PRIVATE_HPP -#include "src/instr/instr_smpi.h" +#include "include/xbt/config.hpp" +#include "simgrid/msg.h" // msg_bar_t +#include "smpi/smpi.h" +#include "src/instr/instr_smpi.hpp" +#include "src/internal_config.h" #include #include -#include "src/internal_config.h" + +extern "C" { + +#define PERSISTENT 0x1 +#define NON_PERSISTENT 0x2 +#define SEND 0x4 +#define RECV 0x8 +#define RECV_DELETE 0x10 +#define ISEND 0x20 +#define SSEND 0x40 +#define PREPARED 0x80 +#define FINISHED 0x100 +#define RMA 0x200 +#define ACCUMULATE 0x400 + +enum smpi_process_state { SMPI_UNINITIALIZED, SMPI_INITIALIZED, SMPI_FINALIZED }; + +#define COLL_TAG_REDUCE -112 +#define COLL_TAG_SCATTER -223 +#define COLL_TAG_SCATTERV -334 +#define COLL_TAG_GATHER -445 +#define COLL_TAG_ALLGATHER -556 +#define COLL_TAG_ALLGATHERV -667 +#define COLL_TAG_BARRIER -778 +#define COLL_TAG_REDUCE_SCATTER -889 +#define COLL_TAG_ALLTOALLV -1000 +#define COLL_TAG_ALLTOALL -1112 +#define COLL_TAG_GATHERV -2223 +#define COLL_TAG_BCAST -3334 +#define COLL_TAG_ALLREDUCE -4445 +// SMPI_RMA_TAG has to be the smallest one, as it will be decremented for accumulate ordering. +#define SMPI_RMA_TAG -6666 + +/* Convert between Fortran and C */ + +#define FORT_BOTTOM(addr) ((*(int*)addr) == -200 ? MPI_BOTTOM : (void*)addr) +#define FORT_IN_PLACE(addr) ((*(int*)addr) == -100 ? MPI_IN_PLACE : (void*)addr) +#define FORT_STATUS_IGNORE(addr) (static_cast((*(int*)addr) == -300 ? MPI_STATUS_IGNORE : (void*)addr)) +#define FORT_STATUSES_IGNORE(addr) (static_cast((*(int*)addr) == -400 ? MPI_STATUSES_IGNORE : (void*)addr)) + +extern XBT_PRIVATE MPI_Comm MPI_COMM_UNINITIALIZED; + +typedef SMPI_Cart_topology* MPIR_Cart_Topology; + +typedef SMPI_Graph_topology* MPIR_Graph_Topology; + +typedef SMPI_Dist_Graph_topology* MPIR_Dist_Graph_Topology; + +XBT_PRIVATE SMPI_Process* smpi_process(); +XBT_PRIVATE SMPI_Process* smpi_process_remote(int index); +XBT_PRIVATE int smpi_process_count(); + +XBT_PRIVATE void smpi_deployment_register_process(const char* instance_id, int rank, int index); +XBT_PRIVATE MPI_Comm* smpi_deployment_comm_world(const char* instance_id); +XBT_PRIVATE msg_bar_t smpi_deployment_finalization_barrier(const char* instance_id); +XBT_PRIVATE void smpi_deployment_cleanup_instances(); + +XBT_PRIVATE void smpi_comm_copy_buffer_callback(smx_activity_t comm, void* buff, size_t buff_size); + +XBT_PRIVATE void smpi_comm_null_copy_buffer_callback(smx_activity_t comm, void* buff, size_t buff_size); + +XBT_PRIVATE int smpi_enabled(); +XBT_PRIVATE void smpi_global_init(); +XBT_PRIVATE void smpi_global_destroy(); +XBT_PRIVATE double smpi_mpi_wtime(); +XBT_PRIVATE void smpi_mpi_init(); + +// utilities +extern XBT_PRIVATE double smpi_cpu_threshold; +extern XBT_PRIVATE double smpi_host_speed; +extern XBT_PRIVATE char* smpi_data_exe_start; // start of the data+bss segment of the executable +extern XBT_PRIVATE int smpi_data_exe_size; // size of the data+bss segment of the executable + +enum shared_malloc_type { shmalloc_none, shmalloc_local, shmalloc_global }; +extern XBT_PRIVATE shared_malloc_type smpi_cfg_shared_malloc; // Whether to activate shared malloc + +XBT_PRIVATE void smpi_switch_data_segment(int dest); +XBT_PRIVATE void smpi_really_switch_data_segment(int dest); +XBT_PRIVATE int smpi_is_privatization_file(char* file); + +XBT_PRIVATE void smpi_get_executable_global_size(); +XBT_PRIVATE void smpi_backup_global_memory_segment(); +XBT_PRIVATE void smpi_destroy_global_memory_segments(); +XBT_PRIVATE void smpi_bench_destroy(); +XBT_PRIVATE void smpi_bench_begin(); +XBT_PRIVATE void smpi_bench_end(); +XBT_PRIVATE void smpi_shared_destroy(); + +XBT_PRIVATE void* smpi_get_tmp_sendbuffer(int size); +XBT_PRIVATE void* smpi_get_tmp_recvbuffer(int size); +XBT_PRIVATE void smpi_free_tmp_buffer(void* buf); + +// f77 wrappers +void mpi_init_(int* ierr); +void mpi_finalize_(int* ierr); +void mpi_abort_(int* comm, int* errorcode, int* ierr); +void mpi_comm_rank_(int* comm, int* rank, int* ierr); +void mpi_comm_size_(int* comm, int* size, int* ierr); +double mpi_wtime_(); +double mpi_wtick_(); +void mpi_initialized_(int* flag, int* ierr); + +void mpi_comm_dup_(int* comm, int* newcomm, int* ierr); +void mpi_comm_create_(int* comm, int* group, int* newcomm, int* ierr); +void mpi_comm_free_(int* comm, int* ierr); +void mpi_comm_split_(int* comm, int* color, int* key, int* comm_out, int* ierr); +void mpi_group_incl_(int* group, int* n, int* key, int* group_out, int* ierr); +void mpi_comm_group_(int* comm, int* group_out, int* ierr); +void mpi_comm_create_group_(int* comm, int* group, int, int* comm_out, int* ierr); +void mpi_send_init_(void* buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr); +void mpi_isend_(void* buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr); +void mpi_irsend_(void* buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr); +void mpi_send_(void* buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* ierr); +void mpi_rsend_(void* buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* ierr); +void mpi_recv_init_(void* buf, int* count, int* datatype, int* src, int* tag, int* comm, int* request, int* ierr); +void mpi_irecv_(void* buf, int* count, int* datatype, int* src, int* tag, int* comm, int* request, int* ierr); +void mpi_recv_(void* buf, int* count, int* datatype, int* src, int* tag, int* comm, MPI_Status* status, int* ierr); +void mpi_start_(int* request, int* ierr); +void mpi_startall_(int* count, int* requests, int* ierr); +void mpi_wait_(int* request, MPI_Status* status, int* ierr); +void mpi_waitany_(int* count, int* requests, int* index, MPI_Status* status, int* ierr); +void mpi_waitall_(int* count, int* requests, MPI_Status* status, int* ierr); + +void mpi_barrier_(int* comm, int* ierr); +void mpi_bcast_(void* buf, int* count, int* datatype, int* root, int* comm, int* ierr); +void mpi_reduce_(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* root, int* comm, int* ierr); +void mpi_allreduce_(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr); +void mpi_reduce_scatter_(void* sendbuf, void* recvbuf, int* recvcounts, int* datatype, int* op, int* comm, int* ierr); +void mpi_scatter_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, int* root, + int* comm, int* ierr); +void mpi_scatterv_(void* sendbuf, int* sendcounts, int* displs, int* sendtype, void* recvbuf, int* recvcount, + int* recvtype, int* root, int* comm, int* ierr); +void mpi_gather_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, int* root, + int* comm, int* ierr); +void mpi_gatherv_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcounts, int* displs, + int* recvtype, int* root, int* comm, int* ierr); +void mpi_allgather_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, + int* comm, int* ierr); +void mpi_allgatherv_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* displs, + int* recvtype, int* comm, int* ierr); +void mpi_type_size_(int* datatype, int* size, int* ierr); + +void mpi_scan_(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr); +void mpi_alltoall_(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, + int* comm, int* ierr); +void mpi_alltoallv_(void* sendbuf, int* sendcounts, int* senddisps, int* sendtype, void* recvbuf, int* recvcounts, + int* recvdisps, int* recvtype, int* comm, int* ierr); +void mpi_get_processor_name_(char* name, int* resultlen, int* ierr); +void mpi_test_(int* request, int* flag, MPI_Status* status, int* ierr); +void mpi_testall_(int* count, int* requests, int* flag, MPI_Status* statuses, int* ierr); +void mpi_get_count_(MPI_Status* status, int* datatype, int* count, int* ierr); +void mpi_type_extent_(int* datatype, MPI_Aint* extent, int* ierr); +void mpi_attr_get_(int* comm, int* keyval, void* attr_value, int* flag, int* ierr); +void mpi_type_commit_(int* datatype, int* ierr); +void mpi_type_vector_(int* count, int* blocklen, int* stride, int* old_type, int* newtype, int* ierr); +void mpi_type_hvector_(int* count, int* blocklen, MPI_Aint* stride, int* old_type, int* newtype, int* ierr); +void mpi_type_create_hvector_(int* count, int* blocklen, MPI_Aint* stride, int* old_type, int* newtype, int* ierr); +void mpi_type_free_(int* datatype, int* ierr); +void mpi_type_lb_(int* datatype, MPI_Aint* extent, int* ierr); +void mpi_type_ub_(int* datatype, MPI_Aint* extent, int* ierr); +void mpi_win_fence_(int* assert, int* win, int* ierr); +void mpi_win_free_(int* win, int* ierr); +void mpi_win_create_(int* base, MPI_Aint* size, int* disp_unit, int* info, int* comm, int* win, int* ierr); +void mpi_win_set_name_(int* win, char* name, int* ierr, int size); +void mpi_win_get_name_(int* win, char* name, int* len, int* ierr); +void mpi_win_post_(int* group, int assert, int* win, int* ierr); +void mpi_win_start_(int* group, int assert, int* win, int* ierr); +void mpi_win_complete_(int* win, int* ierr); +void mpi_win_wait_(int* win, int* ierr); +void mpi_win_allocate_(MPI_Aint* size, int* disp_unit, int* info, int* comm, void* base, int* win, int* ierr); +void mpi_win_attach_(int* win, int* base, MPI_Aint* size, int* ierr); +void mpi_win_create_dynamic_(int* info, int* comm, int* win, int* ierr); +void mpi_win_detach_(int* win, int* base, int* ierr); +void mpi_win_set_info_(int* win, int* info, int* ierr); +void mpi_win_get_info_(int* win, int* info, int* ierr); +void mpi_win_get_group_(int* win, int* group, int* ierr); +void mpi_win_get_attr_(int* win, int* type_keyval, void* attribute_val, int* flag, int* ierr); +void mpi_win_set_attr_(int* win, int* type_keyval, void* att, int* ierr); +void mpi_win_delete_attr_(int* win, int* comm_keyval, int* ierr); +void mpi_win_create_keyval_(void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr); +void mpi_win_free_keyval_(int* keyval, int* ierr); +void mpi_win_lock_(int* lock_type, int* rank, int* assert, int* win, int* ierr); +void mpi_win_lock_all_(int* assert, int* win, int* ierr); +void mpi_win_unlock_(int* rank, int* win, int* ierr); +void mpi_win_unlock_all_(int* win, int* ierr); +void mpi_win_flush_(int* rank, int* win, int* ierr); +void mpi_win_flush_local_(int* rank, int* win, int* ierr); +void mpi_win_flush_all_(int* win, int* ierr); +void mpi_win_flush_local_all_(int* win, int* ierr); +void mpi_info_create_(int* info, int* ierr); +void mpi_info_set_(int* info, char* key, char* value, int* ierr, unsigned int keylen, unsigned int valuelen); +void mpi_info_free_(int* info, int* ierr); +void mpi_get_(int* origin_addr, int* origin_count, int* origin_datatype, int* target_rank, MPI_Aint* target_disp, + int* target_count, int* target_datatype, int* win, int* ierr); +void mpi_put_(int* origin_addr, int* origin_count, int* origin_datatype, int* target_rank, MPI_Aint* target_disp, + int* target_count, int* target_datatype, int* win, int* ierr); +void mpi_rget_(int* origin_addr, int* origin_count, int* origin_datatype, int* target_rank, MPI_Aint* target_disp, + int* target_count, int* target_datatype, int* win, int* request, int* ierr); +void mpi_rput_(int* origin_addr, int* origin_count, int* origin_datatype, int* target_rank, MPI_Aint* target_disp, + int* target_count, int* target_datatype, int* win, int* request, int* ierr); +void mpi_fetch_and_op_(int* origin_addr, int* result_addr, int* datatype, int* target_rank, MPI_Aint* target_disp, + int* op, int* win, int* ierr); +void mpi_compare_and_swap_(int* origin_addr, int* compare_addr, int* result_addr, int* datatype, int* target_rank, + MPI_Aint* target_disp, int* win, int* ierr); +void mpi_get_accumulate_(int* origin_addr, int* origin_count, int* origin_datatype, int* result_addr, int* result_count, + int* result_datatype, int* target_rank, MPI_Aint* target_disp, int* target_count, + int* target_datatype, int* op, int* win, int* ierr); +void mpi_rget_accumulate_(int* origin_addr, int* origin_count, int* origin_datatype, int* result_addr, + int* result_count, int* result_datatype, int* target_rank, MPI_Aint* target_disp, + int* target_count, int* target_datatype, int* op, int* win, int* request, int* ierr); +void mpi_accumulate_(int* origin_addr, int* origin_count, int* origin_datatype, int* target_rank, MPI_Aint* target_disp, + int* target_count, int* target_datatype, int* op, int* win, int* ierr); +void mpi_raccumulate_(int* origin_addr, int* origin_count, int* origin_datatype, int* target_rank, + MPI_Aint* target_disp, int* target_count, int* target_datatype, int* op, int* win, int* request, + int* ierr); +void mpi_error_string_(int* errorcode, char* string, int* resultlen, int* ierr); +void mpi_sendrecv_(void* sendbuf, int* sendcount, int* sendtype, int* dst, int* sendtag, void* recvbuf, int* recvcount, + int* recvtype, int* src, int* recvtag, int* comm, MPI_Status* status, int* ierr); + +void mpi_finalized_(int* flag, int* ierr); +void mpi_init_thread_(int* required, int* provided, int* ierr); +void mpi_query_thread_(int* provided, int* ierr); +void mpi_is_thread_main_(int* flag, int* ierr); +void mpi_address_(void* location, MPI_Aint* address, int* ierr); +void mpi_get_address_(void* location, MPI_Aint* address, int* ierr); +void mpi_type_dup_(int* datatype, int* newdatatype, int* ierr); +void mpi_type_set_name_(int* datatype, char* name, int* ierr, int size); +void mpi_type_get_name_(int* datatype, char* name, int* len, int* ierr); +void mpi_type_get_attr_(int* type, int* type_keyval, void* attribute_val, int* flag, int* ierr); +void mpi_type_set_attr_(int* type, int* type_keyval, void* attribute_val, int* ierr); +void mpi_type_delete_attr_(int* type, int* type_keyval, int* ierr); +void mpi_type_create_keyval_(void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr); +void mpi_type_free_keyval_(int* keyval, int* ierr); +void mpi_pcontrol_(int* level, int* ierr); +void mpi_type_get_extent_(int* datatype, MPI_Aint* lb, MPI_Aint* extent, int* ierr); +void mpi_type_get_true_extent_(int* datatype, MPI_Aint* lb, MPI_Aint* extent, int* ierr); +void mpi_op_create_(void* function, int* commute, int* op, int* ierr); +void mpi_op_free_(int* op, int* ierr); +void mpi_op_commutative_(int* op, int* commute, int* ierr); +void mpi_group_free_(int* group, int* ierr); +void mpi_group_size_(int* group, int* size, int* ierr); +void mpi_group_rank_(int* group, int* rank, int* ierr); +void mpi_group_translate_ranks_(int* group1, int* n, int* ranks1, int* group2, int* ranks2, int* ierr); +void mpi_group_compare_(int* group1, int* group2, int* result, int* ierr); +void mpi_group_union_(int* group1, int* group2, int* newgroup, int* ierr); +void mpi_group_intersection_(int* group1, int* group2, int* newgroup, int* ierr); +void mpi_group_difference_(int* group1, int* group2, int* newgroup, int* ierr); +void mpi_group_excl_(int* group, int* n, int* ranks, int* newgroup, int* ierr); +void mpi_group_range_incl_(int* group, int* n, int ranges[][3], int* newgroup, int* ierr); +void mpi_group_range_excl_(int* group, int* n, int ranges[][3], int* newgroup, int* ierr); +void mpi_comm_get_attr_(int* comm, int* comm_keyval, void* attribute_val, int* flag, int* ierr); +void mpi_comm_set_attr_(int* comm, int* comm_keyval, void* attribute_val, int* ierr); +void mpi_comm_delete_attr_(int* comm, int* comm_keyval, int* ierr); +void mpi_comm_create_keyval_(void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr); +void mpi_comm_free_keyval_(int* keyval, int* ierr); +void mpi_comm_get_name_(int* comm, char* name, int* len, int* ierr); +void mpi_comm_compare_(int* comm1, int* comm2, int* result, int* ierr); +void mpi_comm_disconnect_(int* comm, int* ierr); +void mpi_request_free_(int* request, int* ierr); +void mpi_sendrecv_replace_(void* buf, int* count, int* datatype, int* dst, int* sendtag, int* src, int* recvtag, + int* comm, MPI_Status* status, int* ierr); +void mpi_testany_(int* count, int* requests, int* index, int* flag, MPI_Status* status, int* ierr); +void mpi_waitsome_(int* incount, int* requests, int* outcount, int* indices, MPI_Status* status, int* ierr); +void mpi_reduce_local_(void* inbuf, void* inoutbuf, int* count, int* datatype, int* op, int* ierr); +void mpi_reduce_scatter_block_(void* sendbuf, void* recvbuf, int* recvcount, int* datatype, int* op, int* comm, + int* ierr); +void mpi_pack_size_(int* incount, int* datatype, int* comm, int* size, int* ierr); +void mpi_cart_coords_(int* comm, int* rank, int* maxdims, int* coords, int* ierr); +void mpi_cart_create_(int* comm_old, int* ndims, int* dims, int* periods, int* reorder, int* comm_cart, int* ierr); +void mpi_cart_get_(int* comm, int* maxdims, int* dims, int* periods, int* coords, int* ierr); +void mpi_cart_map_(int* comm_old, int* ndims, int* dims, int* periods, int* newrank, int* ierr); +void mpi_cart_rank_(int* comm, int* coords, int* rank, int* ierr); +void mpi_cart_shift_(int* comm, int* direction, int* displ, int* source, int* dest, int* ierr); +void mpi_cart_sub_(int* comm, int* remain_dims, int* comm_new, int* ierr); +void mpi_cartdim_get_(int* comm, int* ndims, int* ierr); +void mpi_graph_create_(int* comm_old, int* nnodes, int* index, int* edges, int* reorder, int* comm_graph, int* ierr); +void mpi_graph_get_(int* comm, int* maxindex, int* maxedges, int* index, int* edges, int* ierr); +void mpi_graph_map_(int* comm_old, int* nnodes, int* index, int* edges, int* newrank, int* ierr); +void mpi_graph_neighbors_(int* comm, int* rank, int* maxneighbors, int* neighbors, int* ierr); +void mpi_graph_neighbors_count_(int* comm, int* rank, int* nneighbors, int* ierr); +void mpi_graphdims_get_(int* comm, int* nnodes, int* nedges, int* ierr); +void mpi_topo_test_(int* comm, int* top_type, int* ierr); +void mpi_error_class_(int* errorcode, int* errorclass, int* ierr); +void mpi_errhandler_create_(void* function, void* errhandler, int* ierr); +void mpi_errhandler_free_(void* errhandler, int* ierr); +void mpi_errhandler_get_(int* comm, void* errhandler, int* ierr); +void mpi_errhandler_set_(int* comm, void* errhandler, int* ierr); +void mpi_comm_set_errhandler_(int* comm, void* errhandler, int* ierr); +void mpi_comm_get_errhandler_(int* comm, void* errhandler, int* ierr); +void mpi_type_contiguous_(int* count, int* old_type, int* newtype, int* ierr); +void mpi_cancel_(int* request, int* ierr); +void mpi_buffer_attach_(void* buffer, int* size, int* ierr); +void mpi_buffer_detach_(void* buffer, int* size, int* ierr); +void mpi_testsome_(int* incount, int* requests, int* outcount, int* indices, MPI_Status* statuses, int* ierr); +void mpi_comm_test_inter_(int* comm, int* flag, int* ierr); +void mpi_unpack_(void* inbuf, int* insize, int* position, void* outbuf, int* outcount, int* type, int* comm, int* ierr); +void mpi_pack_external_size_(char* datarep, int* incount, int* datatype, MPI_Aint* size, int* ierr); +void mpi_pack_external_(char* datarep, void* inbuf, int* incount, int* datatype, void* outbuf, MPI_Aint* outcount, + MPI_Aint* position, int* ierr); +void mpi_unpack_external_(char* datarep, void* inbuf, MPI_Aint* insize, MPI_Aint* position, void* outbuf, int* outcount, + int* datatype, int* ierr); +void mpi_type_hindexed_(int* count, int* blocklens, MPI_Aint* indices, int* old_type, int* newtype, int* ierr); +void mpi_type_create_hindexed_(int* count, int* blocklens, MPI_Aint* indices, int* old_type, int* newtype, int* ierr); +void mpi_type_create_hindexed_block_(int* count, int* blocklength, MPI_Aint* indices, int* old_type, int* newtype, + int* ierr); +void mpi_type_indexed_(int* count, int* blocklens, int* indices, int* old_type, int* newtype, int* ierr); +void mpi_type_create_indexed_(int* count, int* blocklens, int* indices, int* old_type, int* newtype, int* ierr); +void mpi_type_create_indexed_block_(int* count, int* blocklength, int* indices, int* old_type, int* newtype, int* ierr); +void mpi_type_struct_(int* count, int* blocklens, MPI_Aint* indices, int* old_types, int* newtype, int* ierr); +void mpi_type_create_struct_(int* count, int* blocklens, MPI_Aint* indices, int* old_types, int* newtype, int* ierr); +void mpi_ssend_(void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* ierr); +void mpi_ssend_init_(void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr); +void mpi_intercomm_create_(int* local_comm, int* local_leader, int* peer_comm, int* remote_leader, int* tag, + int* comm_out, int* ierr); +void mpi_intercomm_merge_(int* comm, int* high, int* comm_out, int* ierr); +void mpi_bsend_(void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* ierr); +void mpi_bsend_init_(void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr); +void mpi_ibsend_(void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr); +void mpi_comm_remote_group_(int* comm, int* group, int* ierr); +void mpi_comm_remote_size_(int* comm, int* size, int* ierr); +void mpi_issend_(void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr); +void mpi_probe_(int* source, int* tag, int* comm, MPI_Status* status, int* ierr); +void mpi_attr_delete_(int* comm, int* keyval, int* ierr); +void mpi_attr_put_(int* comm, int* keyval, void* attr_value, int* ierr); +void mpi_rsend_init_(void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr); +void mpi_keyval_create_(void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr); +void mpi_keyval_free_(int* keyval, int* ierr); +void mpi_test_cancelled_(MPI_Status* status, int* flag, int* ierr); +void mpi_pack_(void* inbuf, int* incount, int* type, void* outbuf, int* outcount, int* position, int* comm, int* ierr); +void mpi_get_elements_(MPI_Status* status, int* datatype, int* elements, int* ierr); +void mpi_dims_create_(int* nnodes, int* ndims, int* dims, int* ierr); +void mpi_iprobe_(int* source, int* tag, int* comm, int* flag, MPI_Status* status, int* ierr); +void mpi_type_get_envelope_(int* datatype, int* num_integers, int* num_addresses, int* num_datatypes, int* combiner, + int* ierr); +void mpi_type_get_contents_(int* datatype, int* max_integers, int* max_addresses, int* max_datatypes, + int* array_of_integers, MPI_Aint* array_of_addresses, int* array_of_datatypes, int* ierr); +void mpi_type_create_darray_(int* size, int* rank, int* ndims, int* array_of_gsizes, int* array_of_distribs, + int* array_of_dargs, int* array_of_psizes, int* order, int* oldtype, int* newtype, + int* ierr); +void mpi_type_create_resized_(int* oldtype, MPI_Aint* lb, MPI_Aint* extent, int* newtype, int* ierr); +void mpi_type_create_subarray_(int* ndims, int* array_of_sizes, int* array_of_subsizes, int* array_of_starts, + int* order, int* oldtype, int* newtype, int* ierr); +void mpi_type_match_size_(int* typeclass, int* size, int* datatype, int* ierr); +void mpi_alltoallw_(void* sendbuf, int* sendcnts, int* sdispls, int* sendtypes, void* recvbuf, int* recvcnts, + int* rdispls, int* recvtypes, int* comm, int* ierr); +void mpi_exscan_(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr); +void mpi_comm_set_name_(int* comm, char* name, int* ierr, int size); +void mpi_comm_dup_with_info_(int* comm, int* info, int* newcomm, int* ierr); +void mpi_comm_split_type_(int* comm, int* split_type, int* key, int* info, int* newcomm, int* ierr); +void mpi_comm_set_info_(int* comm, int* info, int* ierr); +void mpi_comm_get_info_(int* comm, int* info, int* ierr); +void mpi_info_get_(int* info, char* key, int* valuelen, char* value, int* flag, int* ierr, unsigned int keylen); +void mpi_comm_create_errhandler_(void* function, void* errhandler, int* ierr); +void mpi_add_error_class_(int* errorclass, int* ierr); +void mpi_add_error_code_(int* errorclass, int* errorcode, int* ierr); +void mpi_add_error_string_(int* errorcode, char* string, int* ierr); +void mpi_comm_call_errhandler_(int* comm, int* errorcode, int* ierr); +void mpi_info_dup_(int* info, int* newinfo, int* ierr); +void mpi_info_get_valuelen_(int* info, char* key, int* valuelen, int* flag, int* ierr, unsigned int keylen); +void mpi_info_delete_(int* info, char* key, int* ierr, unsigned int keylen); +void mpi_info_get_nkeys_(int* info, int* nkeys, int* ierr); +void mpi_info_get_nthkey_(int* info, int* n, char* key, int* ierr, unsigned int keylen); +void mpi_get_version_(int* version, int* subversion, int* ierr); +void mpi_get_library_version_(char* version, int* len, int* ierr); +void mpi_request_get_status_(int* request, int* flag, MPI_Status* status, int* ierr); +void mpi_grequest_start_(void* query_fn, void* free_fn, void* cancel_fn, void* extra_state, int* request, int* ierr); +void mpi_grequest_complete_(int* request, int* ierr); +void mpi_status_set_cancelled_(MPI_Status* status, int* flag, int* ierr); +void mpi_status_set_elements_(MPI_Status* status, int* datatype, int* count, int* ierr); +void mpi_comm_connect_(char* port_name, int* info, int* root, int* comm, int* newcomm, int* ierr); +void mpi_publish_name_(char* service_name, int* info, char* port_name, int* ierr); +void mpi_unpublish_name_(char* service_name, int* info, char* port_name, int* ierr); +void mpi_lookup_name_(char* service_name, int* info, char* port_name, int* ierr); +void mpi_comm_join_(int* fd, int* intercomm, int* ierr); +void mpi_open_port_(int* info, char* port_name, int* ierr); +void mpi_close_port_(char* port_name, int* ierr); +void mpi_comm_accept_(char* port_name, int* info, int* root, int* comm, int* newcomm, int* ierr); +void mpi_comm_spawn_(char* command, char* argv, int* maxprocs, int* info, int* root, int* comm, int* intercomm, + int* array_of_errcodes, int* ierr); +void mpi_comm_spawn_multiple_(int* count, char* array_of_commands, char** array_of_argv, int* array_of_maxprocs, + int* array_of_info, int* root, int* comm, int* intercomm, int* array_of_errcodes, + int* ierr); +void mpi_comm_get_parent_(int* parent, int* ierr); +void mpi_file_close_(int* file, int* ierr); +void mpi_file_delete_(char* filename, int* info, int* ierr); +void mpi_file_open_(int* comm, char* filename, int* amode, int* info, int* fh, int* ierr); +void mpi_file_set_view_(int* fh, long long int* offset, int* etype, int* filetype, char* datarep, int* info, int* ierr); +void mpi_file_read_(int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); +void mpi_file_write_(int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); + +// TODO, make this static and expose it more cleanly + +struct s_smpi_privatization_region_t { + void* address; + int file_descriptor; +}; +typedef s_smpi_privatization_region_t* smpi_privatization_region_t; + +extern XBT_PRIVATE int smpi_loaded_page; +extern XBT_PRIVATE int smpi_universe_size; +XBT_PRIVATE smpi_privatization_region_t smpi_init_global_memory_segment_process(); +} /** * Get the address of the beginning of the memory page where addr is located. @@ -17,11 +422,10 @@ * * This is used when privatizing. */ -#define TOPAGE(addr) (void *)(((unsigned long)(addr) / xbt_pagesize) * xbt_pagesize) +#define TOPAGE(addr) (void*)(((unsigned long)(addr) / xbt_pagesize) * xbt_pagesize) #if HAVE_PAPI -typedef - std::vector> papi_counter_t; +typedef std::vector> papi_counter_t; XBT_PRIVATE papi_counter_t& smpi_process_papi_counters(); XBT_PRIVATE int smpi_process_papi_event_set(); #endif @@ -34,14 +438,13 @@ XBT_PUBLIC(smpi_trace_call_location_t*) smpi_process_get_call_location(); XBT_PUBLIC(smpi_trace_call_location_t*) smpi_trace_get_call_location(); } -typedef enum { +enum smpi_priv_strategies { SMPI_PRIVATIZE_NONE = 0, SMPI_PRIVATIZE_MMAP = 1, SMPI_PRIVATIZE_DLOPEN = 2, SMPI_PRIVATIZE_DEFAULT = SMPI_PRIVATIZE_MMAP -} smpi_priv_strategies; +}; extern XBT_PRIVATE int smpi_privatize_global_variables; #endif - diff --git a/src/smpi/include/smpi_coll.hpp b/src/smpi/include/smpi_coll.hpp index 8410ae7ab7..99a7377644 100644 --- a/src/smpi/include/smpi_coll.hpp +++ b/src/smpi/include/smpi_coll.hpp @@ -8,14 +8,15 @@ #ifndef SMPI_COLL_HPP #define SMPI_COLL_HPP +#include "private.hpp" #include "xbt/base.h" /** \brief MPI collective description */ -#define COLL_DEFS(cat, ret, args, args2)\ - static void set_##cat(const char* name);\ - static s_mpi_coll_description_t mpi_coll_##cat##_description[];\ - static int (*cat ) args; +#define COLL_DEFS(cat, ret, args, args2) \ + static void set_##cat(std::string name); \ + static s_mpi_coll_description_t mpi_coll_##cat##_description[]; \ + static int(*cat) args; #define COLL_SIG(cat, ret, args, args2)\ static int cat args; @@ -81,17 +82,16 @@ static ret cat (COLL_UNPAREN args); \ namespace simgrid{ namespace smpi{ -struct mpi_coll_description { +struct s_mpi_coll_description_t { const char *name; const char *description; void *coll; }; -typedef struct mpi_coll_description s_mpi_coll_description_t; class Colls{ public: static XBT_PUBLIC(void) coll_help(const char *category, s_mpi_coll_description_t * table); - static XBT_PUBLIC(int) find_coll_description(s_mpi_coll_description_t * table, const char *name, const char *desc); + static XBT_PUBLIC(int) find_coll_description(s_mpi_coll_description_t* table, std::string name, const char* desc); static void set_collectives(); // for each collective type, create the set_* prototype, the description array and the function pointer diff --git a/src/smpi/include/smpi_comm.hpp b/src/smpi/include/smpi_comm.hpp index ed621f1a98..86f00b24f7 100644 --- a/src/smpi/include/smpi_comm.hpp +++ b/src/smpi/include/smpi_comm.hpp @@ -58,7 +58,7 @@ class Comm : public F2C, public Keyval{ static void destroy(MPI_Comm comm); void init_smp(); - int add_f(); + int add_f() override; static void free_f(int id); static Comm* f2c(int); diff --git a/src/smpi/include/smpi_datatype.hpp b/src/smpi/include/smpi_datatype.hpp index 3b1fd7dab9..2453f1017b 100644 --- a/src/smpi/include/smpi_datatype.hpp +++ b/src/smpi/include/smpi_datatype.hpp @@ -30,105 +30,104 @@ extern const MPI_Datatype MPI_PTR; //The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC. -typedef struct { +struct float_int { float value; int index; -} float_int; -typedef struct { +}; +struct float_float { float value; float index; -} float_float; -typedef struct { +}; +struct long_long { long value; long index; -} long_long; -typedef struct { +}; +struct double_double { double value; double index; -} double_double; -typedef struct { +}; +struct long_int { long value; int index; -} long_int; -typedef struct { +}; +struct double_int { double value; int index; -} double_int; -typedef struct { +}; +struct short_int { short value; int index; -} short_int; -typedef struct { +}; +struct int_int { int value; int index; -} int_int; -typedef struct { +}; +struct long_double_int { long double value; int index; -} long_double_int; -typedef struct { +}; +struct integer128_t { int64_t value; int64_t index; -} integer128_t; - +}; namespace simgrid{ namespace smpi{ class Datatype : public F2C, public Keyval{ - private: - char* name_; - size_t size_; - MPI_Aint lb_; - MPI_Aint ub_; - int flags_; - int refcount_; - - public: - static std::unordered_map keyvals_; - static int keyval_id_; - - Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags); - Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags); - Datatype(Datatype *datatype, int* ret); - virtual ~Datatype(); - - char* name(); - size_t size(); - MPI_Aint lb(); - MPI_Aint ub(); - int flags(); - int refcount(); - - void ref(); - static void unref(MPI_Datatype datatype); - void commit(); - bool is_valid(); - void addflag(int flag); - int extent(MPI_Aint * lb, MPI_Aint * extent); - MPI_Aint get_extent(); - void get_name(char* name, int* length); - void set_name(char* name); - static int copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, - void *recvbuf, int recvcount, MPI_Datatype recvtype); - virtual void serialize( void* noncontiguous, void *contiguous, - int count); - virtual void unserialize( void* contiguous, void *noncontiguous, - int count, MPI_Op op); - static int keyval_create(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state); - static int keyval_free(int* keyval); - int pack(void* inbuf, int incount, void* outbuf, int outcount, int* position, MPI_Comm comm); - int unpack(void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Comm comm); - - - static int create_contiguous(int count, MPI_Datatype old_type, MPI_Aint lb, MPI_Datatype* new_type); - static int create_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* new_type); - static int create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type); - static int create_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type); - static int create_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype old_type, MPI_Datatype* new_type); - static int create_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* new_type); - - static Datatype* f2c(int id); + char* name_; + size_t size_; + MPI_Aint lb_; + MPI_Aint ub_; + int flags_; + int refcount_; + +public: + static std::unordered_map keyvals_; + static int keyval_id_; + + Datatype(int size, MPI_Aint lb, MPI_Aint ub, int flags); + Datatype(char* name, int size, MPI_Aint lb, MPI_Aint ub, int flags); + Datatype(Datatype* datatype, int* ret); + virtual ~Datatype(); + + char* name(); + size_t size(); + MPI_Aint lb(); + MPI_Aint ub(); + int flags(); + int refcount(); + + void ref(); + static void unref(MPI_Datatype datatype); + void commit(); + bool is_valid(); + bool is_basic(); + void addflag(int flag); + int extent(MPI_Aint* lb, MPI_Aint* extent); + MPI_Aint get_extent(); + void get_name(char* name, int* length); + void set_name(char* name); + static int copy(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, + MPI_Datatype recvtype); + virtual void serialize(void* noncontiguous, void* contiguous, int count); + virtual void unserialize(void* contiguous, void* noncontiguous, int count, MPI_Op op); + static int keyval_create(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, + void* extra_state); + static int keyval_free(int* keyval); + int pack(void* inbuf, int incount, void* outbuf, int outcount, int* position, MPI_Comm comm); + int unpack(void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Comm comm); + + static int create_contiguous(int count, MPI_Datatype old_type, MPI_Aint lb, MPI_Datatype* new_type); + static int create_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* new_type); + static int create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type); + static int create_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type); + static int create_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype old_type, + MPI_Datatype* new_type); + static int create_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, + MPI_Datatype* new_type); + + static Datatype* f2c(int id); }; } diff --git a/src/smpi/include/smpi_datatype_derived.hpp b/src/smpi/include/smpi_datatype_derived.hpp index b450bd9f98..9e1f4c8709 100644 --- a/src/smpi/include/smpi_datatype_derived.hpp +++ b/src/smpi/include/smpi_datatype_derived.hpp @@ -13,91 +13,70 @@ namespace simgrid{ namespace smpi{ class Type_Contiguous: public Datatype { - private: - int block_count_; - MPI_Datatype old_type_; - public: - Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type); - ~Type_Contiguous(); - void serialize( void* noncontiguous, void *contiguous, - int count); - void unserialize( void* contiguous_vector, void *noncontiguous_vector, - int count, MPI_Op op); -}; + int block_count_; + MPI_Datatype old_type_; -class Type_Vector: public Datatype{ - private: - int block_count_; - int block_length_; - int block_stride_; - MPI_Datatype old_type_; - public: - Type_Vector(int size,MPI_Aint lb, MPI_Aint ub, int flags, int count, int blocklen, int stride, MPI_Datatype old_type); - ~Type_Vector(); - void serialize( void* noncontiguous, void *contiguous, - int count); - void unserialize( void* contiguous_vector, void *noncontiguous_vector, - int count, MPI_Op op); +public: + Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type); + ~Type_Contiguous(); + void serialize(void* noncontiguous, void* contiguous, int count); + void unserialize(void* contiguous_vector, void* noncontiguous_vector, int count, MPI_Op op); }; class Type_Hvector: public Datatype{ - private: - int block_count_; - int block_length_; - MPI_Aint block_stride_; - MPI_Datatype old_type_; - public: - Type_Hvector(int size,MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int block_length, MPI_Aint block_stride, MPI_Datatype old_type); - ~Type_Hvector(); - void serialize( void* noncontiguous, void *contiguous, - int count); - void unserialize( void* contiguous_vector, void *noncontiguous_vector, - int count, MPI_Op op); + int block_count_; + int block_length_; + MPI_Aint block_stride_; + MPI_Datatype old_type_; + +public: + Type_Hvector(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int block_length, MPI_Aint block_stride, + MPI_Datatype old_type); + ~Type_Hvector(); + void serialize(void* noncontiguous, void* contiguous, int count); + void unserialize(void* contiguous_vector, void* noncontiguous_vector, int count, MPI_Op op); }; -class Type_Indexed: public Datatype{ - private: - int block_count_; - int* block_lengths_; - int* block_indices_; - MPI_Datatype old_type_; - public: - Type_Indexed(int size,MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int* block_lengths, int* block_indices, MPI_Datatype old_type); - ~Type_Indexed(); - void serialize( void* noncontiguous, void *contiguous, - int count); - void unserialize( void* contiguous_vector, void *noncontiguous_vector, - int count, MPI_Op op); +class Type_Vector : public Type_Hvector { +public: + Type_Vector(int size, MPI_Aint lb, MPI_Aint ub, int flags, int count, int blocklen, int stride, + MPI_Datatype old_type); }; class Type_Hindexed: public Datatype{ - private: - int block_count_; - int* block_lengths_; - MPI_Aint* block_indices_; - MPI_Datatype old_type_; - public: - Type_Hindexed(int size,MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int* block_lengths, MPI_Aint* block_indices, MPI_Datatype old_type); - ~Type_Hindexed(); - void serialize( void* noncontiguous, void *contiguous, - int count); - void unserialize( void* contiguous_vector, void *noncontiguous_vector, - int count, MPI_Op op); + int block_count_; + int* block_lengths_; + MPI_Aint* block_indices_; + MPI_Datatype old_type_; + +public: + Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int* block_lengths, + MPI_Aint* block_indices, MPI_Datatype old_type); + Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int* block_lengths, int* block_indices, + MPI_Datatype old_type, MPI_Aint factor); + ~Type_Hindexed(); + void serialize(void* noncontiguous, void* contiguous, int count); + void unserialize(void* contiguous_vector, void* noncontiguous_vector, int count, MPI_Op op); +}; + +class Type_Indexed : public Type_Hindexed { +public: + Type_Indexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int* block_lengths, int* block_indices, + MPI_Datatype old_type); }; class Type_Struct: public Datatype{ - private: - int block_count_; - int* block_lengths_; - MPI_Aint* block_indices_; - MPI_Datatype* old_types_; - public: - Type_Struct(int size,MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int* block_lengths, MPI_Aint* block_indices, MPI_Datatype* old_types); - ~Type_Struct(); - void serialize( void* noncontiguous, void *contiguous, - int count); - void unserialize( void* contiguous_vector, void *noncontiguous_vector, - int count, MPI_Op op); + int block_count_; + int* block_lengths_; + MPI_Aint* block_indices_; + MPI_Datatype* old_types_; + +public: + Type_Struct(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, int* block_lengths, + MPI_Aint* block_indices, MPI_Datatype* old_types); + ~Type_Struct(); + void serialize(void* noncontiguous, void* contiguous, int count); + void unserialize(void* contiguous_vector, void* noncontiguous_vector, int count, MPI_Op op); }; diff --git a/src/smpi/include/smpi_f2c.hpp b/src/smpi/include/smpi_f2c.hpp index 207c699c4f..03d8908047 100644 --- a/src/smpi/include/smpi_f2c.hpp +++ b/src/smpi/include/smpi_f2c.hpp @@ -33,10 +33,12 @@ class F2C { static void delete_lookup(); static std::unordered_map* lookup(); + virtual ~F2C() = default; + //Override these to handle specific values. - int add_f(); + virtual int add_f(); static void free_f(int id); - int c2f(); + virtual int c2f(); // This method should be overridden in all subclasses to avoid casting the result when calling it. // For the default one, the MPI_*_NULL returned is assumed to be NULL. diff --git a/src/smpi/include/smpi_group.hpp b/src/smpi/include/smpi_group.hpp index 73803641d1..1bb4d1711a 100644 --- a/src/smpi/include/smpi_group.hpp +++ b/src/smpi/include/smpi_group.hpp @@ -8,6 +8,8 @@ #define SMPI_GROUP_HPP_INCLUDED #include "smpi_f2c.hpp" +#include +#include namespace simgrid{ namespace smpi{ @@ -15,14 +17,17 @@ namespace smpi{ class Group : public F2C{ private: int size_; - int *rank_to_index_map_; - std::unordered_map index_to_rank_map_; + /* This is actually a map from int to int. We could use + * std::map here, but looking up a value there costs O(log(n)). + * For a vector, this costs O(1). We hence go with the vector. + */ + std::vector rank_to_index_map_; + std::vector index_to_rank_map_; int refcount_; public: explicit Group(); explicit Group(int size); explicit Group(Group* origin); - ~Group(); void set_mapping(int index, int rank); int index(int rank); diff --git a/src/smpi/include/smpi_keyvals.hpp b/src/smpi/include/smpi_keyvals.hpp index c0ee39515a..48f60ac4a4 100644 --- a/src/smpi/include/smpi_keyvals.hpp +++ b/src/smpi/include/smpi_keyvals.hpp @@ -7,29 +7,28 @@ #define SMPI_KEYVALS_HPP_INCLUDED #include "smpi/smpi.h" -#include "xbt/ex.hpp" #include -typedef struct smpi_delete_fn{ +struct smpi_delete_fn { MPI_Comm_delete_attr_function *comm_delete_fn; MPI_Type_delete_attr_function *type_delete_fn; MPI_Win_delete_attr_function *win_delete_fn; -} smpi_delete_fn; +}; -typedef struct smpi_copy_fn{ +struct smpi_copy_fn { MPI_Comm_copy_attr_function *comm_copy_fn; MPI_Type_copy_attr_function *type_copy_fn; MPI_Win_copy_attr_function *win_copy_fn; -} smpi_copy_fn; +}; -typedef struct s_smpi_key_elem { +struct s_smpi_key_elem_t { smpi_copy_fn copy_fn; smpi_delete_fn delete_fn; int refcount; -} s_smpi_mpi_key_elem_t; +}; -typedef struct s_smpi_key_elem *smpi_key_elem; +typedef s_smpi_key_elem_t* smpi_key_elem; namespace simgrid{ namespace smpi{ @@ -54,7 +53,7 @@ class Keyval{ template int Keyval::keyval_create(smpi_copy_fn copy_fn, smpi_delete_fn delete_fn, int* keyval, void* extra_state){ - smpi_key_elem value = (smpi_key_elem) xbt_new0(s_smpi_mpi_key_elem_t,1); + smpi_key_elem value = new s_smpi_key_elem_t; value->copy_fn=copy_fn; value->delete_fn=delete_fn; @@ -75,7 +74,7 @@ template int Keyval::keyval_free(int* keyval){ } if(elem->refcount==1){ T::keyvals_.erase(*keyval); - xbt_free(elem); + delete elem; }else{ elem->refcount--; } diff --git a/src/smpi/include/smpi_process.hpp b/src/smpi/include/smpi_process.hpp index f532ec7522..0b11c1fcd7 100644 --- a/src/smpi/include/smpi_process.hpp +++ b/src/smpi/include/smpi_process.hpp @@ -7,8 +7,9 @@ #ifndef SMPI_PROCESS_HPP #define SMPI_PROCESS_HPP -#include "src/instr/instr_smpi.h" +#include "private.hpp" #include "simgrid/s4u/Mailbox.hpp" +#include "src/instr/instr_smpi.hpp" #include "xbt/synchro.h" namespace simgrid{ @@ -36,6 +37,7 @@ class Process { int return_value_ = 0; smpi_trace_call_location_t trace_call_loc_; smx_actor_t process_ = nullptr; + smpi_privatization_region_t privatized_region_; #if HAVE_PAPI /** Contains hardware data as read by PAPI **/ int papi_event_set_; @@ -53,8 +55,9 @@ class Process { void set_user_data(void *data); void *get_user_data(); smpi_trace_call_location_t* call_location(); + void set_privatized_region(smpi_privatization_region_t region); + smpi_privatization_region_t privatized_region(); int index(); - MPI_Comm comm_world(); smx_mailbox_t mailbox(); smx_mailbox_t mailbox_small(); xbt_mutex_t mailboxes_mutex(); @@ -65,6 +68,7 @@ class Process { xbt_os_timer_t timer(); void simulated_start(); double simulated_elapsed(); + MPI_Comm comm_world(); MPI_Comm comm_self(); MPI_Comm comm_intra(); void set_comm_intra(MPI_Comm comm); diff --git a/src/smpi/include/smpi_request.hpp b/src/smpi/include/smpi_request.hpp index 5a11b2d009..f6c69ac21f 100644 --- a/src/smpi/include/smpi_request.hpp +++ b/src/smpi/include/smpi_request.hpp @@ -91,7 +91,7 @@ class Request : public F2C { static int match_send(void* a, void* b, simgrid::kernel::activity::CommImpl* ignored); static int match_recv(void* a, void* b, simgrid::kernel::activity::CommImpl* ignored); - int add_f(); + int add_f() override; static void free_f(int id); static Request* f2c(int); diff --git a/src/smpi/include/smpi_topo.hpp b/src/smpi/include/smpi_topo.hpp index d0cb5709ea..9dd874258c 100644 --- a/src/smpi/include/smpi_topo.hpp +++ b/src/smpi/include/smpi_topo.hpp @@ -17,8 +17,10 @@ namespace smpi{ class Topo { public: virtual ~Topo()=default; - protected: - MPI_Comm comm_; + MPI_Comm getComm() const { return comm_; } + void setComm(MPI_Comm comm) { comm_ = comm; } + private: + MPI_Comm comm_; }; @@ -46,7 +48,6 @@ class Topo_Cart: public Topo { class Topo_Graph: public Topo { private: int nnodes_; - int nedges_; int *index_; int *edges_; public: @@ -56,13 +57,10 @@ class Topo_Graph: public Topo { class Topo_Dist_Graph: public Topo { private: - int indegree_; int *in_; int *in_weights_; - int outdegree_; int *out_; int *out_weights_; - int is_weighted_; public: Topo_Dist_Graph(); ~Topo_Dist_Graph(); diff --git a/src/include/smpi/smpi_utils.hpp b/src/smpi/include/smpi_utils.hpp similarity index 66% rename from src/include/smpi/smpi_utils.hpp rename to src/smpi/include/smpi_utils.hpp index 0f98f38a44..972e2854b4 100644 --- a/src/include/smpi/smpi_utils.hpp +++ b/src/smpi/include/smpi_utils.hpp @@ -7,19 +7,19 @@ #define SMPI_UTILS_HPP #include "xbt/base.h" #include +#include #include -SG_BEGIN_DECL() +extern "C" { // Methods used to parse and store the values for timing injections in smpi -typedef struct s_smpi_factor *smpi_os_factor_t; -typedef struct s_smpi_factor{ - size_t factor=0; +struct s_smpi_factor_t { + size_t factor = 0; std::vector values; -} s_smpi_factor_t; +}; +typedef s_smpi_factor_t* smpi_os_factor_t; +} -SG_END_DECL() - -XBT_PUBLIC(std::vector) parse_factor(const char *smpi_coef_string); +XBT_PUBLIC(std::vector) parse_factor(std::string smpi_coef_string); #endif diff --git a/src/smpi/include/smpi_win.hpp b/src/smpi/include/smpi_win.hpp index ea49c1238f..8106b22630 100644 --- a/src/smpi/include/smpi_win.hpp +++ b/src/smpi/include/smpi_win.hpp @@ -7,8 +7,10 @@ #ifndef SMPI_WIN_HPP_INCLUDED #define SMPI_WIN_HPP_INCLUDED +#include "smpi_f2c.hpp" #include "smpi_keyvals.hpp" #include "xbt/synchro.h" +#include #include #include diff --git a/src/smpi/internals/SmpiHost.cpp b/src/smpi/internals/SmpiHost.cpp index 2fe8025add..380c72d527 100644 --- a/src/smpi/internals/SmpiHost.cpp +++ b/src/smpi/internals/SmpiHost.cpp @@ -5,7 +5,7 @@ #include "SmpiHost.hpp" #include "simgrid/s4u/VirtualMachine.hpp" -#include "smpi/smpi_utils.hpp" +#include "smpi_utils.hpp" #include #include @@ -114,23 +114,5 @@ SmpiHost::SmpiHost(simgrid::s4u::Host *ptr) : host(ptr) } SmpiHost::~SmpiHost()=default; - -static void onCreation(simgrid::s4u::Host& host) -{ -} - -static void onHostDestruction(simgrid::s4u::Host& host) -{ - // Ignore virtual machines - if (dynamic_cast(&host)) - return; -} - -void sg_smpi_host_init() -{ - simgrid::s4u::Host::onCreation.connect(&onCreation); - simgrid::s4u::Host::onDestruction.connect(&onHostDestruction); -} - } } diff --git a/src/smpi/internals/instr_smpi.cpp b/src/smpi/internals/instr_smpi.cpp index 69ffcb27b3..6d219aa848 100644 --- a/src/smpi/internals/instr_smpi.cpp +++ b/src/smpi/internals/instr_smpi.cpp @@ -4,103 +4,73 @@ /* 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 "private.h" #include "private.hpp" +#include #include #include #include #include #include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_smpi, instr, "Tracing SMPI"); -static std::unordered_map*> keys; - -static const char *smpi_colors[] ={ - "recv", "1 0 0", - "irecv", "1 0.52 0.52", - "send", "0 0 1", - "isend", "0.52 0.52 1", - "sendrecv", "0 1 1", - "wait", "1 1 0", - "waitall", "0.78 0.78 0", - "waitany", "0.78 0.78 0.58", - "test", "0.52 0.52 0", - - "allgather", "1 0 0", - "allgatherv", "1 0.52 0.52", - "allreduce", "1 0 1", - "alltoall", "0.52 0 1", - "alltoallv", "0.78 0.52 1", - "barrier", "0 0.78 0.78", - "bcast", "0 0.78 0.39", - "gather", "1 1 0", - "gatherv", "1 1 0.52", - "reduce", "0 1 0", - "reducescatter", "0.52 1 0.52", - "scan", "1 0.58 0.23", - "exscan", "1 0.54 0.25", - "scatterv", "0.52 0 0.52", - "scatter", "1 0.74 0.54", - - "computing", "0 1 1", - "sleeping", "0 0.5 0.5", - - "init", "0 1 0", - "finalize", "0 1 0", - - "put", "0.3 1 0", - "get", "0 1 0.3", - "accumulate", "1 0.3 0", - "win_fence", "1 0 0.3", - "win_post", "1 0 0.8", - "win_wait", "1 0.8 0", - "win_start", "0.8 0 1", - "win_complete", "0.8 1 0", - nullptr, nullptr, -}; +static std::unordered_map*> keys; -static char *str_tolower (const char *str) -{ - char* ret = xbt_strdup(str); - int n = strlen(ret); - for (int i = 0; i < n; i++) - ret[i] = tolower (str[i]); - return ret; -} +static const char* smpi_colors[] = { + "recv", "1 0 0", "irecv", "1 0.52 0.52", "send", "0 0 1", + "isend", "0.52 0.52 1", "sendrecv", "0 1 1", "wait", "1 1 0", + "waitall", "0.78 0.78 0", "waitany", "0.78 0.78 0.58", "test", "0.52 0.52 0", + + "allgather", "1 0 0", "allgatherv", "1 0.52 0.52", "allreduce", "1 0 1", + "alltoall", "0.52 0 1", "alltoallv", "0.78 0.52 1", "barrier", "0 0.78 0.78", + "bcast", "0 0.78 0.39", "gather", "1 1 0", "gatherv", "1 1 0.52", + "reduce", "0 1 0", "reducescatter", "0.52 1 0.52", "scan", "1 0.58 0.23", + "exscan", "1 0.54 0.25", "scatterv", "0.52 0 0.52", "scatter", "1 0.74 0.54", + + "computing", "0 1 1", "sleeping", "0 0.5 0.5", -static const char *instr_find_color (const char *state) + "init", "0 1 0", "finalize", "0 1 0", + + "put", "0.3 1 0", "get", "0 1 0.3", "accumulate", "1 0.3 0", + "rput", "0.3 1 0", "rget", "0 1 0.3", "raccumulate", "1 0.3 0", + "compare_and_swap", "0.3 1 0", "get_accumulate", "0 1 0.3", "rget_accumulate", "1 0.3 0", + "win_fence", "1 0 0.3", "win_post", "1 0 0.8", "win_wait", "1 0.8 0", + "win_start", "0.8 0 1", "win_complete", "0.8 1 0", "win_lock", "1 0 0.3", + "win_unlock", "1 0 0.3", "win_lock_all", "1 0 0.8", "win_unlock_all", "1 0.8 0", + "win_flush", "1 0 0.3", "win_flush_local", "1 0 0.8", "win_flush_all", "1 0.8 0", + "win_flush_local_all", "1 0 0.3", "" , "" +}; + +static const char* instr_find_color(const char* state) { - char* target = str_tolower(state); + std::string target = std::string(state); + boost::algorithm::to_lower(target); const char* ret = nullptr; unsigned int i = 0; const char* current = smpi_colors[i]; while (current != nullptr) { - if (strcmp (state, current) == 0 //exact match - || strstr(target, current) != 0 ){//as substring - ret = smpi_colors[i+1]; - break; + if (target == current // exact match + || strstr(target.c_str(), current) != 0) { // as substring + ret = smpi_colors[i + 1]; + break; } i+=2; current = smpi_colors[i]; } - xbt_free(target); return ret; } -XBT_PRIVATE char *smpi_container(int rank, char *container, int n) +XBT_PRIVATE container_t smpi_container(int rank) { - snprintf(container, n, "rank-%d", rank); - return container; + return simgrid::instr::Container::byName(std::string("rank-") + std::to_string(rank)); } -static char *TRACE_smpi_get_key(int src, int dst, int tag, char *key, int n, int send); - -static char *TRACE_smpi_put_key(int src, int dst, int tag, char *key, int n, int send) +static std::string TRACE_smpi_put_key(int src, int dst, int tag, int send) { - //get the dynar for src#dst - char aux[INSTR_DEFAULT_STR_SIZE]; - snprintf(aux, INSTR_DEFAULT_STR_SIZE, "%d#%d#%d#%d", src, dst, tag, send); + // get the deque for src#dst + std::string aux = + std::to_string(src) + "#" + std::to_string(dst) + "#" + std::to_string(tag) + "#" + std::to_string(send); auto it = keys.find(aux); std::deque* d; @@ -113,7 +83,8 @@ static char *TRACE_smpi_put_key(int src, int dst, int tag, char *key, int n, int //generate the key static unsigned long long counter = 0; counter++; - snprintf(key, n, "%d_%d_%d_%llu", src, dst, tag, counter); + std::string key = + std::to_string(src) + "_" + std::to_string(dst) + "_" + std::to_string(tag) + "_" + std::to_string(counter); //push it d->push_back(key); @@ -121,16 +92,17 @@ static char *TRACE_smpi_put_key(int src, int dst, int tag, char *key, int n, int return key; } -static char *TRACE_smpi_get_key(int src, int dst, int tag, char *key, int n, int send) +static std::string TRACE_smpi_get_key(int src, int dst, int tag, int send) { - char aux[INSTR_DEFAULT_STR_SIZE]; - snprintf(aux, INSTR_DEFAULT_STR_SIZE, "%d#%d#%d#%d", src, dst, tag, send==1?0:1); + std::string key; + std::string aux = std::to_string(src) + "#" + std::to_string(dst) + "#" + std::to_string(tag) + "#" + + std::to_string(send == 1 ? 0 : 1); auto it = keys.find(aux); if (it == keys.end()) { // first posted - TRACE_smpi_put_key(src, dst, tag, key, n, send); + key = TRACE_smpi_put_key(src, dst, tag, send); } else { - snprintf(key, n, "%s", it->second->front().c_str()); + key = it->second->front(); it->second->pop_front(); } return key; @@ -138,16 +110,6 @@ static char *TRACE_smpi_get_key(int src, int dst, int tag, char *key, int n, int static std::unordered_map process_category; -static void cleanup_extra_data (instr_extra_data extra){ - if(extra!=nullptr){ - if(extra->sendcounts!=nullptr) - xbt_free(extra->sendcounts); - if(extra->recvcounts!=nullptr) - xbt_free(extra->recvcounts); - xbt_free(extra); - } -} - void TRACE_internal_smpi_set_category (const char *category) { if (not TRACE_smpi_is_enabled()) @@ -185,21 +147,19 @@ void TRACE_smpi_init(int rank) if (not TRACE_smpi_is_enabled()) return; - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); + std::string str = std::string("rank-") + std::to_string(rank); container_t father; if (TRACE_smpi_is_grouped()){ - father = PJ_container_get(sg_host_self_get_name()); + father = simgrid::instr::Container::byNameOrNull(sg_host_self_get_name()); }else{ - father = PJ_container_get_root (); + father = simgrid::instr::Container::getRoot(); } - xbt_assert(father!=nullptr, - "Could not find a parent for mpi rank %s at function %s", str, __FUNCTION__); + xbt_assert(father != nullptr, "Could not find a parent for mpi rank %s at function %s", str.c_str(), __FUNCTION__); #if HAVE_PAPI container_t container = #endif - new simgrid::instr::Container(str, simgrid::instr::INSTR_SMPI, father); + new simgrid::instr::Container(str, "MPI", father); #if HAVE_PAPI papi_counter_t counters = smpi_process()->papi_counters(); @@ -209,7 +169,7 @@ void TRACE_smpi_init(int rank) * multiple times but only the last one would be used... */ if (s_type::getOrNull(it.first.c_str(), container->type_) == nullptr) { - Type::variableNew(it.first.c_str(), nullptr, container->type_); + Type::variableNew(it.first.c_str(), "", container->type_); } } #endif @@ -220,179 +180,86 @@ void TRACE_smpi_finalize(int rank) if (not TRACE_smpi_is_enabled()) return; - char str[INSTR_DEFAULT_STR_SIZE]; - container_t container = PJ_container_get(smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE)); - PJ_container_remove_from_parent (container); + container_t container = smpi_container(rank); + container->removeFromParent(); delete container; } -void TRACE_smpi_collective_in(int rank, const char *operation, instr_extra_data extra) -{ - if (not TRACE_smpi_is_enabled()) { - cleanup_extra_data(extra); - return; - } - - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - const char *color = instr_find_color (operation); - simgrid::instr::Value* val = simgrid::instr::Value::get_or_new(operation, color, type); - new simgrid::instr::PushStateEvent(SIMIX_get_clock(), container, type, val, static_cast(extra)); -} - -void TRACE_smpi_collective_out(int rank, const char *operation) -{ - if (not TRACE_smpi_is_enabled()) - return; - - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - - new simgrid::instr::PopStateEvent(SIMIX_get_clock(), container, type); -} - void TRACE_smpi_computing_init(int rank) { //first use, initialize the color in the trace - if (not TRACE_smpi_is_enabled() || not TRACE_smpi_is_computing()) - return; - - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get(str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - const char* color = instr_find_color("computing"); - new simgrid::instr::PushStateEvent(SIMIX_get_clock(), container, type, - simgrid::instr::Value::get_or_new("computing", color, type)); + if (TRACE_smpi_is_enabled() && TRACE_smpi_is_computing()) + smpi_container(rank)->getState("MPI_STATE")->addEntityValue("computing", instr_find_color("computing")); } -void TRACE_smpi_computing_in(int rank, instr_extra_data extra) +void TRACE_smpi_computing_in(int rank, double amount) { - //do not forget to set the color first, otherwise this will explode - if (not TRACE_smpi_is_enabled() || not TRACE_smpi_is_computing()) { - cleanup_extra_data(extra); - return; - } - - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - simgrid::instr::Value* val = simgrid::instr::Value::get_or_new("computing", nullptr, type); - new simgrid::instr::PushStateEvent(SIMIX_get_clock(), container, type, val, static_cast(extra)); + if (TRACE_smpi_is_enabled() && TRACE_smpi_is_computing()) + smpi_container(rank) + ->getState("MPI_STATE") + ->pushEvent("computing", new simgrid::instr::CpuTIData("compute", amount)); } void TRACE_smpi_computing_out(int rank) { - if (not TRACE_smpi_is_enabled() || not TRACE_smpi_is_computing()) - return; - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - new simgrid::instr::PopStateEvent(SIMIX_get_clock(), container, type); + if (TRACE_smpi_is_enabled() && TRACE_smpi_is_computing()) + smpi_container(rank)->getState("MPI_STATE")->popEvent(); } void TRACE_smpi_sleeping_init(int rank) { //first use, initialize the color in the trace - if (not TRACE_smpi_is_enabled() || not TRACE_smpi_is_sleeping()) - return; - - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - const char *color = instr_find_color ("sleeping"); - simgrid::instr::Value* val = simgrid::instr::Value::get_or_new("sleeping", color, type); - new simgrid::instr::PushStateEvent(SIMIX_get_clock(), container, type, val); + if (TRACE_smpi_is_enabled() && TRACE_smpi_is_sleeping()) + smpi_container(rank)->getState("MPI_STATE")->addEntityValue("sleeping", instr_find_color("sleeping")); } -void TRACE_smpi_sleeping_in(int rank, instr_extra_data extra) +void TRACE_smpi_sleeping_in(int rank, double duration) { - //do not forget to set the color first, otherwise this will explode - if (not TRACE_smpi_is_enabled() || not TRACE_smpi_is_sleeping()) { - cleanup_extra_data(extra); - return; - } - - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - simgrid::instr::Value* val = simgrid::instr::Value::get_or_new("sleeping", nullptr, type); - new simgrid::instr::PushStateEvent(SIMIX_get_clock(), container, type, val, static_cast(extra)); + if (TRACE_smpi_is_enabled() && TRACE_smpi_is_sleeping()) + smpi_container(rank) + ->getState("MPI_STATE") + ->pushEvent("sleeping", new simgrid::instr::CpuTIData("sleep", duration)); } void TRACE_smpi_sleeping_out(int rank) { - if (not TRACE_smpi_is_enabled() || not TRACE_smpi_is_sleeping()) - return; - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - new simgrid::instr::PopStateEvent(SIMIX_get_clock(), container, type); + if (TRACE_smpi_is_enabled() && not TRACE_smpi_is_sleeping()) + smpi_container(rank)->getState("MPI_STATE")->popEvent(); } -void TRACE_smpi_testing_in(int rank, instr_extra_data extra) +void TRACE_smpi_testing_in(int rank) { //do not forget to set the color first, otherwise this will explode - if (not TRACE_smpi_is_enabled()) { - cleanup_extra_data(extra); + if (not TRACE_smpi_is_enabled()) return; - } - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - simgrid::instr::Value* val = simgrid::instr::Value::get_or_new("test", nullptr, type); - new simgrid::instr::PushStateEvent(SIMIX_get_clock(), container, type, val, static_cast(extra)); + simgrid::instr::StateType* state = smpi_container(rank)->getState("MPI_STATE"); + state->addEntityValue("test"); + state->pushEvent("test", new simgrid::instr::NoOpTIData("test")); } void TRACE_smpi_testing_out(int rank) { - if (not TRACE_smpi_is_enabled()) - return; - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - new simgrid::instr::PopStateEvent(SIMIX_get_clock(), container, type); + if (TRACE_smpi_is_enabled()) + smpi_container(rank)->getState("MPI_STATE")->popEvent(); } -void TRACE_smpi_ptp_in(int rank, const char *operation, instr_extra_data extra) +void TRACE_smpi_comm_in(int rank, const char* operation, simgrid::instr::TIData* extra) { if (not TRACE_smpi_is_enabled()) { - cleanup_extra_data(extra); + delete extra; return; } - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - const char *color = instr_find_color (operation); - simgrid::instr::Value* val = simgrid::instr::Value::get_or_new(operation, color, type); - new simgrid::instr::PushStateEvent(SIMIX_get_clock(), container, type, val, static_cast(extra)); + simgrid::instr::StateType* state = smpi_container(rank)->getState("MPI_STATE"); + state->addEntityValue(operation, instr_find_color(operation)); + state->pushEvent(operation, extra); } -void TRACE_smpi_ptp_out(int rank, int dst, const char *operation) +void TRACE_smpi_comm_out(int rank) { - if (not TRACE_smpi_is_enabled()) - return; - - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = container->type_->getChild("MPI_STATE"); - - new simgrid::instr::PopStateEvent(SIMIX_get_clock(), container, type); + if (TRACE_smpi_is_enabled()) + smpi_container(rank)->getState("MPI_STATE")->popEvent(); } void TRACE_smpi_send(int rank, int src, int dst, int tag, int size) @@ -400,15 +267,10 @@ void TRACE_smpi_send(int rank, int src, int dst, int tag, int size) if (not TRACE_smpi_is_enabled()) return; - char key[INSTR_DEFAULT_STR_SIZE] = {0}; - TRACE_smpi_get_key(src, dst, tag, key, INSTR_DEFAULT_STR_SIZE,1); + std::string key = TRACE_smpi_get_key(src, dst, tag, 1); - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(src, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = PJ_type_get_root()->getChild("MPI_LINK"); - XBT_DEBUG("Send tracing from %d to %d, tag %d, with key %s", src, dst, tag, key); - new simgrid::instr::StartLinkEvent(SIMIX_get_clock(), PJ_container_get_root(), type, container, "PTP", key, size); + XBT_DEBUG("Send tracing from %d to %d, tag %d, with key %s", src, dst, tag, key.c_str()); + simgrid::instr::Container::getRoot()->getLink("MPI_LINK")->startEvent(smpi_container(rank), "PTP", key, size); } void TRACE_smpi_recv(int src, int dst, int tag) @@ -416,13 +278,8 @@ void TRACE_smpi_recv(int src, int dst, int tag) if (not TRACE_smpi_is_enabled()) return; - char key[INSTR_DEFAULT_STR_SIZE] = {0}; - TRACE_smpi_get_key(src, dst, tag, key, INSTR_DEFAULT_STR_SIZE,0); + std::string key = TRACE_smpi_get_key(src, dst, tag, 0); - char str[INSTR_DEFAULT_STR_SIZE]; - smpi_container(dst, str, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get (str); - simgrid::instr::Type* type = PJ_type_get_root()->getChild("MPI_LINK"); - XBT_DEBUG("Recv tracing from %d to %d, tag %d, with key %s", src, dst, tag, key); - new simgrid::instr::EndLinkEvent(SIMIX_get_clock(), PJ_container_get_root(), type, container, "PTP", key); + XBT_DEBUG("Recv tracing from %d to %d, tag %d, with key %s", src, dst, tag, key.c_str()); + simgrid::instr::Container::getRoot()->getLink("MPI_LINK")->endEvent(smpi_container(dst), "PTP", key); } diff --git a/src/smpi/internals/smpi_bench.cpp b/src/smpi/internals/smpi_bench.cpp index 24ba70485b..795521e695 100644 --- a/src/smpi/internals/smpi_bench.cpp +++ b/src/smpi/internals/smpi_bench.cpp @@ -3,13 +3,12 @@ /* 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 "private.h" #include "private.hpp" #include "simgrid/modelchecker.h" #include "smpi_comm.hpp" #include "smpi_process.hpp" #include "src/internal_config.h" -#include "src/mc/mc_replay.h" +#include "src/mc/mc_replay.hpp" #include #ifndef WIN32 @@ -28,7 +27,6 @@ double smpi_host_speed; shared_malloc_type smpi_cfg_shared_malloc = shmalloc_global; double smpi_total_benched_time = 0; -smpi_privatization_region_t smpi_privatization_regions; extern "C" XBT_PUBLIC(void) smpi_execute_flops_(double *flops); void smpi_execute_flops_(double *flops) @@ -56,10 +54,7 @@ void smpi_execute(double duration) XBT_DEBUG("Sleep for %g to handle real computation time", duration); double flops = duration * smpi_host_speed; int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type=TRACING_COMPUTING; - extra->comp_size=flops; - TRACE_smpi_computing_in(rank, extra); + TRACE_smpi_computing_in(rank, flops); smpi_execute_flops(flops); @@ -88,7 +83,7 @@ void smpi_bench_begin() return; #if HAVE_PAPI - if (xbt_cfg_get_string("smpi/papi-events")[0] != '\0') { + if (not xbt_cfg_get_string("smpi/papi-events").empty()) { int event_set = smpi_process()->papi_event_set(); // PAPI_start sets everything to 0! See man(3) PAPI_start if (PAPI_LOW_LEVEL_INITED == PAPI_is_initialized()) { @@ -158,14 +153,13 @@ void smpi_bench_end() #if HAVE_PAPI if (xbt_cfg_get_string("smpi/papi-events")[0] != '\0' && TRACE_smpi_is_enabled()) { - char container_name[INSTR_DEFAULT_STR_SIZE]; - smpi_container(smpi_process()->index(), container_name, INSTR_DEFAULT_STR_SIZE); - container_t container = PJ_container_get(container_name); + container_t container = + new simgrid::instr::Container(std::string("rank-") + std::to_string(smpi_process()->index())); papi_counter_t& counter_data = smpi_process()->papi_counters(); for (auto const& pair : counter_data) { - new_pajeSetVariable(surf_get_clock(), container, - PJ_type_get(/* countername */ pair.first.c_str(), container->type), pair.second); + new simgrid::instr::SetVariableEvent( + surf_get_clock(), container, PJ_type_get(/* countername */ pair.first.c_str(), container->type), pair.second); } } #endif @@ -180,10 +174,7 @@ static unsigned int private_sleep(double secs) XBT_DEBUG("Sleep for: %lf secs", secs); int rank = MPI_COMM_WORLD->rank(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type=TRACING_SLEEPING; - extra->sleep_duration=secs; - TRACE_smpi_sleeping_in(rank, extra); + TRACE_smpi_sleeping_in(rank, secs); simcall_process_sleep(secs); @@ -204,13 +195,13 @@ int smpi_usleep(useconds_t usecs) } #if _POSIX_TIMERS > 0 -int smpi_nanosleep(const struct timespec *tp, struct timespec * t) +int smpi_nanosleep(const struct timespec* tp, struct timespec* /*t*/) { return static_cast(private_sleep(static_cast(tp->tv_sec + tp->tv_nsec / 1000000000.0))); } #endif -int smpi_gettimeofday(struct timeval *tv, void* tz) +int smpi_gettimeofday(struct timeval* tv, void* /*tz*/) { smpi_bench_end(); double now = SIMIX_get_clock(); @@ -227,7 +218,7 @@ int smpi_gettimeofday(struct timeval *tv, void* tz) } #if _POSIX_TIMERS > 0 -int smpi_clock_gettime(clockid_t clk_id, struct timespec *tp) +int smpi_clock_gettime(clockid_t /*clk_id*/, struct timespec* tp) { //there is only one time in SMPI, so clk_id is ignored. smpi_bench_end(); diff --git a/src/smpi/internals/smpi_deployment.cpp b/src/smpi/internals/smpi_deployment.cpp index 78a95fdc53..d5ef6a582b 100644 --- a/src/smpi/internals/smpi_deployment.cpp +++ b/src/smpi/internals/smpi_deployment.cpp @@ -4,9 +4,9 @@ /* 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/msg.h" /* barrier */ #include "SmpiHost.hpp" -#include "private.h" +#include "private.hpp" +#include "simgrid/msg.h" /* barrier */ #include "smpi_comm.hpp" #include @@ -56,7 +56,9 @@ extern int* index_to_process_data; */ void SMPI_app_instance_register(const char *name, xbt_main_func_t code, int num_processes) { - SIMIX_function_register(name, code); + if (code != nullptr) { // When started with smpirun, we will not execute a function + SIMIX_function_register(name, code); + } static int already_called = 0; if (not already_called) { @@ -68,6 +70,9 @@ void SMPI_app_instance_register(const char *name, xbt_main_func_t code, int num_ } Instance instance(name, num_processes, process_count, MPI_COMM_NULL, MSG_barrier_init(num_processes)); + MPI_Group group = new simgrid::smpi::Group(instance.size); + instance.comm_world = new simgrid::smpi::Comm(group, nullptr); + MPI_Attr_put(instance.comm_world, MPI_UNIVERSE_SIZE, reinterpret_cast(instance.size)); process_count+=num_processes; @@ -84,10 +89,6 @@ void smpi_deployment_register_process(const char* instance_id, int rank, int ind Instance& instance = smpi_instances.at(instance_id); - if (instance.comm_world == MPI_COMM_NULL) { - MPI_Group group = new simgrid::smpi::Group(instance.size); - instance.comm_world = new simgrid::smpi::Comm(group, nullptr); - } instance.present_processes++; index_to_process_data[index] = instance.index + rank; instance.comm_world->group()->set_mapping(index, rank); @@ -115,9 +116,8 @@ msg_bar_t smpi_deployment_finalization_barrier(const char* instance_id) void smpi_deployment_cleanup_instances(){ for (auto const& item : smpi_instances) { Instance instance = item.second; - if (instance.comm_world != MPI_COMM_NULL) - delete instance.comm_world->group(); - delete instance.comm_world; MSG_barrier_destroy(instance.finalization_barrier); + simgrid::smpi::Comm::destroy(instance.comm_world); } + smpi_instances.clear(); } diff --git a/src/smpi/internals/smpi_dvfs.cpp b/src/smpi/internals/smpi_dvfs.cpp index f83165f541..2d0ffd22e5 100644 --- a/src/smpi/internals/smpi_dvfs.cpp +++ b/src/smpi/internals/smpi_dvfs.cpp @@ -76,17 +76,16 @@ typedef int integer; typedef long int integer; #endif typedef char *address; -typedef short int shortint; typedef float real; typedef double doublereal; -typedef struct { +struct complex { real r; real i; -} complex; -typedef struct { +}; +struct doublecomplex { doublereal r; doublereal i; -} doublecomplex; +}; extern "C" XBT_PUBLIC(doublereal) smpi_get_host_power_peak_at_(integer *pstate_index); doublereal smpi_get_host_power_peak_at_(integer *pstate_index) diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 866f17f3e0..351269c3b2 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -3,21 +3,20 @@ /* 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 "mc/mc.h" -#include "simgrid/s4u/Mailbox.hpp" -#include "simgrid/s4u/Host.hpp" -#include "src/msg/msg_private.h" -#include "src/simix/smx_private.h" -#include "src/surf/surf_interface.hpp" #include "SmpiHost.hpp" -#include "xbt/config.hpp" -#include "private.h" +#include "mc/mc.h" #include "private.hpp" +#include "simgrid/s4u/Host.hpp" +#include "simgrid/s4u/Mailbox.hpp" #include "smpi_coll.hpp" #include "smpi_comm.hpp" #include "smpi_group.hpp" #include "smpi_info.hpp" #include "smpi_process.hpp" +#include "src/msg/msg_private.hpp" +#include "src/simix/smx_private.hpp" +#include "src/surf/surf_interface.hpp" +#include "xbt/config.hpp" #include /* DBL_MAX */ #include @@ -59,10 +58,23 @@ int smpi_universe_size = 0; int* index_to_process_data = nullptr; extern double smpi_total_benched_time; xbt_os_timer_t global_timer; +/** + * Setting MPI_COMM_WORLD to MPI_COMM_UNINITIALIZED (it's a variable) + * is important because the implementation of MPI_Comm checks + * "this == MPI_COMM_UNINITIALIZED"? If yes, it uses smpi_process()->comm_world() + * instead of "this". + * This is basically how we only have one global variable but all processes have + * different communicators (basically, the one their SMPI instance uses). + * + * See smpi_comm.cpp and the functions therein for details. + */ MPI_Comm MPI_COMM_WORLD = MPI_COMM_UNINITIALIZED; MPI_Errhandler *MPI_ERRORS_RETURN = nullptr; MPI_Errhandler *MPI_ERRORS_ARE_FATAL = nullptr; MPI_Errhandler *MPI_ERRHANDLER_NULL = nullptr; +// No instance gets manually created; check also the smpirun.in script as +// this default name is used there as well (when the tag is generated). +static const char* smpi_default_instance_name = "smpirun"; static simgrid::config::Flag smpi_wtime_sleep( "smpi/wtime", "Minimum time to inject inside a call to MPI_Wtime", 0.0); static simgrid::config::Flag smpi_init_sleep( @@ -234,15 +246,13 @@ int smpi_enabled() { void smpi_global_init() { - MPI_Group group; - if (not MC_is_active()) { global_timer = xbt_os_timer_new(); xbt_os_walltimer_start(global_timer); } - if (xbt_cfg_get_string("smpi/comp-adjustment-file")[0] != '\0') { - std::string filename {xbt_cfg_get_string("smpi/comp-adjustment-file")}; + std::string filename = xbt_cfg_get_string("smpi/comp-adjustment-file"); + if (not filename.empty()) { std::ifstream fstream(filename); if (not fstream.is_open()) { xbt_die("Could not open file %s. Does it exist?", filename.c_str()); @@ -268,7 +278,7 @@ void smpi_global_init() // and the (computed) event_set. std::map units2papi_setup; - if (xbt_cfg_get_string("smpi/papi-events")[0] != '\0') { + if (not xbt_cfg_get_string("smpi/papi-events").empty()) { if (PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT) XBT_ERROR("Could not initialize PAPI library; is it correctly installed and linked?" " Expected version is %i", @@ -276,7 +286,7 @@ void smpi_global_init() typedef boost::tokenizer> Tokenizer; boost::char_separator separator_units(";"); - std::string str = std::string(xbt_cfg_get_string("smpi/papi-events")); + std::string str = xbt_cfg_get_string("smpi/papi-events"); Tokenizer tokens(str, separator_units); // Iterate over all the computational units. This could be processes, hosts, threads, ranks... You name it. @@ -330,42 +340,38 @@ void smpi_global_init() } #endif - int smpirun = 0; - msg_bar_t finalization_barrier = nullptr; - if (process_count == 0){ - process_count = SIMIX_process_count(); - smpirun=1; - finalization_barrier = MSG_barrier_init(process_count); + if (index_to_process_data == nullptr) { + index_to_process_data = new int[SIMIX_process_count()]; + } + + bool smpirun = 0; + if (process_count == 0) { // The program has been dispatched but no other + // SMPI instances have been registered. We're using smpirun. + smpirun = true; + SMPI_app_instance_register(smpi_default_instance_name, nullptr, + SIMIX_process_count()); // This call has a side effect on process_count... + MPI_COMM_WORLD = *smpi_deployment_comm_world(smpi_default_instance_name); } smpi_universe_size = process_count; process_data = new simgrid::smpi::Process*[process_count]; for (int i = 0; i < process_count; i++) { - process_data[i] = new simgrid::smpi::Process(i, finalization_barrier); - } - //if the process was launched through smpirun script we generate a global mpi_comm_world - //if not, we let MPI_COMM_NULL, and the comm world will be private to each mpi instance - if (smpirun) { - group = new simgrid::smpi::Group(process_count); - MPI_COMM_WORLD = new simgrid::smpi::Comm(group, nullptr); - MPI_Attr_put(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, reinterpret_cast(process_count)); - - for (int i = 0; i < process_count; i++) - group->set_mapping(i, i); + if (smpirun) { + process_data[i] = new simgrid::smpi::Process(i, smpi_deployment_finalization_barrier(smpi_default_instance_name)); + smpi_deployment_register_process(smpi_default_instance_name, i, i); + } else { + // TODO We can pass a nullptr here because Process::set_data() assigns the + // barrier from the instance anyway. This is ugly and should be changed + process_data[i] = new simgrid::smpi::Process(i, nullptr); + } } } void smpi_global_destroy() { - int count = smpi_process_count(); - smpi_bench_destroy(); smpi_shared_destroy(); - if (MPI_COMM_WORLD != MPI_COMM_UNINITIALIZED){ - delete MPI_COMM_WORLD->group(); - MSG_barrier_destroy(process_data[0]->finalization_barrier()); - }else{ - smpi_deployment_cleanup_instances(); - } + smpi_deployment_cleanup_instances(); + int count = smpi_process_count(); for (int i = 0; i < count; i++) { if(process_data[i]->comm_self()!=MPI_COMM_NULL){ simgrid::smpi::Comm::destroy(process_data[i]->comm_self()); @@ -380,13 +386,8 @@ void smpi_global_destroy() delete[] process_data; process_data = nullptr; - if (MPI_COMM_WORLD != MPI_COMM_UNINITIALIZED){ - MPI_COMM_WORLD->cleanup_smp(); - MPI_COMM_WORLD->cleanup_attr(); - if(simgrid::smpi::Colls::smpi_coll_cleanup_callback!=nullptr) - simgrid::smpi::Colls::smpi_coll_cleanup_callback(); - delete MPI_COMM_WORLD; - } + if (simgrid::smpi::Colls::smpi_coll_cleanup_callback != nullptr) + simgrid::smpi::Colls::smpi_coll_cleanup_callback(); MPI_COMM_WORLD = MPI_COMM_NULL; @@ -394,7 +395,7 @@ void smpi_global_destroy() xbt_os_timer_free(global_timer); } - xbt_free(index_to_process_data); + delete[] index_to_process_data; if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) smpi_destroy_global_memory_segments(); smpi_free_static(); @@ -432,31 +433,24 @@ static void smpi_init_logs(){ } static void smpi_init_options(){ - //return if already called - if (smpi_cpu_threshold > -1) - return; - simgrid::smpi::Colls::set_collectives(); - simgrid::smpi::Colls::smpi_coll_cleanup_callback=nullptr; - smpi_cpu_threshold = xbt_cfg_get_double("smpi/cpu-threshold"); - smpi_host_speed = xbt_cfg_get_double("smpi/host-speed"); - const char* smpi_privatize_option = xbt_cfg_get_string("smpi/privatization"); - if (std::strcmp(smpi_privatize_option, "no") == 0) - smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE; - else if (std::strcmp(smpi_privatize_option, "yes") == 0) - smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT; - else if (std::strcmp(smpi_privatize_option, "mmap") == 0) - smpi_privatize_global_variables = SMPI_PRIVATIZE_MMAP; - else if (std::strcmp(smpi_privatize_option, "dlopen") == 0) - smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN; - - // Some compatibility stuff: - else if (std::strcmp(smpi_privatize_option, "1") == 0) - smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT; - else if (std::strcmp(smpi_privatize_option, "0") == 0) - smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE; - - else - xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option); + // return if already called + if (smpi_cpu_threshold > -1) + return; + simgrid::smpi::Colls::set_collectives(); + simgrid::smpi::Colls::smpi_coll_cleanup_callback = nullptr; + smpi_cpu_threshold = xbt_cfg_get_double("smpi/cpu-threshold"); + smpi_host_speed = xbt_cfg_get_double("smpi/host-speed"); + std::string smpi_privatize_option = xbt_cfg_get_string("smpi/privatization"); + if (smpi_privatize_option == "no" || smpi_privatize_option == "0") + smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE; + else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1") + smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT; + else if (smpi_privatize_option == "mmap") + smpi_privatize_global_variables = SMPI_PRIVATIZE_MMAP; + else if (smpi_privatize_option == "dlopen") + smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN; + else + xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option.c_str()); #if defined(__FreeBSD__) if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) { @@ -468,17 +462,16 @@ static void smpi_init_options(){ if (smpi_cpu_threshold < 0) smpi_cpu_threshold = DBL_MAX; - char* val = xbt_cfg_get_string("smpi/shared-malloc"); - if (not strcasecmp(val, "yes") || not strcmp(val, "1") || not strcasecmp(val, "on") || - not strcasecmp(val, "global")) { + std::string val = xbt_cfg_get_string("smpi/shared-malloc"); + if ((val == "yes") || (val == "1") || (val == "on") || (val == "global")) { smpi_cfg_shared_malloc = shmalloc_global; - } else if (not strcasecmp(val, "local")) { + } else if (val == "local") { smpi_cfg_shared_malloc = shmalloc_local; - } else if (not strcasecmp(val, "no") || not strcmp(val, "0") || not strcasecmp(val, "off")) { + } else if ((val == "no") || (val == "0") || (val == "off")) { smpi_cfg_shared_malloc = shmalloc_none; } else { xbt_die("Invalid value '%s' for option smpi/shared-malloc. Possible values: 'on' or 'global', 'local', 'off'", - val); + val.c_str()); } } @@ -665,8 +658,8 @@ int smpi_main(const char* executable, int argc, char *argv[]) "You may want to use sampling functions or trace replay to reduce this."); } } - int count = smpi_process_count(); int ret = 0; + int count = smpi_process_count(); for (int i = 0; i < count; i++) { if(process_data[i]->return_value()!=0){ ret=process_data[i]->return_value();//return first non 0 value @@ -689,7 +682,7 @@ void SMPI_init(){ TRACE_smpi_alloc(); simgrid::surf::surfExitCallbacks.connect(TRACE_smpi_release); if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) - smpi_initialize_global_memory_segments(); + smpi_backup_global_memory_segment(); } void SMPI_finalize(){ diff --git a/src/smpi/internals/smpi_memory.cpp b/src/smpi/internals/smpi_memory.cpp index a94b870d6a..8719bd57a5 100644 --- a/src/smpi/internals/smpi_memory.cpp +++ b/src/smpi/internals/smpi_memory.cpp @@ -3,19 +3,17 @@ /* 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 -#include - -#include - #include +#include +#include #include #include #include +#include #include #include #include +#include #ifndef WIN32 #include @@ -24,15 +22,22 @@ #include "src/internal_config.h" #include "src/xbt/memory_map.hpp" -#include "private.h" #include "private.hpp" +#include "smpi_process.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_memory, smpi, "Memory layout support for SMPI"); -int smpi_loaded_page = -1; +int smpi_loaded_page = -1; char* smpi_data_exe_start = nullptr; int smpi_data_exe_size = 0; int smpi_privatize_global_variables; +static void* smpi_data_exe_copy; + +// We keep a copy of all the privatization regions: We can then delete everything easily by iterating over this +// collection and nothing can be leaked. We could also iterate over all actors but we would have to be diligent when two +// actors use the same privatization region (so, smart pointers would have to be used etc.) +// Use a std::deque so that pointers remain valid after push_back(). +static std::deque smpi_privatization_regions; static const int PROT_RWX = (PROT_READ | PROT_WRITE | PROT_EXEC); static const int PROT_RW = (PROT_READ | PROT_WRITE ); @@ -111,14 +116,9 @@ void smpi_really_switch_data_segment(int dest) return; #if HAVE_PRIVATIZATION - if(smpi_loaded_page==-1){//initial switch, do the copy from the real page here - for (int i=0; i< smpi_process_count(); i++){ - asan_safe_memcpy(smpi_privatization_regions[i].address, TOPAGE(smpi_data_exe_start), smpi_data_exe_size); - } - } - // FIXME, cross-process support (mmap across process when necessary) - int current = smpi_privatization_regions[dest].file_descriptor; + simgrid::smpi::Process* process = smpi_process_remote(dest); + int current = process->privatized_region()->file_descriptor; XBT_DEBUG("Switching data frame to the one of process %d", dest); void* tmp = mmap(TOPAGE(smpi_data_exe_start), smpi_data_exe_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, current, 0); @@ -134,36 +134,46 @@ int smpi_is_privatization_file(char* file) return buffer_path.compare(0, std::string::npos, file, buffer_path.length()) == 0; } -void smpi_initialize_global_memory_segments() +// TODO: cheinrich: The behavior changed; this now only makes a backup of the +// data segment. I think the function should be renamed. +void smpi_backup_global_memory_segment() { - #if HAVE_PRIVATIZATION smpi_get_executable_global_size(); XBT_DEBUG("bss+data segment found : size %d starting at %p", smpi_data_exe_size, smpi_data_exe_start); - if (smpi_data_exe_size == 0) { // no need to switch + if (smpi_data_exe_size == 0) { // no need to do anything as global variables don't exist smpi_privatize_global_variables=false; return; } - smpi_privatization_regions = static_cast( - xbt_malloc(smpi_process_count() * sizeof(struct s_smpi_privatization_region))); - - for (int i=0; i< smpi_process_count(); i++){ - // create SIMIX_process_count() mappings of this size with the same data inside - int file_descriptor; - void* address = nullptr; - char path[24]; - int status; - - do { - snprintf(path, sizeof(path), "/smpi-buffer-%06x", rand() % 0xffffffU); - file_descriptor = shm_open(path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); - } while (file_descriptor == -1 && errno == EEXIST); - if (file_descriptor < 0) { - if (errno == EMFILE) { - xbt_die("Impossible to create temporary file for memory mapping: %s\n\ + smpi_data_exe_copy = ::operator new(smpi_data_exe_size); + // Make a copy of the data segment. This clean copy is retained over the whole runtime + // of the simulation and can be used to initialize a dynamically added, new process. + asan_safe_memcpy(smpi_data_exe_copy, TOPAGE(smpi_data_exe_start), smpi_data_exe_size); +#else /* ! HAVE_PRIVATIZATION */ + smpi_privatize_global_variables = false; + xbt_die("You are trying to use privatization on a system that does not support it. Don't."); + return; +#endif +} + +// Initializes the memory mapping for a single process and returns the privatization region +smpi_privatization_region_t smpi_init_global_memory_segment_process() +{ + int file_descriptor; + void* address = nullptr; + char path[24]; + int status; + + do { + snprintf(path, sizeof(path), "/smpi-buffer-%06x", rand() % 0xffffffU); + file_descriptor = shm_open(path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); + } while (file_descriptor == -1 && errno == EEXIST); + if (file_descriptor < 0) { + if (errno == EMFILE) { + xbt_die("Impossible to create temporary file for memory mapping: %s\n\ The open() system call failed with the EMFILE error code (too many files). \n\n\ This means that you reached the system limits concerning the amount of files per process. \ This is not a surprise if you are trying to virtualize many processes on top of SMPI. \ @@ -175,48 +185,44 @@ First, check what your limits are:\n\ cat /proc/self/limits # Displays any per-process limitation (including the one given above)\n\n\ If one of these values is less than the amount of MPI processes that you try to run, then you got the explanation of this error. \ Ask the Internet about tutorials on how to increase the files limit such as: https://rtcamp.com/tutorials/linux/increase-open-files-limit/", - strerror(errno)); - } - xbt_die("Impossible to create temporary file for memory mapping: %s", strerror(errno)); + strerror(errno)); } + xbt_die("Impossible to create temporary file for memory mapping: %s", strerror(errno)); + } - status = ftruncate(file_descriptor, smpi_data_exe_size); - if (status) - xbt_die("Impossible to set the size of the temporary file for memory mapping"); + status = ftruncate(file_descriptor, smpi_data_exe_size); + if (status) + xbt_die("Impossible to set the size of the temporary file for memory mapping"); - /* Ask for a free region */ - address = mmap(nullptr, smpi_data_exe_size, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0); - if (address == MAP_FAILED) - xbt_die("Couldn't find a free region for memory mapping"); + /* Ask for a free region */ + address = mmap(nullptr, smpi_data_exe_size, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0); + if (address == MAP_FAILED) + xbt_die("Couldn't find a free region for memory mapping"); - status = shm_unlink(path); - if (status) - xbt_die("Impossible to unlink temporary file for memory mapping"); + status = shm_unlink(path); + if (status) + xbt_die("Impossible to unlink temporary file for memory mapping"); - // initialize the values - asan_safe_memcpy(address, TOPAGE(smpi_data_exe_start), smpi_data_exe_size); + // initialize the values + asan_safe_memcpy(address, smpi_data_exe_copy, smpi_data_exe_size); - // store the address of the mapping for further switches - smpi_privatization_regions[i].file_descriptor = file_descriptor; - smpi_privatization_regions[i].address = address; - } -#else /* ! HAVE_PRIVATIZATION */ - smpi_privatize_global_variables = false; - xbt_die("You are trying to use privatization on a system that does not support it. Don't."); - return; -#endif + // store the address of the mapping for further switches + smpi_privatization_regions.emplace_back(s_smpi_privatization_region_t{address, file_descriptor}); + + return &smpi_privatization_regions.back(); } void smpi_destroy_global_memory_segments(){ if (smpi_data_exe_size == 0) // no need to switch return; #if HAVE_PRIVATIZATION - for (int i=0; i< smpi_process_count(); i++) { - if (munmap(smpi_privatization_regions[i].address, smpi_data_exe_size) < 0) - XBT_WARN("Unmapping of fd %d failed: %s", smpi_privatization_regions[i].file_descriptor, strerror(errno)); - close(smpi_privatization_regions[i].file_descriptor); + for (auto const& region : smpi_privatization_regions) { + if (munmap(region.address, smpi_data_exe_size) < 0) + XBT_WARN("Unmapping of fd %d failed: %s", region.file_descriptor, strerror(errno)); + close(region.file_descriptor); } - xbt_free(smpi_privatization_regions); + smpi_privatization_regions.clear(); + ::operator delete(smpi_data_exe_copy); #endif } diff --git a/src/smpi/internals/smpi_process.cpp b/src/smpi/internals/smpi_process.cpp index 742af85a32..b6c4d107e0 100644 --- a/src/smpi/internals/smpi_process.cpp +++ b/src/smpi/internals/smpi_process.cpp @@ -3,16 +3,14 @@ /* 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 "smpi_process.hpp" #include "mc/mc.h" -#include "src/mc/mc_replay.h" -#include "src/msg/msg_private.h" -#include "src/simix/smx_private.h" -#include "private.h" #include "private.hpp" -#include "smpi_process.hpp" -#include "smpi_group.hpp" #include "smpi_comm.hpp" - +#include "smpi_group.hpp" +#include "src/mc/mc_replay.hpp" +#include "src/msg/msg_private.hpp" +#include "src/simix/smx_private.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_process, smpi, "Logging specific to SMPI (kernel)"); @@ -70,12 +68,12 @@ Process::Process(int index, msg_bar_t finalization_barrier) void Process::set_data(int index, int* argc, char*** argv) { char* instance_id = (*argv)[1]; - comm_world_ = smpi_deployment_comm_world(instance_id); - msg_bar_t bar = smpi_deployment_finalization_barrier(instance_id); - if (bar!=nullptr) // don't overwrite the default one + comm_world_ = smpi_deployment_comm_world(instance_id); + msg_bar_t bar = smpi_deployment_finalization_barrier(instance_id); + if (bar != nullptr) // don't overwrite the current one if the instance has none finalization_barrier_ = bar; instance_id_ = instance_id; - index_ = index; + index_ = index; static_cast(SIMIX_process_self()->userdata)->data = this; @@ -168,6 +166,16 @@ smpi_trace_call_location_t* Process::call_location() return &trace_call_loc_; } +void Process::set_privatized_region(smpi_privatization_region_t region) +{ + privatized_region_ = region; +} + +smpi_privatization_region_t Process::privatized_region() +{ + return privatized_region_; +} + int Process::index() { return index_; @@ -272,7 +280,7 @@ void Process::init(int *argc, char ***argv){ smx_actor_t proc = SIMIX_process_self(); proc->context->set_cleanup(&MSG_process_cleanup_from_SIMIX); - int index = proc->pid - 1; + int index = proc->pid - 1; // The maestro process has always ID 0 but we don't need that process here if(index_to_process_data == nullptr){ index_to_process_data=static_cast(xbt_malloc(SIMIX_process_count()*sizeof(int))); @@ -286,14 +294,17 @@ void Process::init(int *argc, char ***argv){ throw std::invalid_argument(std::string("Invalid rank: ") + (*argv)[2]); } + // cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved + // this up here so that I can set the privatized region before the switch. + Process* process = smpi_process_remote(index); if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ /* Now using segment index of the process */ index = proc->segment_index; + process->set_privatized_region(smpi_init_global_memory_segment_process()); /* Done at the process's creation */ SMPI_switch_data_segment(index); } - Process* process = smpi_process_remote(index); process->set_data(index, argc, argv); } xbt_assert(smpi_process(), diff --git a/src/smpi/internals/smpi_replay.cpp b/src/smpi/internals/smpi_replay.cpp index 90cac5bfc4..8e02386a1f 100644 --- a/src/smpi/internals/smpi_replay.cpp +++ b/src/smpi/internals/smpi_replay.cpp @@ -3,7 +3,7 @@ /* 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 "private.h" +#include "private.hpp" #include "smpi_coll.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" @@ -118,12 +118,8 @@ static MPI_Datatype decode_datatype(const char *const action) return MPI_CURRENT_TYPE; } -const char* encode_datatype(MPI_Datatype datatype, int* known) +const char* encode_datatype(MPI_Datatype datatype) { - //default type for output is set to MPI_BYTE - // MPI_DEFAULT_TYPE is not set for output, use directly MPI_BYTE - if(known!=nullptr) - *known=1; if (datatype==MPI_BYTE) return ""; if(datatype==MPI_DOUBLE) @@ -138,9 +134,6 @@ const char* encode_datatype(MPI_Datatype datatype, int* known) return "4"; if(datatype==MPI_FLOAT) return "5"; - //tell that the datatype is not handled by replay, and that its size should be measured and replayed as size*MPI_BYTE - if(known!=nullptr) - *known=0; // default - not implemented. // do not warn here as we pass in this function even for other trace formats return "-1"; @@ -165,8 +158,9 @@ static void action_init(const char *const *action) XBT_DEBUG("Initialize the counters"); CHECK_ACTION_PARAMS(action, 0, 1) if(action[2]) - MPI_DEFAULT_TYPE=MPI_DOUBLE; // default MPE dataype - else MPI_DEFAULT_TYPE= MPI_BYTE; // default TAU datatype + MPI_DEFAULT_TYPE = MPI_DOUBLE; // default MPE datatype + else + MPI_DEFAULT_TYPE = MPI_BYTE; // default TAU datatype /* start a simulated timer */ smpi_process()->simulated_start(); @@ -203,14 +197,11 @@ static void action_compute(const char *const *action) double clock = smpi_process()->simulated_elapsed(); double flops= parse_double(action[2]); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type=TRACING_COMPUTING; - extra->comp_size=flops; - TRACE_smpi_computing_in(rank, extra); + TRACE_smpi_computing_in(rank, flops); smpi_execute_flops(flops); - TRACE_smpi_computing_out(rank); + log_timed_action (action, clock); } @@ -227,23 +218,18 @@ static void action_send(const char *const *action) MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE; int rank = smpi_process()->index(); - int dst_traced = MPI_COMM_WORLD->group()->rank(to); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_SEND; - extra->send_size = size; - extra->src = rank; - extra->dst = dst_traced; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("send", dst_traced, size, encode_datatype(MPI_CURRENT_TYPE))); if (not TRACE_smpi_view_internals()) TRACE_smpi_send(rank, rank, dst_traced, 0, size*MPI_CURRENT_TYPE->size()); Request::send(nullptr, size, MPI_CURRENT_TYPE, to , 0, MPI_COMM_WORLD); - log_timed_action (action, clock); + TRACE_smpi_comm_out(rank); - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + log_timed_action(action, clock); } static void action_Isend(const char *const *action) @@ -260,19 +246,14 @@ static void action_Isend(const char *const *action) int rank = smpi_process()->index(); int dst_traced = MPI_COMM_WORLD->group()->rank(to); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ISEND; - extra->send_size = size; - extra->src = rank; - extra->dst = dst_traced; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("Isend", dst_traced, size, encode_datatype(MPI_CURRENT_TYPE))); if (not TRACE_smpi_view_internals()) TRACE_smpi_send(rank, rank, dst_traced, 0, size*MPI_CURRENT_TYPE->size()); - MPI_Request request = Request::isend(nullptr, size, MPI_CURRENT_TYPE, to, 0,MPI_COMM_WORLD); + MPI_Request request = Request::isend(nullptr, size, MPI_CURRENT_TYPE, to, 0, MPI_COMM_WORLD); - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); get_reqq_self()->push_back(request); @@ -294,23 +275,18 @@ static void action_recv(const char *const *action) { int rank = smpi_process()->index(); int src_traced = MPI_COMM_WORLD->group()->rank(from); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_RECV; - extra->send_size = size; - extra->src = src_traced; - extra->dst = rank; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("recv", src_traced, size, encode_datatype(MPI_CURRENT_TYPE))); //unknown size from the receiver point of view - if(size<=0.0){ + if (size <= 0.0) { Request::probe(from, 0, MPI_COMM_WORLD, &status); size=status.count; } Request::recv(nullptr, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD, &status); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (not TRACE_smpi_view_internals()) { TRACE_smpi_recv(src_traced, rank, 0); } @@ -332,29 +308,25 @@ static void action_Irecv(const char *const *action) int rank = smpi_process()->index(); int src_traced = MPI_COMM_WORLD->group()->rank(from); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_IRECV; - extra->send_size = size; - extra->src = src_traced; - extra->dst = rank; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::Pt2PtTIData("Irecv", src_traced, size, encode_datatype(MPI_CURRENT_TYPE))); MPI_Status status; //unknow size from the receiver pov - if(size<=0.0){ - Request::probe(from, 0, MPI_COMM_WORLD, &status); - size=status.count; + if (size <= 0.0) { + Request::probe(from, 0, MPI_COMM_WORLD, &status); + size = status.count; } MPI_Request request = Request::irecv(nullptr, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD); - TRACE_smpi_ptp_out(rank, rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); get_reqq_self()->push_back(request); log_timed_action (action, clock); } -static void action_test(const char *const *action){ +static void action_test(const char* const* action) +{ CHECK_ACTION_PARAMS(action, 0, 0) double clock = smpi_process()->simulated_elapsed(); MPI_Status status; @@ -366,9 +338,7 @@ static void action_test(const char *const *action){ //In this case, ignore the extra calls. if(request!=nullptr){ int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type=TRACING_TEST; - TRACE_smpi_testing_in(rank, extra); + TRACE_smpi_testing_in(rank); int flag = Request::test(&request, &status); @@ -402,13 +372,11 @@ static void action_wait(const char *const *action){ int src_traced = group->rank(request->src()); int dst_traced = group->rank(request->dst()); int is_wait_for_receive = (request->flags() & RECV); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_WAIT; - TRACE_smpi_ptp_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("wait")); Request::wait(&request, &status); - TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__); + TRACE_smpi_comm_out(rank); if (is_wait_for_receive) TRACE_smpi_recv(src_traced, dst_traced, 0); log_timed_action (action, clock); @@ -417,34 +385,30 @@ static void action_wait(const char *const *action){ static void action_waitall(const char *const *action){ CHECK_ACTION_PARAMS(action, 0, 0) double clock = smpi_process()->simulated_elapsed(); - unsigned int count_requests=get_reqq_self()->size(); + const unsigned int count_requests = get_reqq_self()->size(); if (count_requests>0) { MPI_Status status[count_requests]; int rank_traced = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_WAITALL; - extra->send_size=count_requests; - TRACE_smpi_ptp_in(rank_traced, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank_traced, __FUNCTION__, new simgrid::instr::Pt2PtTIData("waitAll", -1, count_requests, "")); int recvs_snd[count_requests]; int recvs_rcv[count_requests]; - unsigned int i=0; - for (auto const& req : *(get_reqq_self())) { + for (unsigned int i = 0; i < count_requests; i++) { + const auto& req = (*get_reqq_self())[i]; if (req && (req->flags () & RECV)){ recvs_snd[i]=req->src(); recvs_rcv[i]=req->dst(); }else recvs_snd[i]=-100; - i++; } Request::waitall(count_requests, &(*get_reqq_self())[0], status); - for (i=0; isimulated_elapsed(); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_BARRIER; - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("barrier")); Colls::barrier(MPI_COMM_WORLD); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -478,19 +440,15 @@ static void action_bcast(const char *const *action) } int rank = smpi_process()->index(); - int root_traced = MPI_COMM_WORLD->group()->index(root); - - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_BCAST; - extra->send_size = size; - extra->root = root_traced; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - TRACE_smpi_collective_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("bcast", MPI_COMM_WORLD->group()->index(root), -1.0, size, -1, + encode_datatype(MPI_CURRENT_TYPE), "")); + void *sendbuf = smpi_get_tmp_sendbuffer(size* MPI_CURRENT_TYPE->size()); Colls::bcast(sendbuf, size, MPI_CURRENT_TYPE, root, MPI_COMM_WORLD); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -510,22 +468,16 @@ static void action_reduce(const char *const *action) } int rank = smpi_process()->index(); - int root_traced = MPI_COMM_WORLD->group()->rank(root); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_REDUCE; - extra->send_size = comm_size; - extra->comp_size = comp_size; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->root = root_traced; - - TRACE_smpi_collective_in(rank, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("reduce", MPI_COMM_WORLD->group()->index(root), comp_size, + comm_size, -1, encode_datatype(MPI_CURRENT_TYPE), "")); void *recvbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size()); void *sendbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size()); Colls::reduce(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, root, MPI_COMM_WORLD); smpi_execute_flops(comp_size); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -541,19 +493,15 @@ static void action_allReduce(const char *const *action) { double clock = smpi_process()->simulated_elapsed(); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ALLREDUCE; - extra->send_size = comm_size; - extra->comp_size = comp_size; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - TRACE_smpi_collective_in(rank, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::CollTIData("allReduce", -1, comp_size, comm_size, -1, + encode_datatype(MPI_CURRENT_TYPE), "")); void *recvbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size()); void *sendbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size()); Colls::allreduce(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, MPI_COMM_WORLD); smpi_execute_flops(comp_size); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -576,18 +524,13 @@ static void action_allToAll(const char *const *action) { void *recv = smpi_get_tmp_recvbuffer(recv_size*comm_size* MPI_CURRENT_TYPE2->size()); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ALLTOALL; - extra->send_size = send_size; - extra->recv_size = recv_size; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr); - - TRACE_smpi_collective_in(rank, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::CollTIData("allToAll", -1, -1.0, send_size, recv_size, + encode_datatype(MPI_CURRENT_TYPE), + encode_datatype(MPI_CURRENT_TYPE2))); Colls::alltoall(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, MPI_COMM_WORLD); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -623,22 +566,59 @@ static void action_gather(const char *const *action) { if(rank==root) recv = smpi_get_tmp_recvbuffer(recv_size*comm_size* MPI_CURRENT_TYPE2->size()); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_GATHER; - extra->send_size = send_size; - extra->recv_size = recv_size; - extra->root = root; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr); - - TRACE_smpi_collective_in(smpi_process()->index(), __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::CollTIData("gather", root, -1.0, send_size, recv_size, + encode_datatype(MPI_CURRENT_TYPE), + encode_datatype(MPI_CURRENT_TYPE2))); Colls::gather(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD); - TRACE_smpi_collective_out(smpi_process()->index(), __FUNCTION__); + TRACE_smpi_comm_out(smpi_process()->index()); log_timed_action (action, clock); } +static void action_scatter(const char* const* action) +{ + /* The structure of the scatter action for the rank 0 (total 4 processes) is the following: + 0 gather 68 68 0 0 0 + where: + 1) 68 is the sendcounts + 2) 68 is the recvcounts + 3) 0 is the root node + 4) 0 is the send datatype id, see decode_datatype() + 5) 0 is the recv datatype id, see decode_datatype() + */ + CHECK_ACTION_PARAMS(action, 2, 3) + double clock = smpi_process()->simulated_elapsed(); + int comm_size = MPI_COMM_WORLD->size(); + int send_size = parse_double(action[2]); + int recv_size = parse_double(action[3]); + MPI_Datatype MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE; + if (action[4] && action[5]) { + MPI_CURRENT_TYPE = decode_datatype(action[5]); + MPI_CURRENT_TYPE2 = decode_datatype(action[6]); + } else { + MPI_CURRENT_TYPE = MPI_DEFAULT_TYPE; + } + void* send = smpi_get_tmp_sendbuffer(send_size * MPI_CURRENT_TYPE->size()); + void* recv = nullptr; + int root = 0; + if (action[4]) + root = atoi(action[4]); + int rank = MPI_COMM_WORLD->rank(); + + if (rank == root) + recv = smpi_get_tmp_recvbuffer(recv_size * comm_size * MPI_CURRENT_TYPE2->size()); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::CollTIData("gather", root, -1.0, send_size, recv_size, + encode_datatype(MPI_CURRENT_TYPE), + encode_datatype(MPI_CURRENT_TYPE2))); + + Colls::scatter(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD); + + TRACE_smpi_comm_out(smpi_process()->index()); + log_timed_action(action, clock); +} + static void action_gatherv(const char *const *action) { /* The structure of the gatherv action for the rank 0 (total 4 processes) is the following: 0 gather 68 68 10 10 10 0 0 0 @@ -678,25 +658,74 @@ static void action_gatherv(const char *const *action) { if(rank==root) recv = smpi_get_tmp_recvbuffer(recv_sum* MPI_CURRENT_TYPE2->size()); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_GATHERV; - extra->send_size = send_size; - extra->recvcounts= xbt_new(int,comm_size); - for(int i=0; i< comm_size; i++)//copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i]; - extra->root = root; - extra->num_processes = comm_size; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr); + std::vector* trace_recvcounts = new std::vector; + for (int i = 0; i < comm_size; i++) // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i]); - TRACE_smpi_collective_in(smpi_process()->index(), __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "gatherV", root, send_size, nullptr, -1, trace_recvcounts, + encode_datatype(MPI_CURRENT_TYPE), encode_datatype(MPI_CURRENT_TYPE2))); Colls::gatherv(send, send_size, MPI_CURRENT_TYPE, recv, recvcounts, disps, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD); - TRACE_smpi_collective_out(smpi_process()->index(), __FUNCTION__); + TRACE_smpi_comm_out(smpi_process()->index()); log_timed_action (action, clock); } +static void action_scatterv(const char* const* action) +{ + /* The structure of the scatterv action for the rank 0 (total 4 processes) is the following: + 0 gather 68 10 10 10 68 0 0 0 + where: + 1) 68 10 10 10 is the sendcounts + 2) 68 is the recvcount + 3) 0 is the root node + 4) 0 is the send datatype id, see decode_datatype() + 5) 0 is the recv datatype id, see decode_datatype() + */ + double clock = smpi_process()->simulated_elapsed(); + int comm_size = MPI_COMM_WORLD->size(); + CHECK_ACTION_PARAMS(action, comm_size + 1, 2) + int recv_size = parse_double(action[2 + comm_size]); + int disps[comm_size]; + int sendcounts[comm_size]; + int send_sum = 0; + + MPI_Datatype MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE; + if (action[4 + comm_size] && action[5 + comm_size]) { + MPI_CURRENT_TYPE = decode_datatype(action[4 + comm_size]); + MPI_CURRENT_TYPE2 = decode_datatype(action[5 + comm_size]); + } else + MPI_CURRENT_TYPE = MPI_DEFAULT_TYPE; + + void* send = nullptr; + void* recv = smpi_get_tmp_recvbuffer(recv_size * MPI_CURRENT_TYPE->size()); + for (int i = 0; i < comm_size; i++) { + sendcounts[i] = atoi(action[i + 2]); + send_sum += sendcounts[i]; + disps[i] = 0; + } + + int root = atoi(action[3 + comm_size]); + int rank = MPI_COMM_WORLD->rank(); + + if (rank == root) + send = smpi_get_tmp_sendbuffer(send_sum * MPI_CURRENT_TYPE2->size()); + + std::vector* trace_sendcounts = new std::vector; + for (int i = 0; i < comm_size; i++) // copy data to avoid bad free + trace_sendcounts->push_back(sendcounts[i]); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "gatherV", root, -1, trace_sendcounts, recv_size, nullptr, + encode_datatype(MPI_CURRENT_TYPE), encode_datatype(MPI_CURRENT_TYPE2))); + + Colls::scatterv(send, sendcounts, disps, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD); + + TRACE_smpi_comm_out(smpi_process()->index()); + log_timed_action(action, clock); +} + static void action_reducescatter(const char *const *action) { /* The structure of the reducescatter action for the rank 0 (total 4 processes) is the following: 0 reduceScatter 275427 275427 275427 204020 11346849 0 @@ -712,6 +741,7 @@ static void action_reducescatter(const char *const *action) { int recvcounts[comm_size]; int rank = smpi_process()->index(); int size = 0; + std::vector* trace_recvcounts = new std::vector; if(action[3+comm_size]) MPI_CURRENT_TYPE=decode_datatype(action[3+comm_size]); else @@ -719,20 +749,14 @@ static void action_reducescatter(const char *const *action) { for(int i=0;ipush_back(recvcounts[i]); size+=recvcounts[i]; } - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_REDUCE_SCATTER; - extra->send_size = 0; - extra->recvcounts= xbt_new(int, comm_size); - for(int i=0; i< comm_size; i++)//copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i]; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->comp_size = comp_size; - extra->num_processes = comm_size; - - TRACE_smpi_collective_in(rank, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData("reduceScatter", -1, 0, nullptr, -1, trace_recvcounts, + std::to_string(comp_size), /* ugly hack to print comp_size */ + encode_datatype(MPI_CURRENT_TYPE))); void *sendbuf = smpi_get_tmp_sendbuffer(size* MPI_CURRENT_TYPE->size()); void *recvbuf = smpi_get_tmp_recvbuffer(size* MPI_CURRENT_TYPE->size()); @@ -740,7 +764,7 @@ static void action_reducescatter(const char *const *action) { Colls::reduce_scatter(sendbuf, recvbuf, recvcounts, MPI_CURRENT_TYPE, MPI_OP_NULL, MPI_COMM_WORLD); smpi_execute_flops(comp_size); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -770,19 +794,14 @@ static void action_allgather(const char *const *action) { void *recvbuf = smpi_get_tmp_recvbuffer(recvcount* MPI_CURRENT_TYPE2->size()); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ALLGATHER; - extra->send_size = sendcount; - extra->recv_size= recvcount; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr); - extra->num_processes = MPI_COMM_WORLD->size(); - TRACE_smpi_collective_in(rank, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::CollTIData("allGather", -1, -1.0, sendcount, recvcount, + encode_datatype(MPI_CURRENT_TYPE), + encode_datatype(MPI_CURRENT_TYPE2))); Colls::allgather(sendbuf, sendcount, MPI_CURRENT_TYPE, recvbuf, recvcount, MPI_CURRENT_TYPE2, MPI_COMM_WORLD); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -820,22 +839,19 @@ static void action_allgatherv(const char *const *action) { void *recvbuf = smpi_get_tmp_recvbuffer(recv_sum* MPI_CURRENT_TYPE2->size()); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ALLGATHERV; - extra->send_size = sendcount; - extra->recvcounts= xbt_new(int, comm_size); - for(int i=0; i< comm_size; i++)//copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i]; - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr); - extra->num_processes = comm_size; - - TRACE_smpi_collective_in(rank, __FUNCTION__,extra); + + std::vector* trace_recvcounts = new std::vector; + for (int i = 0; i < comm_size; i++) // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i]); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "allGatherV", -1, sendcount, nullptr, -1, trace_recvcounts, + encode_datatype(MPI_CURRENT_TYPE), encode_datatype(MPI_CURRENT_TYPE2))); Colls::allgatherv(sendbuf, sendcount, MPI_CURRENT_TYPE, recvbuf, recvcounts, disps, MPI_CURRENT_TYPE2, MPI_COMM_WORLD); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -852,8 +868,12 @@ static void action_allToAllv(const char *const *action) { int comm_size = MPI_COMM_WORLD->size(); CHECK_ACTION_PARAMS(action, 2*comm_size+2, 2) + int send_size = 0; + int recv_size = 0; int sendcounts[comm_size]; + std::vector* trace_sendcounts = new std::vector; int recvcounts[comm_size]; + std::vector* trace_recvcounts = new std::vector; int senddisps[comm_size]; int recvdisps[comm_size]; @@ -868,38 +888,29 @@ static void action_allToAllv(const char *const *action) { else MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE; + int rank = smpi_process()->index(); void *sendbuf = smpi_get_tmp_sendbuffer(send_buf_size* MPI_CURRENT_TYPE->size()); void *recvbuf = smpi_get_tmp_recvbuffer(recv_buf_size* MPI_CURRENT_TYPE2->size()); for(int i=0;ipush_back(sendcounts[i]); + send_size += sendcounts[i]; recvcounts[i] = atoi(action[i+4+comm_size]); + trace_recvcounts->push_back(recvcounts[i]); + recv_size += recvcounts[i]; senddisps[i] = 0; recvdisps[i] = 0; } - int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_ALLTOALLV; - extra->recvcounts= xbt_new(int, comm_size); - extra->sendcounts= xbt_new(int, comm_size); - extra->num_processes = comm_size; - - for(int i=0; i< comm_size; i++){//copy data to avoid bad free - extra->send_size += sendcounts[i]; - extra->sendcounts[i] = sendcounts[i]; - extra->recv_size += recvcounts[i]; - extra->recvcounts[i] = recvcounts[i]; - } - extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr); - extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr); - - TRACE_smpi_collective_in(rank, __FUNCTION__,extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "allToAllV", -1, send_size, trace_sendcounts, recv_size, trace_recvcounts, + encode_datatype(MPI_CURRENT_TYPE), encode_datatype(MPI_CURRENT_TYPE2))); Colls::alltoallv(sendbuf, sendcounts, senddisps, MPI_CURRENT_TYPE,recvbuf, recvcounts, recvdisps, MPI_CURRENT_TYPE, MPI_COMM_WORLD); - TRACE_smpi_collective_out(rank, __FUNCTION__); + TRACE_smpi_comm_out(rank); log_timed_action (action, clock); } @@ -915,10 +926,8 @@ void smpi_replay_init(int* argc, char*** argv) int rank = smpi_process()->index(); TRACE_smpi_init(rank); TRACE_smpi_computing_init(rank); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_INIT; - TRACE_smpi_collective_in(rank, "smpi_replay_run_init", extra); - TRACE_smpi_collective_out(rank, "smpi_replay_run_init"); + TRACE_smpi_comm_in(rank, "smpi_replay_run_init", new simgrid::instr::NoOpTIData("init")); + TRACE_smpi_comm_out(rank); xbt_replay_action_register("init", simgrid::smpi::action_init); xbt_replay_action_register("finalize", simgrid::smpi::action_finalize); xbt_replay_action_register("comm_size", simgrid::smpi::action_comm_size); @@ -938,7 +947,9 @@ void smpi_replay_init(int* argc, char*** argv) xbt_replay_action_register("allToAll", simgrid::smpi::action_allToAll); xbt_replay_action_register("allToAllV", simgrid::smpi::action_allToAllv); xbt_replay_action_register("gather", simgrid::smpi::action_gather); + xbt_replay_action_register("scatter", simgrid::smpi::action_scatter); xbt_replay_action_register("gatherV", simgrid::smpi::action_gatherv); + xbt_replay_action_register("scatterV", simgrid::smpi::action_scatterv); xbt_replay_action_register("allGather", simgrid::smpi::action_allgather); xbt_replay_action_register("allGatherV", simgrid::smpi::action_allgatherv); xbt_replay_action_register("reduceScatter", simgrid::smpi::action_reducescatter); @@ -986,13 +997,11 @@ void smpi_replay_main(int* argc, char*** argv) xbt_free(recvbuffer); } - instr_extra_data extra_fin = xbt_new0(s_instr_extra_data_t,1); - extra_fin->type = TRACING_FINALIZE; - TRACE_smpi_collective_in(smpi_process()->index(), "smpi_replay_run_finalize", extra_fin); + TRACE_smpi_comm_in(smpi_process()->index(), "smpi_replay_run_finalize", new simgrid::instr::NoOpTIData("finalize")); smpi_process()->finalize(); - TRACE_smpi_collective_out(smpi_process()->index(), "smpi_replay_run_finalize"); + TRACE_smpi_comm_out(smpi_process()->index()); TRACE_smpi_finalize(smpi_process()->index()); } diff --git a/src/smpi/internals/smpi_shared.cpp b/src/smpi/internals/smpi_shared.cpp index 728b97a2b7..9bf2045811 100644 --- a/src/smpi/internals/smpi_shared.cpp +++ b/src/smpi/internals/smpi_shared.cpp @@ -36,7 +36,6 @@ #include #include -#include "private.h" #include "private.hpp" #include @@ -68,6 +67,7 @@ namespace{ class smpi_source_location : public std::string { public: + smpi_source_location() = default; smpi_source_location(const char* filename, int line) : std::string(std::string(filename) + ":" + std::to_string(line)) { } @@ -149,7 +149,7 @@ static void *smpi_shared_malloc_local(size_t size, const char *file, int line) auto res = allocs.insert(std::make_pair(loc, shared_data_t())); auto data = res.first; if (res.second) { - // The insertion did not take place. + // The new element was inserted. // Generate a shared memory name from the address of the shared_data: char shmname[32]; // cannot be longer than PSHMNAMLEN = 31 on Mac OS X (shm_open raises ENAMETOOLONG otherwise) snprintf(shmname, 31, "/shmalloc%p", &*data); @@ -191,8 +191,8 @@ static void *smpi_shared_malloc_local(size_t size, const char *file, int line) void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int nb_shared_blocks) { - char *huge_page_mount_point = xbt_cfg_get_string("smpi/shared-malloc-hugepage"); - bool use_huge_page = huge_page_mount_point[0] != '\0'; + std::string huge_page_mount_point = xbt_cfg_get_string("smpi/shared-malloc-hugepage"); + bool use_huge_page = not huge_page_mount_point.empty(); #ifndef MAP_HUGETLB /* If the system header don't define that mmap flag */ xbt_assert(not use_huge_page, "Huge pages are not available on your system, you cannot use the smpi/shared-malloc-hugepage option."); @@ -232,23 +232,21 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int * We cannot use a same file for the two type of calls, since the first one needs to be * opened in a hugetlbfs mount point whereas the second needs to be a "classical" file. */ if(use_huge_page && smpi_shared_malloc_bogusfile_huge_page == -1) { - char* huge_page_filename = bprintf("%s/simgrid-shmalloc-XXXXXX", huge_page_mount_point); - smpi_shared_malloc_bogusfile_huge_page = mkstemp(huge_page_filename); - XBT_DEBUG("bogusfile_huge_page: %s\n", huge_page_filename); - unlink(huge_page_filename); - xbt_free(huge_page_filename); + std::string huge_page_filename = huge_page_mount_point + "/simgrid-shmalloc-XXXXXX"; + smpi_shared_malloc_bogusfile_huge_page = mkstemp((char*)huge_page_filename.c_str()); + XBT_DEBUG("bogusfile_huge_page: %s\n", huge_page_filename.c_str()); + unlink(huge_page_filename.c_str()); } if(smpi_shared_malloc_bogusfile == -1) { - char *name = xbt_strdup("/tmp/simgrid-shmalloc-XXXXXX"); + char name[] = "/tmp/simgrid-shmalloc-XXXXXX"; smpi_shared_malloc_bogusfile = mkstemp(name); XBT_DEBUG("bogusfile : %s\n", name); unlink(name); - xbt_free(name); - char* dumb = (char*)calloc(1, smpi_shared_malloc_blocksize); + char* dumb = new char[smpi_shared_malloc_blocksize](); // zero initialized ssize_t err = write(smpi_shared_malloc_bogusfile, dumb, smpi_shared_malloc_blocksize); if(err<0) xbt_die("Could not write bogus file for shared malloc"); - xbt_free(dumb); + delete[] dumb; } int mmap_base_flag = MAP_FIXED | MAP_SHARED | MAP_POPULATE; @@ -273,9 +271,9 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int "stop_offset (%zu) should be lower than its successor start offset (%zu)", stop_offset, shared_block_offsets[2*i_block+2]); size_t start_block_offset = ALIGN_UP(start_offset, smpi_shared_malloc_blocksize); size_t stop_block_offset = ALIGN_DOWN(stop_offset, smpi_shared_malloc_blocksize); - for (unsigned block_id=0, i = start_block_offset / smpi_shared_malloc_blocksize; i < stop_block_offset / smpi_shared_malloc_blocksize; block_id++, i++) { - XBT_DEBUG("\t\tglobal shared allocation, mmap block offset %u", block_id); - void* pos = (void*)((unsigned long)mem + i * smpi_shared_malloc_blocksize); + for (size_t offset = start_block_offset; offset < stop_block_offset; offset += smpi_shared_malloc_blocksize) { + XBT_DEBUG("\t\tglobal shared allocation, mmap block offset %zx", offset); + void* pos = (void*)((unsigned long)mem + offset); void* res = mmap(pos, smpi_shared_malloc_blocksize, PROT_READ | PROT_WRITE, mmap_flag, huge_fd, 0); xbt_assert(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the " @@ -314,7 +312,7 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int shared_metadata_t newmeta; //register metadata for memcpy avoidance - shared_data_key_type* data = (shared_data_key_type*)xbt_malloc(sizeof(shared_data_key_type)); + shared_data_key_type* data = new shared_data_key_type; data->second.fd = -1; data->second.count = 1; newmeta.size = size; @@ -347,8 +345,8 @@ void *smpi_shared_malloc(size_t size, const char *file, int line) { size_t shared_block_offsets[2] = {0, size}; return smpi_shared_malloc_partial(size, shared_block_offsets, nb_shared_blocks); } - XBT_DEBUG("Classic malloc %zu", size); - return xbt_malloc(size); + XBT_DEBUG("Classic allocation of %zu bytes", size); + return ::operator new(size); } int smpi_is_shared(void* ptr, std::vector> &private_blocks, size_t *offset){ @@ -442,13 +440,13 @@ void smpi_shared_free(void *ptr) if (meta != allocs_metadata.end()){ meta->second.data->second.count--; if(meta->second.data->second.count==0) - xbt_free(meta->second.data); + delete meta->second.data; } munmap(ptr, meta->second.size); } else { - XBT_DEBUG("Classic free of %p", ptr); - xbt_free(ptr); + XBT_DEBUG("Classic deallocation of %p", ptr); + ::operator delete(ptr); } } #endif diff --git a/src/smpi/internals/smpi_static_variables.cpp b/src/smpi/internals/smpi_static_variables.cpp index 7d26e57575..0d504c455d 100644 --- a/src/smpi/internals/smpi_static_variables.cpp +++ b/src/smpi/internals/smpi_static_variables.cpp @@ -3,13 +3,13 @@ /* 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 "private.hpp" #include -#include "private.h" -typedef struct s_smpi_static { +struct s_smpi_static_t { void *ptr; void_f_pvoid_t free_fn; -} s_smpi_static_t; +}; /** * \brief Holds a reference to all static variables that were registered diff --git a/src/smpi/internals/smpi_utils.cpp b/src/smpi/internals/smpi_utils.cpp index 86594e15e4..e646ff7ef1 100644 --- a/src/smpi/internals/smpi_utils.cpp +++ b/src/smpi/internals/smpi_utils.cpp @@ -4,14 +4,14 @@ /* 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 "smpi/smpi_utils.hpp" -#include "xbt/sysdep.h" +#include "smpi_utils.hpp" #include "xbt/log.h" +#include "xbt/sysdep.h" #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_utils, smpi, "Logging specific to SMPI (utils)"); -std::vector parse_factor(const char *smpi_coef_string) +std::vector parse_factor(std::string smpi_coef_string) { std::vector smpi_factor; @@ -19,8 +19,7 @@ std::vector parse_factor(const char *smpi_coef_string) typedef boost::tokenizer> Tokenizer; boost::char_separator sep(";"); boost::char_separator factor_separator(":"); - std::string tmp_string(smpi_coef_string); - Tokenizer tokens(tmp_string, sep); + Tokenizer tokens(smpi_coef_string, sep); /** * Iterate over patterns like A:B:C:D;E:F;G:H @@ -34,7 +33,7 @@ std::vector parse_factor(const char *smpi_coef_string) Tokenizer factor_values(*token_iter, factor_separator); s_smpi_factor_t fact; if (factor_values.begin() == factor_values.end()) { - xbt_die("Malformed radical for smpi factor: '%s'", smpi_coef_string); + xbt_die("Malformed radical for smpi factor: '%s'", smpi_coef_string.c_str()); } unsigned int iteration = 0; for (Tokenizer::iterator factor_iter = factor_values.begin(); factor_iter != factor_values.end(); ++factor_iter) { diff --git a/src/smpi/mpi/smpi_comm.cpp b/src/smpi/mpi/smpi_comm.cpp index e70e2052c5..4998ea0c11 100644 --- a/src/smpi/mpi/smpi_comm.cpp +++ b/src/smpi/mpi/smpi_comm.cpp @@ -4,7 +4,6 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "smpi_comm.hpp" -#include "private.h" #include "private.hpp" #include "simgrid/s4u/Host.hpp" #include "smpi_coll.hpp" @@ -13,7 +12,7 @@ #include "smpi_request.hpp" #include "smpi_status.hpp" #include "smpi_win.hpp" -#include "src/simix/smx_private.h" +#include "src/simix/smx_private.hpp" #include #include #include @@ -264,7 +263,7 @@ void Comm::cleanup_smp(){ if (non_uniform_map_ != nullptr) xbt_free(non_uniform_map_); if (leaders_map_ != nullptr) - xbt_free(leaders_map_); + delete[] leaders_map_; } void Comm::unref(Comm* comm){ @@ -333,11 +332,10 @@ void Comm::init_smp(){ MPI_Comm comm_intra = new Comm(group_intra, nullptr); leader=min_index; - int * leaders_map= static_cast(xbt_malloc0(sizeof(int)*comm_size)); - int * leader_list= static_cast(xbt_malloc0(sizeof(int)*comm_size)); - for(i=0; iset_replaying(true); diff --git a/src/smpi/mpi/smpi_datatype.cpp b/src/smpi/mpi/smpi_datatype.cpp index 565ec99448..4237217359 100644 --- a/src/smpi/mpi/smpi_datatype.cpp +++ b/src/smpi/mpi/smpi_datatype.cpp @@ -5,7 +5,6 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "simgrid/modelchecker.h" -#include "private.h" #include "private.hpp" #include "smpi_datatype_derived.hpp" #include "smpi_op.hpp" @@ -190,11 +189,15 @@ void Datatype::commit() flags_ |= DT_FLAG_COMMITED; } - bool Datatype::is_valid(){ return (flags_ & DT_FLAG_COMMITED); } +bool Datatype::is_basic() +{ + return (flags_ & DT_FLAG_BASIC); +} + size_t Datatype::size(){ return size_; } @@ -280,9 +283,9 @@ int Datatype::copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, if (not smpi_process()->replaying()) memcpy(recvbuf, sendbuf, count); } else if (not(sendtype->flags() & DT_FLAG_DERIVED)) { - recvtype->unserialize( sendbuf, recvbuf, recvcount/recvtype->size(), MPI_REPLACE); + recvtype->unserialize(sendbuf, recvbuf, count / recvtype->size(), MPI_REPLACE); } else if (not(recvtype->flags() & DT_FLAG_DERIVED)) { - sendtype->serialize(sendbuf, recvbuf, sendcount/sendtype->size()); + sendtype->serialize(sendbuf, recvbuf, count / sendtype->size()); }else{ void * buf_tmp = xbt_malloc(count); diff --git a/src/smpi/mpi/smpi_datatype_derived.cpp b/src/smpi/mpi/smpi_datatype_derived.cpp index ba77e82eef..b620511f32 100644 --- a/src/smpi/mpi/smpi_datatype_derived.cpp +++ b/src/smpi/mpi/smpi_datatype_derived.cpp @@ -6,30 +6,31 @@ #include "smpi_datatype_derived.hpp" #include "smpi_op.hpp" - -XBT_LOG_EXTERNAL_CATEGORY(smpi_datatype); +#include namespace simgrid{ namespace smpi{ - -Type_Contiguous::Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type): Datatype(size, lb, ub, flags), block_count_(block_count), old_type_(old_type){ +Type_Contiguous::Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type) + : Datatype(size, lb, ub, flags), block_count_(block_count), old_type_(old_type) +{ old_type_->ref(); } -Type_Contiguous::~Type_Contiguous(){ +Type_Contiguous::~Type_Contiguous() +{ Datatype::unref(old_type_); } - -void Type_Contiguous::serialize( void* noncontiguous_buf, void *contiguous_buf, - int count){ +void Type_Contiguous::serialize(void* noncontiguous_buf, void* contiguous_buf, int count) +{ char* contiguous_buf_char = static_cast(contiguous_buf); char* noncontiguous_buf_char = static_cast(noncontiguous_buf)+lb(); memcpy(contiguous_buf_char, noncontiguous_buf_char, count * block_count_ * old_type_->size()); } -void Type_Contiguous::unserialize( void* contiguous_buf, void *noncontiguous_buf, - int count, MPI_Op op){ + +void Type_Contiguous::unserialize(void* contiguous_buf, void* noncontiguous_buf, int count, MPI_Op op) +{ char* contiguous_buf_char = static_cast(contiguous_buf); char* noncontiguous_buf_char = static_cast(noncontiguous_buf)+lb(); int n= count*block_count_; @@ -37,56 +38,6 @@ void Type_Contiguous::unserialize( void* contiguous_buf, void *noncontiguous_buf op->apply( contiguous_buf_char, noncontiguous_buf_char, &n, old_type_); } - -Type_Vector::Type_Vector(int size,MPI_Aint lb, MPI_Aint ub, int flags, int count, int block_length, int stride, MPI_Datatype old_type): Datatype(size, lb, ub, flags), block_count_(count), block_length_(block_length),block_stride_(stride), old_type_(old_type){ - old_type_->ref(); -} - -Type_Vector::~Type_Vector(){ - Datatype::unref(old_type_); -} - - -void Type_Vector::serialize( void* noncontiguous_buf, void *contiguous_buf, - int count){ - char* contiguous_buf_char = static_cast(contiguous_buf); - char* noncontiguous_buf_char = static_cast(noncontiguous_buf); - - for (int i = 0; i < block_count_ * count; i++) { - if (not(old_type_->flags() & DT_FLAG_DERIVED)) - memcpy(contiguous_buf_char, noncontiguous_buf_char, block_length_ * old_type_->size()); - else - old_type_->serialize(noncontiguous_buf_char, contiguous_buf_char, block_length_); - - contiguous_buf_char += block_length_*old_type_->size(); - if((i+1)%block_count_ ==0) - noncontiguous_buf_char += block_length_*old_type_->get_extent(); - else - noncontiguous_buf_char += block_stride_*old_type_->get_extent(); - } -} - -void Type_Vector::unserialize( void* contiguous_buf, void *noncontiguous_buf, - int count, MPI_Op op){ - char* contiguous_buf_char = static_cast(contiguous_buf); - char* noncontiguous_buf_char = static_cast(noncontiguous_buf); - - for (int i = 0; i < block_count_ * count; i++) { - if (not(old_type_->flags() & DT_FLAG_DERIVED)) { - if(op != MPI_OP_NULL) - op->apply(contiguous_buf_char, noncontiguous_buf_char, &block_length_, - old_type_); - }else - old_type_->unserialize(contiguous_buf_char, noncontiguous_buf_char, block_length_, op); - - contiguous_buf_char += block_length_*old_type_->size(); - if((i+1)%block_count_ ==0) - noncontiguous_buf_char += block_length_*old_type_->get_extent(); - else - noncontiguous_buf_char += block_stride_*old_type_->get_extent(); - } -} - Type_Hvector::Type_Hvector(int size,MPI_Aint lb, MPI_Aint ub, int flags, int count, int block_length, MPI_Aint stride, MPI_Datatype old_type): Datatype(size, lb, ub, flags), block_count_(count), block_length_(block_length), block_stride_(stride), old_type_(old_type){ old_type->ref(); } @@ -113,7 +64,6 @@ void Type_Hvector::serialize( void* noncontiguous_buf, void *contiguous_buf, } } - void Type_Hvector::unserialize( void* contiguous_buf, void *noncontiguous_buf, int count, MPI_Op op){ char* contiguous_buf_char = static_cast(contiguous_buf); @@ -133,86 +83,40 @@ void Type_Hvector::unserialize( void* contiguous_buf, void *noncontiguous_buf, } } -Type_Indexed::Type_Indexed(int size,MPI_Aint lb, MPI_Aint ub, int flags, int count, int* block_lengths, int* block_indices, MPI_Datatype old_type): Datatype(size, lb, ub, flags), block_count_(count), old_type_(old_type){ - old_type->ref(); - block_lengths_ = new int[count]; - block_indices_ = new int[count]; - for (int i = 0; i < count; i++) { - block_lengths_[i]=block_lengths[i]; - block_indices_[i]=block_indices[i]; - } -} - -Type_Indexed::~Type_Indexed(){ - Datatype::unref(old_type_); - if(refcount()==0){ - delete[] block_lengths_; - delete[] block_indices_; - } -} - - -void Type_Indexed::serialize( void* noncontiguous_buf, void *contiguous_buf, - int count){ - char* contiguous_buf_char = static_cast(contiguous_buf); - char* noncontiguous_buf_char = static_cast(noncontiguous_buf)+block_indices_[0] * old_type_->size(); - for (int j = 0; j < count; j++) { - for (int i = 0; i < block_count_; i++) { - if (not(old_type_->flags() & DT_FLAG_DERIVED)) - memcpy(contiguous_buf_char, noncontiguous_buf_char, block_lengths_[i] * old_type_->size()); - else - old_type_->serialize( noncontiguous_buf_char, contiguous_buf_char, block_lengths_[i]); - - contiguous_buf_char += block_lengths_[i]*old_type_->size(); - if (i(noncontiguous_buf) + block_indices_[i+1]*old_type_->get_extent(); - else - noncontiguous_buf_char += block_lengths_[i]*old_type_->get_extent(); - } - noncontiguous_buf=static_cast< void*>(noncontiguous_buf_char); - } +Type_Vector::Type_Vector(int size, MPI_Aint lb, MPI_Aint ub, int flags, int count, int block_length, int stride, + MPI_Datatype old_type) + : Type_Hvector(size, lb, ub, flags, count, block_length, stride * old_type->get_extent(), old_type) +{ } - -void Type_Indexed::unserialize( void* contiguous_buf, void *noncontiguous_buf, - int count, MPI_Op op){ - char* contiguous_buf_char = static_cast(contiguous_buf); - char* noncontiguous_buf_char = - static_cast(noncontiguous_buf)+block_indices_[0]*old_type_->get_extent(); - for (int j = 0; j < count; j++) { - for (int i = 0; i < block_count_; i++) { - if (not(old_type_->flags() & DT_FLAG_DERIVED)) { - if(op!=MPI_OP_NULL) - op->apply( contiguous_buf_char, noncontiguous_buf_char, &block_lengths_[i], - old_type_); - }else - old_type_->unserialize( contiguous_buf_char,noncontiguous_buf_char,block_lengths_[i], op); - - contiguous_buf_char += block_lengths_[i]*old_type_->size(); - if (i(noncontiguous_buf) + block_indices_[i+1]*old_type_->get_extent(); - else - noncontiguous_buf_char += block_lengths_[i]*old_type_->get_extent(); - } - noncontiguous_buf=static_cast(noncontiguous_buf_char); +Type_Hindexed::Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int count, int* block_lengths, + MPI_Aint* block_indices, MPI_Datatype old_type) + : Datatype(size, lb, ub, flags), block_count_(count), old_type_(old_type) +{ + old_type_->ref(); + block_lengths_ = new int[count]; + block_indices_ = new MPI_Aint[count]; + for (int i = 0; i < count; i++) { + block_lengths_[i] = block_lengths[i]; + block_indices_[i] = block_indices[i]; } } -Type_Hindexed::Type_Hindexed(int size,MPI_Aint lb, MPI_Aint ub, int flags, int count, int* block_lengths, MPI_Aint* block_indices, MPI_Datatype old_type) -: Datatype(size, lb, ub, flags), block_count_(count), old_type_(old_type) +Type_Hindexed::Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int count, int* block_lengths, + int* block_indices, MPI_Datatype old_type, MPI_Aint factor) + : Datatype(size, lb, ub, flags), block_count_(count), old_type_(old_type) { old_type_->ref(); block_lengths_ = new int[count]; block_indices_ = new MPI_Aint[count]; for (int i = 0; i < count; i++) { - block_lengths_[i]=block_lengths[i]; - block_indices_[i]=block_indices[i]; + block_lengths_[i] = block_lengths[i]; + block_indices_[i] = block_indices[i] * factor; } } - Type_Hindexed::~Type_Hindexed(){ +Type_Hindexed::~Type_Hindexed() +{ Datatype::unref(old_type_); if(refcount()==0){ delete[] block_lengths_; @@ -264,6 +168,12 @@ void Type_Hindexed::unserialize( void* contiguous_buf, void *noncontiguous_buf, } } +Type_Indexed::Type_Indexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int count, int* block_lengths, + int* block_indices, MPI_Datatype old_type) + : Type_Hindexed(size, lb, ub, flags, count, block_lengths, block_indices, old_type, old_type->get_extent()) +{ +} + Type_Struct::Type_Struct(int size,MPI_Aint lb, MPI_Aint ub, int flags, int count, int* block_lengths, MPI_Aint* block_indices, MPI_Datatype* old_types): Datatype(size, lb, ub, flags), block_count_(count), block_lengths_(block_lengths), block_indices_(block_indices), old_types_(old_types){ block_lengths_= new int[count]; block_indices_= new MPI_Aint[count]; diff --git a/src/smpi/mpi/smpi_f2c.cpp b/src/smpi/mpi/smpi_f2c.cpp index 4a31be6386..0b17daa22c 100644 --- a/src/smpi/mpi/smpi_f2c.cpp +++ b/src/smpi/mpi/smpi_f2c.cpp @@ -3,8 +3,8 @@ /* 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 "private.h" #include "smpi_f2c.hpp" +#include "private.hpp" #include "smpi_process.hpp" #include diff --git a/src/smpi/mpi/smpi_group.cpp b/src/smpi/mpi/smpi_group.cpp index a3b3446dc4..4506de673e 100644 --- a/src/smpi/mpi/smpi_group.cpp +++ b/src/smpi/mpi/smpi_group.cpp @@ -3,8 +3,10 @@ /* 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 "smpi_comm.hpp" #include "smpi_group.hpp" +#include "smpi_comm.hpp" +#include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_group, smpi, "Logging specific to SMPI (group)"); @@ -17,64 +19,54 @@ namespace smpi{ Group::Group() { size_ = 0; /* size */ - rank_to_index_map_ = nullptr; /* rank_to_index_map_ */ refcount_ = 1; /* refcount_: start > 0 so that this group never gets freed */ } -Group::Group(int n) : size_(n) +Group::Group(int n) : size_(n), rank_to_index_map_(size_, MPI_UNDEFINED) { - rank_to_index_map_ = new int[size_]; refcount_ = 1; - for (int i = 0; i < size_; i++) - rank_to_index_map_[i] = MPI_UNDEFINED; } Group::Group(MPI_Group origin) { if (origin != MPI_GROUP_NULL && origin != MPI_GROUP_EMPTY) { size_ = origin->size(); - rank_to_index_map_ = new int[size_]; refcount_ = 1; - for (int i = 0; i < size_; i++) { - rank_to_index_map_[i] = origin->rank_to_index_map_[i]; - } - - for (auto const& elm : origin->index_to_rank_map_) { - index_to_rank_map_.insert({elm.first, elm.second}); - } + rank_to_index_map_ = origin->rank_to_index_map_; + index_to_rank_map_ = origin->index_to_rank_map_; } } -Group::~Group() -{ - delete[] rank_to_index_map_; -} - void Group::set_mapping(int index, int rank) { - if (rank < size_) { + if (0 <= rank && rank < size_) { rank_to_index_map_[rank] = index; - if (index != MPI_UNDEFINED) - index_to_rank_map_.insert({index, rank}); + if (index != MPI_UNDEFINED) { + if ((unsigned)index >= index_to_rank_map_.size()) + index_to_rank_map_.resize(index + 1, MPI_UNDEFINED); + index_to_rank_map_[index] = rank; + } } } int Group::index(int rank) { - int index = MPI_UNDEFINED; - - if (0 <= rank && rank < size_) { + int index; + if (0 <= rank && rank < size_) index = rank_to_index_map_[rank]; - } + else + index = MPI_UNDEFINED; return index; } int Group::rank(int index) { - if (this == MPI_GROUP_EMPTY) - return MPI_UNDEFINED; - auto rank = index_to_rank_map_.find(index); - return rank == index_to_rank_map_.end() ? MPI_UNDEFINED : rank->second; + int rank; + if (0 <= index && (unsigned)index < index_to_rank_map_.size()) + rank = index_to_rank_map_[index]; + else + rank = MPI_UNDEFINED; + return rank; } void Group::ref() @@ -224,7 +216,7 @@ int Group::excl(int n, int *ranks, MPI_Group * newgroup){ int oldsize = size_; int newsize = oldsize - n; *newgroup = new Group(newsize); - int* to_exclude=xbt_new0(int, size_); + int* to_exclude = new int[size_]; for (int i = 0; i < oldsize; i++) to_exclude[i]=0; for (int i = 0; i < n; i++) @@ -237,11 +229,19 @@ int Group::excl(int n, int *ranks, MPI_Group * newgroup){ j++; } } - xbt_free(to_exclude); + delete[] to_exclude; return MPI_SUCCESS; } +static bool is_rank_in_range(int rank, int first, int last) +{ + if (first < last) + return rank <= last; + else + return rank >= last; +} + int Group::range_incl(int n, int ranges[][3], MPI_Group * newgroup){ int newsize = 0; for (int i = 0; i < n; i++) { @@ -253,13 +253,8 @@ int Group::range_incl(int n, int ranges[][3], MPI_Group * newgroup){ break; } rank += ranges[i][2]; /* Stride */ - if (ranges[i][0] < ranges[i][1]) { - if (rank > ranges[i][1]) - break; - } else { - if (rank < ranges[i][1]) - break; - } + if (not is_rank_in_range(rank, ranges[i][0], ranges[i][1])) + break; } } *newgroup = new Group(newsize); @@ -275,13 +270,8 @@ int Group::range_incl(int n, int ranges[][3], MPI_Group * newgroup){ break; } rank += ranges[i][2]; /* Stride */ - if (ranges[i][0] < ranges[i][1]) { - if (rank > ranges[i][1]) - break; - } else { - if (rank < ranges[i][1]) - break; - } + if (not is_rank_in_range(rank, ranges[i][0], ranges[i][1])) + break; } } return MPI_SUCCESS; @@ -298,13 +288,8 @@ int Group::range_excl(int n, int ranges[][3], MPI_Group * newgroup){ break; } rank += ranges[i][2]; /* Stride */ - if (ranges[i][0] < ranges[i][1]) { - if (rank > ranges[i][1]) - break; - } else { - if (rank < ranges[i][1]) - break; - } + if (not is_rank_in_range(rank, ranges[i][0], ranges[i][1])) + break; } } if (newsize == 0) { @@ -325,13 +310,8 @@ int Group::range_excl(int n, int ranges[][3], MPI_Group * newgroup){ break; } rank += ranges[i][2]; /* Stride */ - if (ranges[i][0] ranges[i][1]) - break; - }else{ - if (rank < ranges[i][1]) - break; - } + if (not is_rank_in_range(rank, ranges[i][0], ranges[i][1])) + break; } } if(add==1){ diff --git a/src/smpi/mpi/smpi_keyvals.cpp b/src/smpi/mpi/smpi_keyvals.cpp index 559ef5c3c9..9c1b90008e 100644 --- a/src/smpi/mpi/smpi_keyvals.cpp +++ b/src/smpi/mpi/smpi_keyvals.cpp @@ -4,7 +4,7 @@ /* 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 "private.h" +//#include "private.hpp" #include "smpi_keyvals.hpp" namespace simgrid{ diff --git a/src/smpi/mpi/smpi_op.cpp b/src/smpi/mpi/smpi_op.cpp index 67d6ae8a1c..0112d9b478 100644 --- a/src/smpi/mpi/smpi_op.cpp +++ b/src/smpi/mpi/smpi_op.cpp @@ -3,7 +3,6 @@ /* 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 "private.h" #include "private.hpp" #include "smpi_datatype.hpp" #include "smpi_op.hpp" diff --git a/src/smpi/mpi/smpi_request.cpp b/src/smpi/mpi/smpi_request.cpp index d490799d03..64c35749a2 100644 --- a/src/smpi/mpi/smpi_request.cpp +++ b/src/smpi/mpi/smpi_request.cpp @@ -5,16 +5,15 @@ #include "smpi_request.hpp" -#include "mc/mc.h" -#include "src/kernel/activity/CommImpl.hpp" -#include "src/mc/mc_replay.h" #include "SmpiHost.hpp" -#include "private.h" +#include "mc/mc.h" #include "private.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" #include "smpi_op.hpp" #include "smpi_process.hpp" +#include "src/kernel/activity/CommImpl.hpp" +#include "src/mc/mc_replay.hpp" #include @@ -32,7 +31,8 @@ extern void (*smpi_comm_copy_data_callback) (smx_activity_t, void*, size_t); namespace simgrid{ namespace smpi{ -Request::Request(void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm, unsigned flags) : buf_(buf), old_type_(datatype), src_(src), dst_(dst), tag_(tag), comm_(comm), flags_(flags) +Request::Request(void* buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm, unsigned flags) + : buf_(buf), old_type_(datatype), src_(src), dst_(dst), tag_(tag), comm_(comm), flags_(flags) { void *old_buf = nullptr; // FIXME Handle the case of a partial shared malloc. @@ -692,12 +692,11 @@ void Request::finish_wait(MPI_Request* request, MPI_Status * status) if (((req->flags_ & ACCUMULATE) != 0) || (datatype->flags() & DT_FLAG_DERIVED)) { // && (not smpi_is_shared(req->old_buf_))){ - if (not smpi_process()->replaying()) { - if (smpi_privatize_global_variables != 0 && (static_cast(req->old_buf_) >= smpi_data_exe_start) && - ((char*)req->old_buf_ < smpi_data_exe_start + smpi_data_exe_size)) { - XBT_VERB("Privatization : We are unserializing to a zone in global memory Switch data segment "); - smpi_switch_data_segment(smpi_process()->index()); - } + if (not smpi_process()->replaying() && smpi_privatize_global_variables != 0 && + static_cast(req->old_buf_) >= smpi_data_exe_start && + static_cast(req->old_buf_) < smpi_data_exe_start + smpi_data_exe_size) { + XBT_VERB("Privatization : We are unserializing to a zone in global memory Switch data segment "); + smpi_switch_data_segment(smpi_process()->index()); } if(datatype->flags() & DT_FLAG_DERIVED){ diff --git a/src/smpi/mpi/smpi_status.cpp b/src/smpi/mpi/smpi_status.cpp index 575046580d..e282a2276c 100644 --- a/src/smpi/mpi/smpi_status.cpp +++ b/src/smpi/mpi/smpi_status.cpp @@ -3,10 +3,10 @@ /* 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 "private.h" -#include "src/simix/smx_private.h" -#include "smpi_datatype.hpp" #include "smpi_status.hpp" +#include "private.hpp" +#include "smpi_datatype.hpp" +#include "src/simix/smx_private.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/mpi/smpi_topo.cpp b/src/smpi/mpi/smpi_topo.cpp index b55b0e313f..04b5179ffd 100644 --- a/src/smpi/mpi/smpi_topo.cpp +++ b/src/smpi/mpi/smpi_topo.cpp @@ -4,7 +4,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "smpi/smpi.h" -#include "private.h" +#include "private.hpp" #include "smpi_comm.hpp" #include "smpi_topo.hpp" #include "xbt/sysdep.h" @@ -94,7 +94,7 @@ Topo_Cart::Topo_Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], in *comm_cart = MPI_COMM_NULL; } } - comm_=*comm_cart; + setComm(*comm_cart); } Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { @@ -125,7 +125,7 @@ Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { } } } - return new Topo_Cart(comm_, newNDims, newDims, newPeriodic, 0, newcomm); + return new Topo_Cart(getComm(), newNDims, newDims, newPeriodic, 0, newcomm); } int Topo_Cart::coords(int rank, int maxdims, int coords[]) { @@ -195,7 +195,7 @@ int Topo_Cart::shift(int direction, int disp, int *rank_source, int *rank_dest) return MPI_ERR_DIMS; } - this->coords(comm_->rank(),ndims_, position); + this->coords(getComm()->rank(), ndims_, position); position[direction] += disp; if(position[direction] < 0 || diff --git a/src/smpi/mpi/smpi_win.cpp b/src/smpi/mpi/smpi_win.cpp index 02c7765ea1..7cc829aa18 100644 --- a/src/smpi/mpi/smpi_win.cpp +++ b/src/smpi/mpi/smpi_win.cpp @@ -3,7 +3,8 @@ /* 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 "private.h" +#include "smpi_win.hpp" +#include "private.hpp" #include "smpi_coll.hpp" #include "smpi_comm.hpp" #include "smpi_datatype.hpp" @@ -11,7 +12,6 @@ #include "smpi_keyvals.hpp" #include "smpi_process.hpp" #include "smpi_request.hpp" -#include "smpi_win.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_rma, smpi, "Logging specific to SMPI (RMA operations)"); diff --git a/src/smpi/smpirun.in b/src/smpi/smpirun.in index 3229f71cb8..3016954230 100755 --- a/src/smpi/smpirun.in +++ b/src/smpi/smpirun.in @@ -44,7 +44,6 @@ Options: -trace-comment-file # put file contents on the top of the trace file as comment -trace-grouped # group MPI processes by location -trace-resource # trace resource utilization - -trace-viva # generate configuration for Viva's GraphView -trace-file # name of the tracefile (simgrid_smpi.trace) -ext # additional parameter (reserved) @@ -147,14 +146,7 @@ while true; do fi shift 2 ;; - "-hostfile") - HOSTFILE="$2" - if [ ! -f "${HOSTFILE}" ]; then - die "the file '${HOSTFILE}' does not exist" - fi - shift 2 - ;; - "-machinefile") + "-hostfile" | "-machinefile") HOSTFILE="$2" if [ ! -f "${HOSTFILE}" ]; then die "the file '${HOSTFILE}' does not exist" @@ -202,10 +194,6 @@ while true; do TRACE_RESOURCE="true" shift 1 ;; - "-trace-viva") - TRACE_VIVA="true" - shift 1 - ;; "-keep-temps") KEEP="true" SIMOPTS="$SIMOPTS --cfg=smpi/keep-temps:yes" @@ -434,7 +422,7 @@ do fi echo " - + " >> ${APPLICATIONTMP} if [ ${REPLAY} = 1 ]; then if [ ${NUMTRACES} -gt 1 ]; then @@ -482,10 +470,6 @@ if [ -n "${TRACE_ACTIVE}" ]; then if [ -n "${TRACE_RESOURCE}" ]; then TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes" fi - - if [ -n "${TRACE_VIVA}" ]; then - TRACEOPTIONS="${TRACEOPTIONS} --cfg=viva/categorized:smpi_cat.plist --cfg=viva/uncategorized:smpi_uncat.plist" - fi fi ##---------------------- end SMPI TRACING OPTIONS --------------------------------- @@ -521,7 +505,7 @@ pid="" # Keep temporary files on failures to help debugging # if [ ${status} -ne 0 ] ; then - if [ -z ${KEEP} ]; then + if [ -z "${KEEP}" ]; then echo ${EXEC} ${PRIVATIZE} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP} if [ ${HOSTFILETMP} = 1 ] ; then echo "Generated hostfile ${HOSTFILE} kept." diff --git a/src/smpi/smpitools.sh b/src/smpi/smpitools.sh index d562d9ee16..40fcd3a5fc 100644 --- a/src/smpi/smpitools.sh +++ b/src/smpi/smpitools.sh @@ -69,5 +69,5 @@ list_set () { # $1: list # usage: eval $(list_get list) list_get () { - printf 'IFS="$LISTSEP"; eval set -- \\$%s; IFS="$SAVEIFS"' "$1" + printf 'IFS="'\$'LISTSEP"; eval set -- \$%s; IFS="'\$'SAVEIFS"\n' "$1" } diff --git a/src/surf/FileImpl.cpp b/src/surf/FileImpl.cpp deleted file mode 100644 index ff0a830369..0000000000 --- a/src/surf/FileImpl.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 2017. 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 "src/surf/FileImpl.hpp" -#include "src/surf/StorageImpl.hpp" - -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_file, surf, "Logging specific to the SURF file module"); -namespace simgrid { -namespace surf { - -FileImpl::FileImpl(sg_storage_t st, std::string path, std::string mount) : path_(path), mount_point_(mount) -{ - XBT_DEBUG("\tOpen file '%s'", path.c_str()); - location_ = st->getImpl(); - std::map* content = location_->getContent(); - // if file does not exist create an empty file - auto sz = content->find(path); - if (sz != content->end()) { - size_ = sz->second; - } else { - size_ = 0; - content->insert({path, size_}); - XBT_DEBUG("File '%s' was not found, file created.", path.c_str()); - } -} - -Action* FileImpl::read(sg_size_t size) -{ - XBT_DEBUG("READ %s on disk '%s'", cname(), location_->cname()); - if (current_position_ + size > size_) { - if (current_position_ > size_) { - size = 0; - } else { - size = size_ - current_position_; - } - current_position_ = size_; - } else - current_position_ += size; - - return location_->read(size); -} - -Action* FileImpl::write(sg_size_t size) -{ - XBT_DEBUG("WRITE %s on disk '%s'. size '%llu/%llu'", cname(), location_->cname(), size, size_); - - StorageAction* action = location_->write(size); - action->file_ = this; - /* Substract the part of the file that might disappear from the used sized on the storage element */ - location_->usedSize_ -= (size_ - current_position_); - // If the storage is full before even starting to write - if (location_->usedSize_ >= location_->getSize()) { - action->setState(Action::State::failed); - } - return action; -} - -int FileImpl::seek(sg_offset_t offset, int origin) -{ - switch (origin) { - case SEEK_SET: - current_position_ = offset; - return 0; - case SEEK_CUR: - current_position_ += offset; - return 0; - case SEEK_END: - current_position_ = size_ + offset; - return 0; - default: - return -1; - } -} - -int FileImpl::unlink() -{ - /* Check if the file is on this storage */ - if (location_->getContent()->find(path_) == location_->getContent()->end()) { - XBT_WARN("File %s is not on disk %s. Impossible to unlink", cname(), location_->cname()); - return -1; - } else { - XBT_DEBUG("UNLINK %s on disk '%s'", cname(), location_->cname()); - location_->usedSize_ -= size_; - - // Remove the file from storage - location_->getContent()->erase(path_); - - return 0; - } -} - -void FileImpl::move(std::string fullpath) -{ - /* Check if the new full path is on the same mount point */ - if (not strncmp(mount_point_.c_str(), fullpath.c_str(), mount_point_.size())) { - std::map* content = location_->getContent(); - auto sz = content->find(path_); - if (sz != content->end()) { // src file exists - sg_size_t new_size = sz->second; - content->erase(path_); - std::string path = fullpath.substr(mount_point_.length(), fullpath.length()); - content->insert({path.c_str(), new_size}); - XBT_DEBUG("Move file from %s to %s, size '%llu'", path_.c_str(), fullpath.c_str(), new_size); - } else { - XBT_WARN("File %s doesn't exist", path_.c_str()); - } - } else { - XBT_WARN("New full path %s is not on the same mount point: %s.", fullpath.c_str(), mount_point_.c_str()); - } -} -} -} diff --git a/src/surf/FileImpl.hpp b/src/surf/FileImpl.hpp deleted file mode 100644 index 6b2f9cce25..0000000000 --- a/src/surf/FileImpl.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2017. 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. */ - -#ifndef SRC_SURF_FILEIMPL_HPP_ -#define SRC_SURF_FILEIMPL_HPP_ - -#include "surf/surf.h" -#include - -namespace simgrid { -namespace surf { - -class FileImpl { -public: - FileImpl(sg_storage_t st, std::string path, std::string mount); - ~FileImpl() = default; - - std::string name() { return path_; } - const char* cname() { return path_.c_str(); } - const char* mount() { return mount_point_.c_str(); } - sg_size_t size() { return size_; } - void setSize(sg_size_t size) { size_ = size; } - void setPosition(sg_size_t size) { current_position_ = size; } - void incrPosition(sg_size_t incr) { current_position_ += incr; } - sg_size_t tell() { return current_position_; } - int seek(sg_offset_t offset, int origin); - int unlink(); - void move(std::string fullpath); - Action* read(sg_size_t size); - Action* write(sg_size_t size); - -private: - StorageImpl* location_; - std::string path_; - std::string mount_point_; - sg_size_t size_; - sg_size_t current_position_ = SEEK_SET; -}; -} -} -#endif /* SRC_SURF_FILEIMPL_HPP_ */ diff --git a/src/surf/HostImpl.cpp b/src/surf/HostImpl.cpp index f3530f5a69..97bd9437b4 100644 --- a/src/surf/HostImpl.cpp +++ b/src/surf/HostImpl.cpp @@ -1,10 +1,9 @@ -/* Copyright (c) 2013-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2013-2017. 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 "src/plugins/vm/VirtualMachineImpl.hpp" -#include "src/surf/FileImpl.hpp" #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_host, surf, "Logging specific to the SURF host module"); @@ -80,13 +79,16 @@ Action* HostModel::executeParallelTask(int host_nb, simgrid::s4u::Host** host_li xbt_die("Cannot have a communication that is not a simple point-to-point in this model. You should consider " "using the ptask model"); } - } else + } else { xbt_die( "This model only accepts one of the following. You should consider using the ptask model for the other cases.\n" " - execution with one host only and no communication\n" " - Self-comms with one host only\n" " - Communications with two hosts and no computation"); - xbt_free(host_list); + } + delete[] host_list; + delete[] flops_amount; + delete[] bytes_amount; return action; } @@ -104,7 +106,7 @@ void HostImpl::getAttachedStorageList(std::vector* storages) { for (auto const& s : storage_) if (s.second->getHost() == piface_->getCname()) - storages->push_back(s.second->piface_.getName()); + storages->push_back(s.second->piface_.getCname()); } } diff --git a/src/surf/PropertyHolder.cpp b/src/surf/PropertyHolder.cpp index e7657a277d..629870643b 100644 --- a/src/surf/PropertyHolder.cpp +++ b/src/surf/PropertyHolder.cpp @@ -13,7 +13,8 @@ PropertyHolder::~PropertyHolder() { } /** @brief Return the property associated to the provided key (or nullptr if not existing) */ -const char *PropertyHolder::getProperty(const char*key) { +const char* PropertyHolder::getProperty(std::string key) +{ if (properties_ == nullptr) return nullptr; auto prop = properties_->find(key); diff --git a/src/surf/PropertyHolder.hpp b/src/surf/PropertyHolder.hpp index 0dfe679dc4..64633b3df8 100644 --- a/src/surf/PropertyHolder.hpp +++ b/src/surf/PropertyHolder.hpp @@ -21,7 +21,7 @@ public: PropertyHolder() = default; ~PropertyHolder(); - const char *getProperty(const char*id); + const char* getProperty(std::string key); void setProperty(std::string id, std::string value); /* FIXME: This should not be exposed, as users may do bad things with the dict they got (it's not a copy). diff --git a/src/surf/StorageImpl.cpp b/src/surf/StorageImpl.cpp index 122bfde350..cc888ddd19 100644 --- a/src/surf/StorageImpl.cpp +++ b/src/surf/StorageImpl.cpp @@ -6,7 +6,8 @@ #include "StorageImpl.hpp" -#include "surf_private.h" +#include "surf_private.hpp" +#include #include #include #include @@ -60,14 +61,14 @@ StorageModel::~StorageModel() StorageImpl::StorageImpl(Model* model, std::string name, lmm_system_t maxminSystem, double bread, double bwrite, std::string type_id, std::string content_name, sg_size_t size, std::string attach) - : Resource(model, name.c_str(), lmm_constraint_new(maxminSystem, this, MAX(bread, bwrite))) + : Resource(model, name.c_str(), lmm_constraint_new(maxminSystem, this, std::max(bread, bwrite))) , piface_(this) , typeId_(type_id) , size_(size) , attach_(attach) { content_ = parseContent(content_name); - turnOn(); + StorageImpl::turnOn(); XBT_DEBUG("Create resource with Bread '%f' Bwrite '%f' and Size '%llu'", bread, bwrite, size); constraintRead_ = lmm_constraint_new(maxminSystem, this, bread); constraintWrite_ = lmm_constraint_new(maxminSystem, this, bwrite); diff --git a/src/surf/StorageImpl.hpp b/src/surf/StorageImpl.hpp index b74d624435..c66f9f96d7 100644 --- a/src/surf/StorageImpl.hpp +++ b/src/surf/StorageImpl.hpp @@ -32,28 +32,27 @@ class StorageAction; * @brief Callbacks handler which emit the callbacks after Storage creation * * @details Callback functions have the following signature: `void(Storage*)` */ -XBT_PUBLIC_DATA(simgrid::xbt::signal) storageCreatedCallbacks; +XBT_PUBLIC_DATA(simgrid::xbt::signal) storageCreatedCallbacks; /** @ingroup SURF_callbacks * @brief Callbacks handler which emit the callbacks after Storage destruction * * @details Callback functions have the following signature: `void(StoragePtr)` */ -XBT_PUBLIC_DATA(simgrid::xbt::signal) storageDestructedCallbacks; +XBT_PUBLIC_DATA(simgrid::xbt::signal) storageDestructedCallbacks; /** @ingroup SURF_callbacks * @brief Callbacks handler which emit the callbacks after Storage State changed * * @details Callback functions have the following signature: `void(StorageAction *action, int previouslyOn, int * currentlyOn)` */ -XBT_PUBLIC_DATA(simgrid::xbt::signal) storageStateChangedCallbacks; +XBT_PUBLIC_DATA(simgrid::xbt::signal) storageStateChangedCallbacks; /** @ingroup SURF_callbacks * @brief Callbacks handler which emit the callbacks after StorageAction State changed * * @details Callback functions have the following signature: `void(StorageAction *action, simgrid::surf::Action::State * old, simgrid::surf::Action::State current)` */ -XBT_PUBLIC_DATA(simgrid::xbt::signal) +XBT_PUBLIC_DATA(simgrid::xbt::signal) storageActionStateChangedCallbacks; /********* @@ -81,7 +80,7 @@ public: * @brief SURF storage interface class * @details A Storage represent a storage unit (e.g.: hard drive, usb key) */ -class StorageImpl : public simgrid::surf::Resource, public simgrid::surf::PropertyHolder { +class StorageImpl : public Resource, public PropertyHolder { public: /** @brief Storage constructor */ StorageImpl(Model* model, std::string name, lmm_system_t maxminSystem, double bread, double bwrite, @@ -165,10 +164,10 @@ private: /** @ingroup SURF_storage_interface * @brief The possible type of action for the storage component */ -typedef enum { +enum e_surf_action_storage_type_t { READ = 0, /**< Read a file */ WRITE /**< Write in a file */ -} e_surf_action_storage_type_t; +}; /** @ingroup SURF_storage_interface * @brief SURF storage action interface class @@ -205,7 +204,6 @@ public: e_surf_action_storage_type_t type_; StorageImpl* storage_; - FileImpl* file_ = nullptr; }; class StorageType { diff --git a/src/surf/cpu_cas01.cpp b/src/surf/cpu_cas01.cpp index 22eac86469..99707a2730 100644 --- a/src/surf/cpu_cas01.cpp +++ b/src/surf/cpu_cas01.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2011, 2013-2016. The SimGrid Team. +/* Copyright (c) 2009-2011, 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -8,6 +8,7 @@ #include "cpu_ti.hpp" #include "maxmin_private.hpp" #include "simgrid/sg_config.h" +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_cas, surf_cpu, "Logging specific to the SURF CPU IMPROVED module"); @@ -19,8 +20,7 @@ void surf_cpu_model_init_Cas01() xbt_assert(not surf_cpu_model_pm); xbt_assert(not surf_cpu_model_vm); - char *optim = xbt_cfg_get_string("cpu/optim"); - if (not strcmp(optim, "TI")) { + if (xbt_cfg_get_string("cpu/optim") == "TI") { surf_cpu_model_init_ti(); return; } @@ -37,27 +37,25 @@ namespace surf { CpuCas01Model::CpuCas01Model() : simgrid::surf::CpuModel() { - char *optim = xbt_cfg_get_string("cpu/optim"); + std::string optim = xbt_cfg_get_string("cpu/optim"); bool select = xbt_cfg_get_boolean("cpu/maxmin-selective-update"); - if (not strcmp(optim, "Full")) { - updateMechanism_ = UM_FULL; + if (optim == "Full") { + setUpdateMechanism(UM_FULL); selectiveUpdate_ = select; - } else if (not strcmp(optim, "Lazy")) { - updateMechanism_ = UM_LAZY; + } else if (optim == "Lazy") { + setUpdateMechanism(UM_LAZY); selectiveUpdate_ = true; xbt_assert(select || (xbt_cfg_is_default_value("cpu/maxmin-selective-update")), "Disabling selective update while using the lazy update mechanism is dumb!"); } else { - xbt_die("Unsupported optimization (%s) for this model", optim); + xbt_die("Unsupported optimization (%s) for this model", optim.c_str()); } p_cpuRunningActionSetThatDoesNotNeedBeingChecked = new ActionList(); maxminSystem_ = lmm_system_new(selectiveUpdate_); if (getUpdateMechanism() == UM_LAZY) { - actionHeap_ = xbt_heap_new(8, nullptr); - xbt_heap_set_update_callback(actionHeap_, surf_action_lmm_update_index_heap); modifiedSet_ = new ActionLmmList(); maxminSystem_->keep_track = modifiedSet_; } @@ -67,7 +65,6 @@ CpuCas01Model::~CpuCas01Model() { lmm_system_free(maxminSystem_); maxminSystem_ = nullptr; - xbt_heap_free(actionHeap_); delete modifiedSet_; surf_cpu_model_pm = nullptr; @@ -177,13 +174,13 @@ CpuAction* CpuCas01::execution_start(double size, int requestedCores) CpuAction *CpuCas01::sleep(double duration) { if (duration > 0) - duration = MAX(duration, sg_surf_precision); + duration = std::max(duration, sg_surf_precision); - XBT_IN("(%s,%g)", cname(), duration); + XBT_IN("(%s,%g)", getCname(), duration); CpuCas01Action* action = new CpuCas01Action(model(), 1.0, isOff(), speed_.scale * speed_.peak, constraint()); // FIXME: sleep variables should not consume 1.0 in lmm_expand - action->maxDuration_ = duration; + action->setMaxDuration(duration); action->suspended_ = 2; if (duration < 0) { // NO_MAX_DURATION /* Move to the *end* of the corresponding action set. This convention is used to speed up update_resource_state */ @@ -214,9 +211,8 @@ CpuCas01Action::CpuCas01Action(Model* model, double cost, bool failed, double sp , requestedCore_(requestedCore) { if (model->getUpdateMechanism() == UM_LAZY) { - indexHeap_ = -1; - lastUpdate_ = surf_get_clock(); - lastValue_ = 0.0; + refreshLastUpdate(); + setLastValue(0.0); } lmm_expand(model->getMaxminSystem(), constraint, getVariable(), 1.0); } diff --git a/src/surf/cpu_interface.cpp b/src/surf/cpu_interface.cpp index 7a6dc74f85..2c4e30843a 100644 --- a/src/surf/cpu_interface.cpp +++ b/src/surf/cpu_interface.cpp @@ -4,9 +4,9 @@ /* 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 "cpu_interface.hpp" -#include "src/instr/instr_private.h" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include XBT_LOG_EXTERNAL_CATEGORY(surf_kernel); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu, surf, "Logging specific to the SURF cpu module"); @@ -23,15 +23,15 @@ namespace surf { void CpuModel::updateActionsStateLazy(double now, double /*delta*/) { - while ((xbt_heap_size(getActionHeap()) > 0) - && (double_equals(xbt_heap_maxkey(getActionHeap()), now, sg_surf_precision))) { + while (not actionHeapIsEmpty() && double_equals(actionHeapTopDate(), now, sg_surf_precision)) { - CpuAction *action = static_cast(xbt_heap_pop(getActionHeap())); + CpuAction* action = static_cast(actionHeapPop()); XBT_CDEBUG(surf_kernel, "Something happened to action %p", action); if (TRACE_is_enabled()) { Cpu *cpu = static_cast(lmm_constraint_id(lmm_get_cnst_from_var(getMaxminSystem(), action->getVariable(), 0))); - TRACE_surf_host_set_utilization(cpu->cname(), action->getCategory(), lmm_variable_getvalue(action->getVariable()), - action->getLastUpdate(), now - action->getLastUpdate()); + TRACE_surf_host_set_utilization(cpu->getCname(), action->getCategory(), + lmm_variable_getvalue(action->getVariable()), action->getLastUpdate(), + now - action->getLastUpdate()); } action->finish(Action::State::done); @@ -44,13 +44,9 @@ void CpuModel::updateActionsStateLazy(double now, double /*delta*/) //defining the last timestamp that we can safely dump to trace file //without losing the event ascending order (considering all CPU's) double smaller = -1; - ActionList *actionSet = getRunningActionSet(); - ActionList::iterator it(actionSet->begin()); - ActionList::iterator itend(actionSet->end()); - for (; it != itend; ++it) { - CpuAction *action = static_cast(&*it); - if (smaller < 0 || action->getLastUpdate() < smaller) - smaller = action->getLastUpdate(); + for (Action const& action : *getRunningActionSet()) { + if (smaller < 0 || action.getLastUpdate() < smaller) + smaller = action.getLastUpdate(); } if (smaller > 0) { TRACE_last_timestamp_to_dump = smaller; @@ -60,30 +56,26 @@ void CpuModel::updateActionsStateLazy(double now, double /*delta*/) void CpuModel::updateActionsStateFull(double now, double delta) { - CpuAction *action = nullptr; - ActionList *running_actions = getRunningActionSet(); - ActionList::iterator it(running_actions->begin()); - ActionList::iterator itNext = it; - ActionList::iterator itend(running_actions->end()); - for (; it != itend; it = itNext) { - ++itNext; - action = static_cast(&*it); + for (auto it = std::begin(*getRunningActionSet()); it != std::end(*getRunningActionSet());) { + CpuAction& action = static_cast(*it); + ++it; // increment iterator here since the following calls to action.finish() may invalidate it if (TRACE_is_enabled()) { - Cpu *cpu = static_cast (lmm_constraint_id(lmm_get_cnst_from_var(getMaxminSystem(), action->getVariable(), 0)) ); + Cpu* cpu = + static_cast(lmm_constraint_id(lmm_get_cnst_from_var(getMaxminSystem(), action.getVariable(), 0))); - TRACE_surf_host_set_utilization(cpu->cname(), action->getCategory(), lmm_variable_getvalue(action->getVariable()), - now - delta, delta); + TRACE_surf_host_set_utilization(cpu->getCname(), action.getCategory(), + lmm_variable_getvalue(action.getVariable()), now - delta, delta); TRACE_last_timestamp_to_dump = now - delta; } - action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta); + action.updateRemains(lmm_variable_getvalue(action.getVariable()) * delta); - if (action->getMaxDuration() != NO_MAX_DURATION) - action->updateMaxDuration(delta); + if (action.getMaxDuration() != NO_MAX_DURATION) + action.updateMaxDuration(delta); - if (((action->getRemainsNoUpdate() <= 0) && (lmm_get_variable_weight(action->getVariable()) > 0)) || - ((action->getMaxDuration() != NO_MAX_DURATION) && (action->getMaxDuration() <= 0))) { - action->finish(Action::State::done); + if (((action.getRemainsNoUpdate() <= 0) && (lmm_get_variable_weight(action.getVariable()) > 0)) || + ((action.getMaxDuration() != NO_MAX_DURATION) && (action.getMaxDuration() <= 0))) { + action.finish(Action::State::done); } } } @@ -123,8 +115,9 @@ int Cpu::getNbPStates() void Cpu::setPState(int pstate_index) { xbt_assert(pstate_index <= static_cast(speedPerPstate_.size()), - "Invalid parameters for CPU %s (pstate %d > length of pstates %d)", cname(), pstate_index, - static_cast(speedPerPstate_.size())); + "Invalid parameters for CPU %s (pstate %d > length of pstates %d). Please fix your platform file, or your " + "call to change the pstate.", + getCname(), pstate_index, static_cast(speedPerPstate_.size())); double new_peak_speed = speedPerPstate_[pstate_index]; pstate_ = pstate_index; @@ -157,7 +150,7 @@ double Cpu::getAvailableSpeed() } void Cpu::onSpeedChange() { - TRACE_surf_host_set_speed(surf_get_clock(), cname(), coresAmount_ * speed_.scale * speed_.peak); + TRACE_surf_host_set_speed(surf_get_clock(), getCname(), coresAmount_ * speed_.scale * speed_.peak); s4u::Host::onSpeedChange(*host_); } @@ -189,21 +182,23 @@ void CpuAction::updateRemainingLazy(double now) xbt_assert(getStateSet() == getModel()->getRunningActionSet(), "You're updating an action that is not running."); xbt_assert(getPriority() > 0, "You're updating an action that seems suspended."); - double delta = now - lastUpdate_; + double delta = now - getLastUpdate(); - if (remains_ > 0) { - XBT_CDEBUG(surf_kernel, "Updating action(%p): remains was %f, last_update was: %f", this, remains_, lastUpdate_); - double_update(&(remains_), lastValue_ * delta, sg_maxmin_precision*sg_surf_precision); + if (getRemainsNoUpdate() > 0) { + XBT_CDEBUG(surf_kernel, "Updating action(%p): remains was %f, last_update was: %f", this, getRemainsNoUpdate(), + getLastUpdate()); + updateRemains(getLastValue() * delta); if (TRACE_is_enabled()) { Cpu *cpu = static_cast(lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0))); - TRACE_surf_host_set_utilization(cpu->cname(), getCategory(), lastValue_, lastUpdate_, now - lastUpdate_); + TRACE_surf_host_set_utilization(cpu->getCname(), getCategory(), getLastValue(), getLastUpdate(), + now - getLastUpdate()); } - XBT_CDEBUG(surf_kernel, "Updating action(%p): remains is now %f", this, remains_); + XBT_CDEBUG(surf_kernel, "Updating action(%p): remains is now %f", this, getRemainsNoUpdate()); } - lastUpdate_ = now; - lastValue_ = lmm_variable_getvalue(getVariable()); + refreshLastUpdate(); + setLastValue(lmm_variable_getvalue(getVariable())); } simgrid::xbt::signal CpuAction::onStateChange; diff --git a/src/surf/cpu_interface.hpp b/src/surf/cpu_interface.hpp index fc67386f29..f360cf1059 100644 --- a/src/surf/cpu_interface.hpp +++ b/src/surf/cpu_interface.hpp @@ -18,10 +18,6 @@ namespace simgrid { namespace surf { -class CpuModel; -class Cpu; -class CpuAction; - /** @ingroup SURF_cpu_interface * @brief SURF cpu model interface class * @details A model is an object which handle the interactions between its Resources and its Actions diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index 454efa886d..55b0d23e08 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -5,8 +5,8 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "cpu_ti.hpp" -#include "xbt/heap.h" #include "src/surf/trace_mgr.hpp" +#include #ifndef SURF_MODEL_CPUTI_H_ #define SURF_MODEL_CPUTI_H_ @@ -16,12 +16,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf_cpu, "Logging specific to the namespace simgrid { namespace surf { -static inline -void cpu_ti_action_update_index_heap(void *action, int i) -{ - (static_cast(action))->updateIndexHeap(i); -} - /********* * Trace * *********/ @@ -337,9 +331,6 @@ CpuTiModel::CpuTiModel() : CpuModel() runningActionSetThatDoesNotNeedBeingChecked_ = new ActionList(); modifiedCpu_ = new CpuTiList(); - - tiActionHeap_ = xbt_heap_new(8, nullptr); - xbt_heap_set_update_callback(tiActionHeap_, cpu_ti_action_update_index_heap); } CpuTiModel::~CpuTiModel() @@ -347,7 +338,6 @@ CpuTiModel::~CpuTiModel() surf_cpu_model_pm = nullptr; delete runningActionSetThatDoesNotNeedBeingChecked_; delete modifiedCpu_; - xbt_heap_free(tiActionHeap_); } Cpu *CpuTiModel::createCpu(simgrid::s4u::Host *host, std::vector* speedPerPstate, int core) @@ -359,16 +349,16 @@ double CpuTiModel::nextOccuringEvent(double now) { double min_action_duration = -1; -/* iterates over modified cpus to update share resources */ - for(CpuTiList::iterator it(modifiedCpu_->begin()), itend(modifiedCpu_->end()) ; it != itend ;) { - CpuTi *ti = &*it; - ++it; - ti->updateActionsFinishTime(now); + /* iterates over modified cpus to update share resources */ + for (auto it = std::begin(*modifiedCpu_); it != std::end(*modifiedCpu_);) { + CpuTi& ti = *it; + ++it; // increment iterator here since the following call to ti.updateActionsFinishTime() may invalidate it + ti.updateActionsFinishTime(now); } -/* get the min next event if heap not empty */ - if (xbt_heap_size(tiActionHeap_) > 0) - min_action_duration = xbt_heap_maxkey(tiActionHeap_) - now; + /* get the min next event if heap not empty */ + if (not actionHeapIsEmpty()) + min_action_duration = actionHeapTopDate() - now; XBT_DEBUG("Share resources, min next event date: %f", min_action_duration); @@ -377,8 +367,8 @@ double CpuTiModel::nextOccuringEvent(double now) void CpuTiModel::updateActionsState(double now, double /*delta*/) { - while ((xbt_heap_size(tiActionHeap_) > 0) && (xbt_heap_maxkey(tiActionHeap_) <= now)) { - CpuTiAction *action = static_cast(xbt_heap_pop(tiActionHeap_)); + while (not actionHeapIsEmpty() && actionHeapTopDate() <= now) { + CpuTiAction* action = static_cast(actionHeapPop()); XBT_DEBUG("Action %p: finish", action); action->finish(Action::State::done); /* set the remains to 0 due to precision problems when updating the remaining amount */ @@ -460,20 +450,12 @@ void CpuTi::apply_event(tmgr_trace_event_t event, double value) double date = surf_get_clock(); /* put all action running on cpu to failed */ - for(ActionTiList::iterator it(actionSet_->begin()), itend(actionSet_->end()); it != itend ; ++it) { - - CpuTiAction *action = &*it; - if (action->getState() == Action::State::running - || action->getState() == Action::State::ready - || action->getState() == Action::State::not_in_the_system) { - action->setFinishTime(date); - action->setState(Action::State::failed); - if (action->indexHeap_ >= 0) { - CpuTiAction* heap_act = static_cast( - xbt_heap_remove(static_cast(model())->tiActionHeap_, action->indexHeap_)); - if (heap_act != action) - DIE_IMPOSSIBLE; - } + for (CpuTiAction& action : *actionSet_) { + if (action.getState() == Action::State::running || action.getState() == Action::State::ready || + action.getState() == Action::State::not_in_the_system) { + action.setFinishTime(date); + action.setState(Action::State::failed); + action.heapRemove(model()->getActionHeap()); } } } @@ -486,70 +468,62 @@ void CpuTi::apply_event(tmgr_trace_event_t event, double value) void CpuTi::updateActionsFinishTime(double now) { - CpuTiAction *action; double sum_priority = 0.0; double total_area; /* update remaining amount of actions */ updateRemainingAmount(now); - for(ActionTiList::iterator it(actionSet_->begin()), itend(actionSet_->end()) ; it != itend ; ++it) { - action = &*it; + for (CpuTiAction const& action : *actionSet_) { /* action not running, skip it */ - if (action->getStateSet() != surf_cpu_model_pm->getRunningActionSet()) + if (action.getStateSet() != surf_cpu_model_pm->getRunningActionSet()) continue; /* bogus priority, skip it */ - if (action->getPriority() <= 0) + if (action.getPriority() <= 0) continue; /* action suspended, skip it */ - if (action->suspended_ != 0) + if (action.suspended_ != 0) continue; - sum_priority += 1.0 / action->getPriority(); + sum_priority += 1.0 / action.getPriority(); } sumPriority_ = sum_priority; - for(ActionTiList::iterator it(actionSet_->begin()), itend(actionSet_->end()) ; it != itend ; ++it) { - action = &*it; + for (CpuTiAction& action : *actionSet_) { double min_finish = -1; /* action not running, skip it */ - if (action->getStateSet() != surf_cpu_model_pm->getRunningActionSet()) + if (action.getStateSet() != surf_cpu_model_pm->getRunningActionSet()) continue; /* verify if the action is really running on cpu */ - if (action->suspended_ == 0 && action->getPriority() > 0) { + if (action.suspended_ == 0 && action.getPriority() > 0) { /* total area needed to finish the action. Used in trace integration */ - total_area = (action->getRemains()) * sum_priority * action->getPriority(); + total_area = (action.getRemains()) * sum_priority * action.getPriority(); total_area /= speed_.peak; - action->setFinishTime(speedIntegratedTrace_->solve(now, total_area)); + action.setFinishTime(speedIntegratedTrace_->solve(now, total_area)); /* verify which event will happen before (max_duration or finish time) */ - if (action->getMaxDuration() > NO_MAX_DURATION && - action->getStartTime() + action->getMaxDuration() < action->finishTime_) - min_finish = action->getStartTime() + action->getMaxDuration(); + if (action.getMaxDuration() > NO_MAX_DURATION && + action.getStartTime() + action.getMaxDuration() < action.getFinishTime()) + min_finish = action.getStartTime() + action.getMaxDuration(); else - min_finish = action->finishTime_; + min_finish = action.getFinishTime(); } else { /* put the max duration time on heap */ - if (action->getMaxDuration() > NO_MAX_DURATION) - min_finish = action->getStartTime() + action->getMaxDuration(); + if (action.getMaxDuration() > NO_MAX_DURATION) + min_finish = action.getStartTime() + action.getMaxDuration(); } /* add in action heap */ - XBT_DEBUG("action(%p) index %d", action, action->indexHeap_); - if (action->indexHeap_ >= 0) { - CpuTiAction* heap_act = static_cast( - xbt_heap_remove(static_cast(model())->tiActionHeap_, action->indexHeap_)); - if (heap_act != action) - DIE_IMPOSSIBLE; - } if (min_finish > NO_MAX_DURATION) - xbt_heap_push(static_cast(model())->tiActionHeap_, action, min_finish); + action.heapUpdate(model()->getActionHeap(), min_finish, NOTSET); + else + action.heapRemove(model()->getActionHeap()); - XBT_DEBUG("Update finish time: Cpu(%s) Action: %p, Start Time: %f Finish Time: %f Max duration %f", cname(), action, - action->getStartTime(), action->finishTime_, action->getMaxDuration()); + XBT_DEBUG("Update finish time: Cpu(%s) Action: %p, Start Time: %f Finish Time: %f Max duration %f", getCname(), + &action, action.getStartTime(), action.getFinishTime(), action.getMaxDuration()); } /* remove from modified cpu */ modified(false); @@ -577,39 +551,37 @@ void CpuTi::updateRemainingAmount(double now) /* compute the integration area */ double area_total = speedIntegratedTrace_->integrate(lastUpdate_, now) * speed_.peak; XBT_DEBUG("Flops total: %f, Last update %f", area_total, lastUpdate_); - - for(ActionTiList::iterator it(actionSet_->begin()), itend(actionSet_->end()) ; it != itend ; ++it) { - CpuTiAction *action = &*it; + for (CpuTiAction& action : *actionSet_) { /* action not running, skip it */ - if (action->getStateSet() != model()->getRunningActionSet()) + if (action.getStateSet() != model()->getRunningActionSet()) continue; /* bogus priority, skip it */ - if (action->getPriority() <= 0) + if (action.getPriority() <= 0) continue; /* action suspended, skip it */ - if (action->suspended_ != 0) + if (action.suspended_ != 0) continue; /* action don't need update */ - if (action->getStartTime() >= now) + if (action.getStartTime() >= now) continue; /* skip action that are finishing now */ - if (action->finishTime_ >= 0 && action->finishTime_ <= now) + if (action.getFinishTime() >= 0 && action.getFinishTime() <= now) continue; /* update remaining */ - action->updateRemains(area_total / (sumPriority_ * action->getPriority())); - XBT_DEBUG("Update remaining action(%p) remaining %f", action, action->remains_); + action.updateRemains(area_total / (sumPriority_ * action.getPriority())); + XBT_DEBUG("Update remaining action(%p) remaining %f", &action, action.getRemainsNoUpdate()); } lastUpdate_ = now; } CpuAction *CpuTi::execution_start(double size) { - XBT_IN("(%s,%g)", cname(), size); + XBT_IN("(%s,%g)", getCname(), size); CpuTiAction* action = new CpuTiAction(static_cast(model()), size, isOff(), this); actionSet_->push_back(*action); @@ -622,12 +594,12 @@ CpuAction *CpuTi::execution_start(double size) CpuAction *CpuTi::sleep(double duration) { if (duration > 0) - duration = MAX(duration, sg_surf_precision); + duration = std::max(duration, sg_surf_precision); - XBT_IN("(%s,%g)", cname(), duration); + XBT_IN("(%s,%g)", getCname(), duration); CpuTiAction* action = new CpuTiAction(static_cast(model()), 1.0, isOff(), this); - action->maxDuration_ = duration; + action->setMaxDuration(duration); action->suspended_ = 2; if (duration == NO_MAX_DURATION) { /* Move to the *end* of the corresponding action set. This convention @@ -664,15 +636,9 @@ CpuTiAction::CpuTiAction(CpuTiModel *model_, double cost, bool failed, CpuTi *cp : CpuAction(model_, cost, failed) , cpu_(cpu) { - indexHeap_ = -1; cpu_->modified(true); } -void CpuTiAction::updateIndexHeap(int i) -{ - indexHeap_ = i; -} - void CpuTiAction::setState(Action::State state) { CpuAction::setState(state); @@ -689,7 +655,7 @@ int CpuTiAction::unref() if (action_ti_hook.is_linked()) cpu_->actionSet_->erase(cpu_->actionSet_->iterator_to(*this)); /* remove from heap */ - xbt_heap_remove(static_cast(getModel())->tiActionHeap_, this->indexHeap_); + heapRemove(getModel()->getActionHeap()); cpu_->modified(true); delete this; return 1; @@ -700,7 +666,7 @@ int CpuTiAction::unref() void CpuTiAction::cancel() { this->setState(Action::State::failed); - xbt_heap_remove(getModel()->getActionHeap(), this->indexHeap_); + heapRemove(getModel()->getActionHeap()); cpu_->modified(true); } @@ -709,7 +675,7 @@ void CpuTiAction::suspend() XBT_IN("(%p)", this); if (suspended_ != 2) { suspended_ = 1; - xbt_heap_remove(getModel()->getActionHeap(), indexHeap_); + heapRemove(getModel()->getActionHeap()); cpu_->modified(true); } XBT_OUT(); @@ -731,7 +697,7 @@ void CpuTiAction::setMaxDuration(double duration) XBT_IN("(%p,%g)", this, duration); - maxDuration_ = duration; + Action::setMaxDuration(duration); if (duration >= 0) min_finish = (getStartTime() + getMaxDuration()) < getFinishTime() ? @@ -739,13 +705,8 @@ void CpuTiAction::setMaxDuration(double duration) else min_finish = getFinishTime(); -/* add in action heap */ - if (indexHeap_ >= 0) { - CpuTiAction *heap_act = static_cast(xbt_heap_remove(getModel()->getActionHeap(), indexHeap_)); - if (heap_act != this) - DIE_IMPOSSIBLE; - } - xbt_heap_push(getModel()->getActionHeap(), this, min_finish); + /* add in action heap */ + heapUpdate(getModel()->getActionHeap(), min_finish, NOTSET); XBT_OUT(); } @@ -753,7 +714,7 @@ void CpuTiAction::setMaxDuration(double duration) void CpuTiAction::setSharingWeight(double priority) { XBT_IN("(%p,%g)", this, priority); - sharingWeight_ = priority; + setSharingWeightNoUpdate(priority); cpu_->modified(true); XBT_OUT(); } @@ -763,7 +724,7 @@ double CpuTiAction::getRemains() XBT_IN("(%p)", this); cpu_->updateRemainingAmount(surf_get_clock()); XBT_OUT(); - return remains_; + return getRemainsNoUpdate(); } } diff --git a/src/surf/cpu_ti.hpp b/src/surf/cpu_ti.hpp index 4bdbe144ed..1789127e20 100644 --- a/src/surf/cpu_ti.hpp +++ b/src/surf/cpu_ti.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015. The SimGrid Team. +/* Copyright (c) 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -88,7 +88,6 @@ public: void setState(simgrid::surf::Action::State state) override; int unref() override; void cancel() override; - void updateIndexHeap(int i) override; void suspend() override; void resume() override; void setMaxDuration(double duration) override; @@ -150,7 +149,6 @@ public: ActionList *runningActionSetThatDoesNotNeedBeingChecked_; CpuTiList *modifiedCpu_; - xbt_heap_t tiActionHeap_; }; } diff --git a/src/surf/fair_bottleneck.cpp b/src/surf/fair_bottleneck.cpp index 2a0fcb7c8f..84be37fc03 100644 --- a/src/surf/fair_bottleneck.cpp +++ b/src/surf/fair_bottleneck.cpp @@ -7,6 +7,7 @@ #include "maxmin_private.hpp" #include "xbt/log.h" #include "xbt/sysdep.h" +#include #include #include #include @@ -43,15 +44,12 @@ void bottleneck_solve(lmm_system_t sys) XBT_DEBUG("Variable set : %d", xbt_swag_size(var_list)); xbt_swag_foreach(_var, var_list) { var = static_cast(_var); - int nb = 0; var->value = 0.0; XBT_DEBUG("Handling variable %p", var); xbt_swag_insert(var, &(sys->saturated_variable_set)); - for (int i = 0; i < var->cnsts_number; i++) { - if (var->cnsts[i].consumption_weight == 0.0) - nb++; - } - if ((nb == var->cnsts_number) && (var->sharing_weight > 0.0)) { + auto weighted = std::find_if(begin(var->cnsts), end(var->cnsts), + [](s_lmm_element_t const& x) { return x.consumption_weight != 0.0; }); + if (weighted == end(var->cnsts) && var->sharing_weight > 0.0) { XBT_DEBUG("Err, finally, there is no need to take care of variable %p", var); xbt_swag_remove(var, &(sys->saturated_variable_set)); var->value = 1.0; @@ -115,13 +113,12 @@ void bottleneck_solve(lmm_system_t sys) xbt_swag_foreach_safe(_var, _var_next, var_list) { var = static_cast(_var); double min_inc = DBL_MAX; - for (int i = 0; i < var->cnsts_number; i++) { - lmm_element_t elm = &var->cnsts[i]; - if (elm->consumption_weight > 0) - min_inc = MIN(min_inc, elm->constraint->usage / elm->consumption_weight); + for (s_lmm_element_t const& elm : var->cnsts) { + if (elm.consumption_weight > 0) + min_inc = std::min(min_inc, elm.constraint->usage / elm.consumption_weight); } if (var->bound > 0) - min_inc = MIN(min_inc, var->bound - var->value); + min_inc = std::min(min_inc, var->bound - var->value); var->mu = min_inc; XBT_DEBUG("Updating variable %p maximum increment: %g", var, var->mu); var->value += var->mu; @@ -144,7 +141,7 @@ void bottleneck_solve(lmm_system_t sys) } else { XBT_DEBUG("\tNon-Shared variable. Update constraint usage of %p (%g) with variable %p by %g", cnst, cnst->usage, elem->variable, elem->variable->mu); - cnst->usage = MIN(cnst->usage, elem->consumption_weight * elem->variable->mu); + cnst->usage = std::min(cnst->usage, elem->consumption_weight * elem->variable->mu); } } if (not cnst->sharing_policy) { diff --git a/src/surf/instr_routing.cpp b/src/surf/instr_routing.cpp index fb1a77b1fe..6a271cdf5f 100644 --- a/src/surf/instr_routing.cpp +++ b/src/surf/instr_routing.cpp @@ -3,21 +3,21 @@ /* 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 "src/instr/instr_private.h" +#include "src/instr/instr_private.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" -#include "src/kernel/routing/NetZoneImpl.hpp" #include "src/kernel/routing/NetPoint.hpp" +#include "src/kernel/routing/NetZoneImpl.hpp" #include "src/surf/network_interface.hpp" #include "src/surf/xml/platf_private.hpp" -#include "surf/surf.h" +#include "surf/surf.hpp" #include "xbt/graph.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_routing, instr, "Tracing platform hierarchy"); static int platform_created = 0; /* indicate whether the platform file has been traced */ -static std::vector currentContainer; /* push and pop, used only in creation */ +static std::vector currentContainer; /* push and pop, used only in creation */ static const char *instr_node_name (xbt_node_t node) { @@ -65,10 +65,10 @@ static container_t lowestCommonAncestor (container_t a1, container_t a2) return p; } -static void linkContainers (container_t src, container_t dst, xbt_dict_t filter) +static void linkContainers(container_t src, container_t dst, std::set* filter) { //ignore loopback - if (strcmp(src->name_, "__loopback__") == 0 || strcmp(dst->name_, "__loopback__") == 0) { + if (src->getName() == "__loopback__" || dst->getName() == "__loopback__") { XBT_DEBUG (" linkContainers: ignoring loopback link"); return; } @@ -79,51 +79,46 @@ static void linkContainers (container_t src, container_t dst, xbt_dict_t filter) xbt_die ("common father unknown, this is a tracing problem"); } - if (filter != nullptr){ - //check if we already register this pair (we only need one direction) - char aux1[INSTR_DEFAULT_STR_SIZE]; - char aux2[INSTR_DEFAULT_STR_SIZE]; - snprintf(aux1, INSTR_DEFAULT_STR_SIZE, "%s%s", src->name_, dst->name_); - snprintf(aux2, INSTR_DEFAULT_STR_SIZE, "%s%s", dst->name_, src->name_); - if (xbt_dict_get_or_null (filter, aux1)){ - XBT_DEBUG(" linkContainers: already registered %s <-> %s (1)", src->name_, dst->name_); - return; - } - if (xbt_dict_get_or_null (filter, aux2)){ - XBT_DEBUG(" linkContainers: already registered %s <-> %s (2)", dst->name_, src->name_); - return; - } - - //ok, not found, register it - xbt_dict_set (filter, aux1, xbt_strdup ("1"), nullptr); - xbt_dict_set (filter, aux2, xbt_strdup ("1"), nullptr); + // check if we already register this pair (we only need one direction) + std::string aux1 = src->getName() + dst->getName(); + std::string aux2 = dst->getName() + src->getName(); + if (filter->find(aux1) != filter->end()) { + XBT_DEBUG(" linkContainers: already registered %s <-> %s (1)", src->getCname(), dst->getCname()); + return; + } + if (filter->find(aux2) != filter->end()) { + XBT_DEBUG(" linkContainers: already registered %s <-> %s (2)", dst->getCname(), src->getCname()); + return; } + // ok, not found, register it + filter->insert(aux1); + filter->insert(aux2); + //declare type - char link_typename[INSTR_DEFAULT_STR_SIZE]; - snprintf(link_typename, INSTR_DEFAULT_STR_SIZE, "%s-%s%s-%s%s", father->type_->name_, src->type_->name_, - src->type_->id_, dst->type_->name_, dst->type_->id_); - simgrid::instr::Type* link_type = father->type_->getChildOrNull(link_typename); - if (link_type == nullptr) - link_type = simgrid::instr::Type::linkNew(link_typename, father->type_, src->type_, dst->type_); + std::string link_typename = father->type_->getName() + "-" + src->type_->getName() + + std::to_string(src->type_->getId()) + "-" + dst->type_->getName() + + std::to_string(dst->type_->getId()); + simgrid::instr::LinkType* link = father->type_->getOrCreateLinkType(link_typename, src->type_, dst->type_); + link->setCallingContainer(father); //register EDGE types for triva configuration - trivaEdgeTypes.insert(link_type->name_); + trivaEdgeTypes.insert(link->getName()); //create the link static long long counter = 0; - char key[INSTR_DEFAULT_STR_SIZE]; - snprintf (key, INSTR_DEFAULT_STR_SIZE, "%lld", counter); + std::string key = std::to_string(counter); counter++; - new simgrid::instr::StartLinkEvent(SIMIX_get_clock(), father, link_type, src, "topology", key); - new simgrid::instr::EndLinkEvent(SIMIX_get_clock(), father, link_type, dst, "topology", key); + link->startEvent(src, "topology", key); + link->endEvent(dst, "topology", key); - XBT_DEBUG(" linkContainers %s <-> %s", src->name_, dst->name_); + XBT_DEBUG(" linkContainers %s <-> %s", src->getCname(), dst->getCname()); } -static void recursiveGraphExtraction(simgrid::s4u::NetZone* netzone, container_t container, xbt_dict_t filter) +static void recursiveGraphExtraction(simgrid::s4u::NetZone* netzone, container_t container, + std::set* filter) { if (not TRACE_platform_topology()) { XBT_DEBUG("Graph extraction disabled by user."); @@ -133,27 +128,23 @@ static void recursiveGraphExtraction(simgrid::s4u::NetZone* netzone, container_t if (not netzone->getChildren()->empty()) { //bottom-up recursion for (auto const& nz_son : *netzone->getChildren()) { - container_t child_container = static_cast(xbt_dict_get(container->children_, nz_son->getCname())); + container_t child_container = container->children_.at(nz_son->getCname()); recursiveGraphExtraction(nz_son, child_container, filter); } } xbt_graph_t graph = xbt_graph_new_graph (0, nullptr); - xbt_dict_t nodes = xbt_dict_new_homogeneous(nullptr); - xbt_dict_t edges = xbt_dict_new_homogeneous(nullptr); - xbt_edge_t edge = nullptr; - - xbt_dict_cursor_t cursor = nullptr; - char *edge_name; + std::map* nodes = new std::map; + std::map* edges = new std::map; static_cast(netzone)->getGraph(graph, nodes, edges); - xbt_dict_foreach(edges,cursor,edge_name,edge) { - linkContainers( - PJ_container_get(static_cast(edge->src->data)), - PJ_container_get(static_cast(edge->dst->data)), filter); + for (auto elm : *edges) { + xbt_edge_t edge = elm.second; + linkContainers(simgrid::instr::Container::byName(static_cast(edge->src->data)), + simgrid::instr::Container::byName(static_cast(edge->dst->data)), filter); } - xbt_dict_free (&nodes); - xbt_dict_free (&edges); + delete nodes; + delete edges; xbt_graph_free_graph(graph, xbt_free_f, xbt_free_f, nullptr); } @@ -162,20 +153,16 @@ static void recursiveGraphExtraction(simgrid::s4u::NetZone* netzone, container_t */ static void sg_instr_AS_begin(simgrid::s4u::NetZone& netzone) { - const char* id = netzone.getCname(); + std::string id = netzone.getName(); - if (PJ_container_get_root() == nullptr){ - container_t root = new simgrid::instr::Container(id, simgrid::instr::INSTR_AS, nullptr); - PJ_container_set_root (root); + if (simgrid::instr::Container::getRoot() == nullptr) { + simgrid::instr::NetZoneContainer* root = new simgrid::instr::NetZoneContainer(id, 0, nullptr); if (TRACE_smpi_is_enabled()) { - simgrid::instr::Type* mpi = root->type_->getChildOrNull("MPI"); - if (mpi == nullptr){ - mpi = simgrid::instr::Type::containerNew("MPI", root->type_); - if (not TRACE_smpi_is_grouped()) - simgrid::instr::Type::stateNew("MPI_STATE", mpi); - simgrid::instr::Type::linkNew("MPI_LINK", PJ_type_get_root(), mpi, mpi); - } + simgrid::instr::Type* mpi = root->type_->getOrCreateContainerType("MPI"); + if (not TRACE_smpi_is_grouped()) + mpi->getOrCreateStateType("MPI_STATE"); + root->type_->getOrCreateLinkType("MPI_LINK", mpi, mpi); } if (TRACE_needs_platform()){ @@ -185,8 +172,8 @@ static void sg_instr_AS_begin(simgrid::s4u::NetZone& netzone) } if (TRACE_needs_platform()){ - container_t father = currentContainer.back(); - container_t container = new simgrid::instr::Container(id, simgrid::instr::INSTR_AS, father); + simgrid::instr::NetZoneContainer* container = + new simgrid::instr::NetZoneContainer(id, currentContainer.size(), currentContainer.back()); currentContainer.push_back(container); } } @@ -202,117 +189,87 @@ static void instr_routing_parse_start_link(simgrid::s4u::Link& link) { if (currentContainer.empty()) // No ongoing parsing. Are you creating the loopback? return; - container_t father = currentContainer.back(); - - double bandwidth_value = link.bandwidth(); - double latency_value = link.latency(); - container_t container = new simgrid::instr::Container(link.name(), simgrid::instr::INSTR_LINK, father); + container_t father = currentContainer.back(); + container_t container = new simgrid::instr::Container(link.getName(), "LINK", father); if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (not TRACE_disable_link())) { - simgrid::instr::Type* bandwidth = container->type_->getChildOrNull("bandwidth"); - if (bandwidth == nullptr) - bandwidth = simgrid::instr::Type::variableNew("bandwidth", nullptr, container->type_); - simgrid::instr::Type* latency = container->type_->getChildOrNull("latency"); - if (latency == nullptr) - latency = simgrid::instr::Type::variableNew("latency", nullptr, container->type_); - new simgrid::instr::SetVariableEvent(0, container, bandwidth, bandwidth_value); - new simgrid::instr::SetVariableEvent(0, container, latency, latency_value); + simgrid::instr::VariableType* bandwidth = container->type_->getOrCreateVariableType("bandwidth", ""); + bandwidth->setCallingContainer(container); + bandwidth->setEvent(0, link.bandwidth()); + simgrid::instr::VariableType* latency = container->type_->getOrCreateVariableType("latency", ""); + latency->setCallingContainer(container); + latency->setEvent(0, link.latency()); } if (TRACE_uncategorized()) { - simgrid::instr::Type* bandwidth_used = container->type_->getChildOrNull("bandwidth_used"); - if (bandwidth_used == nullptr) - simgrid::instr::Type::variableNew("bandwidth_used", "0.5 0.5 0.5", container->type_); + container->type_->getOrCreateVariableType("bandwidth_used", "0.5 0.5 0.5"); } } static void sg_instr_new_host(simgrid::s4u::Host& host) { - container_t father = currentContainer.back(); - container_t container = new simgrid::instr::Container(host.getCname(), simgrid::instr::INSTR_HOST, father); + container_t container = new simgrid::instr::HostContainer(host, currentContainer.back()); + container_t root = simgrid::instr::Container::getRoot(); if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (not TRACE_disable_speed())) { - simgrid::instr::Type* speed = container->type_->getChildOrNull("power"); - if (speed == nullptr){ - speed = simgrid::instr::Type::variableNew("power", nullptr, container->type_); - } - - double current_speed_state = host.getSpeed(); - new simgrid::instr::SetVariableEvent(0, container, speed, current_speed_state); - } - if (TRACE_uncategorized()){ - simgrid::instr::Type* speed_used = container->type_->getChildOrNull("power_used"); - if (speed_used == nullptr){ - simgrid::instr::Type::variableNew("power_used", "0.5 0.5 0.5", container->type_); - } + simgrid::instr::VariableType* power = container->type_->getOrCreateVariableType("power", ""); + power->setCallingContainer(container); + power->setEvent(0, host.getSpeed()); } - if (TRACE_smpi_is_enabled() && TRACE_smpi_is_grouped()){ - simgrid::instr::Type* mpi = container->type_->getChildOrNull("MPI"); - if (mpi == nullptr){ - mpi = simgrid::instr::Type::containerNew("MPI", container->type_); - simgrid::instr::Type::stateNew("MPI_STATE", mpi); - } - } + if (TRACE_uncategorized()) + container->type_->getOrCreateVariableType("power_used", "0.5 0.5 0.5"); + + if (TRACE_smpi_is_enabled() && TRACE_smpi_is_grouped()) + container->type_->getOrCreateContainerType("MPI")->getOrCreateStateType("MPI_STATE"); if (TRACE_msg_process_is_enabled()) { - simgrid::instr::Type* msg_process = container->type_->getChildOrNull("MSG_PROCESS"); - if (msg_process == nullptr){ - msg_process = simgrid::instr::Type::containerNew("MSG_PROCESS", container->type_); - simgrid::instr::Type* state = simgrid::instr::Type::stateNew("MSG_PROCESS_STATE", msg_process); - new simgrid::instr::Value("suspend", "1 0 1", state); - simgrid::instr::Value::get_or_new("sleep", "1 1 0", state); - simgrid::instr::Value::get_or_new("receive", "1 0 0", state); - simgrid::instr::Value::get_or_new("send", "0 0 1", state); - simgrid::instr::Value::get_or_new("task_execute", "0 1 1", state); - simgrid::instr::Type::linkNew("MSG_PROCESS_LINK", PJ_type_get_root(), msg_process, msg_process); - simgrid::instr::Type::linkNew("MSG_PROCESS_TASK_LINK", PJ_type_get_root(), msg_process, msg_process); - } + simgrid::instr::ContainerType* msg_process = container->type_->getOrCreateContainerType("MSG_PROCESS"); + simgrid::instr::StateType* state = msg_process->getOrCreateStateType("MSG_PROCESS_STATE"); + state->addEntityValue("suspend", "1 0 1"); + state->addEntityValue("sleep", "1 1 0"); + state->addEntityValue("receive", "1 0 0"); + state->addEntityValue("send", "0 0 1"); + state->addEntityValue("task_execute", "0 1 1"); + root->type_->getOrCreateLinkType("MSG_PROCESS_LINK", msg_process, msg_process); + root->type_->getOrCreateLinkType("MSG_PROCESS_TASK_LINK", msg_process, msg_process); } if (TRACE_msg_vm_is_enabled()) { - simgrid::instr::Type* msg_vm = container->type_->getChildOrNull("MSG_VM"); - if (msg_vm == nullptr){ - msg_vm = simgrid::instr::Type::containerNew("MSG_VM", container->type_); - simgrid::instr::Type* state = simgrid::instr::Type::stateNew("MSG_VM_STATE", msg_vm); - new simgrid::instr::Value("suspend", "1 0 1", state); - simgrid::instr::Value::get_or_new("sleep", "1 1 0", state); - simgrid::instr::Value::get_or_new("receive", "1 0 0", state); - simgrid::instr::Value::get_or_new("send", "0 0 1", state); - simgrid::instr::Value::get_or_new("task_execute", "0 1 1", state); - simgrid::instr::Type::linkNew("MSG_VM_LINK", PJ_type_get_root(), msg_vm, msg_vm); - simgrid::instr::Type::linkNew("MSG_VM_PROCESS_LINK", PJ_type_get_root(), msg_vm, msg_vm); - } + simgrid::instr::ContainerType* msg_vm = container->type_->getOrCreateContainerType("MSG_VM"); + simgrid::instr::StateType* state = msg_vm->getOrCreateStateType("MSG_VM_STATE"); + state->addEntityValue("suspend", "1 0 1"); + state->addEntityValue("sleep", "1 1 0"); + state->addEntityValue("receive", "1 0 0"); + state->addEntityValue("send", "0 0 1"); + state->addEntityValue("task_execute", "0 1 1"); + root->type_->getOrCreateLinkType("MSG_VM_LINK", msg_vm, msg_vm); + root->type_->getOrCreateLinkType("MSG_VM_PROCESS_LINK", msg_vm, msg_vm); } - } static void sg_instr_new_router(simgrid::kernel::routing::NetPoint * netpoint) { - if (not netpoint->isRouter()) - return; - if (TRACE_is_enabled() && TRACE_needs_platform()) { - container_t father = currentContainer.back(); - new simgrid::instr::Container(netpoint->cname(), simgrid::instr::INSTR_ROUTER, father); - } + if (netpoint->isRouter() && TRACE_is_enabled() && TRACE_needs_platform()) + new simgrid::instr::RouterContainer(netpoint->getCname(), currentContainer.back()); } static void instr_routing_parse_end_platform () { currentContainer.clear(); - xbt_dict_t filter = xbt_dict_new_homogeneous(xbt_free_f); + std::set* filter = new std::set; XBT_DEBUG ("Starting graph extraction."); - recursiveGraphExtraction(simgrid::s4u::Engine::getInstance()->getNetRoot(), PJ_container_get_root(), filter); + recursiveGraphExtraction(simgrid::s4u::Engine::getInstance()->getNetRoot(), simgrid::instr::Container::getRoot(), + filter); XBT_DEBUG ("Graph extraction finished."); - xbt_dict_free(&filter); + delete filter; platform_created = 1; - TRACE_paje_dump_buffer(1); + TRACE_paje_dump_buffer(true); } void instr_routing_define_callbacks () { - //always need the call backs to ASes (we need only the root AS), - //to create the rootContainer and the rootType properly + // always need the callbacks to ASes (we need only the root AS), to create the rootContainer and the rootType properly if (not TRACE_is_enabled()) return; if (TRACE_needs_platform()) { @@ -322,95 +279,71 @@ void instr_routing_define_callbacks () } simgrid::s4u::NetZone::onCreation.connect(sg_instr_AS_begin); simgrid::s4u::NetZone::onSeal.connect(sg_instr_AS_end); - simgrid::kernel::routing::NetPoint::onCreation.connect(&sg_instr_new_router); + simgrid::kernel::routing::NetPoint::onCreation.connect(sg_instr_new_router); } /* * user categories support */ -static void recursiveNewVariableType(const char* new_typename, const char* color, simgrid::instr::Type* root) +static void recursiveNewVariableType(std::string new_typename, std::string color, simgrid::instr::Type* root) { - if (not strcmp(root->name_, "HOST")) { - char tnstr[INSTR_DEFAULT_STR_SIZE]; - snprintf (tnstr, INSTR_DEFAULT_STR_SIZE, "p%s", new_typename); - simgrid::instr::Type::variableNew(tnstr, color, root); - } - if (not strcmp(root->name_, "MSG_VM")) { - char tnstr[INSTR_DEFAULT_STR_SIZE]; - snprintf (tnstr, INSTR_DEFAULT_STR_SIZE, "p%s", new_typename); - simgrid::instr::Type::variableNew(tnstr, color, root); - } - if (not strcmp(root->name_, "LINK")) { - char tnstr[INSTR_DEFAULT_STR_SIZE]; - snprintf (tnstr, INSTR_DEFAULT_STR_SIZE, "b%s", new_typename); - simgrid::instr::Type::variableNew(tnstr, color, root); - } - xbt_dict_cursor_t cursor = nullptr; - simgrid::instr::Type* child_type; - char *name; - xbt_dict_foreach (root->children_, cursor, name, child_type) { - recursiveNewVariableType (new_typename, color, child_type); + if (root->getName() == "HOST" || root->getName() == "MSG_VM") + root->getOrCreateVariableType(std::string("p") + new_typename, color); + + if (root->getName() == "LINK") + root->getOrCreateVariableType(std::string("b") + new_typename, color); + + for (auto elm : root->children_) { + recursiveNewVariableType(new_typename, color, elm.second); } } -void instr_new_variable_type (const char *new_typename, const char *color) +void instr_new_variable_type(std::string new_typename, std::string color) { - recursiveNewVariableType (new_typename, color, PJ_type_get_root()); + recursiveNewVariableType(new_typename, color, simgrid::instr::Container::getRoot()->type_); } -static void recursiveNewUserVariableType(const char* father_type, const char* new_typename, const char* color, +static void recursiveNewUserVariableType(std::string father_type, std::string new_typename, std::string color, simgrid::instr::Type* root) { - if (not strcmp(root->name_, father_type)) { - simgrid::instr::Type::variableNew(new_typename, color, root); - } - xbt_dict_cursor_t cursor = nullptr; - simgrid::instr::Type* child_type; - char *name; - xbt_dict_foreach (root->children_, cursor, name, child_type) { - recursiveNewUserVariableType (father_type, new_typename, color, child_type); + if (root->getName() == father_type) { + root->getOrCreateVariableType(new_typename, color); } + for (auto elm : root->children_) + recursiveNewUserVariableType(father_type, new_typename, color, elm.second); } -void instr_new_user_variable_type (const char *father_type, const char *new_typename, const char *color) +void instr_new_user_variable_type(std::string father_type, std::string new_typename, std::string color) { - recursiveNewUserVariableType (father_type, new_typename, color, PJ_type_get_root()); + recursiveNewUserVariableType(father_type, new_typename, color, simgrid::instr::Container::getRoot()->type_); } -static void recursiveNewUserStateType(const char* father_type, const char* new_typename, simgrid::instr::Type* root) +static void recursiveNewUserStateType(std::string father_type, std::string new_typename, simgrid::instr::Type* root) { - if (not strcmp(root->name_, father_type)) { - simgrid::instr::Type::stateNew(new_typename, root); - } - xbt_dict_cursor_t cursor = nullptr; - simgrid::instr::Type* child_type; - char *name; - xbt_dict_foreach (root->children_, cursor, name, child_type) { - recursiveNewUserStateType (father_type, new_typename, child_type); - } + if (root->getName() == father_type) + root->getOrCreateStateType(new_typename); + + for (auto elm : root->children_) + recursiveNewUserStateType(father_type, new_typename, elm.second); } -void instr_new_user_state_type (const char *father_type, const char *new_typename) +void instr_new_user_state_type(std::string father_type, std::string new_typename) { - recursiveNewUserStateType (father_type, new_typename, PJ_type_get_root()); + recursiveNewUserStateType(father_type, new_typename, simgrid::instr::Container::getRoot()->type_); } -static void recursiveNewValueForUserStateType(const char* type_name, const char* val, const char* color, +static void recursiveNewValueForUserStateType(std::string type_name, const char* val, std::string color, simgrid::instr::Type* root) { - if (not strcmp(root->name_, type_name)) { - new simgrid::instr::Value(val, color, root); - } - xbt_dict_cursor_t cursor = nullptr; - simgrid::instr::Type* child_type; - char *name; - xbt_dict_foreach (root->children_, cursor, name, child_type) { - recursiveNewValueForUserStateType(type_name, val, color, child_type); - } + if (root->getName() == type_name) + static_cast(root)->addEntityValue(val, color); + + for (auto elm : root->children_) + recursiveNewValueForUserStateType(type_name, val, color, elm.second); } -void instr_new_value_for_user_state_type (const char *type_name, const char *value, const char *color) +void instr_new_value_for_user_state_type(std::string type_name, const char* value, std::string color) { - recursiveNewValueForUserStateType (type_name, value, color, PJ_type_get_root()); + recursiveNewValueForUserStateType(type_name, value, color, simgrid::instr::Container::getRoot()->type_); } int instr_platform_traced () @@ -420,14 +353,14 @@ int instr_platform_traced () #define GRAPHICATOR_SUPPORT_FUNCTIONS -static void recursiveXBTGraphExtraction(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges, sg_netzone_t netzone, +static void recursiveXBTGraphExtraction(xbt_graph_t graph, std::map* nodes, + std::map* edges, sg_netzone_t netzone, container_t container) { if (not netzone->getChildren()->empty()) { //bottom-up recursion for (auto const& netzone_child : *netzone->getChildren()) { - container_t child_container = - static_cast(xbt_dict_get(container->children_, netzone_child->getCname())); + container_t child_container = container->children_.at(netzone_child->getCname()); recursiveXBTGraphExtraction(graph, nodes, edges, netzone_child, child_container); } } @@ -438,12 +371,12 @@ static void recursiveXBTGraphExtraction(xbt_graph_t graph, xbt_dict_t nodes, xbt xbt_graph_t instr_routing_platform_graph () { xbt_graph_t ret = xbt_graph_new_graph (0, nullptr); - xbt_dict_t nodes = xbt_dict_new_homogeneous(nullptr); - xbt_dict_t edges = xbt_dict_new_homogeneous(nullptr); + std::map* nodes = new std::map; + std::map* edges = new std::map; recursiveXBTGraphExtraction(ret, nodes, edges, simgrid::s4u::Engine::getInstance()->getNetRoot(), - PJ_container_get_root()); - xbt_dict_free (&nodes); - xbt_dict_free (&edges); + simgrid::instr::Container::getRoot()); + delete nodes; + delete edges; return ret; } diff --git a/src/surf/instr_surf.cpp b/src/surf/instr_surf.cpp index 83f7e1e227..2746a66bb2 100644 --- a/src/surf/instr_surf.cpp +++ b/src/surf/instr_surf.cpp @@ -1,10 +1,10 @@ -/* Copyright (c) 2010, 2012-2015. The SimGrid Team. +/* Copyright (c) 2010, 2012-2017. 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 "src/instr/instr_private.h" +#include "src/instr/instr_private.hpp" #include "src/surf/surf_interface.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_surf, instr, "Tracing Surf"); @@ -12,28 +12,20 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_surf, instr, "Tracing Surf"); void TRACE_surf_host_set_speed(double date, const char *resource, double speed) { if (TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) { - container_t container = PJ_container_get(resource); - simgrid::instr::Type* type = container->type_->getChild("power"); - new simgrid::instr::SetVariableEvent(date, container, type, speed); + simgrid::instr::Container::byName(resource)->getVariable("power")->setEvent(date, speed); } } void TRACE_surf_link_set_bandwidth(double date, const char *resource, double bandwidth) { if (TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) { - container_t container = PJ_container_get(resource); - simgrid::instr::Type* type = container->type_->getChild("bandwidth"); - new simgrid::instr::SetVariableEvent(date, container, type, bandwidth); + simgrid::instr::Container::byName(resource)->getVariable("bandwidth")->setEvent(date, bandwidth); } } void TRACE_surf_action(surf_action_t surf_action, const char *category) { - if (not TRACE_is_enabled()) - return; - if (not TRACE_categorized()) - return; - if (not category) + if (not TRACE_is_enabled() || not TRACE_categorized() || not category) return; surf_action->setCategory(category); diff --git a/src/surf/lagrange.cpp b/src/surf/lagrange.cpp index 0f671f5d37..447273bede 100644 --- a/src/surf/lagrange.cpp +++ b/src/surf/lagrange.cpp @@ -11,6 +11,7 @@ #include "xbt/sysdep.h" #include "maxmin_private.hpp" +#include #include #ifndef MATH #include @@ -37,7 +38,9 @@ static double partial_diff_lambda(double lambda, void *param_cnst); static int __check_feasible(xbt_swag_t cnst_list, xbt_swag_t var_list, int warn) { - void *_cnst, *_elem, *_var; + void* _cnst; + void* _elem; + void* _var; xbt_swag_t elem_list = nullptr; lmm_element_t elem = nullptr; lmm_constraint_t cnst = nullptr; @@ -84,8 +87,8 @@ static double new_value(lmm_variable_t var) { double tmp = 0; - for (int i = 0; i < var->cnsts_number; i++) { - tmp += (var->cnsts[i].constraint)->lambda; + for (s_lmm_element_t const& elem : var->cnsts) { + tmp += elem.constraint->lambda; } if (var->bound > 0) tmp += var->mu; @@ -99,8 +102,8 @@ static double new_mu(lmm_variable_t var) double mu_i = 0.0; double sigma_i = 0.0; - for (int j = 0; j < var->cnsts_number; j++) { - sigma_i += (var->cnsts[j].constraint)->lambda; + for (s_lmm_element_t const& elem : var->cnsts) { + sigma_i += elem.constraint->lambda; } mu_i = var->func_fp(var, var->bound) - sigma_i; if (mu_i < 0.0) @@ -124,8 +127,8 @@ static double dual_objective(xbt_swag_t var_list, xbt_swag_t cnst_list) if (not var->sharing_weight) break; - for (int j = 0; j < var->cnsts_number; j++) - sigma_i += (var->cnsts[j].constraint)->lambda; + for (s_lmm_element_t const& elem : var->cnsts) + sigma_i += elem.constraint->lambda; if (var->bound > 0) sigma_i += var->mu; @@ -198,30 +201,27 @@ void lagrange_solve(lmm_system_t sys) var_list = &(sys->variable_set); i = 0; xbt_swag_foreach(_var, var_list) { - var = static_cast(_var); - if (not var->sharing_weight) - var->value = 0.0; - else { - int nb = 0; - if (var->bound < 0.0) { - XBT_DEBUG("#### NOTE var(%d) is a boundless variable", i); - var->mu = -1.0; - var->value = new_value(var); - } else { - var->mu = 1.0; - var->new_mu = 2.0; - var->value = new_value(var); - } - XBT_DEBUG("#### var(%p) ->weight : %e", var, var->sharing_weight); - XBT_DEBUG("#### var(%p) ->mu : %e", var, var->mu); - XBT_DEBUG("#### var(%p) ->weight: %e", var, var->sharing_weight); - XBT_DEBUG("#### var(%p) ->bound: %e", var, var->bound); - for (i = 0; i < var->cnsts_number; i++) { - if (var->cnsts[i].consumption_weight == 0.0) - nb++; - } - if (nb == var->cnsts_number) - var->value = 1.0; + var = static_cast(_var); + if (not var->sharing_weight) + var->value = 0.0; + else { + if (var->bound < 0.0) { + XBT_DEBUG("#### NOTE var(%d) is a boundless variable", i); + var->mu = -1.0; + var->value = new_value(var); + } else { + var->mu = 1.0; + var->new_mu = 2.0; + var->value = new_value(var); + } + XBT_DEBUG("#### var(%p) ->weight : %e", var, var->sharing_weight); + XBT_DEBUG("#### var(%p) ->mu : %e", var, var->mu); + XBT_DEBUG("#### var(%p) ->weight: %e", var, var->sharing_weight); + XBT_DEBUG("#### var(%p) ->bound: %e", var, var->bound); + auto weighted = std::find_if(begin(var->cnsts), end(var->cnsts), + [](s_lmm_element_t const& x) { return x.consumption_weight != 0.0; }); + if (weighted == end(var->cnsts)) + var->value = 1.0; } } @@ -276,7 +276,7 @@ void lagrange_solve(lmm_system_t sys) else { tmp = new_value(var); - overall_modification = MAX(overall_modification, fabs(var->value - tmp)); + overall_modification = std::max(overall_modification, fabs(var->value - tmp)); var->value = tmp; XBT_DEBUG("New value of var (%p) = %e, overall_modification = %e", var, var->value, overall_modification); @@ -433,8 +433,8 @@ static double partial_diff_lambda(double lambda, void *param_cnst) double sigma_i = 0.0; // Compute sigma_i - for (int j = 0; j < var->cnsts_number; j++) { - sigma_i += (var->cnsts[j].constraint)->lambda; + for (s_lmm_element_t const& elem : var->cnsts) { + sigma_i += elem.constraint->lambda; } //add mu_i if this flow has a RTT constraint associated diff --git a/src/surf/maxmin.cpp b/src/surf/maxmin.cpp index 095d6e0dca..e9fd4ee864 100644 --- a/src/surf/maxmin.cpp +++ b/src/surf/maxmin.cpp @@ -6,22 +6,20 @@ /* \file callbacks.h */ #include "maxmin_private.hpp" +#include "xbt/backtrace.hpp" #include "xbt/log.h" #include "xbt/mallocator.h" #include "xbt/sysdep.h" +#include #include #include #include #include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_maxmin, surf, "Logging specific to SURF (maxmin)"); -typedef struct s_dyn_light { - int *data; - int pos; - int size; -} s_dyn_light_t; -typedef s_dyn_light_t* dyn_light_t; +typedef std::vector dyn_light_t; double sg_maxmin_precision = 0.00001; /* Change this with --cfg=maxmin/precision:VALUE */ double sg_surf_precision = 0.00001; /* Change this with --cfg=surf/precision:VALUE */ @@ -44,7 +42,8 @@ static void lmm_disable_var(lmm_system_t sys, lmm_variable_t var); static int lmm_concurrency_slack(lmm_constraint_t cnstr); static int lmm_cnstrs_min_concurrency_slack(lmm_variable_t var); -inline int lmm_element_concurrency(lmm_element_t elem) { +static inline int lmm_element_concurrency(lmm_element_t elem) +{ //Ignore element with weight less than one (e.g. cross-traffic) return (elem->consumption_weight >= 1) ? 1 : 0; //There are other alternatives, but they will change the behaviour of the model.. @@ -55,12 +54,14 @@ inline int lmm_element_concurrency(lmm_element_t elem) { //return (int)ceil(elem->weight);//Include element as the rounded-up integer value of the element weight } -inline void lmm_decrease_concurrency(lmm_element_t elem) { +static inline void lmm_decrease_concurrency(lmm_element_t elem) +{ xbt_assert(elem->constraint->concurrency_current>=lmm_element_concurrency(elem)); elem->constraint->concurrency_current-=lmm_element_concurrency(elem); } -inline void lmm_increase_concurrency(lmm_element_t elem) { +static inline void lmm_increase_concurrency(lmm_element_t elem) +{ elem->constraint->concurrency_current+= lmm_element_concurrency(elem); lmm_constraint_t cnstr=elem->constraint; @@ -110,7 +111,7 @@ static void lmm_check_concurrency(lmm_system_t sys) { lmm_variable_t var = (lmm_variable_t)varIt; - if (not var->cnsts_number) + if (var->cnsts.empty()) continue; lmm_element_t elem = &var->cnsts[0]; @@ -118,62 +119,54 @@ static void lmm_check_concurrency(lmm_system_t sys) int belong_to_disabled = xbt_swag_belongs(elem, &(elem->constraint->disabled_element_set)); int belong_to_active = xbt_swag_belongs(elem, &(elem->constraint->active_element_set)); - for (int i = 1; i < var->cnsts_number; i++) { - elem = &var->cnsts[i]; - xbt_assert(belong_to_enabled == xbt_swag_belongs(elem, &(elem->constraint->enabled_element_set)), + for (s_lmm_element_t const& elem : var->cnsts) { + xbt_assert(belong_to_enabled == xbt_swag_belongs(&elem, &(elem.constraint->enabled_element_set)), "Variable inconsistency (1): enabled_element_set"); - xbt_assert(belong_to_disabled == xbt_swag_belongs(elem, &(elem->constraint->disabled_element_set)), + xbt_assert(belong_to_disabled == xbt_swag_belongs(&elem, &(elem.constraint->disabled_element_set)), "Variable inconsistency (2): disabled_element_set"); - xbt_assert(belong_to_active == xbt_swag_belongs(elem, &(elem->constraint->active_element_set)), + xbt_assert(belong_to_active == xbt_swag_belongs(&elem, &(elem.constraint->active_element_set)), "Variable inconsistency (3): active_element_set"); } } } -static inline void lmm_variable_remove(lmm_system_t sys, lmm_variable_t var) +static void lmm_var_free(lmm_system_t sys, lmm_variable_t var) { XBT_IN("(sys=%p, var=%p)", sys, var); sys->modified = 1; // TODOLATER Can do better than that by leaving only the variable in only one enabled_element_set, call // lmm_update_modified_set, and then remove it.. - if (var->cnsts_number) + if (not var->cnsts.empty()) lmm_update_modified_set(sys, var->cnsts[0].constraint); - for (int i = 0; i < var->cnsts_number; i++) { - lmm_element_t elem = &var->cnsts[i]; + for (s_lmm_element_t& elem : var->cnsts) { if (var->sharing_weight > 0) - lmm_decrease_concurrency(elem); - xbt_swag_remove(elem, &(elem->constraint->enabled_element_set)); - xbt_swag_remove(elem, &(elem->constraint->disabled_element_set)); - xbt_swag_remove(elem, &(elem->constraint->active_element_set)); - int nelements = xbt_swag_size(&(elem->constraint->enabled_element_set)) + - xbt_swag_size(&(elem->constraint->disabled_element_set)); + lmm_decrease_concurrency(&elem); + xbt_swag_remove(&elem, &(elem.constraint->enabled_element_set)); + xbt_swag_remove(&elem, &(elem.constraint->disabled_element_set)); + xbt_swag_remove(&elem, &(elem.constraint->active_element_set)); + int nelements = xbt_swag_size(&(elem.constraint->enabled_element_set)) + + xbt_swag_size(&(elem.constraint->disabled_element_set)); if (nelements == 0) - make_constraint_inactive(sys, elem->constraint); + make_constraint_inactive(sys, elem.constraint); else - lmm_on_disabled_var(sys, elem->constraint); + lmm_on_disabled_var(sys, elem.constraint); } // Check if we can enable new variables going through the constraints where var was. - // Do it after removing all elements, so he first disabled variables get priority over those with smaller requirement - for (int i = 0; i < var->cnsts_number; i++) { - lmm_element_t elem = &var->cnsts[i]; - if (xbt_swag_size(&(elem->constraint->disabled_element_set))) - lmm_on_disabled_var(sys, elem->constraint); + // Do it after removing all elements, so the first disabled variables get priority over those with smaller requirement + for (s_lmm_element_t& elem : var->cnsts) { + if (xbt_swag_size(&(elem.constraint->disabled_element_set))) + lmm_on_disabled_var(sys, elem.constraint); } - var->cnsts_number = 0; + var->cnsts.clear(); lmm_check_concurrency(sys); - XBT_OUT(); -} - -static void lmm_var_free(lmm_system_t sys, lmm_variable_t var) -{ - lmm_variable_remove(sys, var); xbt_mallocator_release(sys->variable_mallocator, var); + XBT_OUT(); } lmm_system_t lmm_system_new(bool selective_update) @@ -181,7 +174,7 @@ lmm_system_t lmm_system_new(bool selective_update) s_lmm_variable_t var; s_lmm_constraint_t cnst; - lmm_system_t l = xbt_new0(s_lmm_system_t, 1); + lmm_system_t l = new s_lmm_system_t(); l->modified = 0; l->selective_update_active = selective_update; @@ -217,25 +210,22 @@ void lmm_system_free(lmm_system_t sys) return; while ((var = (lmm_variable_t) extract_variable(sys))) { - int status; - char* demangled = abi::__cxa_demangle(typeid(*var->id).name(), 0, 0, &status); - - XBT_WARN("Probable bug: a %s variable (#%d) not removed before the LMM system destruction.", demangled, + auto demangled = simgrid::xbt::demangle(typeid(*var->id).name()); + XBT_WARN("Probable bug: a %s variable (#%d) not removed before the LMM system destruction.", demangled.get(), var->id_int); - xbt_free(demangled); lmm_var_free(sys, var); } while ((cnst = (lmm_constraint_t) extract_constraint(sys))) lmm_cnst_free(sys, cnst); xbt_mallocator_free(sys->variable_mallocator); - free(sys); + delete sys; } static inline void lmm_cnst_free(lmm_system_t sys, lmm_constraint_t cnst) { make_constraint_inactive(sys, cnst); - free(cnst); + delete cnst; } lmm_constraint_t lmm_constraint_new(lmm_system_t sys, void *id, double bound_value) @@ -243,8 +233,8 @@ lmm_constraint_t lmm_constraint_new(lmm_system_t sys, void *id, double bound_val lmm_constraint_t cnst = nullptr; s_lmm_element_t elem; - cnst = xbt_new0(s_lmm_constraint_t, 1); - cnst->id = id; + cnst = new s_lmm_constraint_t(); + cnst->id = id; cnst->id_int = Global_const_debug_id++; xbt_swag_init(&(cnst->enabled_element_set), xbt_swag_offset(elem, enabled_element_set_hookup)); xbt_swag_init(&(cnst->disabled_element_set), xbt_swag_offset(elem, disabled_element_set_hookup)); @@ -297,32 +287,14 @@ int lmm_constraint_sharing_policy(lmm_constraint_t cnst) return (cnst->sharing_policy); } -/* @brief Remove a constraint - * Currently this is dead code, but it is exposed in maxmin.h - * Apparently, this call was designed assuming that constraint would no more have elements in it. - * If not the case, assertion will fail, and you need to add calls e.g. to lmm_shrink before effectively removing it. - */ -inline void lmm_constraint_free(lmm_system_t sys,lmm_constraint_t cnst) -{ - xbt_assert(not xbt_swag_size(&(cnst->active_element_set)), "Removing constraint but it still has active elements"); - xbt_assert(not xbt_swag_size(&(cnst->enabled_element_set)), "Removing constraint but it still has enabled elements"); - xbt_assert(not xbt_swag_size(&(cnst->disabled_element_set)), - "Removing constraint but it still has disabled elements"); - remove_constraint(sys, cnst); - lmm_cnst_free(sys, cnst); -} - static void *lmm_variable_mallocator_new_f() { - lmm_variable_t var = xbt_new(s_lmm_variable_t, 1); - var->cnsts = nullptr; /* will be created by realloc */ - return var; + return new s_lmm_variable_t; } static void lmm_variable_mallocator_free_f(void *var) { - xbt_free(((lmm_variable_t) var)->cnsts); - xbt_free(var); + delete static_cast(var); } lmm_variable_t lmm_variable_new(lmm_system_t sys, simgrid::surf::Action* id, double sharing_weight, double bound, @@ -333,20 +305,7 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, simgrid::surf::Action* id, dou lmm_variable_t var = (lmm_variable_t)xbt_mallocator_get(sys->variable_mallocator); var->id = id; var->id_int = Global_debug_id++; - var->cnsts = (s_lmm_element_t *) xbt_realloc(var->cnsts, number_of_constraints * sizeof(s_lmm_element_t)); - for (int i = 0; i < number_of_constraints; i++) { - var->cnsts[i].enabled_element_set_hookup.next = nullptr; - var->cnsts[i].enabled_element_set_hookup.prev = nullptr; - var->cnsts[i].disabled_element_set_hookup.next = nullptr; - var->cnsts[i].disabled_element_set_hookup.prev = nullptr; - var->cnsts[i].active_element_set_hookup.next = nullptr; - var->cnsts[i].active_element_set_hookup.prev = nullptr; - var->cnsts[i].constraint = nullptr; - var->cnsts[i].variable = nullptr; - var->cnsts[i].consumption_weight = 0.0; - } - var->cnsts_size = number_of_constraints; - var->cnsts_number = 0; + var->cnsts.reserve(number_of_constraints); var->sharing_weight = sharing_weight; var->staged_weight = 0.0; var->bound = bound; @@ -394,59 +353,6 @@ double lmm_variable_getbound(lmm_variable_t var) return (var->bound); } -void lmm_shrink(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var) -{ - lmm_element_t elem = nullptr; - int found = 0; - - for (int i = 0; i < var->cnsts_number; i++) { - elem = &(var->cnsts[i]); - if (elem->constraint == cnst) { - found = 1; - break; - } - } - - if (not found) { - XBT_DEBUG("cnst %p is not found in var %p", cnst, var); - return; - } - - sys->modified = 1; - - XBT_DEBUG("remove elem(value %f, cnst %p, var %p) in var %p", elem->consumption_weight, elem->constraint, - elem->variable, var); - - /* We are going to change the constraint object and the variable object. - * Propagate this change to other objects. Calling here before removing variable from not active elements - * (inactive elements are not visited) - */ - lmm_update_modified_set(sys, cnst); - //Useful in case var was already removed from the constraint - lmm_update_modified_set(sys, var->cnsts[0].constraint); // will look up enabled_element_set of this constraint, and - //then each var in the enabled_element_set, and each var->cnsts[i]. - - if(xbt_swag_remove(elem, &(elem->constraint->enabled_element_set))) - lmm_decrease_concurrency(elem); - - xbt_swag_remove(elem, &(elem->constraint->active_element_set)); - elem->constraint = nullptr; - elem->variable = nullptr; - elem->consumption_weight = 0; - - var->cnsts_number -= 1; - - //No variable in this constraint -> make it inactive - if (xbt_swag_size(&(cnst->enabled_element_set))+xbt_swag_size(&(cnst->disabled_element_set)) == 0) - make_constraint_inactive(sys, cnst); - else { - //Check maxconcurrency to see if we can enable new variables - lmm_on_disabled_var(sys,elem->constraint); - } - - lmm_check_concurrency(sys); -} - void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, double consumption_weight) { sys->modified = 1; @@ -455,10 +361,9 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, dou //If it does, substract it from the required slack int current_share = 0; if(var->concurrency_share>1){ - for (int i = 0; i < var->cnsts_number; i++) { - if(var->cnsts[i].constraint==cnst && - xbt_swag_belongs(&var->cnsts[i],&(var->cnsts[i].constraint->enabled_element_set))) - current_share+=lmm_element_concurrency(&(var->cnsts[i])); + for (s_lmm_element_t& elem : var->cnsts) { + if (elem.constraint == cnst && xbt_swag_belongs(&elem, &(elem.constraint->enabled_element_set))) + current_share += lmm_element_concurrency(&elem); } } @@ -466,34 +371,35 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, dou if (var->sharing_weight > 0 && var->concurrency_share - current_share > lmm_concurrency_slack(cnst)) { double weight = var->sharing_weight; lmm_disable_var(sys,var); - for (int i = 0; i < var->cnsts_number; i++) - lmm_on_disabled_var(sys,var->cnsts[i].constraint); + for (s_lmm_element_t const& elem : var->cnsts) + lmm_on_disabled_var(sys, elem.constraint); consumption_weight = 0; var->staged_weight=weight; xbt_assert(not var->sharing_weight); } - xbt_assert(var->cnsts_number < var->cnsts_size, "Too much constraints"); + xbt_assert(var->cnsts.size() < var->cnsts.capacity(), "Too much constraints"); - lmm_element_t elem = &(var->cnsts[var->cnsts_number++]); + var->cnsts.resize(var->cnsts.size() + 1); + s_lmm_element_t& elem = var->cnsts.back(); - elem->consumption_weight = consumption_weight; - elem->constraint = cnst; - elem->variable = var; + elem.consumption_weight = consumption_weight; + elem.constraint = cnst; + elem.variable = var; if (var->sharing_weight) { - xbt_swag_insert_at_head(elem, &(elem->constraint->enabled_element_set)); - lmm_increase_concurrency(elem); + xbt_swag_insert_at_head(&elem, &(elem.constraint->enabled_element_set)); + lmm_increase_concurrency(&elem); } else - xbt_swag_insert_at_tail(elem, &(elem->constraint->disabled_element_set)); + xbt_swag_insert_at_tail(&elem, &(elem.constraint->disabled_element_set)); if (not sys->selective_update_active) { make_constraint_active(sys, cnst); - } else if (elem->consumption_weight > 0 || var->sharing_weight > 0) { + } else if (elem.consumption_weight > 0 || var->sharing_weight > 0) { make_constraint_active(sys, cnst); lmm_update_modified_set(sys, cnst); //TODOLATER: Why do we need this second call? - if (var->cnsts_number > 1) + if (var->cnsts.size() > 1) lmm_update_modified_set(sys, var->cnsts[0].constraint); } @@ -502,36 +408,34 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, dou void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, double value) { - int i; sys->modified = 1; lmm_check_concurrency(sys); //BEWARE: In case you have multiple elements in one constraint, this will always add value to the first element. - for (i = 0; i < var->cnsts_number; i++) - if (var->cnsts[i].constraint == cnst) - break; - - if (i < var->cnsts_number) { + auto elem_it = std::find_if(begin(var->cnsts), end(var->cnsts), + [&cnst](s_lmm_element_t const& x) { return x.constraint == cnst; }); + if (elem_it != end(var->cnsts)) { + s_lmm_element_t& elem = *elem_it; if (var->sharing_weight) - lmm_decrease_concurrency(&var->cnsts[i]); + lmm_decrease_concurrency(&elem); if (cnst->sharing_policy) - var->cnsts[i].consumption_weight += value; + elem.consumption_weight += value; else - var->cnsts[i].consumption_weight = MAX(var->cnsts[i].consumption_weight, value); + elem.consumption_weight = std::max(elem.consumption_weight, value); //We need to check that increasing value of the element does not cross the concurrency limit if (var->sharing_weight) { - if(lmm_concurrency_slack(cnst)cnsts[i])){ + if (lmm_concurrency_slack(cnst) < lmm_element_concurrency(&elem)) { double weight = var->sharing_weight; lmm_disable_var(sys,var); - for (int j = 0; j < var->cnsts_number; j++) - lmm_on_disabled_var(sys,var->cnsts[j].constraint); + for (s_lmm_element_t const& elem2 : var->cnsts) + lmm_on_disabled_var(sys, elem2.constraint); var->staged_weight=weight; xbt_assert(not var->sharing_weight); } - lmm_increase_concurrency(&var->cnsts[i]); + lmm_increase_concurrency(&elem); } lmm_update_modified_set(sys, cnst); } else @@ -540,17 +444,17 @@ void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, lmm_check_concurrency(sys); } -lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t /*sys*/, lmm_variable_t var, int num) +lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t /*sys*/, lmm_variable_t var, unsigned num) { - if (num < var->cnsts_number) + if (num < var->cnsts.size()) return (var->cnsts[num].constraint); else return nullptr; } -double lmm_get_cnst_weight_from_var(lmm_system_t /*sys*/, lmm_variable_t var, int num) +double lmm_get_cnst_weight_from_var(lmm_system_t /*sys*/, lmm_variable_t var, unsigned num) { - if (num < var->cnsts_number) + if (num < var->cnsts.size()) return (var->cnsts[num].consumption_weight); else return 0.0; @@ -558,7 +462,7 @@ double lmm_get_cnst_weight_from_var(lmm_system_t /*sys*/, lmm_variable_t var, in int lmm_get_number_of_cnst_from_var(lmm_system_t /*sys*/, lmm_variable_t var) { - return (var->cnsts_number); + return (var->cnsts.size()); } lmm_variable_t lmm_get_var_from_cnst(lmm_system_t /*sys*/, lmm_constraint_t cnst, lmm_element_t * elem) @@ -629,40 +533,29 @@ void *lmm_variable_id(lmm_variable_t var) } static inline void saturated_constraint_set_update(double usage, int cnst_light_num, - dyn_light_t saturated_constraint_set, double *min_usage) + dyn_light_t& saturated_constraint_set, double* min_usage) { xbt_assert(usage > 0,"Impossible"); if (*min_usage < 0 || *min_usage > usage) { *min_usage = usage; XBT_HERE(" min_usage=%f (cnst->remaining / cnst->usage =%f)", *min_usage, usage); - saturated_constraint_set->data[0] = cnst_light_num; - saturated_constraint_set->pos = 1; + saturated_constraint_set.assign(1, cnst_light_num); } else if (*min_usage == usage) { - if(saturated_constraint_set->pos == saturated_constraint_set->size) { // realloc the size - saturated_constraint_set->size *= 2; - saturated_constraint_set->data = - (int*) xbt_realloc(saturated_constraint_set->data, (saturated_constraint_set->size) * sizeof(int)); - } - saturated_constraint_set->data[saturated_constraint_set->pos] = cnst_light_num; - saturated_constraint_set->pos++; + saturated_constraint_set.emplace_back(cnst_light_num); } } -static inline void saturated_variable_set_update(s_lmm_constraint_light_t *cnst_light_tab, - dyn_light_t saturated_constraint_set, lmm_system_t sys) +static inline void saturated_variable_set_update(s_lmm_constraint_light_t* cnst_light_tab, + const dyn_light_t& saturated_constraint_set, lmm_system_t sys) { /* Add active variables (i.e. variables that need to be set) from the set of constraints to saturate (cnst_light_tab)*/ - lmm_constraint_light_t cnst = nullptr; - void *_elem; - lmm_element_t elem = nullptr; - xbt_swag_t elem_list = nullptr; - int i; - for(i = 0; i< saturated_constraint_set->pos; i++){ - cnst = &cnst_light_tab[saturated_constraint_set->data[i]]; - elem_list = &(cnst->cnst->active_element_set); + for (int const& saturated_cnst : saturated_constraint_set) { + lmm_constraint_light_t cnst = &cnst_light_tab[saturated_cnst]; + void* _elem; + xbt_swag_t elem_list = &(cnst->cnst->active_element_set); xbt_swag_foreach(_elem, elem_list) { - elem = (lmm_element_t)_elem; + lmm_element_t elem = (lmm_element_t)_elem; //Visiting active_element_set, so, by construction, should never get a zero weight, correct? xbt_assert(elem->variable->sharing_weight > 0); if (elem->consumption_weight > 0) @@ -705,7 +598,7 @@ void lmm_print(lmm_system_t sys) if(cnst->sharing_policy) sum += elem->consumption_weight * elem->variable->value; else - sum = MAX(sum, elem->consumption_weight * elem->variable->value); + sum = std::max(sum, elem->consumption_weight * elem->variable->value); } //TODO: Adding disabled elements only for test compatibility, but do we really want them to be printed? elem_list = &(cnst->disabled_element_set); @@ -716,7 +609,7 @@ void lmm_print(lmm_system_t sys) if(cnst->sharing_policy) sum += elem->consumption_weight * elem->variable->value; else - sum = MAX(sum, elem->consumption_weight * elem->variable->value); + sum = std::max(sum, elem->consumption_weight * elem->variable->value); } buf = buf + "0) <= " + std::to_string(cnst->bound) + " ('" + std::to_string(cnst->id_int) + "')"; @@ -774,12 +667,9 @@ void lmm_solve(lmm_system_t sys) } } - s_lmm_constraint_light_t *cnst_light_tab = - (s_lmm_constraint_light_t *)xbt_malloc0(xbt_swag_size(cnst_list)*sizeof(s_lmm_constraint_light_t)); + s_lmm_constraint_light_t* cnst_light_tab = new s_lmm_constraint_light_t[xbt_swag_size(cnst_list)](); int cnst_light_num = 0; - dyn_light_t saturated_constraint_set = xbt_new0(s_dyn_light_t,1); - saturated_constraint_set->size = 5; - saturated_constraint_set->data = xbt_new0(int, saturated_constraint_set->size); + dyn_light_t saturated_constraint_set; xbt_swag_foreach_safe(_cnst, _cnst_next, cnst_list) { lmm_constraint_t cnst = (lmm_constraint_t)_cnst; @@ -839,14 +729,12 @@ void lmm_solve(lmm_system_t sys) if (min_bound < 0) min_bound = var->bound * var->sharing_weight; else - min_bound = MIN(min_bound, (var->bound * var->sharing_weight)); + min_bound = std::min(min_bound, (var->bound * var->sharing_weight)); XBT_DEBUG("Updated min_bound=%f", min_bound); } } while ((var = (lmm_variable_t)xbt_swag_getFirst(var_list))) { - int i; - if (min_bound < 0) { //If no variable could reach its bound, deal iteratively the constraints usage ( at worst one constraint is // saturated at each cycle) @@ -868,14 +756,13 @@ void lmm_solve(lmm_system_t sys) var->id_int, var->value); /* Update the usage of contraints where this variable is involved */ - for (i = 0; i < var->cnsts_number; i++) { - lmm_element_t elem = &var->cnsts[i]; - lmm_constraint_t cnst = elem->constraint; + for (s_lmm_element_t& elem : var->cnsts) { + lmm_constraint_t cnst = elem.constraint; if (cnst->sharing_policy) { - //Remember: shared constraints require that sum(elem->value * var->value) < cnst->bound - double_update(&(cnst->remaining), elem->consumption_weight * var->value, cnst->bound * sg_maxmin_precision); - double_update(&(cnst->usage), elem->consumption_weight / var->sharing_weight, sg_maxmin_precision); - //If the constraint is saturated, remove it from the set of active constraints (light_tab) + // Remember: shared constraints require that sum(elem.value * var->value) < cnst->bound + double_update(&(cnst->remaining), elem.consumption_weight * var->value, cnst->bound * sg_maxmin_precision); + double_update(&(cnst->usage), elem.consumption_weight / var->sharing_weight, sg_maxmin_precision); + // If the constraint is saturated, remove it from the set of active constraints (light_tab) if (not double_positive(cnst->usage, sg_maxmin_precision) || not double_positive(cnst->remaining, cnst->bound * sg_maxmin_precision)) { if (cnst->cnst_light) { @@ -890,18 +777,19 @@ void lmm_solve(lmm_system_t sys) } else { cnst->cnst_light->remaining_over_usage = cnst->remaining / cnst->usage; } - make_elem_inactive(elem); + make_elem_inactive(&elem); } else { - //Remember: non-shared constraints only require that max(elem->value * var->value) < cnst->bound + // Remember: non-shared constraints only require that max(elem.value * var->value) < cnst->bound cnst->usage = 0.0; - make_elem_inactive(elem); + make_elem_inactive(&elem); xbt_swag_t elem_list = &(cnst->enabled_element_set); xbt_swag_foreach(_elem, elem_list) { - elem = (lmm_element_t)_elem; - xbt_assert(elem->variable->sharing_weight > 0); - if (elem->variable->value > 0) continue; - if (elem->consumption_weight > 0) - cnst->usage = MAX(cnst->usage, elem->consumption_weight / elem->variable->sharing_weight); + lmm_element_t elem2 = static_cast(_elem); + xbt_assert(elem2->variable->sharing_weight > 0); + if (elem2->variable->value > 0) + continue; + if (elem2->consumption_weight > 0) + cnst->usage = std::max(cnst->usage, elem2->consumption_weight / elem2->variable->sharing_weight); } //If the constraint is saturated, remove it from the set of active constraints (light_tab) if (not double_positive(cnst->usage, sg_maxmin_precision) || @@ -929,7 +817,7 @@ void lmm_solve(lmm_system_t sys) /* Find out which variables reach the maximum */ min_usage = -1; min_bound = -1; - saturated_constraint_set->pos = 0; + saturated_constraint_set.clear(); int pos; for(pos=0; posactive_element_set.count>0, "Cannot saturate more a constraint that has" @@ -955,9 +843,7 @@ void lmm_solve(lmm_system_t sys) lmm_check_concurrency(sys); - xbt_free(saturated_constraint_set->data); - xbt_free(saturated_constraint_set); - xbt_free(cnst_light_tab); + delete[] cnst_light_tab; XBT_OUT(); } @@ -975,33 +861,30 @@ void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var, double boun sys->modified = 1; var->bound = bound; - if (var->cnsts_number) + if (not var->cnsts.empty()) lmm_update_modified_set(sys, var->cnsts[0].constraint); } -int lmm_concurrency_slack(lmm_constraint_t cnstr){ - //FIXME MARTIN: Replace by infinite value std::numeric_limits::(max)(), or something better within Simgrid? - if(cnstr->concurrency_limit<0) - return 666; - +int lmm_concurrency_slack(lmm_constraint_t cnstr) +{ + if (cnstr->concurrency_limit < 0) + return std::numeric_limits::max(); return cnstr->concurrency_limit - cnstr->concurrency_current; } /** \brief Measure the minimum concurrency slack across all constraints where the given var is involved */ -int lmm_cnstrs_min_concurrency_slack(lmm_variable_t var){ +int lmm_cnstrs_min_concurrency_slack(lmm_variable_t var) +{ int minslack = std::numeric_limits::max(); - for (int i = 0; i < var->cnsts_number; i++) { - int slack = lmm_concurrency_slack(var->cnsts[i].constraint); - - //This is only an optimization, to avoid looking at more constraints when slack is already zero - //Disable it when debugging to let lmm_concurrency_slack catch nasty things - if (not slack && not XBT_LOG_ISENABLED(surf_maxmin, xbt_log_priority_debug)) - return 0; - - if(minslack>slack) - minslack=slack; + for (s_lmm_element_t const& elem : var->cnsts) { + int slack = lmm_concurrency_slack(elem.constraint); + if (slack < minslack) { + // This is only an optimization, to avoid looking at more constraints when slack is already zero + if (slack == 0) + return 0; + minslack = slack; + } } - return minslack; } @@ -1028,13 +911,12 @@ void lmm_enable_var(lmm_system_t sys, lmm_variable_t var){ xbt_swag_remove(var, &(sys->variable_set)); xbt_swag_insert_at_head(var, &(sys->variable_set)); - for (int i = 0; i < var->cnsts_number; i++) { - lmm_element_t elem = &var->cnsts[i]; - xbt_swag_remove(elem, &(elem->constraint->disabled_element_set)); - xbt_swag_insert_at_head(elem, &(elem->constraint->enabled_element_set)); - lmm_increase_concurrency(elem); + for (s_lmm_element_t& elem : var->cnsts) { + xbt_swag_remove(&elem, &(elem.constraint->disabled_element_set)); + xbt_swag_insert_at_head(&elem, &(elem.constraint->enabled_element_set)); + lmm_increase_concurrency(&elem); } - if (var->cnsts_number) + if (not var->cnsts.empty()) lmm_update_modified_set(sys, var->cnsts[0].constraint); //When used within lmm_on_disabled_var, we would get an assertion fail, because transiently there can be variables @@ -1048,16 +930,15 @@ void lmm_disable_var(lmm_system_t sys, lmm_variable_t var){ // moving the last element of var. xbt_swag_remove(var, &(sys->variable_set)); xbt_swag_insert_at_tail(var, &(sys->variable_set)); - if (var->cnsts_number) + if (not var->cnsts.empty()) lmm_update_modified_set(sys, var->cnsts[0].constraint); - for (int i = 0; i < var->cnsts_number; i++) { - lmm_element_t elem = &var->cnsts[i]; - xbt_swag_remove(elem, &(elem->constraint->enabled_element_set)); - xbt_swag_insert_at_tail(elem, &(elem->constraint->disabled_element_set)); + for (s_lmm_element_t& elem : var->cnsts) { + xbt_swag_remove(&elem, &(elem.constraint->enabled_element_set)); + xbt_swag_insert_at_tail(&elem, &(elem.constraint->disabled_element_set)); - xbt_swag_remove(elem, &(elem->constraint->active_element_set)); + xbt_swag_remove(&elem, &(elem.constraint->active_element_set)); - lmm_decrease_concurrency(elem); + lmm_decrease_concurrency(&elem); } var->sharing_weight = 0.0; @@ -1089,13 +970,11 @@ void lmm_on_disabled_var(lmm_system_t sys, lmm_constraint_t cnstr){ lmm_element_t nextelem = (lmm_element_t)xbt_swag_getNext(elem, cnstr->disabled_element_set.offset); - if (elem->variable->staged_weight>0 ){ + if (elem->variable->staged_weight > 0 && lmm_can_enable_var(elem->variable)) { //Found a staged variable //TODOLATER: Add random timing function to model reservation protocol fuzziness? Then how to make sure that //staged variables will eventually be called? - if(lmm_can_enable_var(elem->variable)){ - lmm_enable_var(sys,elem->variable); - } + lmm_enable_var(sys, elem->variable); } xbt_assert(cnstr->concurrency_current<=cnstr->concurrency_limit,"Concurrency overflow!"); @@ -1193,12 +1072,12 @@ static void lmm_update_modified_set_rec(lmm_system_t sys, lmm_constraint_t cnst) //TODOLATER: Why lmm_modified_set has been changed in git version 2392B5157...? Looks equivalent logically and less obvious.. xbt_swag_foreach(_elem, &cnst->enabled_element_set) { lmm_variable_t var = ((lmm_element_t)_elem)->variable; - s_lmm_element_t *cnsts = var->cnsts; - int i; - for (i = 0; var->visited != sys->visited_counter && i < var->cnsts_number ; i++) { - if (cnsts[i].constraint != cnst && not xbt_swag_belongs(cnsts[i].constraint, &sys->modified_constraint_set)) { - xbt_swag_insert(cnsts[i].constraint, &sys->modified_constraint_set); - lmm_update_modified_set_rec(sys, cnsts[i].constraint); + for (s_lmm_element_t const& elem : var->cnsts) { + if (var->visited == sys->visited_counter) + break; + if (elem.constraint != cnst && not xbt_swag_belongs(elem.constraint, &sys->modified_constraint_set)) { + xbt_swag_insert(elem.constraint, &sys->modified_constraint_set); + lmm_update_modified_set_rec(sys, elem.constraint); } } //var will be ignored in later visits as long as sys->visited_counter does not move diff --git a/src/surf/maxmin_private.hpp b/src/surf/maxmin_private.hpp index 44fac8c50b..03505578a2 100644 --- a/src/surf/maxmin_private.hpp +++ b/src/surf/maxmin_private.hpp @@ -6,10 +6,12 @@ #ifndef SURF_MAXMIN_PRIVATE_H #define SURF_MAXMIN_PRIVATE_H -#include "surf/maxmin.h" -#include "xbt/swag.h" -#include "xbt/mallocator.h" +#include "surf/maxmin.hpp" #include "surf_interface.hpp" +#include "xbt/mallocator.h" +#include "xbt/swag.h" + +#include /** @ingroup SURF_lmm * @brief LMM element @@ -17,7 +19,7 @@ * Basically, each variable will have a set of elements, one for each constraint where it is involved. * Then, it is used to list all variables involved in constraint through constraint's xxx_element_set lists, or vice-versa list all constraints for a given variable. */ -typedef struct lmm_element { +struct s_lmm_element_t { /* hookup to constraint */ s_xbt_swag_hookup_t enabled_element_set_hookup; s_xbt_swag_hookup_t disabled_element_set_hookup; @@ -30,14 +32,14 @@ typedef struct lmm_element { // - if CPU, then probably 1. // - If network, then 1 in forward direction and 0.05 backward for the ACKs double consumption_weight; -} s_lmm_element_t; -#define make_elem_active(elem) xbt_swag_insert_at_head(elem,&(elem->constraint->active_element_set)) -#define make_elem_inactive(elem) xbt_swag_remove(elem,&(elem->constraint->active_element_set)) +}; +#define make_elem_active(elem) xbt_swag_insert_at_head((elem), &((elem)->constraint->active_element_set)) +#define make_elem_inactive(elem) xbt_swag_remove((elem), &((elem)->constraint->active_element_set)) -typedef struct lmm_constraint_light { +struct s_lmm_constraint_light_t { double remaining_over_usage; lmm_constraint_t cnst; -} s_lmm_constraint_light_t; +}; /** @ingroup SURF_lmm * @brief LMM constraint @@ -47,7 +49,7 @@ typedef struct lmm_constraint_light { * \li Active elements which variable's weight is non-zero (i.e. it is enabled) AND its element value is non-zero. LMM_solve iterates over active elements during resolution, dynamically making them active or unactive. * */ -typedef struct lmm_constraint { +struct s_lmm_constraint_t { /* hookup to system */ s_xbt_swag_hookup_t constraint_set_hookup; s_xbt_swag_hookup_t active_constraint_set_hookup; @@ -71,21 +73,19 @@ typedef struct lmm_constraint { double lambda; double new_lambda; lmm_constraint_light_t cnst_light; -} s_lmm_constraint_t; +}; /** @ingroup SURF_lmm * @brief LMM variable * * When something prevents us from enabling a variable, we "stage" the weight that we would have like to set, so that as soon as possible we enable the variable with desired weight */ -typedef struct lmm_variable { +struct s_lmm_variable_t { /* hookup to system */ s_xbt_swag_hookup_t variable_set_hookup; s_xbt_swag_hookup_t saturated_variable_set_hookup; - s_lmm_element_t *cnsts; - int cnsts_size; - int cnsts_number; + std::vector cnsts; // sharing_weight: variable's impact on the resource during the sharing // if == 0, the variable is not considered by LMM @@ -103,16 +103,16 @@ typedef struct lmm_variable { /* \begin{For Lagrange only} */ double mu; double new_mu; - double (*func_f) (struct lmm_variable * var, double x); /* (f) */ - double (*func_fp) (struct lmm_variable * var, double x); /* (f') */ - double (*func_fpi) (struct lmm_variable * var, double x); /* (f')^{-1} */ + double (*func_f)(s_lmm_variable_t* var, double x); /* (f) */ + double (*func_fp)(s_lmm_variable_t* var, double x); /* (f') */ + double (*func_fpi)(s_lmm_variable_t* var, double x); /* (f')^{-1} */ /* \end{For Lagrange only} */ -} s_lmm_variable_t; +}; /** @ingroup SURF_lmm * @brief LMM system */ -typedef struct lmm_system { +struct s_lmm_system_t { int modified; bool selective_update_active; /* flag to update partially the system only selecting changed portions */ unsigned visited_counter; /* used by lmm_update_modified_set and lmm_remove_modified_set to cleverly (un-)flag the constraints (more details in these functions)*/ @@ -130,19 +130,27 @@ typedef struct lmm_system { xbt_mallocator_t variable_mallocator; void (*solve_fun)(lmm_system_t self); -} s_lmm_system_t; - -#define extract_variable(sys) xbt_swag_extract(&(sys->variable_set)) -#define extract_constraint(sys) xbt_swag_extract(&(sys->constraint_set)) -#define insert_constraint(sys,cnst) xbt_swag_insert(cnst,&(sys->constraint_set)) -#define remove_variable(sys,var) do {xbt_swag_remove(var,&(sys->variable_set));\ - xbt_swag_remove(var,&(sys->saturated_variable_set));} while(0) -#define remove_constraint(sys,cnst) do {xbt_swag_remove(cnst,&(sys->constraint_set));\ - xbt_swag_remove(cnst,&(sys->saturated_constraint_set));} while(0) -#define make_constraint_active(sys,cnst) xbt_swag_insert(cnst,&(sys->active_constraint_set)) -#define make_constraint_inactive(sys,cnst) \ - do { xbt_swag_remove(cnst, &sys->active_constraint_set); \ - xbt_swag_remove(cnst, &sys->modified_constraint_set); } while (0) +}; + +#define extract_variable(sys) xbt_swag_extract(&((sys)->variable_set)) +#define extract_constraint(sys) xbt_swag_extract(&((sys)->constraint_set)) +#define insert_constraint(sys, cnst) xbt_swag_insert((cnst), &((sys)->constraint_set)) +#define remove_variable(sys, var) \ + do { \ + xbt_swag_remove(var, &((sys)->variable_set)); \ + xbt_swag_remove(var, &((sys)->saturated_variable_set)); \ + } while (0) +#define remove_constraint(sys, cnst) \ + do { \ + xbt_swag_remove((cnst), &((sys)->constraint_set)); \ + xbt_swag_remove((cnst), &((sys)->saturated_constraint_set)); \ + } while (0) +#define make_constraint_active(sys, cnst) xbt_swag_insert((cnst), &((sys)->active_constraint_set)) +#define make_constraint_inactive(sys, cnst) \ + do { \ + xbt_swag_remove((cnst), &(sys)->active_constraint_set); \ + xbt_swag_remove((cnst), &(sys)->modified_constraint_set); \ + } while (0) /** @ingroup SURF_lmm * @brief Print information about a lmm system diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index d3e8809e05..943acb8f9e 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -9,7 +9,7 @@ #include "network_cm02.hpp" #include "simgrid/s4u/Host.hpp" #include "simgrid/sg_config.h" -#include "src/instr/instr_private.h" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network); @@ -134,27 +134,25 @@ namespace surf { NetworkCm02Model::NetworkCm02Model() :NetworkModel() { - char *optim = xbt_cfg_get_string("network/optim"); + std::string optim = xbt_cfg_get_string("network/optim"); bool select = xbt_cfg_get_boolean("network/maxmin-selective-update"); - if (not strcmp(optim, "Full")) { - updateMechanism_ = UM_FULL; + if (optim == "Full") { + setUpdateMechanism(UM_FULL); selectiveUpdate_ = select; - } else if (not strcmp(optim, "Lazy")) { - updateMechanism_ = UM_LAZY; + } else if (optim == "Lazy") { + setUpdateMechanism(UM_LAZY); selectiveUpdate_ = true; xbt_assert(select || (xbt_cfg_is_default_value("network/maxmin-selective-update")), "You cannot disable selective update when using the lazy update mechanism"); } else { - xbt_die("Unsupported optimization (%s) for this model. Accepted: Full, Lazy.", optim); + xbt_die("Unsupported optimization (%s) for this model. Accepted: Full, Lazy.", optim.c_str()); } maxminSystem_ = lmm_system_new(selectiveUpdate_); - loopback_ = createLink("__loopback__", 498000000, 0.000015, SURF_LINK_FATPIPE); + loopback_ = NetworkCm02Model::createLink("__loopback__", 498000000, 0.000015, SURF_LINK_FATPIPE); - if (updateMechanism_ == UM_LAZY) { - actionHeap_ = xbt_heap_new(8, nullptr); - xbt_heap_set_update_callback(actionHeap_, surf_action_lmm_update_index_heap); + if (getUpdateMechanism() == UM_LAZY) { modifiedSet_ = new ActionLmmList(); maxminSystem_->keep_track = modifiedSet_; } @@ -173,10 +171,9 @@ LinkImpl* NetworkCm02Model::createLink(const std::string& name, double bandwidth void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) { - while ((xbt_heap_size(actionHeap_) > 0) - && (double_equals(xbt_heap_maxkey(actionHeap_), now, sg_surf_precision))) { + while (not actionHeapIsEmpty() && double_equals(actionHeapTopDate(), now, sg_surf_precision)) { - NetworkCm02Action *action = static_cast (xbt_heap_pop(actionHeap_)); + NetworkCm02Action* action = static_cast(actionHeapPop()); XBT_DEBUG("Something happened to action %p", action); if (TRACE_is_enabled()) { int n = lmm_get_number_of_cnst_from_var(maxminSystem_, action->getVariable()); @@ -186,7 +183,7 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) NetworkCm02Link *link = static_cast(lmm_constraint_id(constraint)); double value = lmm_variable_getvalue(action->getVariable())* lmm_get_cnst_weight_from_var(maxminSystem_, action->getVariable(), i); - TRACE_surf_link_set_utilization(link->cname(), action->getCategory(), value, action->getLastUpdate(), + TRACE_surf_link_set_utilization(link->getCname(), action->getCategory(), value, action->getLastUpdate(), now - action->getLastUpdate()); } } @@ -195,7 +192,7 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) if (action->getHat() == LATENCY) { XBT_DEBUG("Latency paid for action %p. Activating", action); lmm_update_variable_weight(maxminSystem_, action->getVariable(), action->weight_); - action->heapRemove(actionHeap_); + action->heapRemove(getActionHeap()); action->refreshLastUpdate(); // if I am wearing a max_duration or normal hat @@ -205,7 +202,7 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) XBT_DEBUG("Action %p finished", action); action->setRemains(0); action->finish(Action::State::done); - action->heapRemove(actionHeap_); + action->heapRemove(getActionHeap()); } } } @@ -213,52 +210,48 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) void NetworkCm02Model::updateActionsStateFull(double now, double delta) { - ActionList *running_actions = getRunningActionSet(); - - for(ActionList::iterator it(running_actions->begin()), itNext=it, itend(running_actions->end()) - ; it != itend ; it=itNext) { - ++itNext; - - NetworkCm02Action *action = static_cast (&*it); - XBT_DEBUG("Something happened to action %p", action); - double deltap = delta; - if (action->latency_ > 0) { - if (action->latency_ > deltap) { - double_update(&(action->latency_), deltap, sg_surf_precision); - deltap = 0.0; - } else { - double_update(&(deltap), action->latency_, sg_surf_precision); - action->latency_ = 0.0; - } - if (action->latency_ <= 0.0 && not action->isSuspended()) - lmm_update_variable_weight(maxminSystem_, action->getVariable(), action->weight_); - } - if (TRACE_is_enabled()) { - int n = lmm_get_number_of_cnst_from_var(maxminSystem_, action->getVariable()); - for (int i = 0; i < n; i++){ - lmm_constraint_t constraint = lmm_get_cnst_from_var(maxminSystem_, action->getVariable(), i); - - NetworkCm02Link* link = static_cast(lmm_constraint_id(constraint)); - TRACE_surf_link_set_utilization(link->cname(), action->getCategory(), - (lmm_variable_getvalue(action->getVariable()) * - lmm_get_cnst_weight_from_var(maxminSystem_, action->getVariable(), i)), - action->getLastUpdate(), now - action->getLastUpdate()); - } + for (auto it = std::begin(*getRunningActionSet()); it != std::end(*getRunningActionSet());) { + NetworkCm02Action& action = static_cast(*it); + ++it; // increment iterator here since the following calls to action.finish() may invalidate it + XBT_DEBUG("Something happened to action %p", &action); + double deltap = delta; + if (action.latency_ > 0) { + if (action.latency_ > deltap) { + double_update(&action.latency_, deltap, sg_surf_precision); + deltap = 0.0; + } else { + double_update(&deltap, action.latency_, sg_surf_precision); + action.latency_ = 0.0; } - if (not lmm_get_number_of_cnst_from_var(maxminSystem_, action->getVariable())) { - /* There is actually no link used, hence an infinite bandwidth. This happens often when using models like - * vivaldi. In such case, just make sure that the action completes immediately. - */ - action->updateRemains(action->getRemains()); + if (action.latency_ <= 0.0 && not action.isSuspended()) + lmm_update_variable_weight(maxminSystem_, action.getVariable(), action.weight_); + } + if (TRACE_is_enabled()) { + int n = lmm_get_number_of_cnst_from_var(maxminSystem_, action.getVariable()); + for (int i = 0; i < n; i++) { + lmm_constraint_t constraint = lmm_get_cnst_from_var(maxminSystem_, action.getVariable(), i); + + NetworkCm02Link* link = static_cast(lmm_constraint_id(constraint)); + TRACE_surf_link_set_utilization(link->getCname(), action.getCategory(), + (lmm_variable_getvalue(action.getVariable()) * + lmm_get_cnst_weight_from_var(maxminSystem_, action.getVariable(), i)), + action.getLastUpdate(), now - action.getLastUpdate()); } - action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta); + } + if (not lmm_get_number_of_cnst_from_var(maxminSystem_, action.getVariable())) { + /* There is actually no link used, hence an infinite bandwidth. This happens often when using models like + * vivaldi. In such case, just make sure that the action completes immediately. + */ + action.updateRemains(action.getRemains()); + } + action.updateRemains(lmm_variable_getvalue(action.getVariable()) * delta); - if (action->getMaxDuration() > NO_MAX_DURATION) - action->updateMaxDuration(delta); + if (action.getMaxDuration() > NO_MAX_DURATION) + action.updateMaxDuration(delta); - if (((action->getRemains() <= 0) && (lmm_get_variable_weight(action->getVariable()) > 0)) || - ((action->getMaxDuration() > NO_MAX_DURATION) && (action->getMaxDuration() <= 0))) { - action->finish(Action::State::done); + if (((action.getRemains() <= 0) && (lmm_get_variable_weight(action.getVariable()) > 0)) || + ((action.getMaxDuration() > NO_MAX_DURATION) && (action.getMaxDuration() <= 0))) { + action.finish(Action::State::done); } } } @@ -267,24 +260,23 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz { int failed = 0; double latency = 0.0; - std::vector* back_route = nullptr; - std::vector* route = new std::vector(); + std::vector back_route; + std::vector route; XBT_IN("(%s,%s,%g,%g)", src->getCname(), dst->getCname(), size, rate); src->routeTo(dst, route, &latency); - xbt_assert(not route->empty() || latency, + xbt_assert(not route.empty() || latency, "You're trying to send data from %s to %s but there is no connecting path between these two hosts.", src->getCname(), dst->getCname()); - for (auto const& link : *route) + for (auto const& link : route) if (link->isOff()) failed = 1; if (sg_network_crosstraffic == 1) { - back_route = new std::vector(); dst->routeTo(src, back_route, nullptr); - for (auto const& link : *back_route) + for (auto const& link : back_route) if (link->isOff()) failed = 1; } @@ -293,17 +285,16 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz action->weight_ = latency; action->latency_ = latency; action->rate_ = rate; - if (updateMechanism_ == UM_LAZY) { - action->indexHeap_ = -1; - action->lastUpdate_ = surf_get_clock(); + if (getUpdateMechanism() == UM_LAZY) { + action->refreshLastUpdate(); } double bandwidth_bound = -1.0; if (sg_weight_S_parameter > 0) - for (auto const& link : *route) + for (auto const& link : route) action->weight_ += sg_weight_S_parameter / link->bandwidth(); - for (auto const& link : *route) { + for (auto const& link : route) { double bb = bandwidthFactor(size) * link->bandwidth(); bandwidth_bound = (bandwidth_bound < 0.0) ? bb : std::min(bandwidth_bound, bb); } @@ -312,19 +303,18 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz action->latency_ *= latencyFactor(size); action->rate_ = bandwidthConstraint(action->rate_, bandwidth_bound, size); - int constraints_per_variable = route->size(); - if (back_route != nullptr) - constraints_per_variable += back_route->size(); + int constraints_per_variable = route.size(); + constraints_per_variable += back_route.size(); if (action->latency_ > 0) { - action->variable_ = lmm_variable_new(maxminSystem_, action, 0.0, -1.0, constraints_per_variable); - if (updateMechanism_ == UM_LAZY) { + action->setVariable(lmm_variable_new(maxminSystem_, action, 0.0, -1.0, constraints_per_variable)); + if (getUpdateMechanism() == UM_LAZY) { // add to the heap the event when the latency is payed - XBT_DEBUG("Added action (%p) one latency event at date %f", action, action->latency_ + action->lastUpdate_); - action->heapInsert(actionHeap_, action->latency_ + action->lastUpdate_, route->empty() ? NORMAL : LATENCY); + XBT_DEBUG("Added action (%p) one latency event at date %f", action, action->latency_ + action->getLastUpdate()); + action->heapInsert(getActionHeap(), action->latency_ + action->getLastUpdate(), route.empty() ? NORMAL : LATENCY); } } else - action->variable_ = lmm_variable_new(maxminSystem_, action, 1.0, -1.0, constraints_per_variable); + action->setVariable(lmm_variable_new(maxminSystem_, action, 1.0, -1.0, constraints_per_variable)); if (action->rate_ < 0) { lmm_update_variable_bound(maxminSystem_, action->getVariable(), (action->latCurrent_ > 0) ? sg_tcp_gamma / (2.0 * action->latCurrent_) : -1.0); @@ -332,21 +322,18 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz lmm_update_variable_bound(maxminSystem_, action->getVariable(), (action->latCurrent_ > 0) ? std::min(action->rate_, sg_tcp_gamma / (2.0 * action->latCurrent_)) : action->rate_); } - for (auto const& link : *route) + for (auto const& link : route) lmm_expand(maxminSystem_, link->constraint(), action->getVariable(), 1.0); - if (back_route != nullptr) { // sg_network_crosstraffic was activated + if (not back_route.empty()) { // sg_network_crosstraffic was activated XBT_DEBUG("Fullduplex active adding backward flow using 5%%"); - for (auto const& link : *back_route) + for (auto const& link : back_route) lmm_expand(maxminSystem_, link->constraint(), action->getVariable(), .05); //Change concurrency_share here, if you want that cross-traffic is included in the SURF concurrency //(You would also have to change lmm_element_concurrency()) //lmm_variable_concurrency_share_set(action->getVariable(),2); } - - delete route; - delete back_route; XBT_OUT(); simgrid::s4u::Link::onCommunicate(action, src, dst); @@ -417,7 +404,7 @@ void NetworkCm02Link::setBandwidth(double value) lmm_update_constraint_bound(model()->getMaxminSystem(), constraint(), sg_bandwidth_factor * (bandwidth_.peak * bandwidth_.scale)); - TRACE_surf_link_set_bandwidth(surf_get_clock(), cname(), sg_bandwidth_factor * bandwidth_.peak * bandwidth_.scale); + TRACE_surf_link_set_bandwidth(surf_get_clock(), getCname(), sg_bandwidth_factor * bandwidth_.peak * bandwidth_.scale); if (sg_weight_S_parameter > 0) { double delta = sg_weight_S_parameter / value - sg_weight_S_parameter / (bandwidth_.peak * bandwidth_.scale); @@ -476,26 +463,29 @@ void NetworkCm02Action::updateRemainingLazy(double now) if (suspended_ != 0) return; - double delta = now - lastUpdate_; + double delta = now - getLastUpdate(); + double max_duration = getMaxDuration(); - if (remains_ > 0) { - XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, remains_, lastUpdate_); - double_update(&(remains_), lastValue_ * delta, sg_maxmin_precision*sg_surf_precision); + if (getRemainsNoUpdate() > 0) { + XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, getRemainsNoUpdate(), getLastUpdate()); + updateRemains(getLastValue() * delta); - XBT_DEBUG("Updating action(%p): remains is now %f", this, remains_); + XBT_DEBUG("Updating action(%p): remains is now %f", this, getRemainsNoUpdate()); } - if (maxDuration_ > NO_MAX_DURATION) - double_update(&maxDuration_, delta, sg_surf_precision); + if (max_duration > NO_MAX_DURATION) { + double_update(&max_duration, delta, sg_surf_precision); + setMaxDuration(max_duration); + } - if ((remains_ <= 0 && (lmm_get_variable_weight(getVariable()) > 0)) || - ((maxDuration_ > NO_MAX_DURATION) && (maxDuration_ <= 0))) { + if ((getRemainsNoUpdate() <= 0 && (lmm_get_variable_weight(getVariable()) > 0)) || + ((max_duration > NO_MAX_DURATION) && (max_duration <= 0))) { finish(Action::State::done); heapRemove(getModel()->getActionHeap()); } - lastUpdate_ = now; - lastValue_ = lmm_variable_getvalue(getVariable()); + refreshLastUpdate(); + setLastValue(lmm_variable_getvalue(getVariable())); } } diff --git a/src/surf/network_constant.cpp b/src/surf/network_constant.cpp index dcbc87f1d0..166d70ef61 100644 --- a/src/surf/network_constant.cpp +++ b/src/surf/network_constant.cpp @@ -32,43 +32,33 @@ LinkImpl* NetworkConstantModel::createLink(const std::string& name, double bw, d double NetworkConstantModel::nextOccuringEvent(double /*now*/) { double min = -1.0; - - ActionList* actionSet = getRunningActionSet(); - ActionList::iterator it(actionSet->begin()); - ActionList::iterator itend(actionSet->end()); - for (; it != itend; ++it) { - NetworkConstantAction* action = static_cast(&*it); - if (action->latency_ > 0 && (min < 0 || action->latency_ < min)) - min = action->latency_; + for (Action const& action : *getRunningActionSet()) { + const NetworkConstantAction& net_action = static_cast(action); + if (net_action.latency_ > 0 && (min < 0 || net_action.latency_ < min)) + min = net_action.latency_; } - return min; } void NetworkConstantModel::updateActionsState(double /*now*/, double delta) { - NetworkConstantAction* action = nullptr; - ActionList* actionSet = getRunningActionSet(); - ActionList::iterator it(actionSet->begin()); - ActionList::iterator itNext = it; - ActionList::iterator itend(actionSet->end()); - for (; it != itend; it = itNext) { - ++itNext; - action = static_cast(&*it); - if (action->latency_ > 0) { - if (action->latency_ > delta) { - double_update(&(action->latency_), delta, sg_surf_precision); + for (auto it = std::begin(*getRunningActionSet()); it != std::end(*getRunningActionSet());) { + NetworkConstantAction& action = static_cast(*it); + ++it; // increment iterator here since the following calls to action.finish() may invalidate it + if (action.latency_ > 0) { + if (action.latency_ > delta) { + double_update(&action.latency_, delta, sg_surf_precision); } else { - action->latency_ = 0.0; + action.latency_ = 0.0; } } - action->updateRemains(action->getCost() * delta / action->initialLatency_); - if (action->getMaxDuration() != NO_MAX_DURATION) - action->updateMaxDuration(delta); + action.updateRemains(action.getCost() * delta / action.initialLatency_); + if (action.getMaxDuration() != NO_MAX_DURATION) + action.updateMaxDuration(delta); - if (((action->getRemainsNoUpdate() <= 0) || - ((action->getMaxDuration() != NO_MAX_DURATION) && (action->getMaxDuration() <= 0)))) { - action->finish(Action::State::done); + if ((action.getRemainsNoUpdate() <= 0) || + ((action.getMaxDuration() != NO_MAX_DURATION) && (action.getMaxDuration() <= 0))) { + action.finish(Action::State::done); } } } diff --git a/src/surf/network_ib.cpp b/src/surf/network_ib.cpp index 7d7c3249a9..8a051ec09b 100644 --- a/src/surf/network_ib.cpp +++ b/src/surf/network_ib.cpp @@ -104,7 +104,7 @@ namespace surf { NetworkIBModel::NetworkIBModel() : NetworkSmpiModel() { - const char* IB_factors_string = xbt_cfg_get_string("smpi/IB-penalty-factors"); + std::string IB_factors_string = xbt_cfg_get_string("smpi/IB-penalty-factors"); std::vector radical_elements; boost::split(radical_elements, IB_factors_string, boost::is_any_of(";")); @@ -183,18 +183,18 @@ void NetworkIBModel::computeIBfactors(IBNode* root) XBT_DEBUG("Finished computing IB penalties"); } -void NetworkIBModel::updateIBfactors_rec(IBNode* root, bool* updatedlist) +void NetworkIBModel::updateIBfactors_rec(IBNode* root, std::vector& updatedlist) { - if (updatedlist[root->id] == 0) { + if (not updatedlist[root->id]) { XBT_DEBUG("IB - Updating rec %d", root->id); computeIBfactors(root); - updatedlist[root->id] = 1; + updatedlist[root->id] = true; for (std::vector::iterator it = root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) { - if (updatedlist[(*it)->destination->id] != 1) + if (not updatedlist[(*it)->destination->id]) updateIBfactors_rec((*it)->destination, updatedlist); } for (std::map::iterator it = root->ActiveCommsDown.begin(); it != root->ActiveCommsDown.end(); ++it) { - if (updatedlist[it->first->id] != 1) + if (not updatedlist[it->first->id]) updateIBfactors_rec(it->first, updatedlist); } } @@ -205,7 +205,6 @@ void NetworkIBModel::updateIBfactors(NetworkAction* action, IBNode* from, IBNode if (from == to) // disregard local comms (should use loopback) return; - bool* updated = (bool*)xbt_malloc0(active_nodes.size() * sizeof(bool)); ActiveComm* comm = nullptr; if (remove) { if (to->ActiveCommsDown[from] == 1) @@ -233,11 +232,10 @@ void NetworkIBModel::updateIBfactors(NetworkAction* action, IBNode* from, IBNode to->nbActiveCommsDown++; } XBT_DEBUG("IB - Updating %d", from->id); + std::vector updated(active_nodes.size(), false); updateIBfactors_rec(from, updated); XBT_DEBUG("IB - Finished updating %d", from->id); - if (comm) - delete comm; - xbt_free(updated); + delete comm; } } } diff --git a/src/surf/network_ib.hpp b/src/surf/network_ib.hpp index ceab7b9d08..df41a8873a 100644 --- a/src/surf/network_ib.hpp +++ b/src/surf/network_ib.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015. The SimGrid Team. +/* Copyright (c) 2014-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -11,6 +11,7 @@ #include "xbt/base.h" #include +#include namespace simgrid { namespace surf { @@ -42,7 +43,7 @@ namespace simgrid { class XBT_PRIVATE NetworkIBModel : public NetworkSmpiModel { private: - void updateIBfactors_rec(IBNode *root, bool* updatedlist); + void updateIBfactors_rec(IBNode* root, std::vector& updatedlist); void computeIBfactors(IBNode *root); public: NetworkIBModel(); diff --git a/src/surf/network_interface.cpp b/src/surf/network_interface.cpp index 6e2569a32d..f88a72d106 100644 --- a/src/surf/network_interface.cpp +++ b/src/surf/network_interface.cpp @@ -30,6 +30,13 @@ namespace simgrid { { return links->size(); } + void LinkImpl::linksList(std::vector* linkList) + { + for (auto const& kv : *links) { + linkList->push_back(&kv.second->piface_); + } + } + /** @brief Returns a list of all existing links */ LinkImpl** LinkImpl::linksList() { @@ -63,7 +70,6 @@ namespace simgrid { NetworkModel::~NetworkModel() { lmm_system_free(maxminSystem_); - xbt_heap_free(actionHeap_); delete modifiedSet_; } @@ -83,10 +89,10 @@ namespace simgrid { { double minRes = Model::nextOccuringEventFull(now); - for(auto it(getRunningActionSet()->begin()), itend(getRunningActionSet()->end()); it != itend ; it++) { - NetworkAction *action = static_cast(&*it); - if (action->latency_ > 0) - minRes = (minRes < 0) ? action->latency_ : std::min(minRes, action->latency_); + for (Action const& action : *getRunningActionSet()) { + const NetworkAction& net_action = static_cast(action); + if (net_action.latency_ > 0) + minRes = (minRes < 0) ? net_action.latency_ : std::min(minRes, net_action.latency_); } XBT_DEBUG("Min of share resources %f", minRes); @@ -166,17 +172,17 @@ namespace simgrid { } void LinkImpl::setStateTrace(tmgr_trace_t trace) { - xbt_assert(stateEvent_ == nullptr, "Cannot set a second state trace to Link %s", cname()); + xbt_assert(stateEvent_ == nullptr, "Cannot set a second state trace to Link %s", getCname()); stateEvent_ = future_evt_set->add_trace(trace, this); } void LinkImpl::setBandwidthTrace(tmgr_trace_t trace) { - xbt_assert(bandwidth_.event == nullptr, "Cannot set a second bandwidth trace to Link %s", cname()); + xbt_assert(bandwidth_.event == nullptr, "Cannot set a second bandwidth trace to Link %s", getCname()); bandwidth_.event = future_evt_set->add_trace(trace, this); } void LinkImpl::setLatencyTrace(tmgr_trace_t trace) { - xbt_assert(latency_.event == nullptr, "Cannot set a second latency trace to Link %s", cname()); + xbt_assert(latency_.event == nullptr, "Cannot set a second latency trace to Link %s", getCname()); latency_.event = future_evt_set->add_trace(trace, this); } @@ -196,7 +202,7 @@ namespace simgrid { { std::list retlist; lmm_system_t sys = getModel()->getMaxminSystem(); - int llen = lmm_get_number_of_cnst_from_var(sys, variable_); + int llen = lmm_get_number_of_cnst_from_var(sys, getVariable()); for (int i = 0; i < llen; i++) { /* Beware of composite actions: ptasks put links and cpus together */ diff --git a/src/surf/network_interface.hpp b/src/surf/network_interface.hpp index d8a3b0d10a..476775c0d7 100644 --- a/src/surf/network_interface.hpp +++ b/src/surf/network_interface.hpp @@ -174,6 +174,7 @@ public: static LinkImpl* byName(std::string name); static int linksCount(); static LinkImpl** linksList(); + static void linksList(std::vector* linkList); static void linksExit(); }; @@ -208,10 +209,10 @@ public: void setState(simgrid::surf::Action::State state) override; virtual std::list links(); - double latency_; - double latCurrent_; - double weight_; - double rate_; + double latency_ = {}; + double latCurrent_ = {}; + double weight_ = {}; + double rate_ = {}; }; } } diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index a9139b1bad..7c300951cf 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -3,17 +3,19 @@ /* 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 #include "xbt/config.hpp" +#include "xbt/string.hpp" #include "ns3/core-module.h" #include "ns3/node.h" -#include "ns3/ns3_simulator.h" #include "network_ns3.hpp" +#include "ns3/ns3_simulator.hpp" -#include "src/instr/instr_private.h" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals #include "src/kernel/routing/NetPoint.hpp" #include "simgrid/s4u/Engine.hpp" @@ -21,13 +23,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ns3, surf, "Logging specific to the SURF network NS3 module"); -std::vector IPV4addr; +std::vector IPV4addr; /***************** * Crude globals * *****************/ -extern xbt_dict_t flowFromSock; +extern std::map flowFromSock; static ns3::InternetStackHelper stack; static ns3::NodeContainer nodes; @@ -79,24 +81,23 @@ static void clusterCreation_cb(ClusterCreationArgs* cluster) static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoint* src, simgrid::kernel::routing::NetPoint* dst, simgrid::kernel::routing::NetPoint* gw_src, simgrid::kernel::routing::NetPoint* gw_dst, - std::vector* link_list) + std::vector& link_list) { - if (link_list->size() == 1) { - simgrid::surf::LinkNS3* link = static_cast(link_list->at(0)); + if (link_list.size() == 1) { + simgrid::surf::LinkNS3* link = static_cast(link_list[0]); - XBT_DEBUG("Route from '%s' to '%s' with link '%s' %s", src->cname(), dst->cname(), link->cname(), + XBT_DEBUG("Route from '%s' to '%s' with link '%s' %s", src->getCname(), dst->getCname(), link->getCname(), (symmetrical ? "(symmetrical)" : "(not symmetrical)")); // XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id); - XBT_DEBUG("\tLink (%s) bw:%fbps lat:%fs", link->cname(), link->bandwidth(), - link->latency()); + XBT_DEBUG("\tLink (%s) bw:%fbps lat:%fs", link->getCname(), link->bandwidth(), link->latency()); // create link ns3 NetPointNs3* host_src = src->extension(); NetPointNs3* host_dst = dst->extension(); - xbt_assert(host_src != nullptr, "Network element %s does not seem to be NS3-ready", src->cname()); - xbt_assert(host_dst != nullptr, "Network element %s does not seem to be NS3-ready", dst->cname()); + xbt_assert(host_src != nullptr, "Network element %s does not seem to be NS3-ready", src->getCname()); + xbt_assert(host_dst != nullptr, "Network element %s does not seem to be NS3-ready", dst->getCname()); ns3_add_link(host_src, host_dst, link->bandwidth(), link->latency()); } else { @@ -108,7 +109,7 @@ static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoin "of length 1.\n" "WARNING: Remove long routes to avoid this harmless message; subsequent long routes will be silently " "ignored.", - src->cname(), dst->cname(), link_list->size()); + src->getCname(), dst->getCname(), link_list.size()); warned_about_long_routes = true; } } @@ -134,8 +135,8 @@ void surf_network_model_init_NS3() all_existing_models->push_back(surf_network_model); } -static simgrid::config::Flag ns3_tcp_model("ns3/TcpModel", - "The ns3 tcp model can be : NewReno or Reno or Tahoe", "NewReno"); +static simgrid::config::Flag + ns3_tcp_model("ns3/TcpModel", "The ns3 tcp model can be : NewReno or Reno or Tahoe", "default"); namespace simgrid { namespace surf { @@ -143,27 +144,19 @@ namespace surf { NetworkNS3Model::NetworkNS3Model() : NetworkModel() { NetPointNs3::EXTENSION_ID = simgrid::kernel::routing::NetPoint::extension_create(); - flowFromSock = xbt_dict_new_homogeneous([](void* p) { delete static_cast(p); }); ns3_initialize(ns3_tcp_model.get().c_str()); simgrid::kernel::routing::NetPoint::onCreation.connect([](simgrid::kernel::routing::NetPoint* pt) { pt->extension_set(new NetPointNs3()); - XBT_VERB("SimGrid's %s is known as node %d within NS3", pt->cname(), pt->extension()->node_num); + XBT_VERB("SimGrid's %s is known as node %d within NS3", pt->getCname(), pt->extension()->node_num); }); simgrid::surf::on_cluster.connect(&clusterCreation_cb); simgrid::s4u::onPlatformCreated.connect(&postparse_cb); simgrid::s4u::NetZone::onRouteCreation.connect(&routeCreation_cb); - - LogComponentEnable("PacketSink", ns3::LOG_LEVEL_INFO); - LogComponentEnable("UdpEchoClientApplication", ns3::LOG_LEVEL_INFO); - LogComponentEnable("UdpEchoServerApplication", ns3::LOG_LEVEL_INFO); } NetworkNS3Model::~NetworkNS3Model() { - for (auto const& addr : IPV4addr) - free(addr); IPV4addr.clear(); - xbt_dict_free(&flowFromSock); } LinkImpl* NetworkNS3Model::createLink(const std::string& name, double bandwidth, double latency, @@ -201,7 +194,7 @@ double NetworkNS3Model::nextOccuringEvent(double now) void NetworkNS3Model::updateActionsState(double now, double delta) { - static xbt_dynar_t socket_to_destroy = xbt_dynar_new(sizeof(char*),nullptr); + static std::vector socket_to_destroy; /* If there are no running flows, advance the NS3 simulator and return */ if (getRunningActionSet()->empty()) { @@ -212,10 +205,10 @@ void NetworkNS3Model::updateActionsState(double now, double delta) return; } - xbt_dict_cursor_t cursor = nullptr; - char *ns3Socket; - SgFlow *sgFlow; - xbt_dict_foreach(flowFromSock,cursor,ns3Socket,sgFlow){ + std::string ns3Socket; + for (auto elm : flowFromSock) { + ns3Socket = elm.first; + SgFlow* sgFlow = elm.second; NetworkNS3Action * action = sgFlow->action_; XBT_DEBUG("Processing socket %p (action %p)",sgFlow,action); action->setRemains(action->getCost() - sgFlow->sentBytes_); @@ -226,29 +219,30 @@ void NetworkNS3Model::updateActionsState(double now, double delta) std::vector route = std::vector(); - action->src_->routeTo(action->dst_, &route, nullptr); + action->src_->routeTo(action->dst_, route, nullptr); for (auto const& link : route) - TRACE_surf_link_set_utilization(link->cname(), action->getCategory(), (data_delta_sent) / delta, now - delta, + TRACE_surf_link_set_utilization(link->getCname(), action->getCategory(), (data_delta_sent) / delta, now - delta, delta); action->lastSent_ = sgFlow->sentBytes_; } if(sgFlow->finished_){ - xbt_dynar_push(socket_to_destroy,&ns3Socket); + socket_to_destroy.push_back(ns3Socket); XBT_DEBUG("Destroy socket %p of action %p", ns3Socket, action); action->finish(Action::State::done); } } - while (not xbt_dynar_is_empty(socket_to_destroy)) { - xbt_dynar_pop(socket_to_destroy,&ns3Socket); - + while (not socket_to_destroy.empty()) { + ns3Socket = socket_to_destroy.back(); + socket_to_destroy.pop_back(); + SgFlow* flow = flowFromSock.at(ns3Socket); if (XBT_LOG_ISENABLED(ns3, xbt_log_priority_debug)) { - SgFlow* flow = static_cast(xbt_dict_get(flowFromSock, ns3Socket)); XBT_DEBUG ("Removing socket %p of action %p", ns3Socket, flow->action_); } - xbt_dict_remove(flowFromSock, ns3Socket); + delete flow; + flowFromSock.erase(ns3Socket); } } @@ -347,22 +341,22 @@ void ns3_create_flow(simgrid::s4u::Host* src, simgrid::s4u::Host* dst, ns3::Ptr dst_node = nodes.Get(node2); xbt_assert(node2 < IPV4addr.size(), "Element %s is unknown to NS3. Is it connected to any one-hop link?", - dst->pimpl_netpoint->cname()); - char* addr = IPV4addr.at(node2); - xbt_assert(addr != nullptr, "Element %s is unknown to NS3. Is it connected to any one-hop link?", - dst->pimpl_netpoint->cname()); + dst->pimpl_netpoint->getCname()); + std::string& addr = IPV4addr[node2]; + xbt_assert(not addr.empty(), "Element %s is unknown to NS3. Is it connected to any one-hop link?", + dst->pimpl_netpoint->getCname()); - XBT_DEBUG("ns3_create_flow %u Bytes from %u to %u with Interface %s", TotalBytes, node1, node2, addr); + XBT_DEBUG("ns3_create_flow %u Bytes from %u to %u with Interface %s", TotalBytes, node1, node2, addr.c_str()); ns3::PacketSinkHelper sink("ns3::TcpSocketFactory", ns3::InetSocketAddress (ns3::Ipv4Address::GetAny(), port_number)); sink.Install (dst_node); ns3::Ptr sock = ns3::Socket::CreateSocket(src_node, ns3::TcpSocketFactory::GetTypeId()); - xbt_dict_set(flowFromSock, transformSocketPtr(sock), new SgFlow(TotalBytes, action), nullptr); + flowFromSock.insert({transformSocketPtr(sock), new SgFlow(TotalBytes, action)}); sock->Bind(ns3::InetSocketAddress(port_number)); - ns3::Simulator::ScheduleNow(&StartFlow, sock, addr, port_number); + ns3::Simulator::ScheduleNow(&StartFlow, sock, addr.c_str(), port_number); port_number++; xbt_assert(port_number <= 65000, "Too many connections! Port number is saturated."); @@ -420,11 +414,10 @@ void ns3_add_cluster(const char* id, double bw, double lat) { ns3::NetDeviceContainer devices = csma.Install(Nodes); XBT_DEBUG("Create CSMA"); - char * adr = bprintf("%d.%d.0.0",number_of_networks,number_of_links); - XBT_DEBUG("Assign IP Addresses %s to CSMA.",adr); + std::string addr = simgrid::xbt::string_printf("%d.%d.0.0", number_of_networks, number_of_links); + XBT_DEBUG("Assign IP Addresses %s to CSMA.", addr.c_str()); ns3::Ipv4AddressHelper ipv4; - ipv4.SetBase (adr, "255.255.0.0"); - free(adr); + ipv4.SetBase(addr.c_str(), "255.255.0.0"); interfaces.Add(ipv4.Assign (devices)); if(number_of_links == 255){ @@ -437,11 +430,11 @@ void ns3_add_cluster(const char* id, double bw, double lat) { XBT_DEBUG("Number of nodes in Cluster_nodes: %u", Cluster_nodes.GetN()); } -static char* transformIpv4Address (ns3::Ipv4Address from){ +static std::string transformIpv4Address(ns3::Ipv4Address from) +{ std::stringstream sstream; sstream << from ; - std::string s = sstream.str(); - return bprintf("%s",s.c_str()); + return sstream.str(); } void ns3_add_link(NetPointNs3* src, NetPointNs3* dst, double bw, double lat) { @@ -459,28 +452,26 @@ void ns3_add_link(NetPointNs3* src, NetPointNs3* dst, double bw, double lat) { pointToPoint.SetDeviceAttribute("DataRate", ns3::DataRateValue(ns3::DataRate(bw*8)));// NS3 takes bps, but we provide Bps pointToPoint.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat))); - char *filename = bprintf("link-%d-%d.tr", srcNum, dstNum); + std::string filename = simgrid::xbt::string_printf("link-%d-%d.tr", srcNum, dstNum); ns3::AsciiTraceHelper ascii; - pointToPoint.EnableAsciiAll (ascii.CreateFileStream (filename)); + pointToPoint.EnableAsciiAll(ascii.CreateFileStream(filename)); pointToPoint.EnablePcapAll ("tcp-bulk-send", false); - xbt_free(filename); ns3::NetDeviceContainer netA; netA.Add(pointToPoint.Install (a, b)); - char * adr = bprintf("%d.%d.0.0",number_of_networks,number_of_links); - address.SetBase (adr, "255.255.0.0"); - XBT_DEBUG("\tInterface stack '%s'",adr); - free(adr); + std::string addr = simgrid::xbt::string_printf("%d.%d.0.0", number_of_networks, number_of_links); + address.SetBase(addr.c_str(), "255.255.0.0"); + XBT_DEBUG("\tInterface stack '%s'", addr.c_str()); interfaces.Add(address.Assign (netA)); if (IPV4addr.size() <= (unsigned)srcNum) - IPV4addr.resize(srcNum + 1, nullptr); - IPV4addr.at(srcNum) = transformIpv4Address(interfaces.GetAddress(interfaces.GetN() - 2)); + IPV4addr.resize(srcNum + 1); + IPV4addr[srcNum] = transformIpv4Address(interfaces.GetAddress(interfaces.GetN() - 2)); if (IPV4addr.size() <= (unsigned)dstNum) - IPV4addr.resize(dstNum + 1, nullptr); - IPV4addr.at(dstNum) = transformIpv4Address(interfaces.GetAddress(interfaces.GetN() - 1)); + IPV4addr.resize(dstNum + 1); + IPV4addr[dstNum] = transformIpv4Address(interfaces.GetAddress(interfaces.GetN() - 1)); if (number_of_links == 255){ xbt_assert(number_of_networks < 255, "Number of links and networks exceed 255*255"); diff --git a/src/surf/network_ns3.hpp b/src/surf/network_ns3.hpp index b30a7eb830..fdb5683513 100644 --- a/src/surf/network_ns3.hpp +++ b/src/surf/network_ns3.hpp @@ -9,7 +9,7 @@ #include "xbt/base.h" #include "network_interface.hpp" -#include "src/surf/ns3/ns3_interface.h" +#include "src/surf/ns3/ns3_interface.hpp" namespace simgrid { namespace surf { diff --git a/src/surf/network_smpi.cpp b/src/surf/network_smpi.cpp index 9c6f3890da..47b0d16a0d 100644 --- a/src/surf/network_smpi.cpp +++ b/src/surf/network_smpi.cpp @@ -11,7 +11,7 @@ #include "network_smpi.hpp" #include "simgrid/sg_config.h" -#include "smpi/smpi_utils.hpp" +#include "smpi_utils.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network); diff --git a/src/surf/network_smpi.hpp b/src/surf/network_smpi.hpp index 1ab37a73c2..8a91cb852f 100644 --- a/src/surf/network_smpi.hpp +++ b/src/surf/network_smpi.hpp @@ -19,7 +19,6 @@ namespace simgrid { double latencyFactor(double size); double bandwidthFactor(double size); double bandwidthConstraint(double rate, double bound, double size); - void communicateCallBack() {}; }; } } diff --git a/src/surf/ns3/ns3_interface.h b/src/surf/ns3/ns3_interface.hpp similarity index 86% rename from src/surf/ns3/ns3_interface.h rename to src/surf/ns3/ns3_interface.hpp index 9479f656f9..8b1bc35bbc 100644 --- a/src/surf/ns3/ns3_interface.h +++ b/src/surf/ns3/ns3_interface.hpp @@ -3,8 +3,8 @@ /* 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. */ -#ifndef NS3_INTERFACE_H -#define NS3_INTERFACE_H +#ifndef NS3_INTERFACE_HPP +#define NS3_INTERFACE_HPP #include "simgrid/s4u/Host.hpp" @@ -22,17 +22,15 @@ public: int node_num; }; -SG_BEGIN_DECL() +extern "C" { XBT_PUBLIC(void) ns3_initialize(const char* TcpProtocol); XBT_PUBLIC(void) -ns3_create_flow(sg_host_t src, sg_host_t dst, u_int32_t TotalBytes, - simgrid::surf::NetworkNS3Action* action); +ns3_create_flow(sg_host_t src, sg_host_t dst, u_int32_t TotalBytes, simgrid::surf::NetworkNS3Action* action); XBT_PUBLIC(void) ns3_simulator(double maxSeconds); XBT_PUBLIC(void*) ns3_add_router(const char* id); XBT_PUBLIC(void) ns3_add_link(NetPointNs3* src, NetPointNs3* dst, double bw, double lat); XBT_PUBLIC(void) ns3_add_cluster(const char* id, double bw, double lat); - -SG_END_DECL() +} #endif diff --git a/src/surf/ns3/ns3_simulator.cc b/src/surf/ns3/ns3_simulator.cpp similarity index 91% rename from src/surf/ns3/ns3_simulator.cc rename to src/surf/ns3/ns3_simulator.cpp index 55df59e5b3..f41d1e8cf0 100644 --- a/src/surf/ns3/ns3_simulator.cc +++ b/src/surf/ns3/ns3_simulator.cpp @@ -3,14 +3,13 @@ /* 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 "src/surf/ns3/ns3_simulator.h" -#include "xbt/dict.h" +#include "src/surf/ns3/ns3_simulator.hpp" #include "xbt/log.h" #include "xbt/sysdep.h" #include -xbt_dict_t flowFromSock = nullptr; // ns3::sock -> SgFlow +std::map flowFromSock; // ns3::sock -> SgFlow static void receive_callback(ns3::Ptr socket); static void datasent_callback(ns3::Ptr socket, uint32_t dataSent); @@ -26,7 +25,8 @@ SgFlow::SgFlow(uint32_t totalBytes, simgrid::surf::NetworkNS3Action* action) static SgFlow* getFlowFromSocket(ns3::Ptr socket) { - return (SgFlow*)xbt_dict_get_or_null(flowFromSock, transformSocketPtr(socket)); + auto it = flowFromSock.find(transformSocketPtr(socket)); + return (it == flowFromSock.end()) ? nullptr : it->second; } static void receive_callback(ns3::Ptr socket) @@ -55,7 +55,7 @@ static void WriteUntilBufferFull(ns3::Ptr sock, uint32_t txSpace) uint32_t toWrite = std::min({flow->remaining_, sock->GetTxAvailable()}); if (toWrite == 0) // buffer full return; - int amountSent = sock->Send(0, toWrite, 0); + int amountSent = sock->Send(0, toWrite, 0); xbt_assert(amountSent > 0, "Since TxAvailable>0, amountSent should also >0"); flow->bufferedBytes_ += amountSent; @@ -113,19 +113,18 @@ void StartFlow(ns3::Ptr sock, const char* to, uint16_t port_number) sock->Connect(serverAddr); // tell the tcp implementation to call WriteUntilBufferFull again // if we blocked and new tx buffer space becomes available - sock->SetSendCallback (MakeCallback(&WriteUntilBufferFull)); + sock->SetSendCallback(MakeCallback(&WriteUntilBufferFull)); // Note when the send is over sock->SetRecvCallback(MakeCallback(&receive_callback)); // Keep track of what was used (for the TRACING module) sock->SetDataSentCallback(MakeCallback(&datasent_callback)); XBT_DEBUG("startFlow of F[%p, %p, %u] dest=%s port=%d", flow, flow->action_, flow->totalBytes_, to, port_number); - //WriteUntilBufferFull (sock, sock->GetTxAvailable ()); + // WriteUntilBufferFull (sock, sock->GetTxAvailable ()); /* sock->SetSendCallback(MakeCallback(&send_callback)); sock->SetConnectCallback(MakeCallback(&succeededConnect_callback), MakeCallback(&failedConnect_callback)); sock->SetCloseCallbacks(MakeCallback(&normalClose_callback), MakeCallback(&errorClose_callback)); send_callback(sock, sock->GetTxAvailable ()); */ - } diff --git a/src/surf/ns3/ns3_simulator.h b/src/surf/ns3/ns3_simulator.hpp similarity index 80% rename from src/surf/ns3/ns3_simulator.h rename to src/surf/ns3/ns3_simulator.hpp index c69c1a8d41..743f0031dd 100644 --- a/src/surf/ns3/ns3_simulator.h +++ b/src/surf/ns3/ns3_simulator.hpp @@ -3,12 +3,12 @@ /* 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. */ -#ifndef NS3_SIM_H -#define NS3_SIM_H +#ifndef NS3_SIMULATOR_HPP +#define NS3_SIMULATOR_HPP #include -#include "ns3_interface.h" +#include "ns3_interface.hpp" #include #include @@ -18,7 +18,7 @@ #include #include -class SgFlow { +class XBT_PRIVATE SgFlow { public: SgFlow(uint32_t totalBytes, simgrid::surf::NetworkNS3Action* action); @@ -33,14 +33,11 @@ public: void StartFlow(ns3::Ptr sock, const char* to, uint16_t port_number); -static inline const char* transformSocketPtr(ns3::Ptr localSocket) +static inline std::string transformSocketPtr(ns3::Ptr localSocket) { - static char key[24]; std::stringstream sstream; sstream << localSocket; - snprintf(key, 24, "%s", sstream.str().c_str()); - - return key; + return sstream.str(); } #endif diff --git a/src/surf/plugins/host_energy.cpp b/src/surf/plugins/host_energy.cpp index 6e102e470e..a66839f20a 100644 --- a/src/surf/plugins/host_energy.cpp +++ b/src/surf/plugins/host_energy.cpp @@ -110,7 +110,7 @@ before you can get accurate energy predictions. XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_energy, surf, "Logging specific to the SURF energy plugin"); namespace simgrid { -namespace energy { +namespace plugin { class PowerRange { public: @@ -200,7 +200,7 @@ void HostEnergy::update() double energy_this_step = instantaneous_consumption * (finish_time - start_time); - // TODO Trace: Trace energy_this_step from start_time to finish_time in host->name() + // TODO Trace: Trace energy_this_step from start_time to finish_time in host->getName() this->total_energy = previous_energy + energy_this_step; this->last_updated = finish_time; @@ -355,7 +355,7 @@ void HostEnergy::initWattsRangeList() } } -using simgrid::energy::HostEnergy; +using simgrid::plugin::HostEnergy; /* **************************** events callback *************************** */ static void onCreation(simgrid::s4u::Host& host) @@ -363,7 +363,7 @@ static void onCreation(simgrid::s4u::Host& host) if (dynamic_cast(&host)) // Ignore virtual machines return; - //TODO Trace: set to zero the energy variable associated to host->name() + // TODO Trace: set to zero the energy variable associated to host->getName() host.extension_set(new HostEnergy(&host)); } @@ -432,7 +432,7 @@ static void onSimulationEnd() } /* **************************** Public interface *************************** */ -SG_BEGIN_DECL() +extern "C" { /** \ingroup plugin_energy * \brief Enable host energy plugin @@ -513,5 +513,4 @@ double sg_host_get_current_consumption(sg_host_t host) double cpu_load = lmm_constraint_get_usage(host->pimpl_cpu->constraint()) / host->getSpeed(); return host->extension()->getCurrentWattsValue(cpu_load); } - -SG_END_DECL() +} diff --git a/src/surf/plugins/host_load.cpp b/src/surf/plugins/host_load.cpp index 99e7a39f35..3d5a901e56 100644 --- a/src/surf/plugins/host_load.cpp +++ b/src/surf/plugins/host_load.cpp @@ -106,13 +106,6 @@ void HostLoad::reset() using simgrid::plugin::HostLoad; /* **************************** events callback *************************** */ -static void on_host_added(simgrid::s4u::Host& host) -{ - if (dynamic_cast(&host)) // Ignore virtual machines - return; - host.extension_set(new HostLoad(&host)); -} - /* This callback is fired either when the host changes its state (on/off) or its speed * (because the user changed the pstate, or because of external trace events) */ static void onHostChange(simgrid::s4u::Host& host) @@ -120,12 +113,11 @@ static void onHostChange(simgrid::s4u::Host& host) if (dynamic_cast(&host)) // Ignore virtual machines return; - HostLoad* host_load = host.extension(); - host_load->update(); + host.extension()->update(); } /* This callback is called when an action (computation, idle, ...) terminates */ -static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf::Action::State previous) +static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf::Action::State /*previous*/) { for (simgrid::surf::Cpu* const& cpu : action->cpus()) { simgrid::s4u::Host* host = cpu->getHost(); @@ -139,7 +131,7 @@ static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf: } /* **************************** Public interface *************************** */ -SG_BEGIN_DECL() +extern "C" { /** \ingroup plugin_load * \brief Initializes the HostLoad plugin @@ -152,7 +144,14 @@ void sg_host_load_plugin_init() HostLoad::EXTENSION_ID = simgrid::s4u::Host::extension_create(); - simgrid::s4u::Host::onCreation.connect(&on_host_added); + /* When attaching a callback into a signal, you can use a lambda as follows, or a regular function as done below */ + + simgrid::s4u::Host::onCreation.connect([](simgrid::s4u::Host& host) { + if (dynamic_cast(&host)) // Ignore virtual machines + return; + host.extension_set(new HostLoad(&host)); + }); + simgrid::surf::CpuAction::onStateChange.connect(&onActionStateChange); simgrid::s4u::Host::onStateChange.connect(&onHostChange); simgrid::s4u::Host::onSpeedChange.connect(&onHostChange); @@ -185,5 +184,4 @@ void sg_host_load_reset(sg_host_t host) host->extension()->reset(); } - -SG_END_DECL() +} diff --git a/src/surf/plugins/link_energy.cpp b/src/surf/plugins/link_energy.cpp new file mode 100644 index 0000000000..f7bc8ebcc4 --- /dev/null +++ b/src/surf/plugins/link_energy.cpp @@ -0,0 +1,259 @@ +/* Copyright (c) 2017. 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/plugins/energy.h" +#include "simgrid/s4u/Engine.hpp" +#include "simgrid/simix.hpp" +#include "src/surf/network_interface.hpp" +#include +#include +#include +#include +#include +#include + +/** @addtogroup SURF_plugin_energy + + + This is the energy plugin, enabling to account for the dissipated energy in the simulated platform. + + The energy consumption of a link depends directly on its current traffic load. Specify that consumption in your + platform file as follows: + + \verbatim + + + + + \endverbatim + + The first property means that when your link is switched on, but without anything to do, it will dissipate 100 Watts. + If it's fully loaded, it will dissipate 200 Watts. If its load is at 50%, then it will dissipate 150 Watts. + The second property means that when your host is turned off, it will dissipate only 10 Watts (please note that these + values are arbitrary). + + To simulate the energy-related elements, first call the simgrid#energy#sg_link_energy_plugin_init() before your + #MSG_init(), + and then use the following function to retrieve the consumption of a given link: MSG_link_get_consumed_energy(). + */ + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy, surf, "Logging specific to the SURF LinkEnergy plugin"); + +namespace simgrid { +namespace plugin { + +class LinkPowerRange { +public: + double idle; + double busy; + + LinkPowerRange(double idle, double busy) : idle(idle), busy(busy) {} +}; + +class LinkEnergy { +public: + static simgrid::xbt::Extension EXTENSION_ID; + + explicit LinkEnergy(simgrid::s4u::Link* ptr); + ~LinkEnergy(); + + double getALinkTotalPower(); + void initWattsRangeList(); + double getTotalEnergy(); + void update(); + +private: + double getPower(); + + simgrid::s4u::Link* link{}; + + std::vector power_range_watts_list{}; + + double total_energy{0.0}; + double last_updated{0.0}; /*< Timestamp of the last energy update event*/ +}; + +simgrid::xbt::Extension LinkEnergy::EXTENSION_ID; + +LinkEnergy::LinkEnergy(simgrid::s4u::Link* ptr) : link(ptr), last_updated(surf_get_clock()) +{ +} + +LinkEnergy::~LinkEnergy() = default; + +void LinkEnergy::update() +{ + double power = getPower(); + double now = surf_get_clock(); + total_energy += power * (now - last_updated); + last_updated = now; +} + +void LinkEnergy::initWattsRangeList() +{ + + if (!power_range_watts_list.empty()) + return; + + const char* all_power_values_str = this->link->getProperty("watt_range"); + + if (all_power_values_str == nullptr) + return; + + std::vector all_power_values; + boost::split(all_power_values, all_power_values_str, boost::is_any_of(",")); + + for (auto current_power_values_str : all_power_values) { + /* retrieve the power values associated */ + std::vector current_power_values; + boost::split(current_power_values, current_power_values_str, boost::is_any_of(":")); + xbt_assert(current_power_values.size() == 2, "Power properties incorrectly defined - " + "could not retrieve idle and busy power values for link %s", + this->link->getCname()); + + /* min_power corresponds to the idle power (link load = 0) */ + /* max_power is the power consumed at 100% link load */ + char* idle = bprintf("Invalid idle power value for link%s", this->link->getCname()); + char* busy = bprintf("Invalid busy power value for %s", this->link->getCname()); + + double idleVal = xbt_str_parse_double((current_power_values.at(0)).c_str(), idle); + + double busyVal = xbt_str_parse_double((current_power_values.at(1)).c_str(), busy); + + this->power_range_watts_list.push_back(LinkPowerRange(idleVal, busyVal)); + + xbt_free(idle); + xbt_free(busy); + update(); + } +} + +double LinkEnergy::getPower() +{ + + if (power_range_watts_list.empty()) + return 0.0; + + auto range = power_range_watts_list[0]; + + double busy = range.busy; + double idle = range.idle; + + double power_slope = busy - idle; + + double normalized_link_usage = link->getUsage() / link->bandwidth(); + double dynamic_power = power_slope * normalized_link_usage; + + return idle + dynamic_power; +} + +double LinkEnergy::getTotalEnergy() +{ + update(); + return this->total_energy; +} +} +} + +using simgrid::plugin::LinkEnergy; + +/* **************************** events callback *************************** */ +static void onCreation(simgrid::s4u::Link& link) +{ + XBT_DEBUG("onCreation is called for link: %s", link.getCname()); + link.extension_set(new LinkEnergy(&link)); +} + +static void onCommunicate(simgrid::surf::NetworkAction* action, simgrid::s4u::Host* src, simgrid::s4u::Host* dst) +{ + XBT_DEBUG("onCommunicate is called"); + for (simgrid::surf::LinkImpl* link : action->links()) { + + if (link == nullptr) + continue; + + XBT_DEBUG("Update link %s", link->getCname()); + // Get the link_energy extension for the relevant link + LinkEnergy* link_energy = link->piface_.extension(); + link_energy->initWattsRangeList(); + link_energy->update(); + } +} + +static void onActionStateChange(simgrid::surf::NetworkAction* action) +{ + XBT_DEBUG("onActionStateChange is called"); + for (simgrid::surf::LinkImpl* link : action->links()) { + + if (link == nullptr) + continue; + + // Get the link_energy extension for the relevant link + LinkEnergy* link_energy = link->piface_.extension(); + link_energy->update(); + } +} + +static void onLinkStateChange(simgrid::s4u::Link& link) +{ + XBT_DEBUG("onLinkStateChange is called for link: %s", link.getCname()); + + LinkEnergy* link_energy = link.extension(); + link_energy->update(); +} + +static void onLinkDestruction(simgrid::s4u::Link& link) +{ + XBT_DEBUG("onLinkDestruction is called for link: %s", link.getCname()); + + LinkEnergy* link_energy = link.extension(); + link_energy->update(); +} + +static void computeAndDisplayTotalEnergy() +{ + std::vector link_list; + simgrid::s4u::Engine::getInstance()->getLinkList(&link_list); + double total_energy = 0.0; // Total dissipated energy (whole platform) + for (const auto link : link_list) { + LinkEnergy* link_energy = link->extension(); + + double a_link_total_energy = link_energy->getTotalEnergy(); + total_energy += a_link_total_energy; + const char* name = link->getCname(); + if (strcmp(name, "__loopback__")) + XBT_INFO("Link '%s' total consumption: %f", name, a_link_total_energy); + } + + XBT_INFO("Total energy over all links: %f", total_energy); +} + +static void onSimulationEnd() +{ + computeAndDisplayTotalEnergy(); +} +/* **************************** Public interface *************************** */ +SG_BEGIN_DECL() +/** \ingroup SURF_plugin_energy + * \brief Enable energy plugin + * \details Enable energy plugin to get joules consumption of each cpu. You should call this function before + * #MSG_init(). + */ +void sg_link_energy_plugin_init() +{ + + if (LinkEnergy::EXTENSION_ID.valid()) + return; + LinkEnergy::EXTENSION_ID = simgrid::s4u::Link::extension_create(); + + simgrid::s4u::Link::onCreation.connect(&onCreation); + simgrid::s4u::Link::onStateChange.connect(&onLinkStateChange); + simgrid::s4u::Link::onDestruction.connect(&onLinkDestruction); + simgrid::s4u::Link::onCommunicationStateChange.connect(&onActionStateChange); + simgrid::s4u::Link::onCommunicate.connect(&onCommunicate); + simgrid::s4u::onSimulationEnd.connect(&onSimulationEnd); +} + +SG_END_DECL() diff --git a/src/surf/ptask_L07.cpp b/src/surf/ptask_L07.cpp index b3d5beab5b..7a3c22b6db 100644 --- a/src/surf/ptask_L07.cpp +++ b/src/surf/ptask_L07.cpp @@ -65,7 +65,7 @@ NetworkL07Model::NetworkL07Model(HostL07Model *hmodel, lmm_system_t sys) , hostModel_(hmodel) { maxminSystem_ = sys; - loopback_ = createLink("__loopback__", 498000000, 0.000015, SURF_LINK_FATPIPE); + loopback_ = NetworkL07Model::createLink("__loopback__", 498000000, 0.000015, SURF_LINK_FATPIPE); } NetworkL07Model::~NetworkL07Model() @@ -76,13 +76,11 @@ NetworkL07Model::~NetworkL07Model() double HostL07Model::nextOccuringEvent(double now) { double min = HostModel::nextOccuringEventFull(now); - ActionList::iterator it(getRunningActionSet()->begin()); - ActionList::iterator itend(getRunningActionSet()->end()); - for (; it != itend; ++it) { - L07Action *action = static_cast(&*it); - if (action->latency_ > 0 && (min < 0 || action->latency_ < min)) { - min = action->latency_; - XBT_DEBUG("Updating min with %p (start %f): %f", action, action->getStartTime(), min); + for (Action const& action : *getRunningActionSet()) { + const L07Action& net_action = static_cast(action); + if (net_action.latency_ > 0 && (min < 0 || net_action.latency_ < min)) { + min = net_action.latency_; + XBT_DEBUG("Updating min with %p (start %f): %f", &net_action, net_action.getStartTime(), min); } } XBT_DEBUG("min value: %f", min); @@ -90,36 +88,30 @@ double HostL07Model::nextOccuringEvent(double now) return min; } -void HostL07Model::updateActionsState(double /*now*/, double delta) { - - L07Action *action; - ActionList *actionSet = getRunningActionSet(); - ActionList::iterator it(actionSet->begin()); - ActionList::iterator itNext = it; - ActionList::iterator itend(actionSet->end()); - - for (; it != itend; it = itNext) { - ++itNext; - action = static_cast(&*it); - if (action->latency_ > 0) { - if (action->latency_ > delta) { - double_update(&(action->latency_), delta, sg_surf_precision); +void HostL07Model::updateActionsState(double /*now*/, double delta) +{ + for (auto it = std::begin(*getRunningActionSet()); it != std::end(*getRunningActionSet());) { + L07Action& action = static_cast(*it); + ++it; // increment iterator here since the following calls to action.finish() may invalidate it + if (action.latency_ > 0) { + if (action.latency_ > delta) { + double_update(&(action.latency_), delta, sg_surf_precision); } else { - action->latency_ = 0.0; + action.latency_ = 0.0; } - if ((action->latency_ <= 0.0) && (action->isSuspended() == 0)) { - action->updateBound(); - lmm_update_variable_weight(maxminSystem_, action->getVariable(), 1.0); + if ((action.latency_ <= 0.0) && (action.isSuspended() == 0)) { + action.updateBound(); + lmm_update_variable_weight(maxminSystem_, action.getVariable(), 1.0); } } - XBT_DEBUG("Action (%p) : remains (%g) updated by %g.", - action, action->getRemains(), lmm_variable_getvalue(action->getVariable()) * delta); - action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta); + XBT_DEBUG("Action (%p) : remains (%g) updated by %g.", &action, action.getRemains(), + lmm_variable_getvalue(action.getVariable()) * delta); + action.updateRemains(lmm_variable_getvalue(action.getVariable()) * delta); - if (action->getMaxDuration() > NO_MAX_DURATION) - action->updateMaxDuration(delta); + if (action.getMaxDuration() > NO_MAX_DURATION) + action.updateMaxDuration(delta); - XBT_DEBUG("Action (%p) : remains (%g).", action, action->getRemains()); + XBT_DEBUG("Action (%p) : remains (%g).", &action, action.getRemains()); /* In the next if cascade, the action can be finished either because: * - The amount of remaining work reached 0 @@ -127,22 +119,22 @@ void HostL07Model::updateActionsState(double /*now*/, double delta) { * If it's not done, it may have failed. */ - if (((action->getRemains() <= 0) && (lmm_get_variable_weight(action->getVariable()) > 0)) || - ((action->getMaxDuration() > NO_MAX_DURATION) && (action->getMaxDuration() <= 0))) { - action->finish(Action::State::done); + if (((action.getRemains() <= 0) && (lmm_get_variable_weight(action.getVariable()) > 0)) || + ((action.getMaxDuration() > NO_MAX_DURATION) && (action.getMaxDuration() <= 0))) { + action.finish(Action::State::done); } else { /* Need to check that none of the model has failed */ int i = 0; - lmm_constraint_t cnst = lmm_get_cnst_from_var(maxminSystem_, action->getVariable(), i); + lmm_constraint_t cnst = lmm_get_cnst_from_var(maxminSystem_, action.getVariable(), i); while (cnst != nullptr) { i++; void *constraint_id = lmm_constraint_id(cnst); if (static_cast(constraint_id)->isOff()) { - XBT_DEBUG("Action (%p) Failed!!", action); - action->finish(Action::State::failed); + XBT_DEBUG("Action (%p) Failed!!", &action); + action.finish(Action::State::failed); break; } - cnst = lmm_get_cnst_from_var(maxminSystem_, action->getVariable(), i); + cnst = lmm_get_cnst_from_var(maxminSystem_, action.getVariable(), i); } } } @@ -182,11 +174,11 @@ L07Action::L07Action(Model *model, int host_nb, sg_host_t *host_list, double lat=0.0; std::vector route; - hostList_->at(i)->routeTo(hostList_->at(j), &route, &lat); - latency = MAX(latency, lat); + hostList_->at(i)->routeTo(hostList_->at(j), route, &lat); + latency = std::max(latency, lat); for (auto const& link : route) - affected_links.insert(link->cname()); + affected_links.insert(link->getCname()); } } } @@ -195,24 +187,22 @@ L07Action::L07Action(Model *model, int host_nb, sg_host_t *host_list, } XBT_DEBUG("Creating a parallel task (%p) with %d hosts and %d unique links.", this, host_nb, nb_link); - this->latency_ = latency; + latency_ = latency; - this->variable_ = lmm_variable_new(model->getMaxminSystem(), this, 1.0, - (rate > 0 ? rate : -1.0), - host_nb + nb_link); + setVariable(lmm_variable_new(model->getMaxminSystem(), this, 1.0, (rate > 0 ? rate : -1.0), host_nb + nb_link)); - if (this->latency_ > 0) - lmm_update_variable_weight(model->getMaxminSystem(), this->getVariable(), 0.0); + if (latency_ > 0) + lmm_update_variable_weight(model->getMaxminSystem(), getVariable(), 0.0); for (int i = 0; i < host_nb; i++) - lmm_expand(model->getMaxminSystem(), host_list[i]->pimpl_cpu->constraint(), this->getVariable(), flops_amount[i]); + lmm_expand(model->getMaxminSystem(), host_list[i]->pimpl_cpu->constraint(), getVariable(), flops_amount[i]); if(bytes_amount != nullptr) { for (int i = 0; i < host_nb; i++) { for (int j = 0; j < host_nb; j++) { if (bytes_amount[i * host_nb + j] > 0.0) { std::vector route; - hostList_->at(i)->routeTo(hostList_->at(j), &route, nullptr); + hostList_->at(i)->routeTo(hostList_->at(j), route, nullptr); for (auto const& link : route) lmm_expand_add(model->getMaxminSystem(), link->constraint(), this->getVariable(), @@ -226,14 +216,14 @@ L07Action::L07Action(Model *model, int host_nb, sg_host_t *host_list, this->setCost(1.0); this->setRemains(0.0); } - xbt_free(host_list); + delete[] host_list; } Action* NetworkL07Model::communicate(s4u::Host* src, s4u::Host* dst, double size, double rate) { - sg_host_t*host_list = xbt_new0(sg_host_t, 2); - double *flops_amount = xbt_new0(double, 2); - double *bytes_amount = xbt_new0(double, 4); + sg_host_t* host_list = new sg_host_t[2](); + double* flops_amount = new double[2](); + double* bytes_amount = new double[4](); host_list[0] = src; host_list[1] = dst; @@ -280,8 +270,8 @@ LinkL07::LinkL07(NetworkL07Model* model, const std::string& name, double bandwid Action *CpuL07::execution_start(double size) { - sg_host_t*host_list = xbt_new0(sg_host_t, 1); - double *flops_amount = xbt_new0(double, 1); + sg_host_t* host_list = new sg_host_t[1](); + double* flops_amount = new double[1](); host_list[0] = getHost(); flops_amount[0] = size; @@ -292,7 +282,7 @@ Action *CpuL07::execution_start(double size) Action *CpuL07::sleep(double duration) { L07Action *action = static_cast(execution_start(1.0)); - action->maxDuration_ = duration; + action->setMaxDuration(duration); action->suspended_ = 2; lmm_update_variable_weight(model()->getMaxminSystem(), action->getVariable(), 0.0); @@ -325,7 +315,7 @@ bool LinkL07::isUsed(){ void CpuL07::apply_event(tmgr_trace_event_t triggered, double value) { - XBT_DEBUG("Updating cpu %s (%p) with value %g", cname(), this, value); + XBT_DEBUG("Updating cpu %s (%p) with value %g", getCname(), this, value); if (triggered == speed_.event) { speed_.scale = value; onSpeedChange(); @@ -345,7 +335,7 @@ void CpuL07::apply_event(tmgr_trace_event_t triggered, double value) void LinkL07::apply_event(tmgr_trace_event_t triggered, double value) { - XBT_DEBUG("Updating link %s (%p) with value=%f", cname(), this, value); + XBT_DEBUG("Updating link %s (%p) with value=%f", getCname(), this, value); if (triggered == bandwidth_.event) { setBandwidth(value); tmgr_trace_event_unref(&bandwidth_.event); @@ -392,8 +382,8 @@ LinkL07::~LinkL07() = default; L07Action::~L07Action(){ delete hostList_; - free(communicationAmount_); - free(computationAmount_); + delete[] communicationAmount_; + delete[] computationAmount_; } void L07Action::updateBound() @@ -409,9 +399,9 @@ void L07Action::updateBound() if (communicationAmount_[i * hostNb + j] > 0) { double lat = 0.0; std::vector route; - hostList_->at(i)->routeTo(hostList_->at(j), &route, &lat); + hostList_->at(i)->routeTo(hostList_->at(j), route, &lat); - lat_current = MAX(lat_current, lat * communicationAmount_[i * hostNb + j]); + lat_current = std::max(lat_current, lat * communicationAmount_[i * hostNb + j]); } } } diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index 354ba1c6c6..81a15d0189 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -7,7 +7,7 @@ #include "simgrid/s4u/Storage.hpp" #include "src/kernel/EngineImpl.hpp" -#include "src/simix/smx_private.h" +#include "src/simix/smx_private.hpp" #include "src/include/simgrid/sg_config.h" @@ -195,7 +195,6 @@ void sg_platf_new_cluster(ClusterCreationArgs* cluster) XBT_DEBUG("", host_id.c_str(), cluster->speeds.front()); s_sg_platf_host_cbarg_t host; - memset(&host, 0, sizeof(host)); host.id = host_id.c_str(); if ((cluster->properties != nullptr) && (not cluster->properties->empty())) { host.properties = new std::map; @@ -316,7 +315,6 @@ void sg_platf_new_cabinet(CabinetCreationArgs* cabinet) for (int const& radical : *cabinet->radicals) { std::string hostname = cabinet->prefix + std::to_string(radical) + cabinet->suffix; s_sg_platf_host_cbarg_t host; - memset(&host, 0, sizeof(host)); host.pstate = 0; host.core_amount = 1; host.id = hostname.c_str(); @@ -442,14 +440,14 @@ void sg_platf_new_process(sg_platf_process_cbarg_t process) double kill_time = process->kill_time; int auto_restart = process->on_failure == SURF_ACTOR_ON_FAILURE_DIE ? 0 : 1; - std::vector args(process->argv, process->argv + process->argc); - std::function code = factory(std::move(args)); + std::string process_name = process->args[0]; + std::function code = factory(std::move(process->args)); std::shared_ptr> properties(process->properties); smx_process_arg_t arg = nullptr; arg = new simgrid::simix::ProcessArg(); - arg->name = std::string(process->argv[0]); + arg->name = process_name; arg->code = code; arg->data = nullptr; arg->host = host; @@ -461,7 +459,7 @@ void sg_platf_new_process(sg_platf_process_cbarg_t process) if (start_time > SIMIX_get_clock()) { arg = new simgrid::simix::ProcessArg(); - arg->name = std::string(process->argv[0]); + arg->name = process_name; arg->code = std::move(code); arg->data = nullptr; arg->host = host; @@ -521,22 +519,22 @@ void sg_platf_end() { /* Pick the right models for CPU, net and host, and call their model_init_preparse */ static void surf_config_models_setup() { - const char* host_model_name = xbt_cfg_get_string("host/model"); - const char* network_model_name = xbt_cfg_get_string("network/model"); - const char* cpu_model_name = xbt_cfg_get_string("cpu/model"); - const char* storage_model_name = xbt_cfg_get_string("storage/model"); + std::string host_model_name = xbt_cfg_get_string("host/model"); + std::string network_model_name = xbt_cfg_get_string("network/model"); + std::string cpu_model_name = xbt_cfg_get_string("cpu/model"); + std::string storage_model_name = xbt_cfg_get_string("storage/model"); /* The compound host model is needed when using non-default net/cpu models */ if ((not xbt_cfg_is_default_value("network/model") || not xbt_cfg_is_default_value("cpu/model")) && xbt_cfg_is_default_value("host/model")) { host_model_name = "compound"; - xbt_cfg_set_string("host/model", host_model_name); + xbt_cfg_set_string("host/model", host_model_name.c_str()); } - XBT_DEBUG("host model: %s", host_model_name); - if (not strcmp(host_model_name, "compound")) { - xbt_assert(cpu_model_name, "Set a cpu model to use with the 'compound' host model"); - xbt_assert(network_model_name, "Set a network model to use with the 'compound' host model"); + XBT_DEBUG("host model: %s", host_model_name.c_str()); + if (host_model_name == "compound") { + xbt_assert(not cpu_model_name.empty(), "Set a cpu model to use with the 'compound' host model"); + xbt_assert(not network_model_name.empty(), "Set a network model to use with the 'compound' host model"); int cpu_id = find_model_description(surf_cpu_model_description, cpu_model_name); surf_cpu_model_description[cpu_id].model_init_preparse(); @@ -600,10 +598,10 @@ simgrid::s4u::NetZone* sg_platf_new_Zone_begin(ZoneCreationArgs* zone) new_zone = new simgrid::kernel::routing::FatTreeZone(current_routing, zone->id); break; case A_surfxml_AS_routing_Dijkstra: - new_zone = new simgrid::kernel::routing::DijkstraZone(current_routing, zone->id, 0); + new_zone = new simgrid::kernel::routing::DijkstraZone(current_routing, zone->id, false); break; case A_surfxml_AS_routing_DijkstraCache: - new_zone = new simgrid::kernel::routing::DijkstraZone(current_routing, zone->id, 1); + new_zone = new simgrid::kernel::routing::DijkstraZone(current_routing, zone->id, true); break; case A_surfxml_AS_routing_Floyd: new_zone = new simgrid::kernel::routing::FloydZone(current_routing, zone->id); @@ -676,7 +674,7 @@ void sg_platf_new_hostlink(HostLinkCreationArgs* hostlink) if (as_cluster->privateLinks_.find(netpoint->id()) != as_cluster->privateLinks_.end()) surf_parse_error(std::string("Host_link for '") + hostlink->id.c_str() + "' is already defined!"); - XBT_DEBUG("Push Host_link for host '%s' to position %u", netpoint->cname(), netpoint->id()); + XBT_DEBUG("Push Host_link for host '%s' to position %u", netpoint->getCname(), netpoint->id()); as_cluster->privateLinks_.insert({netpoint->id(), {linkUp, linkDown}}); } diff --git a/src/surf/storage_n11.cpp b/src/surf/storage_n11.cpp index d8bfca3039..54f284761a 100644 --- a/src/surf/storage_n11.cpp +++ b/src/surf/storage_n11.cpp @@ -20,8 +20,8 @@ static void check_disk_attachment() for (auto const& s : *simgrid::surf::StorageImpl::storagesMap()) { simgrid::kernel::routing::NetPoint* host_elm = sg_netpoint_by_name_or_null(s.second->getHost().c_str()); if (not host_elm) - surf_parse_error(std::string("Unable to attach storage ") + s.second->cname() + ": host " + s.second->getHost() + - " does not exist."); + surf_parse_error(std::string("Unable to attach storage ") + s.second->getCname() + ": host " + + s.second->getHost() + " does not exist."); else s.second->piface_.attached_to_ = sg_host_by_name(s.second->getHost().c_str()); } @@ -75,33 +75,24 @@ double StorageN11Model::nextOccuringEvent(double now) void StorageN11Model::updateActionsState(double /*now*/, double delta) { - ActionList *actionSet = getRunningActionSet(); - for (ActionList::iterator it(actionSet->begin()), itNext = it, itend(actionSet->end()); it != itend; it = itNext) { - ++itNext; - - StorageAction *action = static_cast(&*it); - - double current_progress = lrint(lmm_variable_getvalue(action->getVariable()) * delta); - - action->updateRemains(current_progress); - if (action->type_ == WRITE) { - action->storage_->usedSize_ += current_progress; - action->file_->incrPosition(current_progress); - action->file_->setSize(action->file_->tell()); - - action->storage_->getContent()->erase(action->file_->cname()); - action->storage_->getContent()->insert({action->file_->cname(), action->file_->size()}); + for (auto it = std::begin(*getRunningActionSet()); it != std::end(*getRunningActionSet());) { + StorageAction& action = static_cast(*it); + ++it; // increment iterator here since the following calls to action.finish() may invalidate it + double current_progress = lrint(lmm_variable_getvalue(action.getVariable()) * delta); + action.updateRemains(current_progress); + if (action.type_ == WRITE) { + action.storage_->usedSize_ += current_progress; } - if (action->getMaxDuration() > NO_MAX_DURATION) - action->updateMaxDuration(delta); + if (action.getMaxDuration() > NO_MAX_DURATION) + action.updateMaxDuration(delta); - if (action->getRemainsNoUpdate() > 0 && lmm_get_variable_weight(action->getVariable()) > 0 && - action->storage_->usedSize_ == action->storage_->getSize()) { - action->finish(Action::State::failed); - } else if (((action->getRemainsNoUpdate() <= 0) && (lmm_get_variable_weight(action->getVariable()) > 0)) || - ((action->getMaxDuration() > NO_MAX_DURATION) && (action->getMaxDuration() <= 0))) { - action->finish(Action::State::done); + if (action.getRemainsNoUpdate() > 0 && lmm_get_variable_weight(action.getVariable()) > 0 && + action.storage_->usedSize_ == action.storage_->getSize()) { + action.finish(Action::State::failed); + } else if (((action.getRemainsNoUpdate() <= 0) && (lmm_get_variable_weight(action.getVariable()) > 0)) || + ((action.getMaxDuration() > NO_MAX_DURATION) && (action.getMaxDuration() <= 0))) { + action.finish(Action::State::done); } } } @@ -136,7 +127,7 @@ StorageN11Action::StorageN11Action(Model* model, double cost, bool failed, Stora e_surf_action_storage_type_t type) : StorageAction(model, cost, failed, lmm_variable_new(model->getMaxminSystem(), this, 1.0, -1.0, 3), storage, type) { - XBT_IN("(%s,%g", storage->cname(), cost); + XBT_IN("(%s,%g", storage->getCname(), cost); // Must be less than the max bandwidth for all actions lmm_expand(model->getMaxminSystem(), storage->constraint(), getVariable(), 1.0); diff --git a/src/surf/storage_n11.hpp b/src/surf/storage_n11.hpp index 5e3ff38b4e..b6d8c4f7ea 100644 --- a/src/surf/storage_n11.hpp +++ b/src/surf/storage_n11.hpp @@ -6,7 +6,6 @@ #include -#include "FileImpl.hpp" #include "StorageImpl.hpp" #ifndef STORAGE_N11_HPP_ diff --git a/src/surf/surf_c_bindings.cpp b/src/surf/surf_c_bindings.cpp index 61e00b91fd..cac3a8698d 100644 --- a/src/surf/surf_c_bindings.cpp +++ b/src/surf/surf_c_bindings.cpp @@ -4,8 +4,9 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "simgrid/s4u/Engine.hpp" -#include "src/instr/instr_private.h" +#include "src/instr/instr_private.hpp" #include "src/plugins/vm/VirtualMachineImpl.hpp" +#include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_kernel); @@ -74,10 +75,10 @@ double surf_solve(double max_date) XBT_DEBUG("Next TRACE event: %f", next_event_date); if (not surf_network_model->nextOccuringEventIsIdempotent()) { // NS3, I see you - if (next_event_date!=-1.0 && time_delta!=-1.0) { - time_delta = MIN(next_event_date - NOW, time_delta); + if (next_event_date != -1.0) { + time_delta = std::min(next_event_date - NOW, time_delta); } else { - time_delta = MAX(next_event_date - NOW, time_delta); // Get the positive component + time_delta = std::max(next_event_date - NOW, time_delta); // Get the positive component } XBT_DEBUG("Run the NS3 network at most %fs", time_delta); @@ -85,22 +86,20 @@ double surf_solve(double max_date) model_next_action_end = surf_network_model->nextOccuringEvent(time_delta); XBT_DEBUG("Min for network : %f", model_next_action_end); - if(model_next_action_end>=0.0) + if (model_next_action_end >= 0.0) time_delta = model_next_action_end; } - if (next_event_date < 0.0) { - XBT_DEBUG("no next TRACE event. Stop searching for it"); + if (next_event_date < 0.0 || (next_event_date > NOW + time_delta)) { + // next event may have already occurred or will after the next resource change, then bail out + XBT_DEBUG("no next usable TRACE event. Stop searching for it"); break; } - if ((time_delta == -1.0) || (next_event_date > NOW + time_delta)) - break; // next event occurs after the next resource change, bail out - XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)", time_delta, NOW, next_event_date); while ((event = future_evt_set->pop_leq(next_event_date, &value, &resource))) { - if (resource->isUsed() || (watched_hosts.find(resource->cname()) != watched_hosts.end())) { + if (resource->isUsed() || (watched_hosts.find(resource->getCname()) != watched_hosts.end())) { time_delta = next_event_date - NOW; XBT_DEBUG("This event invalidates the next_occuring_event() computation of models. Next event set to %f", time_delta); } @@ -109,7 +108,7 @@ double surf_solve(double max_date) NOW = next_event_date; /* update state of the corresponding resource to the new value. Does not touch lmm. It will be modified if needed when updating actions */ - XBT_DEBUG("Calling update_resource_state for resource %s", resource->cname()); + XBT_DEBUG("Calling update_resource_state for resource %s", resource->getCname()); resource->apply_event(event, value); NOW = round_start; } @@ -129,12 +128,12 @@ double surf_solve(double max_date) NOW = NOW + time_delta; // Inform the models of the date change - for (auto const& model : *all_existing_models) { + for (auto const& model : *all_existing_models) model->updateActionsState(NOW, time_delta); - } + simgrid::s4u::onTimeAdvance(time_delta); - TRACE_paje_dump_buffer (0); + TRACE_paje_dump_buffer(false); return time_delta; } diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index c07fe792db..67c6b6b97a 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -7,7 +7,7 @@ #include "mc/mc.h" #include "simgrid/s4u/Engine.hpp" #include "simgrid/sg_config.h" -#include "src/instr/instr_private.h" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals #include "src/kernel/routing/NetPoint.hpp" #include "src/surf/HostImpl.hpp" @@ -16,6 +16,10 @@ #include #include +#ifdef _WIN32 +#include +#endif + XBT_LOG_NEW_CATEGORY(surf, "All SURF categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf, "Logging specific to SURF (kernel)"); @@ -170,47 +174,6 @@ FILE *surf_fopen(const char *name, const char *mode) return nullptr; } -#ifdef _WIN32 -#include -#define MAX_DRIVE 26 -static const char *disk_drives_letter_table[MAX_DRIVE] = { - "A:\\","B:\\","C:\\","D:\\","E:\\","F:\\","G:\\","H:\\","I:\\","J:\\","K:\\","L:\\","M:\\", - "N:\\","O:\\","P:\\","Q:\\","R:\\","S:\\","T:\\","U:\\","V:\\","W:\\","X:\\","Y:\\","Z:\\" -}; -#endif - -/* - * Returns the initial path. On Windows the initial path is - * the current directory for the current process in the other - * case the function returns "./" that represents the current - * directory on Unix/Linux platforms. - */ - -const char *__surf_get_initial_path() -{ - -#ifdef _WIN32 - unsigned i; - char current_directory[MAX_PATH + 1] = { 0 }; - unsigned int len = GetCurrentDirectory(MAX_PATH + 1, current_directory); - char root[4] = { 0 }; - - if (not len) - return nullptr; - - strncpy(root, current_directory, 3); - - for (i = 0; i < MAX_DRIVE; i++) { - if (toupper(root[0]) == disk_drives_letter_table[i][0]) - return disk_drives_letter_table[i]; - } - - return nullptr; -#else - return "./"; -#endif -} - /* The __surf_is_absolute_file_path() returns 1 if * file_path is a absolute file path, in the other * case the function returns 0. @@ -239,23 +202,20 @@ void model_help(const char *category, s_surf_model_description_t * table) printf(" %s: %s\n", table[i].name, table[i].description); } -int find_model_description(s_surf_model_description_t* table, const char* name) +int find_model_description(s_surf_model_description_t* table, std::string name) { for (int i = 0; table[i].name; i++) - if (not strcmp(name, table[i].name)) { + if (name == table[i].name) return i; - } if (not table[0].name) xbt_die("No model is valid! This is a bug."); - char* name_list = xbt_strdup(table[0].name); - for (int i = 1; table[i].name; i++) { - name_list = (char *) xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3); - strncat(name_list, ", ", 2); - strncat(name_list, table[i].name, strlen(table[i].name)); - } - xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list); + std::string name_list = std::string(table[0].name); + for (int i = 1; table[i].name; i++) + name_list = name_list + ", " + table[i].name; + + xbt_die("Model '%s' is invalid! Valid models are: %s.", name.c_str(), name_list.c_str()); return -1; } @@ -405,7 +365,6 @@ Model::Model() doneActionSet_ = new ActionList(); modifiedSet_ = nullptr; - actionHeap_ = nullptr; updateMechanism_ = UM_UNDEFINED; selectiveUpdate_ = 0; } @@ -417,6 +376,14 @@ Model::~Model(){ delete doneActionSet_; } +Action* Model::actionHeapPop() +{ + Action* action = actionHeap_.top().second; + actionHeap_.pop(); + action->clearHeapHandle(); + return action; +} + double Model::nextOccuringEvent(double now) { //FIXME: set the good function once and for all @@ -482,8 +449,8 @@ double Model::nextOccuringEventLazy(double now) } //hereafter must have already the min value for this resource model - if (xbt_heap_size(actionHeap_) > 0) { - double min = xbt_heap_maxkey(actionHeap_) - now; + if (not actionHeapIsEmpty()) { + double min = actionHeapTopDate() - now; XBT_DEBUG("minimum with the HEAP %f", min); return min; } else { @@ -496,22 +463,22 @@ double Model::nextOccuringEventFull(double /*now*/) { maxminSystem_->solve_fun(maxminSystem_); double min = -1; - for (auto it(getRunningActionSet()->begin()), itend(getRunningActionSet()->end()); it != itend ; ++it) { - Action *action = &*it; - double value = lmm_variable_getvalue(action->getVariable()); + + for (Action& action : *getRunningActionSet()) { + double value = lmm_variable_getvalue(action.getVariable()); if (value > 0) { - if (action->getRemains() > 0) - value = action->getRemainsNoUpdate() / value; + if (action.getRemains() > 0) + value = action.getRemainsNoUpdate() / value; else value = 0.0; if (min < 0 || value < min) { min = value; - XBT_DEBUG("Updating min (value) with %p: %f", action, min); + XBT_DEBUG("Updating min (value) with %p: %f", &action, min); } } - if ((action->getMaxDuration() >= 0) && (min<0 || action->getMaxDuration() < min)) { - min = action->getMaxDuration(); - XBT_DEBUG("Updating min (duration) with %p: %f", action, min); + if ((action.getMaxDuration() >= 0) && (min < 0 || action.getMaxDuration() < min)) { + min = action.getMaxDuration(); + XBT_DEBUG("Updating min (duration) with %p: %f", &action, min); } } XBT_DEBUG("min value : %f", min); @@ -577,7 +544,12 @@ Model* Resource::model() const return model_; } -const char* Resource::cname() const +const std::string& Resource::getName() const +{ + return name_; +} + +const char* Resource::getCname() const { return name_.c_str(); } @@ -607,11 +579,6 @@ const char *surf_action_state_names[6] = { "SURF_ACTION_NOT_IN_THE_SYSTEM" }; -/* added to manage the communication action's heap */ -void surf_action_lmm_update_index_heap(void *action, int i) { - static_cast(action)->updateIndexHeap(i); -} - namespace simgrid { namespace surf { @@ -640,7 +607,7 @@ void Action::finish(Action::State state) setState(state); } -Action::State Action::getState() +Action::State Action::getState() const { if (stateSet_ == model_->getReadyActionSet()) return Action::State::ready; @@ -677,7 +644,7 @@ void Action::setState(Action::State state) stateSet_->push_back(*this); } -double Action::getBound() +double Action::getBound() const { return (variable_) ? lmm_variable_getbound(variable_) : 0; } @@ -693,22 +660,6 @@ void Action::setBound(double bound) XBT_OUT(); } -double Action::getStartTime() -{ - return start_; -} - -double Action::getFinishTime() -{ - /* keep the function behavior, some models (cpu_ti) change the finish time before the action end */ - return remains_ <= 0 ? finishTime_ : -1; -} - -void Action::setData(void* data) -{ - data_ = data; -} - void Action::setCategory(const char *category) { category_ = xbt_strdup(category); @@ -786,7 +737,7 @@ void Action::resume() { XBT_IN("(%p)", this); if (suspended_ != 2) { - lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), sharingWeight_); + lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), getPriority()); suspended_ = 0; if (getModel()->getUpdateMechanism() == UM_LAZY) heapRemove(getModel()->getActionHeap()); @@ -805,34 +756,31 @@ bool Action::isSuspended() * LATENCY = this is a heap entry to warn us when the latency is payed * MAX_DURATION =this is a heap entry to warn us when the max_duration limit is reached */ -void Action::heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat) +void Action::heapInsert(heap_type& heap, double key, enum heap_action_type hat) { hat_ = hat; - xbt_heap_push(heap, this, key); + heapHandle_ = heap.emplace(std::make_pair(key, this)); } -void Action::heapRemove(xbt_heap_t heap) +void Action::heapRemove(heap_type& heap) { hat_ = NOTSET; - if (indexHeap_ >= 0) { - xbt_heap_remove(heap, indexHeap_); + if (heapHandle_) { + heap.erase(*heapHandle_); + clearHeapHandle(); } } -void Action::heapUpdate(xbt_heap_t heap, double key, enum heap_action_type hat) +void Action::heapUpdate(heap_type& heap, double key, enum heap_action_type hat) { hat_ = hat; - if (indexHeap_ >= 0) { - xbt_heap_update(heap, indexHeap_, key); - }else{ - xbt_heap_push(heap, this, key); + if (heapHandle_) { + heap.update(*heapHandle_, std::make_pair(key, this)); + } else { + heapHandle_ = heap.emplace(std::make_pair(key, this)); } } -void Action::updateIndexHeap(int i) { - indexHeap_ = i; -} - double Action::getRemains() { XBT_IN("(%p)", this); @@ -843,10 +791,5 @@ double Action::getRemains() return remains_; } -double Action::getRemainsNoUpdate() -{ - return remains_; -} - } } diff --git a/src/surf/surf_interface.hpp b/src/surf/surf_interface.hpp index 0e2b5cad2a..38bdbe0f09 100644 --- a/src/surf/surf_interface.hpp +++ b/src/surf/surf_interface.hpp @@ -7,12 +7,15 @@ #define SURF_MODEL_H_ #include "xbt/signal.hpp" +#include "xbt/utility.hpp" -#include "src/surf/surf_private.h" -#include "surf/surf.h" +#include "src/surf/surf_private.hpp" +#include "surf/surf.hpp" #include "xbt/str.h" +#include #include +#include #include #include #include @@ -65,8 +68,6 @@ enum heap_action_type{ * Action * **********/ -XBT_PRIVATE void surf_action_lmm_update_index_heap(void *action, int i); - /** \ingroup SURF_models * \brief List of initialized models */ @@ -75,6 +76,11 @@ XBT_PUBLIC_DATA(std::vector*) all_existing_models; namespace simgrid { namespace surf { +typedef std::pair heap_element_type; +typedef boost::heap::pairing_heap, boost::heap::stable, + boost::heap::compare>> + heap_type; + /** @ingroup SURF_interface * @brief SURF action interface class * @details An action is an event generated by a resource (e.g.: a communication for the network) @@ -126,27 +132,27 @@ public: void finish(Action::State state); /** @brief Get the [state](\ref simgrid::surf::Action::State) of the current Action */ - Action::State getState(); /**< get the state*/ + Action::State getState() const; /**< get the state*/ /** @brief Set the [state](\ref simgrid::surf::Action::State) of the current Action */ virtual void setState(Action::State state); /** @brief Get the bound of the current Action */ - double getBound(); + double getBound() const; /** @brief Set the bound of the current Action */ void setBound(double bound); /** @brief Get the start time of the current action */ - double getStartTime(); + double getStartTime() const { return start_; } /** @brief Get the finish time of the current action */ - double getFinishTime(); + double getFinishTime() const { return finishTime_; } /** @brief Get the user data associated to the current action */ - void *getData() {return data_;} + void* getData() const { return data_; } /** @brief Set the user data associated to the current action */ - void setData(void* data); + void setData(void* data) { data_ = data; } /** @brief Get the cost of the current action */ - double getCost() {return cost_;} + double getCost() const { return cost_; } /** @brief Set the cost of the current action */ void setCost(double cost) {cost_ = cost;} @@ -163,7 +169,7 @@ public: /** @brief Get the remaining time of the current action after updating the resource */ virtual double getRemains(); /** @brief Get the remaining time of the current action without updating the resource */ - double getRemainsNoUpdate(); + double getRemainsNoUpdate() const { return remains_; } /** @brief Set the finish time of the current action */ void setFinishTime(double value) {finishTime_ = value;} @@ -188,63 +194,68 @@ public: virtual bool isSuspended(); /** @brief Get the maximum duration of the current action */ - double getMaxDuration() {return maxDuration_;} + double getMaxDuration() const { return maxDuration_; } /** @brief Set the maximum duration of the current Action */ virtual void setMaxDuration(double duration); /** @brief Get the tracing category associated to the current action */ - char *getCategory() {return category_;} + char* getCategory() const { return category_; } /** @brief Set the tracing category of the current Action */ void setCategory(const char *category); /** @brief Get the priority of the current Action */ - double getPriority() { return sharingWeight_; }; + double getPriority() const { return sharingWeight_; }; /** @brief Set the priority of the current Action */ virtual void setSharingWeight(double priority); + void setSharingWeightNoUpdate(double weight) { sharingWeight_ = weight; } /** @brief Get the state set in which the action is */ - ActionList* getStateSet() {return stateSet_;}; + ActionList* getStateSet() const { return stateSet_; }; s_xbt_swag_hookup_t stateHookup_ = {nullptr,nullptr}; - simgrid::surf::Model* getModel() { return model_; } + simgrid::surf::Model* getModel() const { return model_; } protected: ActionList* stateSet_; - double sharingWeight_ = 1.0; /**< priority (1.0 by default) */ int refcount_ = 1; - double remains_; /**< How much of that cost remains to be done in the currently running task */ - double maxDuration_ = NO_MAX_DURATION; /*< max_duration (may fluctuate until the task is completed) */ - double finishTime_ = -1; /**< finish time : this is modified during the run and fluctuates until the task is completed */ private: + double sharingWeight_ = 1.0; /**< priority (1.0 by default) */ + double maxDuration_ = NO_MAX_DURATION; /*< max_duration (may fluctuate until the task is completed) */ + double remains_; /**< How much of that cost remains to be done in the currently running task */ double start_; /**< start time */ char *category_ = nullptr; /**< tracing category for categorized resource utilization monitoring */ + double finishTime_ = + -1; /**< finish time : this is modified during the run and fluctuates until the task is completed */ double cost_; simgrid::surf::Model *model_; void *data_ = nullptr; /**< for your convenience */ /* LMM */ + double lastUpdate_ = 0; + double lastValue_ = 0; + lmm_variable_t variable_ = nullptr; + enum heap_action_type hat_ = NOTSET; + boost::optional heapHandle_ = boost::none; + public: virtual void updateRemainingLazy(double now) { THROW_IMPOSSIBLE; }; - void heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat); - void heapRemove(xbt_heap_t heap); - void heapUpdate(xbt_heap_t heap, double key, enum heap_action_type hat); - virtual void updateIndexHeap(int i); - lmm_variable_t getVariable() {return variable_;} - double getLastUpdate() {return lastUpdate_;} + void heapInsert(heap_type& heap, double key, enum heap_action_type hat); + void heapRemove(heap_type& heap); + void heapUpdate(heap_type& heap, double key, enum heap_action_type hat); + void clearHeapHandle() { heapHandle_ = boost::none; } + lmm_variable_t getVariable() const { return variable_; } + void setVariable(lmm_variable_t var) { variable_ = var; } + double getLastUpdate() const { return lastUpdate_; } void refreshLastUpdate() {lastUpdate_ = surf_get_clock();} - enum heap_action_type getHat() {return hat_;} - bool is_linked() {return action_lmm_hook.is_linked();} - + double getLastValue() const { return lastValue_; } + void setLastValue(double val) { lastValue_ = val; } + enum heap_action_type getHat() const { return hat_; } + bool is_linked() const { return action_lmm_hook.is_linked(); } protected: - lmm_variable_t variable_ = nullptr; - double lastValue_ = 0; - double lastUpdate_ = 0; int suspended_ = 0; - int indexHeap_; - enum heap_action_type hat_ = NOTSET; }; typedef Action::ActionList ActionList; @@ -268,31 +279,36 @@ public: virtual ~Model(); /** @brief Get the set of [actions](@ref Action) in *ready* state */ - virtual ActionList* getReadyActionSet() {return readyActionSet_;} + virtual ActionList* getReadyActionSet() const { return readyActionSet_; } /** @brief Get the set of [actions](@ref Action) in *running* state */ - virtual ActionList* getRunningActionSet() {return runningActionSet_;} + virtual ActionList* getRunningActionSet() const { return runningActionSet_; } /** @brief Get the set of [actions](@ref Action) in *failed* state */ - virtual ActionList* getFailedActionSet() {return failedActionSet_;} + virtual ActionList* getFailedActionSet() const { return failedActionSet_; } /** @brief Get the set of [actions](@ref Action) in *done* state */ - virtual ActionList* getDoneActionSet() {return doneActionSet_;} + virtual ActionList* getDoneActionSet() const { return doneActionSet_; } /** @brief Get the set of modified [actions](@ref Action) */ - virtual ActionLmmListPtr getModifiedSet() {return modifiedSet_;} + virtual ActionLmmListPtr getModifiedSet() const { return modifiedSet_; } /** @brief Get the maxmin system of the current Model */ - lmm_system_t getMaxminSystem() {return maxminSystem_;} + lmm_system_t getMaxminSystem() const { return maxminSystem_; } /** * @brief Get the update mechanism of the current Model * @see e_UM_t */ - e_UM_t getUpdateMechanism() {return updateMechanism_;} + e_UM_t getUpdateMechanism() const { return updateMechanism_; } + void setUpdateMechanism(e_UM_t mechanism) { updateMechanism_ = mechanism; } /** @brief Get Action heap */ - xbt_heap_t getActionHeap() {return actionHeap_;} + heap_type& getActionHeap() { return actionHeap_; } + + double actionHeapTopDate() const { return actionHeap_.top().first; } + Action* actionHeapPop(); + bool actionHeapIsEmpty() const { return actionHeap_.empty(); } /** * @brief Share the resources between the actions @@ -324,15 +340,15 @@ public: protected: ActionLmmListPtr modifiedSet_; lmm_system_t maxminSystem_ = nullptr; - e_UM_t updateMechanism_ = UM_UNDEFINED; bool selectiveUpdate_; - xbt_heap_t actionHeap_; private: + e_UM_t updateMechanism_ = UM_UNDEFINED; ActionList* readyActionSet_; /**< Actions in state SURF_ACTION_READY */ ActionList* runningActionSet_; /**< Actions in state SURF_ACTION_RUNNING */ ActionList* failedActionSet_; /**< Actions in state SURF_ACTION_FAILED */ ActionList* doneActionSet_; /**< Actions in state SURF_ACTION_DONE */ + heap_type actionHeap_; }; } @@ -345,11 +361,11 @@ private: /** @ingroup SURF_interface * @brief Resource which have a metric handled by a maxmin system */ -typedef struct { +struct s_surf_metric_t { double peak; /**< The peak of the metric, ie its max value */ double scale; /**< Current availability of the metric according to the traces, in [0,1] */ tmgr_trace_event_t event; /**< The associated trace event associated to the metric */ -} s_surf_metric_t; +}; namespace simgrid { namespace surf { @@ -375,7 +391,9 @@ public: Model* model() const; /** @brief Get the name of the current Resource */ - const char* cname() const; + const std::string& getName() const; + /** @brief Get the name of the current Resource */ + const char* getCname() const; bool operator==(const Resource &other) const; @@ -418,8 +436,8 @@ protected: namespace std { template <> class hash { public: - std::size_t operator()(const simgrid::surf::Resource& r) const { return (std::size_t)xbt_str_hash(r.cname()); } - }; + std::size_t operator()(const simgrid::surf::Resource& r) const { return (std::size_t)xbt_str_hash(r.getCname()); } +}; } #endif /* SURF_MODEL_H_ */ diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h deleted file mode 100644 index fc90b62a9a..0000000000 --- a/src/surf/surf_private.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2004-2017. 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. */ - -#ifndef SURF_SURF_PRIVATE_H -#define SURF_SURF_PRIVATE_H - -#include "surf/surf.h" -#include "surf/maxmin.h" -#include "src/surf/trace_mgr.hpp" - -#define NO_MAX_DURATION -1.0 - -SG_BEGIN_DECL() - -extern XBT_PRIVATE const char *surf_action_state_names[6]; - -/** @ingroup SURF_interface - * @brief Possible update mechanisms - */ -typedef enum { - UM_FULL, /**< Full update mechanism: the remaining time of every action is recomputed at each step */ - UM_LAZY, /**< Lazy update mechanism: only the modified actions get recomputed. - It may be slower than full if your system is tightly coupled to the point where every action - gets recomputed anyway. In that case, you'd better not try to be cleaver with lazy and go for - a simple full update. */ - UM_UNDEFINED /**< Mechanism not defined */ -} e_UM_t; - -/* Generic functions common to all models */ - -XBT_PRIVATE FILE *surf_fopen(const char *name, const char *mode); -XBT_PRIVATE std::ifstream* surf_ifsopen(std::string name); - -/* The __surf_is_absolute_file_path() returns 1 if - * file_path is a absolute file path, in the other - * case the function returns 0. - */ -XBT_PRIVATE int __surf_is_absolute_file_path(const char *file_path); - -extern XBT_PRIVATE simgrid::trace_mgr::future_evt_set *future_evt_set; - - -XBT_PUBLIC(void) storage_register_callbacks(); - -XBT_PUBLIC(void) generic_get_graph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges, sg_netzone_t rc); -XBT_PRIVATE void parse_after_config(); - -/********** Tracing **********/ -/* from surf_instr.c */ -void TRACE_surf_host_set_speed(double date, const char *resource, double power); -void TRACE_surf_link_set_bandwidth(double date, const char *resource, double bandwidth); - -SG_END_DECL() - -#endif diff --git a/src/surf/surf_private.hpp b/src/surf/surf_private.hpp new file mode 100644 index 0000000000..55a7e4f17e --- /dev/null +++ b/src/surf/surf_private.hpp @@ -0,0 +1,54 @@ +/* Copyright (c) 2004-2017. 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. */ + +#ifndef SURF_SURF_PRIVATE_HPP +#define SURF_SURF_PRIVATE_HPP + +#include "src/surf/trace_mgr.hpp" +#include "surf/maxmin.hpp" +#include "surf/surf.hpp" + +#define NO_MAX_DURATION -1.0 + +extern "C" { + +extern XBT_PRIVATE const char* surf_action_state_names[6]; + +/** @ingroup SURF_interface + * @brief Possible update mechanisms + */ +enum e_UM_t { + UM_FULL, /**< Full update mechanism: the remaining time of every action is recomputed at each step */ + UM_LAZY, /**< Lazy update mechanism: only the modified actions get recomputed. + It may be slower than full if your system is tightly coupled to the point where every action + gets recomputed anyway. In that case, you'd better not try to be cleaver with lazy and go for + a simple full update. */ + UM_UNDEFINED /**< Mechanism not defined */ +}; + +/* Generic functions common to all models */ + +XBT_PRIVATE FILE* surf_fopen(const char* name, const char* mode); +XBT_PRIVATE std::ifstream* surf_ifsopen(std::string name); + +/* The __surf_is_absolute_file_path() returns 1 if + * file_path is a absolute file path, in the other + * case the function returns 0. + */ +XBT_PRIVATE int __surf_is_absolute_file_path(const char* file_path); + +extern XBT_PRIVATE simgrid::trace_mgr::future_evt_set* future_evt_set; + +XBT_PUBLIC(void) storage_register_callbacks(); + +XBT_PRIVATE void parse_after_config(); + +/********** Tracing **********/ +/* from surf_instr.c */ +void TRACE_surf_host_set_speed(double date, const char* resource, double power); +void TRACE_surf_link_set_bandwidth(double date, const char* resource, double bandwidth); +} + +#endif diff --git a/src/surf/trace_mgr.cpp b/src/surf/trace_mgr.cpp index dbbf1ae424..d5e70c1f27 100644 --- a/src/surf/trace_mgr.cpp +++ b/src/surf/trace_mgr.cpp @@ -9,7 +9,7 @@ #include "src/surf/surf_interface.hpp" #include "src/surf/trace_mgr.hpp" -#include "surf_private.h" +#include "surf_private.hpp" #include "xbt/RngStream.h" #include #include @@ -50,9 +50,12 @@ trace::trace() } trace::~trace() = default; future_evt_set::future_evt_set() = default; -simgrid::trace_mgr::future_evt_set::~future_evt_set() +future_evt_set::~future_evt_set() { - xbt_heap_free(heap_); + while (not heap_.empty()) { + delete heap_.top().second; + heap_.pop(); + } } } } @@ -122,14 +125,15 @@ tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t tr { tmgr_trace_event_t trace_iterator = nullptr; - trace_iterator = xbt_new0(s_tmgr_trace_event_t, 1); - trace_iterator->trace = trace; - trace_iterator->idx = 0; + trace_iterator = new s_tmgr_trace_event_t; + trace_iterator->trace = trace; + trace_iterator->idx = 0; trace_iterator->resource = resource; + trace_iterator->free_me = false; xbt_assert((trace_iterator->idx < trace->event_list.size()), "Your trace should have at least one event!"); - xbt_heap_push(heap_, trace_iterator, 0. /*start_time*/); + heap_.emplace(0.0 /* start time */, trace_iterator); return trace_iterator; } @@ -137,9 +141,7 @@ tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t tr /** @brief returns the date of the next occurring event (pure function) */ double simgrid::trace_mgr::future_evt_set::next_date() const { - if (xbt_heap_size(heap_)) - return (xbt_heap_maxkey(heap_)); - return -1.0; + return heap_.empty() ? -1.0 : heap_.top().first; } /** @brief Retrieves the next occurring event, or nullptr if none happens before #date */ @@ -150,9 +152,10 @@ tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::pop_leq(double date, doub if (event_date > date) return nullptr; - tmgr_trace_event_t trace_iterator = (tmgr_trace_event_t)xbt_heap_pop(heap_); - if (trace_iterator == nullptr) + if (heap_.empty()) return nullptr; + tmgr_trace_event_t trace_iterator = heap_.top().second; + heap_.pop(); tmgr_trace_t trace = trace_iterator->trace; *resource = trace_iterator->resource; @@ -162,13 +165,13 @@ tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::pop_leq(double date, doub *value = dateVal.value_; if (trace_iterator->idx < trace->event_list.size() - 1) { - xbt_heap_push(heap_, trace_iterator, event_date + dateVal.date_); + heap_.emplace(event_date + dateVal.date_, trace_iterator); trace_iterator->idx++; } else if (dateVal.date_ > 0) { /* Last element. Shall we loop? */ - xbt_heap_push(heap_, trace_iterator, event_date + dateVal.date_); + heap_.emplace(event_date + dateVal.date_, trace_iterator); trace_iterator->idx = 1; /* idx=0 is a placeholder to store when events really start */ } else { /* If we don't loop, we don't need this trace_event anymore */ - trace_iterator->free_me = 1; + trace_iterator->free_me = true; } return trace_iterator; @@ -184,7 +187,7 @@ void tmgr_finalize() void tmgr_trace_event_unref(tmgr_trace_event_t* trace_event) { if ((*trace_event)->free_me) { - xbt_free(*trace_event); + delete *trace_event; *trace_event = nullptr; } } diff --git a/src/surf/trace_mgr.hpp b/src/surf/trace_mgr.hpp index 2cb74ce73a..955ff2a041 100644 --- a/src/surf/trace_mgr.hpp +++ b/src/surf/trace_mgr.hpp @@ -7,20 +7,20 @@ #define SURF_TMGR_H #include "simgrid/forward.h" -#include "xbt/heap.h" #include "xbt/sysdep.h" +#include #include -SG_BEGIN_DECL() +extern "C" { /* Iterator within a trace */ -typedef struct tmgr_trace_event { +struct s_tmgr_trace_event_t { tmgr_trace_t trace; unsigned int idx; sg_resource_t resource; - int free_me; -} s_tmgr_trace_event_t; -typedef struct tmgr_trace_event* tmgr_trace_event_t; + bool free_me; +}; +typedef s_tmgr_trace_event_t* tmgr_trace_event_t; /** * \brief Free a trace event structure @@ -35,10 +35,8 @@ XBT_PUBLIC(void) tmgr_finalize(); XBT_PUBLIC(tmgr_trace_t) tmgr_trace_new_from_file(std::string filename); XBT_PUBLIC(tmgr_trace_t) tmgr_trace_new_from_string(std::string id, std::string input, double periodicity); +} -SG_END_DECL() - -#ifdef __cplusplus namespace simgrid { /** @brief Modeling of the availability profile (due to an external load) or the churn * @@ -93,11 +91,10 @@ public: tmgr_trace_event_t add_trace(tmgr_trace_t trace, simgrid::surf::Resource * resource); private: - // TODO: use a boost type for the heap (or a ladder queue) - xbt_heap_t heap_ = xbt_heap_new(8, xbt_free_f); /* Content: only trace_events (yep, 8 is an arbitrary value) */ + typedef std::pair Qelt; + std::priority_queue, std::greater> heap_; }; }} // namespace simgrid::trace_mgr -#endif /* C++ only */ #endif /* SURF_TMGR_H */ diff --git a/src/surf/xml/platf.hpp b/src/surf/xml/platf.hpp index 17c6f9e155..51b7cc3072 100644 --- a/src/surf/xml/platf.hpp +++ b/src/surf/xml/platf.hpp @@ -8,7 +8,7 @@ #include -SG_BEGIN_DECL() +extern "C" { /* Module management functions */ XBT_PUBLIC(void) sg_platf_init();; @@ -17,7 +17,7 @@ XBT_PUBLIC(void) sg_platf_exit(); XBT_PUBLIC(void) surf_parse_open(const char *file); XBT_PUBLIC(void) surf_parse_close(); XBT_PUBLIC(void) surf_parse_assert(bool cond, std::string msg); -XBT_PUBLIC(void) XBT_ATTRIB_NORETURN surf_parse_error(std::string msg); +XBT_ATTRIB_NORETURN XBT_PUBLIC(void) surf_parse_error(std::string msg); XBT_PUBLIC(void) surf_parse_assert_netpoint(std::string hostname, std::string pre, std::string post); XBT_PUBLIC(void) surf_parse_warn(std::string msg); @@ -29,7 +29,6 @@ XBT_PUBLIC(double) surf_parse_get_bandwidth(const char* string, const char* enti XBT_PUBLIC(double) surf_parse_get_speed(const char* string, const char* entity_kind, std::string name); XBT_PUBLIC(int) surf_parse(); /* Entry-point to the parser */ - -SG_END_DECL() +} #endif diff --git a/src/surf/xml/platf_private.hpp b/src/surf/xml/platf_private.hpp index 93958801c9..13b3012cff 100644 --- a/src/surf/xml/platf_private.hpp +++ b/src/surf/xml/platf_private.hpp @@ -15,7 +15,7 @@ #include #include -SG_BEGIN_DECL() +extern "C" { #include "src/surf/xml/simgrid_dtd.h" #ifndef YY_TYPEDEF_YY_SIZE_T @@ -23,12 +23,12 @@ SG_BEGIN_DECL() typedef size_t yy_size_t; #endif -typedef enum { - SURF_CLUSTER_DRAGONFLY=3, - SURF_CLUSTER_FAT_TREE=2, - SURF_CLUSTER_FLAT = 1, - SURF_CLUSTER_TORUS = 0 -} e_surf_cluster_topology_t; +enum e_surf_cluster_topology_t { + SURF_CLUSTER_DRAGONFLY = 3, + SURF_CLUSTER_FAT_TREE = 2, + SURF_CLUSTER_FLAT = 1, + SURF_CLUSTER_TORUS = 0 +}; /* ***************************************** */ /* @@ -41,16 +41,16 @@ typedef enum { * used, instead of malloced structures. */ -typedef struct { - const char* id; +struct s_sg_platf_host_cbarg_t { + const char* id = nullptr; std::vector speed_per_pstate; - int pstate; - int core_amount; - tmgr_trace_t speed_trace; - tmgr_trace_t state_trace; - const char* coord; - std::map* properties; -} s_sg_platf_host_cbarg_t; + int pstate = 0; + int core_amount = 0; + tmgr_trace_t speed_trace = nullptr; + tmgr_trace_t state_trace = nullptr; + const char* coord = nullptr; + std::map* properties = nullptr; +}; typedef s_sg_platf_host_cbarg_t* sg_platf_host_cbarg_t; class HostLinkCreationArgs { @@ -83,15 +83,15 @@ public: tmgr_trace_t state_trace; }; -typedef struct s_sg_platf_route_cbarg *sg_platf_route_cbarg_t; -typedef struct s_sg_platf_route_cbarg { - bool symmetrical; - sg_netpoint_t src; - sg_netpoint_t dst; - sg_netpoint_t gw_src; - sg_netpoint_t gw_dst; - std::vector* link_list; -} s_sg_platf_route_cbarg_t; +struct s_sg_platf_route_cbarg_t { + bool symmetrical = false; + sg_netpoint_t src = nullptr; + sg_netpoint_t dst = nullptr; + sg_netpoint_t gw_src = nullptr; + sg_netpoint_t gw_dst = nullptr; + std::vector link_list; +}; +typedef s_sg_platf_route_cbarg_t* sg_platf_route_cbarg_t; class ClusterCreationArgs { public: @@ -152,11 +152,11 @@ public: std::string name; }; -typedef struct s_sg_platf_prop_cbarg *sg_platf_prop_cbarg_t; -typedef struct s_sg_platf_prop_cbarg { +struct s_sg_platf_prop_cbarg_t { const char *id; const char *value; -} s_sg_platf_prop_cbarg_t; +}; +typedef s_sg_platf_prop_cbarg_t* sg_platf_prop_cbarg_t; class TraceCreationArgs { public: @@ -173,17 +173,16 @@ public: std::string element; }; -typedef struct s_sg_platf_process_cbarg *sg_platf_process_cbarg_t; -typedef struct s_sg_platf_process_cbarg { - const char **argv; - int argc; - std::map* properties; - const char *host; - const char *function; - double start_time; - double kill_time; - e_surf_process_on_failure_t on_failure; -} s_sg_platf_process_cbarg_t; +struct s_sg_platf_process_cbarg_t { + std::vector args; + std::map* properties = nullptr; + const char* host = nullptr; + const char* function = nullptr; + double start_time = 0.0; + double kill_time = 0.0; + e_surf_process_on_failure_t on_failure = {}; +}; +typedef s_sg_platf_process_cbarg_t* sg_platf_process_cbarg_t; class ZoneCreationArgs { public: @@ -235,10 +234,7 @@ XBT_PUBLIC(void) surf_parse_set_out(FILE * out_str); XBT_PUBLIC(int) surf_parse_get_debug(); XBT_PUBLIC(void) surf_parse_set_debug(int bdebug); XBT_PUBLIC(int) surf_parse_lex_destroy(); - -XBT_PUBLIC(void) routing_route_free(sg_platf_route_cbarg_t route); - -SG_END_DECL() +} namespace simgrid { namespace surf { diff --git a/src/surf/xml/simgrid.dtd b/src/surf/xml/simgrid.dtd index 475388fd15..07d6a11f13 100644 --- a/src/surf/xml/simgrid.dtd +++ b/src/surf/xml/simgrid.dtd @@ -4,11 +4,17 @@ More info: http://simgrid.gforge.inria.fr/simgrid/latest/doc/platform.html To upgrade your files, use the tool simgrid_update_xml +* Things that will change in upcoming version 5 (TODO): + - The following tags will be removed: + - spits an error since v3.18 + - does nothing since a very long time + - , , and , deprecated in DTD4.1 + * New in DTD version 4.1 (in SimGrid 3.16): backward compatible change (v4 files are valid v4.1 files) - can be used as a synonym for the now deprecated - can be used as a synonym for the now deprecated - an be used as a synonym for the now deprecated - - can be used as a synonym for the now deprecated + - can be used as a synonym for the now deprecated * New in DTD version 4 (in SimGrid 3.13): - Rename (power->speed) the attributes describing the amount of flop diff --git a/src/surf/xml/simgrid_dtd.c b/src/surf/xml/simgrid_dtd.c index 361af31057..ac9cb57a55 100644 --- a/src/surf/xml/simgrid_dtd.c +++ b/src/surf/xml/simgrid_dtd.c @@ -50,7 +50,7 @@ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. + * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 @@ -67,7 +67,7 @@ typedef uint32_t flex_uint32_t; typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; +typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; @@ -200,86 +200,86 @@ extern FILE *surf_parse_in, *surf_parse_out; if ( *p == '\n' )\ --surf_parse_lineno;\ }while(0) - + /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ - do \ - { \ - /* Undo effects of setting up surf_parse_text. */ \ + do \ + { \ + /* Undo effects of setting up surf_parse_text. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up surf_parse_text again */ \ - } \ - while ( 0 ) + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up surf_parse_text again */ \ + } \ + while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - int yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; - int yy_buffer_status; + int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via surf_parse_restart()), so that the user can continue scanning by - * just pointing surf_parse_in at a new input file. - */ + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via surf_parse_restart()), so that the user can continue scanning by + * just pointing surf_parse_in at a new input file. + */ #define YY_BUFFER_EOF_PENDING 2 - }; + }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ @@ -304,13 +304,13 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* yy_hold_char holds the character lost when surf_parse_text is formed. */ static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ +static int yy_n_chars; /* number of characters read into yy_ch_buf */ unsigned int surf_parse_leng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ /* Flag which is used to allow surf_parse_wrap()'s to do buffer switches * instead of setting up a fresh surf_parse_in. A bit of a hack ... @@ -342,24 +342,24 @@ void surf_parse_free (void * ); #define yy_new_buffer surf_parse__create_buffer #define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ surf_parse_ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ + YY_CURRENT_BUFFER_LVALUE = \ surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } #define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ + { \ + if ( ! YY_CURRENT_BUFFER ){\ surf_parse_ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ + YY_CURRENT_BUFFER_LVALUE = \ surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) @@ -393,21 +393,21 @@ static void yynoreturn yy_fatal_error (yyconst char* msg ); * corresponding action - sets up surf_parse_text. */ #define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - surf_parse_leng = (int) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; + (yytext_ptr) = yy_bp; \ + surf_parse_leng = (int) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 647 #define YY_END_OF_BUFFER 648 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; static yyconst flex_int16_t yy_accept[3886] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4940,38 +4940,38 @@ static yyconst flex_int16_t yy_chk[13918] = /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[648] = { 0, -0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 0, 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, - 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, 0, - 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, +0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 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, + 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, 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; @@ -4994,13 +4994,13 @@ char *surf_parse_text; * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. * FleXML is Copyright (C) 2003-2013 Martin Quinson. All rights reserved. * (1.9.6). - * + * * There are two, intertwined parts to this program, part A and part B. * * Part A * ------ - * - * Some parts, here collectively called "Part A", are found in the + * + * Some parts, here collectively called "Part A", are found in the * FleXML package. They are Copyright (C) 1999-2005 Kristoffer Rose * and Copyright (C) 2003-2013 Martin Quinson. All rights reserved. * @@ -5018,20 +5018,20 @@ char *surf_parse_text; * Notice that these are explicit rights granted to you for files * generated by the FleXML system. For your rights in connection with * the FleXML system itself please consult the GNU General Public License. - * + * * Part B * ------ - * - * The other parts, here collectively called "Part B", and which came - * from the DTD used by FleXML to generate this program, can be + * + * The other parts, here collectively called "Part B", and which came + * from the DTD used by FleXML to generate this program, can be * distributed (or not, as the case may be) under the terms of whoever - * wrote them, provided these terms respect and obey the two conditions + * wrote them, provided these terms respect and obey the two conditions * above under the heading "Part A". * * The author of and contributors to FleXML specifically disclaim - * any copyright interest in "Part B", unless "Part B" was written + * any copyright interest in "Part B", unless "Part B" was written * by the author of or contributors to FleXML. - * + * */ /* Version strings. */ @@ -5044,7 +5044,7 @@ const char surfxml_flexml_version[] = "1.9.6"; #include #include #include - + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__) # ifndef __STRICT_ANSI__ # include @@ -5053,7 +5053,7 @@ const char surfxml_flexml_version[] = "1.9.6"; #else # include #endif - + #ifndef FLEXML_INDEXSTACKSIZE #define FLEXML_INDEXSTACKSIZE 1000 #endif @@ -5451,23 +5451,23 @@ short int surfxml_zoneRoute_symmetrical_isset; /* XML state. */ #ifdef FLEX_DEBUG -# define ENTER(state) debug_enter(state,#state) -# define LEAVE debug_leave() -# define SET(state) debug_set(state,#state) +# define ENTER(state) debug_enter(state,#state) +# define LEAVE debug_leave() +# define SET(state) debug_set(state,#state) static void debug_enter(int, const char*); static void debug_leave(void); static void debug_set(int, const char*); #else -# define ENTER(state) (yy_push_state(state)) -# define LEAVE (yy_pop_state()) -# define SET(state) BEGIN(state) +# define ENTER(state) (yy_push_state(state)) +# define LEAVE (yy_pop_state()) +# define SET(state) BEGIN(state) #endif /* Generic actions. */ -#define SKIP /*skip*/ +#define SKIP /*skip*/ #define SUCCEED CLEANUP; return 0 -#define FAIL return fail +#define FAIL return fail static int fail(const char*, ...); enum {flexml_max_err_msg_size = 512}; @@ -5504,12 +5504,12 @@ static int inext = 1; static int ck_blimit() { if (bnext >= blimit) { - blimit += FLEXML_BUFFERSTACKSIZE + 2; - { - char *temp = (char *) realloc(surfxml_bufferstack, blimit); - assert(temp); - surfxml_bufferstack = temp; - } + blimit += FLEXML_BUFFERSTACKSIZE + 2; + { + char *temp = (char *) realloc(surfxml_bufferstack, blimit); + assert(temp); + surfxml_bufferstack = temp; + } } return 0; } @@ -5518,12 +5518,12 @@ static int ck_blimit() static int ck_ilimit() { if (inext >= ilimit) { - ilimit += FLEXML_INDEXSTACKSIZE + 2; - { - int *temp = (int *) realloc(indexstack, ilimit); - assert(temp); - indexstack = temp; - } + ilimit += FLEXML_INDEXSTACKSIZE + 2; + { + int *temp = (int *) realloc(indexstack, ilimit); + assert(temp); + indexstack = temp; + } } return 0; } @@ -5537,16 +5537,16 @@ static void surfxml_bufferliteral(char c, int* pp, const char* text) assert(s && e && s <= e); ++s; while (s < e) { - if (isspace(*s)) { - BUFFERPUTC(' '); - do ++s; while (s < e && isspace(*s)); - } else - BUFFERPUTC(*s++); + if (isspace(*s)) { + BUFFERPUTC(' '); + do ++s; while (s < e && isspace(*s)); + } else + BUFFERPUTC(*s++); } } else { const char *s = text; while (*s) - BUFFERPUTC(*s++); + BUFFERPUTC(*s++); } BUFFERDONE; } @@ -5556,7 +5556,7 @@ static void pushbuffer(int p) { ck_ilimit(); indexstack[inext++] = p; - indexstack[inext++] = bnext; + indexstack[inext++] = bnext; } static int popbuffer(void) @@ -5580,18 +5580,18 @@ static int popbuffer(void) /* Miscellaneous. */ /* Parser states (flex `exclusive start conditions'): * - * PROLOG the XML prolog of the document before - * DOCTYPE the XML prolog of the document after - * EPILOG after the root element - * INCOMMENT inside an XML comment - * INPI inside an XML PI - * VALUE1 inside a '...'-delimited literal - * VALUE2 inside a "..."-delimited literal - * CDATA inside a section. - * ROOT_ expect root element - * AL_ inside the attribute list for - * IN_ inside a with element contents (ready for end tag) - * IMPOSSIBLE dummy to permit disabling rules; must be last + * PROLOG the XML prolog of the document before + * DOCTYPE the XML prolog of the document after + * EPILOG after the root element + * INCOMMENT inside an XML comment + * INPI inside an XML PI + * VALUE1 inside a '...'-delimited literal + * VALUE2 inside a "..."-delimited literal + * CDATA inside a section. + * ROOT_ expect root element + * AL_ inside the attribute list for + * IN_ inside a with element contents (ready for end tag) + * IMPOSSIBLE dummy to permit disabling rules; must be last */ /* State names. */ @@ -5785,7 +5785,7 @@ FILE *surf_parse_get_out (void ); void surf_parse_set_out (FILE * _out_str ); - int surf_parse_get_leng (void ); + int surf_parse_get_leng (void ); char *surf_parse_get_text (void ); @@ -5806,7 +5806,7 @@ extern int surf_parse_wrap (void ); #endif #ifndef YY_NO_UNPUT - + #endif #ifndef yytext_ptr @@ -5830,11 +5830,11 @@ static int input (void ); static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = NULL; - + static void yy_push_state (int _new_state ); - + static void yy_pop_state (void ); - + /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ @@ -5858,33 +5858,33 @@ static int input (void ); */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < ( size_t ) max_size && \ - (c = getc( surf_parse_in )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( surf_parse_in ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = (int) fread(buf, 1, max_size, surf_parse_in))==0 && ferror(surf_parse_in)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(surf_parse_in); \ - } \ - }\ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < ( size_t ) max_size && \ + (c = getc( surf_parse_in )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( surf_parse_in ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, max_size, surf_parse_in))==0 && ferror(surf_parse_in)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(surf_parse_in); \ + } \ + }\ \ #endif @@ -5933,43 +5933,43 @@ extern int surf_parse_lex (void); #endif #define YY_RULE_SETUP \ - YY_USER_ACTION + YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - - if ( !(yy_init) ) - { - (yy_init) = 1; + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) + { + (yy_init) = 1; #ifdef YY_USER_INIT - YY_USER_INIT; + YY_USER_INIT; #endif - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ - if ( ! surf_parse_in ) - surf_parse_in = stdin; + if ( ! surf_parse_in ) + surf_parse_in = stdin; - if ( ! surf_parse_out ) - surf_parse_out = stdout; + if ( ! surf_parse_out ) + surf_parse_out = stdout; - if ( ! YY_CURRENT_BUFFER ) { - surf_parse_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE ); - } + if ( ! YY_CURRENT_BUFFER ) { + surf_parse_ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE ); + } - surf_parse__load_buffer_state( ); - } + surf_parse__load_buffer_state( ); + } - { + { /* Bypass Flex's default INITIAL state and begin by parsing the XML prolog. */ SET(PROLOG); @@ -6150,153 +6150,153 @@ YY_DECL /* COMMENTS and PIs: handled uniformly for efficiency. */ - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); - /* Support of surf_parse_text. */ - *yy_cp = (yy_hold_char); + /* Support of surf_parse_text. */ + *yy_cp = (yy_hold_char); - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; - yy_current_state = (yy_start); + yy_current_state = (yy_start); yy_match: - do - { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - 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 >= 3886 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 13842 ); + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + 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 >= 3886 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 13842 ); yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) - { - unsigned int yyl; - for ( yyl = 0; yyl < surf_parse_leng; ++yyl ) - if ( surf_parse_text[yyl] == '\n' ) - + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + unsigned int yyl; + for ( yyl = 0; yyl < surf_parse_leng; ++yyl ) + if ( surf_parse_text[yyl] == '\n' ) + surf_parse_lineno++; ; - } + } -do_action: /* This label is used only to access EOF actions. */ +do_action: /* This label is used only to access EOF actions. */ - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; case 1: YY_RULE_SETUP ENTER(INCOMMENT); - YY_BREAK + YY_BREAK case 2: YY_RULE_SETUP ENTER(INPI); - YY_BREAK + YY_BREAK case 3: YY_RULE_SETUP LEAVE; - YY_BREAK + YY_BREAK case 4: case 5: case 6: /* rule 6 can match eol */ YY_RULE_SETUP SKIP; - YY_BREAK + YY_BREAK case YY_STATE_EOF(INCOMMENT): FAIL("EOF in comment."); - YY_BREAK + YY_BREAK case 7: YY_RULE_SETUP LEAVE; - YY_BREAK + YY_BREAK case 8: case 9: /* rule 9 can match eol */ YY_RULE_SETUP SKIP; - YY_BREAK + YY_BREAK case YY_STATE_EOF(INPI): FAIL("EOF in PI (processing instruction)."); - YY_BREAK + YY_BREAK /* SPACES: skipped uniformly */ case 10: /* rule 10 can match eol */ YY_RULE_SETUP SKIP; - YY_BREAK + YY_BREAK /* PROLOG: determine root element and process it. */ case 11: /* rule 11 can match eol */ YY_RULE_SETUP -SET(DOCTYPE); - YY_BREAK +SET(DOCTYPE); + YY_BREAK case 12: /* rule 12 can match eol */ YY_RULE_SETUP FAIL("Bad declaration %s.\nIf your are using a XML v3 file (check the version attribute in ), please update it with tools/simgrid_update_xml.pl",surf_parse_text); - YY_BREAK + YY_BREAK case 13: /* rule 13 can match eol */ YY_RULE_SETUP SET(ROOT_surfxml_platform); - YY_BREAK + YY_BREAK case 14: /* rule 14 can match eol */ YY_RULE_SETUP FAIL("Bad declaration %s.\nIf your are using a XML v3 file (check the version attribute in ), please update it with tools/simgrid_update_xml.pl",surf_parse_text); - YY_BREAK + YY_BREAK case 15: YY_RULE_SETUP FAIL("Unexpected character `%c' in prolog.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(PROLOG): case YY_STATE_EOF(DOCTYPE): FAIL("EOF in prolog."); - YY_BREAK + YY_BREAK /* RULES DERIVED FROM DTD. */ case 16: /* rule 16 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 17: /* rule 17 can match eol */ YY_RULE_SETUP @@ -6307,88 +6307,88 @@ YY_RULE_SETUP surfxml_AS_routing_isset = 0; ENTER(AL_surfxml_AS); pushbuffer(0); } - YY_BREAK + YY_BREAK case 18: /* rule 18 can match eol */ YY_RULE_SETUP if (surfxml_AS_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_AS_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_AS_id); - YY_BREAK + YY_BREAK case 19: /* rule 19 can match eol */ YY_RULE_SETUP if (surfxml_AS_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_AS_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_AS_id); - YY_BREAK + YY_BREAK case 20: /* rule 20 can match eol */ case 21: /* rule 21 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_Full; - YY_BREAK + YY_BREAK case 22: /* rule 22 can match eol */ case 23: /* rule 23 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_Floyd; - YY_BREAK + YY_BREAK case 24: /* rule 24 can match eol */ case 25: /* rule 25 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_Dijkstra; - YY_BREAK + YY_BREAK case 26: /* rule 26 can match eol */ case 27: /* rule 27 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_DijkstraCache; - YY_BREAK + YY_BREAK case 28: /* rule 28 can match eol */ case 29: /* rule 29 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_None; - YY_BREAK + YY_BREAK case 30: /* rule 30 can match eol */ case 31: /* rule 31 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_Vivaldi; - YY_BREAK + YY_BREAK case 32: /* rule 32 can match eol */ case 33: /* rule 33 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_Cluster; - YY_BREAK + YY_BREAK case 34: /* rule 34 can match eol */ case 35: /* rule 35 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_ClusterTorus; - YY_BREAK + YY_BREAK case 36: /* rule 36 can match eol */ case 37: /* rule 37 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_ClusterFatTree; - YY_BREAK + YY_BREAK case 38: /* rule 38 can match eol */ case 39: /* rule 39 can match eol */ YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_ClusterDragonfly; - YY_BREAK + YY_BREAK case 40: YY_RULE_SETUP { @@ -6396,7 +6396,7 @@ YY_RULE_SETUP if (!AX_surfxml_AS_routing) FAIL("Required attribute `routing' not set for `AS' element."); LEAVE; STag_surfxml_AS();surfxml_pcdata_ix = 0; ENTER(S_surfxml_AS); } - YY_BREAK + YY_BREAK case 41: YY_RULE_SETUP { @@ -6410,18 +6410,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 42: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of AS element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 43: YY_RULE_SETUP FAIL("Bad attribute `%s' in `AS' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_AS): FAIL("EOF in attribute list of `AS' element."); - YY_BREAK + YY_BREAK case 44: /* rule 44 can match eol */ @@ -6437,16 +6437,16 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 45: /* rule 45 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 46: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_AS): case YY_STATE_EOF(S_surfxml_AS): case YY_STATE_EOF(S_surfxml_AS_1): @@ -6454,14 +6454,14 @@ case YY_STATE_EOF(S_surfxml_AS_3): case YY_STATE_EOF(S_surfxml_AS_4): case YY_STATE_EOF(S_surfxml_AS_6): case YY_STATE_EOF(S_surfxml_AS_8): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 47: /* rule 47 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 48: /* rule 48 can match eol */ YY_RULE_SETUP @@ -6478,62 +6478,62 @@ YY_RULE_SETUP surfxml_ASroute_symmetrical_isset = 0; ENTER(AL_surfxml_ASroute); pushbuffer(0); } - YY_BREAK + YY_BREAK case 49: /* rule 49 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); - YY_BREAK + YY_BREAK case 50: /* rule 50 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); - YY_BREAK + YY_BREAK case 51: /* rule 51 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 + YY_BREAK case 52: /* rule 52 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); - YY_BREAK + YY_BREAK case 53: /* rule 53 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); - YY_BREAK + YY_BREAK case 54: /* rule 54 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); - YY_BREAK + YY_BREAK case 55: /* rule 55 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 + YY_BREAK case 56: /* rule 56 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 + YY_BREAK case 57: /* rule 57 can match eol */ case 58: /* rule 58 can match eol */ YY_RULE_SETUP A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES; - YY_BREAK + YY_BREAK case 59: /* rule 59 can match eol */ case 60: /* rule 60 can match eol */ YY_RULE_SETUP A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO; - YY_BREAK + YY_BREAK case 61: YY_RULE_SETUP { @@ -6543,7 +6543,7 @@ YY_RULE_SETUP if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute); } - YY_BREAK + YY_BREAK case 62: YY_RULE_SETUP { @@ -6553,24 +6553,24 @@ YY_RULE_SETUP if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); LEAVE; STag_surfxml_ASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_ASroute(); popbuffer(); /* attribute */ switch (YY_START) { - case S_surfxml_AS: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; - case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; - case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_4: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 63: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 64: YY_RULE_SETUP FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_ASroute): FAIL("EOF in attribute list of `ASroute' element."); - YY_BREAK + YY_BREAK case 65: /* rule 65 can match eol */ @@ -6580,33 +6580,33 @@ YY_RULE_SETUP ETag_surfxml_ASroute(); popbuffer(); /* attribute */ switch (YY_START) { - case S_surfxml_AS: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; - case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; - case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_4: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 66: /* rule 66 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 67: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_ASroute): case YY_STATE_EOF(S_surfxml_ASroute): case YY_STATE_EOF(S_surfxml_ASroute_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 68: /* rule 68 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 69: /* rule 69 can match eol */ YY_RULE_SETUP @@ -6623,62 +6623,62 @@ YY_RULE_SETUP surfxml_actor_start___time_isset = 0; ENTER(AL_surfxml_actor); pushbuffer(0); } - YY_BREAK + YY_BREAK case 70: /* rule 70 can match eol */ YY_RULE_SETUP if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_actor_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_function); - YY_BREAK + YY_BREAK case 71: /* rule 71 can match eol */ YY_RULE_SETUP if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_actor_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_function); - YY_BREAK + YY_BREAK case 72: /* rule 72 can match eol */ YY_RULE_SETUP if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_actor_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_host); - YY_BREAK + YY_BREAK case 73: /* rule 73 can match eol */ YY_RULE_SETUP if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_actor_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_host); - YY_BREAK + YY_BREAK case 74: /* rule 74 can match eol */ YY_RULE_SETUP if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_actor_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_kill___time); - YY_BREAK + YY_BREAK case 75: /* rule 75 can match eol */ YY_RULE_SETUP if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_actor_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_kill___time); - YY_BREAK + YY_BREAK case 76: /* rule 76 can match eol */ case 77: /* rule 77 can match eol */ YY_RULE_SETUP A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_DIE; - YY_BREAK + YY_BREAK case 78: /* rule 78 can match eol */ case 79: /* rule 79 can match eol */ YY_RULE_SETUP A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_RESTART; - YY_BREAK + YY_BREAK case 80: /* rule 80 can match eol */ YY_RULE_SETUP if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_actor_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_start___time); - YY_BREAK + YY_BREAK case 81: /* rule 81 can match eol */ YY_RULE_SETUP if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_actor_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_start___time); - YY_BREAK + YY_BREAK case 82: YY_RULE_SETUP { @@ -6686,7 +6686,7 @@ YY_RULE_SETUP if (!AX_surfxml_actor_host) FAIL("Required attribute `host' not set for `actor' element."); LEAVE; STag_surfxml_actor();surfxml_pcdata_ix = 0; ENTER(S_surfxml_actor); } - YY_BREAK + YY_BREAK case 83: YY_RULE_SETUP { @@ -6697,18 +6697,18 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break; } } - YY_BREAK + YY_BREAK case 84: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of actor element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 85: YY_RULE_SETUP FAIL("Bad attribute `%s' in `actor' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_actor): FAIL("EOF in attribute list of `actor' element."); - YY_BREAK + YY_BREAK case 86: /* rule 86 can match eol */ @@ -6721,27 +6721,27 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break; } } - YY_BREAK + YY_BREAK case 87: /* rule 87 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 88: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_actor): case YY_STATE_EOF(S_surfxml_actor): case YY_STATE_EOF(S_surfxml_actor_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 89: /* rule 89 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 90: /* rule 90 can match eol */ YY_RULE_SETUP @@ -6750,25 +6750,25 @@ YY_RULE_SETUP surfxml_argument_value_isset = 0; ENTER(AL_surfxml_argument); pushbuffer(0); } - YY_BREAK + YY_BREAK case 91: /* rule 91 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 + YY_BREAK case 92: /* rule 92 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 + YY_BREAK case 93: 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 + YY_BREAK case 94: YY_RULE_SETUP { @@ -6779,18 +6779,18 @@ YY_RULE_SETUP case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break; } } - YY_BREAK + YY_BREAK case 95: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 96: YY_RULE_SETUP FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_argument): FAIL("EOF in attribute list of `argument' element."); - YY_BREAK + YY_BREAK case 97: /* rule 97 can match eol */ @@ -6804,25 +6804,25 @@ YY_RULE_SETUP case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break; } } - YY_BREAK + YY_BREAK case 98: /* rule 98 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 99: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_argument): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 100: /* rule 100 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 101: /* rule 101 can match eol */ YY_RULE_SETUP @@ -6835,38 +6835,38 @@ YY_RULE_SETUP surfxml_backbone_latency_isset = 0; ENTER(AL_surfxml_backbone); pushbuffer(0); } - YY_BREAK + YY_BREAK case 102: /* rule 102 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 + YY_BREAK case 103: /* rule 103 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 + YY_BREAK case 104: /* rule 104 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 + YY_BREAK case 105: /* rule 105 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 + YY_BREAK case 106: /* rule 106 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 + YY_BREAK case 107: /* rule 107 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 + YY_BREAK case 108: YY_RULE_SETUP { @@ -6875,7 +6875,7 @@ YY_RULE_SETUP if (!AX_surfxml_backbone_latency) FAIL("Required attribute `latency' not set for `backbone' element."); LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone); } - YY_BREAK + YY_BREAK case 109: YY_RULE_SETUP { @@ -6888,18 +6888,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 110: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 111: YY_RULE_SETUP FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_backbone): FAIL("EOF in attribute list of `backbone' element."); - YY_BREAK + YY_BREAK case 112: /* rule 112 can match eol */ @@ -6913,25 +6913,25 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 113: /* rule 113 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 114: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_backbone): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 115: /* rule 115 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 116: /* rule 116 can match eol */ YY_RULE_SETUP @@ -6946,48 +6946,48 @@ YY_RULE_SETUP surfxml_bypassASroute_src_isset = 0; ENTER(AL_surfxml_bypassASroute); pushbuffer(0); } - YY_BREAK + YY_BREAK case 117: /* rule 117 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); - YY_BREAK + YY_BREAK case 118: /* rule 118 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); - YY_BREAK + YY_BREAK case 119: /* rule 119 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 + YY_BREAK case 120: /* rule 120 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 + YY_BREAK case 121: /* rule 121 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); - YY_BREAK + YY_BREAK case 122: /* rule 122 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); - YY_BREAK + YY_BREAK case 123: /* rule 123 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 + YY_BREAK case 124: /* rule 124 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 + YY_BREAK case 125: YY_RULE_SETUP { @@ -6997,7 +6997,7 @@ YY_RULE_SETUP if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element."); LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute); } - YY_BREAK + YY_BREAK case 126: YY_RULE_SETUP { @@ -7011,18 +7011,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 127: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 128: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_bypassASroute): FAIL("EOF in attribute list of `bypassASroute' element."); - YY_BREAK + YY_BREAK case 129: /* rule 129 can match eol */ @@ -7036,27 +7036,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 130: /* rule 130 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 131: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_bypassASroute): case YY_STATE_EOF(S_surfxml_bypassASroute): case YY_STATE_EOF(S_surfxml_bypassASroute_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 132: /* rule 132 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 133: /* rule 133 can match eol */ YY_RULE_SETUP @@ -7067,28 +7067,28 @@ YY_RULE_SETUP surfxml_bypassRoute_src_isset = 0; ENTER(AL_surfxml_bypassRoute); pushbuffer(0); } - YY_BREAK + YY_BREAK case 134: /* rule 134 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 + YY_BREAK case 135: /* rule 135 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 + YY_BREAK case 136: /* rule 136 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 + YY_BREAK case 137: /* rule 137 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 + YY_BREAK case 138: YY_RULE_SETUP { @@ -7096,7 +7096,7 @@ YY_RULE_SETUP if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute); } - YY_BREAK + YY_BREAK case 139: YY_RULE_SETUP { @@ -7108,18 +7108,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 140: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 141: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_bypassRoute): FAIL("EOF in attribute list of `bypassRoute' element."); - YY_BREAK + YY_BREAK case 142: /* rule 142 can match eol */ @@ -7133,27 +7133,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 143: /* rule 143 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 144: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_bypassRoute): case YY_STATE_EOF(S_surfxml_bypassRoute): case YY_STATE_EOF(S_surfxml_bypassRoute_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 145: /* rule 145 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 146: /* rule 146 can match eol */ YY_RULE_SETUP @@ -7168,48 +7168,48 @@ YY_RULE_SETUP surfxml_bypassZoneRoute_src_isset = 0; ENTER(AL_surfxml_bypassZoneRoute); pushbuffer(0); } - YY_BREAK + YY_BREAK case 147: /* rule 147 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_dst); - YY_BREAK + YY_BREAK case 148: /* rule 148 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_dst); - YY_BREAK + YY_BREAK case 149: /* rule 149 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst); - YY_BREAK + YY_BREAK case 150: /* rule 150 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst); - YY_BREAK + YY_BREAK case 151: /* rule 151 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src); - YY_BREAK + YY_BREAK case 152: /* rule 152 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src); - YY_BREAK + YY_BREAK case 153: /* rule 153 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_src); - YY_BREAK + YY_BREAK case 154: /* rule 154 can match eol */ YY_RULE_SETUP if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_src); - YY_BREAK + YY_BREAK case 155: YY_RULE_SETUP { @@ -7219,7 +7219,7 @@ YY_RULE_SETUP if (!AX_surfxml_bypassZoneRoute_src) FAIL("Required attribute `src' not set for `bypassZoneRoute' element."); LEAVE; STag_surfxml_bypassZoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassZoneRoute); } - YY_BREAK + YY_BREAK case 156: YY_RULE_SETUP { @@ -7233,18 +7233,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 157: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassZoneRoute element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 158: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassZoneRoute' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_bypassZoneRoute): FAIL("EOF in attribute list of `bypassZoneRoute' element."); - YY_BREAK + YY_BREAK case 159: /* rule 159 can match eol */ @@ -7258,27 +7258,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 160: /* rule 160 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 161: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_bypassZoneRoute): case YY_STATE_EOF(S_surfxml_bypassZoneRoute): case YY_STATE_EOF(S_surfxml_bypassZoneRoute_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 162: /* rule 162 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 163: /* rule 163 can match eol */ YY_RULE_SETUP @@ -7299,78 +7299,78 @@ YY_RULE_SETUP surfxml_cabinet_suffix_isset = 0; ENTER(AL_surfxml_cabinet); pushbuffer(0); } - YY_BREAK + YY_BREAK case 164: /* rule 164 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); - YY_BREAK + YY_BREAK case 165: /* rule 165 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); - YY_BREAK + YY_BREAK case 166: /* rule 166 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 + YY_BREAK case 167: /* rule 167 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 + YY_BREAK case 168: /* rule 168 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 + YY_BREAK case 169: /* rule 169 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 + YY_BREAK case 170: /* rule 170 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); - YY_BREAK + YY_BREAK case 171: /* rule 171 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); - YY_BREAK + YY_BREAK case 172: /* rule 172 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); - YY_BREAK + YY_BREAK case 173: /* rule 173 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); - YY_BREAK + YY_BREAK case 174: /* rule 174 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cabinet_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_speed); - YY_BREAK + YY_BREAK case 175: /* rule 175 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cabinet_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_speed); - YY_BREAK + YY_BREAK case 176: /* rule 176 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); - YY_BREAK + YY_BREAK case 177: /* rule 177 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); - YY_BREAK + YY_BREAK case 178: YY_RULE_SETUP { @@ -7383,7 +7383,7 @@ YY_RULE_SETUP if (!AX_surfxml_cabinet_suffix) FAIL("Required attribute `suffix' not set for `cabinet' element."); LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet); } - YY_BREAK + YY_BREAK case 179: YY_RULE_SETUP { @@ -7402,18 +7402,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 180: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 181: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_cabinet): FAIL("EOF in attribute list of `cabinet' element."); - YY_BREAK + YY_BREAK case 182: /* rule 182 can match eol */ @@ -7429,25 +7429,25 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 183: /* rule 183 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 184: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_cabinet): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 185: /* rule 185 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 186: /* rule 186 can match eol */ YY_RULE_SETUP @@ -7490,221 +7490,221 @@ YY_RULE_SETUP surfxml_cluster_topology_isset = 0; ENTER(AL_surfxml_cluster); pushbuffer(0); } - YY_BREAK + YY_BREAK case 187: /* rule 187 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); - YY_BREAK + YY_BREAK case 188: /* rule 188 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); - YY_BREAK + YY_BREAK case 189: /* rule 189 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 + YY_BREAK case 190: /* rule 190 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); - YY_BREAK + YY_BREAK case 191: /* rule 191 can match eol */ case 192: /* rule 192 can match eol */ YY_RULE_SETUP A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED; - YY_BREAK + YY_BREAK case 193: /* rule 193 can match eol */ case 194: /* rule 194 can match eol */ YY_RULE_SETUP A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE; - YY_BREAK + YY_BREAK case 195: /* rule 195 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); - YY_BREAK + YY_BREAK case 196: /* rule 196 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); - YY_BREAK + YY_BREAK case 197: /* rule 197 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); - YY_BREAK + YY_BREAK case 198: /* rule 198 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); - YY_BREAK + YY_BREAK case 199: /* rule 199 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 + YY_BREAK case 200: /* rule 200 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 + YY_BREAK case 201: /* rule 201 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 + YY_BREAK case 202: /* rule 202 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); - YY_BREAK + YY_BREAK case 203: /* rule 203 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); - YY_BREAK + YY_BREAK case 204: /* rule 204 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); - YY_BREAK + YY_BREAK case 205: /* rule 205 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); - YY_BREAK + YY_BREAK case 206: /* rule 206 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); - YY_BREAK + YY_BREAK case 207: /* rule 207 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 + YY_BREAK case 208: /* rule 208 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 + YY_BREAK case 209: /* rule 209 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); - YY_BREAK + YY_BREAK case 210: /* rule 210 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); - YY_BREAK + YY_BREAK case 211: /* rule 211 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); - YY_BREAK + YY_BREAK case 212: /* rule 212 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); - YY_BREAK + YY_BREAK case 213: /* rule 213 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); - YY_BREAK + YY_BREAK case 214: /* rule 214 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); - YY_BREAK + YY_BREAK case 215: /* rule 215 can match eol */ case 216: /* rule 216 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED; - YY_BREAK + YY_BREAK case 217: /* rule 217 can match eol */ case 218: /* rule 218 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX; - YY_BREAK + YY_BREAK case 219: /* rule 219 can match eol */ case 220: /* rule 220 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE; - YY_BREAK + YY_BREAK case 221: /* rule 221 can match eol */ YY_RULE_SETUP if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cluster_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_speed); - YY_BREAK + YY_BREAK case 222: /* rule 222 can match eol */ YY_RULE_SETUP if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cluster_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_speed); - YY_BREAK + YY_BREAK case 223: /* rule 223 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); - YY_BREAK + YY_BREAK case 224: /* rule 224 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); - YY_BREAK + YY_BREAK case 225: /* rule 225 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 + YY_BREAK case 226: /* rule 226 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); - YY_BREAK + YY_BREAK case 227: /* rule 227 can match eol */ case 228: /* rule 228 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT; - YY_BREAK + YY_BREAK case 229: /* rule 229 can match eol */ case 230: /* rule 230 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS; - YY_BREAK + YY_BREAK case 231: /* rule 231 can match eol */ case 232: /* rule 232 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_FAT___TREE; - YY_BREAK + YY_BREAK case 233: /* rule 233 can match eol */ case 234: /* rule 234 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_DRAGONFLY; - YY_BREAK + YY_BREAK case 235: YY_RULE_SETUP { @@ -7717,7 +7717,7 @@ YY_RULE_SETUP if (!AX_surfxml_cluster_suffix) FAIL("Required attribute `suffix' not set for `cluster' element."); LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster); } - YY_BREAK + YY_BREAK case 236: YY_RULE_SETUP { @@ -7736,18 +7736,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 237: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 238: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_cluster): FAIL("EOF in attribute list of `cluster' element."); - YY_BREAK + YY_BREAK case 239: /* rule 239 can match eol */ @@ -7763,27 +7763,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 240: /* rule 240 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 241: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_cluster): case YY_STATE_EOF(S_surfxml_cluster): case YY_STATE_EOF(S_surfxml_cluster_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 242: /* rule 242 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 243: /* rule 243 can match eol */ YY_RULE_SETUP @@ -7792,24 +7792,24 @@ YY_RULE_SETUP surfxml_config_id_isset = 0; ENTER(AL_surfxml_config); pushbuffer(0); } - YY_BREAK + YY_BREAK case 244: /* rule 244 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 + YY_BREAK case 245: /* rule 245 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 + YY_BREAK case 246: YY_RULE_SETUP { LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config); } - YY_BREAK + YY_BREAK case 247: YY_RULE_SETUP { @@ -7818,18 +7818,18 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_2: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break; } } - YY_BREAK + YY_BREAK case 248: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 249: YY_RULE_SETUP FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_config): FAIL("EOF in attribute list of `config' element."); - YY_BREAK + YY_BREAK case 250: /* rule 250 can match eol */ @@ -7842,27 +7842,27 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_2: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break; } } - YY_BREAK + YY_BREAK case 251: /* rule 251 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 252: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_config): case YY_STATE_EOF(S_surfxml_config): case YY_STATE_EOF(S_surfxml_config_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 253: /* rule 253 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 254: /* rule 254 can match eol */ YY_RULE_SETUP @@ -7883,78 +7883,78 @@ YY_RULE_SETUP surfxml_host_state___file_isset = 0; ENTER(AL_surfxml_host); pushbuffer(0); } - YY_BREAK + YY_BREAK case 255: /* rule 255 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 + YY_BREAK case 256: /* rule 256 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 + YY_BREAK case 257: /* rule 257 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 + YY_BREAK case 258: /* rule 258 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 + YY_BREAK case 259: /* rule 259 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 + YY_BREAK case 260: /* rule 260 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 + YY_BREAK case 261: /* rule 261 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 + YY_BREAK case 262: /* rule 262 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 + YY_BREAK case 263: /* rule 263 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 + YY_BREAK case 264: /* rule 264 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 + YY_BREAK case 265: /* rule 265 can match eol */ YY_RULE_SETUP if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_host_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_speed); - YY_BREAK + YY_BREAK case 266: /* rule 266 can match eol */ YY_RULE_SETUP if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_host_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_speed); - YY_BREAK + YY_BREAK case 267: /* rule 267 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 + YY_BREAK case 268: /* rule 268 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 + YY_BREAK case 269: YY_RULE_SETUP { @@ -7962,7 +7962,7 @@ YY_RULE_SETUP if (!AX_surfxml_host_speed) FAIL("Required attribute `speed' not set for `host' element."); LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host); } - YY_BREAK + YY_BREAK case 270: YY_RULE_SETUP { @@ -7974,18 +7974,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 271: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 272: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_host): FAIL("EOF in attribute list of `host' element."); - YY_BREAK + YY_BREAK case 273: /* rule 273 can match eol */ @@ -7999,27 +7999,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 274: /* rule 274 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 275: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_host): case YY_STATE_EOF(S_surfxml_host): case YY_STATE_EOF(S_surfxml_host_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 276: /* rule 276 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 277: /* rule 277 can match eol */ YY_RULE_SETUP @@ -8032,38 +8032,38 @@ YY_RULE_SETUP surfxml_host___link_up_isset = 0; ENTER(AL_surfxml_host___link); pushbuffer(0); } - YY_BREAK + YY_BREAK case 278: /* rule 278 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 + YY_BREAK case 279: /* rule 279 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 + YY_BREAK case 280: /* rule 280 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 + YY_BREAK case 281: /* rule 281 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 + YY_BREAK case 282: /* rule 282 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 + YY_BREAK case 283: /* rule 283 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 + YY_BREAK case 284: YY_RULE_SETUP { @@ -8072,7 +8072,7 @@ YY_RULE_SETUP if (!AX_surfxml_host___link_up) FAIL("Required attribute `up' not set for `host_link' element."); LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link); } - YY_BREAK + YY_BREAK case 285: YY_RULE_SETUP { @@ -8085,18 +8085,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 286: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 287: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_host___link): FAIL("EOF in attribute list of `host_link' element."); - YY_BREAK + YY_BREAK case 288: /* rule 288 can match eol */ @@ -8110,26 +8110,26 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 289: /* rule 289 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 290: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_host___link): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK /* */ case 291: /* rule 291 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 292: /* rule 292 can match eol */ YY_RULE_SETUP @@ -8138,25 +8138,25 @@ YY_RULE_SETUP surfxml_include_file_isset = 0; ENTER(AL_surfxml_include); pushbuffer(0); } - YY_BREAK + YY_BREAK case 293: /* rule 293 can match eol */ YY_RULE_SETUP if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_include_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_include_file); - YY_BREAK + YY_BREAK case 294: /* rule 294 can match eol */ YY_RULE_SETUP if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_include_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_include_file); - YY_BREAK + YY_BREAK case 295: YY_RULE_SETUP { if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element."); LEAVE; STag_surfxml_include();surfxml_pcdata_ix = 0; ENTER(S_surfxml_include); } - YY_BREAK + YY_BREAK case 296: YY_RULE_SETUP { @@ -8169,18 +8169,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 297: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of include element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 298: YY_RULE_SETUP FAIL("Bad attribute `%s' in `include' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_include): FAIL("EOF in attribute list of `include' element."); - YY_BREAK + YY_BREAK case 299: /* rule 299 can match eol */ @@ -8196,27 +8196,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 300: /* rule 300 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 301: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_include): case YY_STATE_EOF(S_surfxml_include): case YY_STATE_EOF(S_surfxml_include_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 302: /* rule 302 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 303: /* rule 303 can match eol */ YY_RULE_SETUP @@ -8237,89 +8237,89 @@ YY_RULE_SETUP surfxml_link_state___file_isset = 0; ENTER(AL_surfxml_link); pushbuffer(0); } - YY_BREAK + YY_BREAK case 304: /* rule 304 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); - YY_BREAK + YY_BREAK case 305: /* rule 305 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); - YY_BREAK + YY_BREAK case 306: /* rule 306 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); - YY_BREAK + YY_BREAK case 307: /* rule 307 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); - YY_BREAK + YY_BREAK case 308: /* rule 308 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 + YY_BREAK case 309: /* rule 309 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); - YY_BREAK + YY_BREAK case 310: /* rule 310 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); - YY_BREAK + YY_BREAK case 311: /* rule 311 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); - YY_BREAK + YY_BREAK case 312: /* rule 312 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 + YY_BREAK case 313: /* rule 313 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); - YY_BREAK + YY_BREAK case 314: /* rule 314 can match eol */ case 315: /* rule 315 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED; - YY_BREAK + YY_BREAK case 316: /* rule 316 can match eol */ case 317: /* rule 317 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE; - YY_BREAK + YY_BREAK case 318: /* rule 318 can match eol */ case 319: /* rule 319 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX; - YY_BREAK + YY_BREAK case 320: /* rule 320 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 + YY_BREAK case 321: /* rule 321 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); - YY_BREAK + YY_BREAK case 322: YY_RULE_SETUP { @@ -8327,7 +8327,7 @@ YY_RULE_SETUP if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link); } - YY_BREAK + YY_BREAK case 323: YY_RULE_SETUP { @@ -8339,18 +8339,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 324: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 325: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_link): FAIL("EOF in attribute list of `link' element."); - YY_BREAK + YY_BREAK case 326: /* rule 326 can match eol */ @@ -8364,27 +8364,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 327: /* rule 327 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 328: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_link): case YY_STATE_EOF(S_surfxml_link): case YY_STATE_EOF(S_surfxml_link_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 329: /* rule 329 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 330: /* rule 330 can match eol */ YY_RULE_SETUP @@ -8395,7 +8395,7 @@ YY_RULE_SETUP surfxml_link___ctn_id_isset = 0; ENTER(AL_surfxml_link___ctn); pushbuffer(0); } - YY_BREAK + YY_BREAK case 331: /* rule 331 can match eol */ @@ -8403,38 +8403,38 @@ case 332: /* rule 332 can match eol */ YY_RULE_SETUP A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP; - YY_BREAK + YY_BREAK case 333: /* rule 333 can match eol */ case 334: /* rule 334 can match eol */ YY_RULE_SETUP A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN; - YY_BREAK + YY_BREAK case 335: /* rule 335 can match eol */ case 336: /* rule 336 can match eol */ YY_RULE_SETUP A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE; - YY_BREAK + YY_BREAK case 337: /* rule 337 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 + YY_BREAK case 338: /* rule 338 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 + YY_BREAK case 339: 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 + YY_BREAK case 340: YY_RULE_SETUP { @@ -8449,18 +8449,18 @@ YY_RULE_SETUP case S_surfxml_zoneRoute: case S_surfxml_zoneRoute_1: case S_surfxml_zoneRoute_2: SET(S_surfxml_zoneRoute_2); break; } } - YY_BREAK + YY_BREAK case 341: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 342: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_link___ctn): FAIL("EOF in attribute list of `link_ctn' element."); - YY_BREAK + YY_BREAK case 343: /* rule 343 can match eol */ @@ -8478,19 +8478,19 @@ YY_RULE_SETUP case S_surfxml_zoneRoute: case S_surfxml_zoneRoute_1: case S_surfxml_zoneRoute_2: SET(S_surfxml_zoneRoute_2); break; } } - YY_BREAK + YY_BREAK case 344: /* rule 344 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 345: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_link___ctn): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK /* * */ @@ -8498,7 +8498,7 @@ case 346: /* rule 346 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 347: /* rule 347 can match eol */ YY_RULE_SETUP @@ -8509,28 +8509,28 @@ YY_RULE_SETUP surfxml_model___prop_value_isset = 0; ENTER(AL_surfxml_model___prop); pushbuffer(0); } - YY_BREAK + YY_BREAK case 348: /* rule 348 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 + YY_BREAK case 349: /* rule 349 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 + YY_BREAK case 350: /* rule 350 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 + YY_BREAK case 351: /* rule 351 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 + YY_BREAK case 352: YY_RULE_SETUP { @@ -8538,7 +8538,7 @@ YY_RULE_SETUP if (!AX_surfxml_model___prop_value) FAIL("Required attribute `value' not set for `model_prop' element."); LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop); } - YY_BREAK + YY_BREAK case 353: YY_RULE_SETUP { @@ -8549,18 +8549,18 @@ YY_RULE_SETUP case S_surfxml_storage___type: case S_surfxml_storage___type_1: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break; } } - YY_BREAK + YY_BREAK case 354: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 355: YY_RULE_SETUP FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_model___prop): FAIL("EOF in attribute list of `model_prop' element."); - YY_BREAK + YY_BREAK case 356: /* rule 356 can match eol */ @@ -8573,25 +8573,25 @@ YY_RULE_SETUP case S_surfxml_storage___type: case S_surfxml_storage___type_1: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break; } } - YY_BREAK + YY_BREAK case 357: /* rule 357 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 358: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_model___prop): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 359: /* rule 359 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 360: /* rule 360 can match eol */ YY_RULE_SETUP @@ -8602,28 +8602,28 @@ YY_RULE_SETUP surfxml_mount_storageId_isset = 0; ENTER(AL_surfxml_mount); pushbuffer(0); } - YY_BREAK + YY_BREAK case 361: /* rule 361 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 + YY_BREAK case 362: /* rule 362 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 + YY_BREAK case 363: /* rule 363 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 + YY_BREAK case 364: /* rule 364 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 + YY_BREAK case 365: YY_RULE_SETUP { @@ -8631,7 +8631,7 @@ YY_RULE_SETUP if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element."); LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount); } - YY_BREAK + YY_BREAK case 366: YY_RULE_SETUP { @@ -8642,18 +8642,18 @@ YY_RULE_SETUP case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break; } } - YY_BREAK + YY_BREAK case 367: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 368: YY_RULE_SETUP FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_mount): FAIL("EOF in attribute list of `mount' element."); - YY_BREAK + YY_BREAK case 369: /* rule 369 can match eol */ @@ -8666,25 +8666,25 @@ YY_RULE_SETUP case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break; } } - YY_BREAK + YY_BREAK case 370: /* rule 370 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 371: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_mount): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 372: /* rule 372 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 373: /* rule 373 can match eol */ YY_RULE_SETUP @@ -8707,88 +8707,88 @@ YY_RULE_SETUP surfxml_peer_state___file_isset = 0; ENTER(AL_surfxml_peer); pushbuffer(0); } - YY_BREAK + YY_BREAK case 374: /* rule 374 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); - YY_BREAK + YY_BREAK case 375: /* rule 375 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); - YY_BREAK + YY_BREAK case 376: /* rule 376 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); - YY_BREAK + YY_BREAK case 377: /* rule 377 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); - YY_BREAK + YY_BREAK case 378: /* rule 378 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); - YY_BREAK + YY_BREAK case 379: /* rule 379 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); - YY_BREAK + YY_BREAK case 380: /* rule 380 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); - YY_BREAK + YY_BREAK case 381: /* rule 381 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); - YY_BREAK + YY_BREAK case 382: /* rule 382 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 + YY_BREAK case 383: /* rule 383 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 + YY_BREAK case 384: /* rule 384 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); - YY_BREAK + YY_BREAK case 385: /* rule 385 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); - YY_BREAK + YY_BREAK case 386: /* rule 386 can match eol */ YY_RULE_SETUP if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_peer_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_speed); - YY_BREAK + YY_BREAK case 387: /* rule 387 can match eol */ YY_RULE_SETUP if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_peer_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_speed); - YY_BREAK + YY_BREAK case 388: /* rule 388 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 + YY_BREAK case 389: /* rule 389 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 + YY_BREAK case 390: YY_RULE_SETUP { @@ -8798,7 +8798,7 @@ YY_RULE_SETUP if (!AX_surfxml_peer_speed) FAIL("Required attribute `speed' not set for `peer' element."); LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer); } - YY_BREAK + YY_BREAK case 391: YY_RULE_SETUP { @@ -8814,18 +8814,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 392: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 393: YY_RULE_SETUP FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_peer): FAIL("EOF in attribute list of `peer' element."); - YY_BREAK + YY_BREAK case 394: /* rule 394 can match eol */ @@ -8841,21 +8841,21 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 395: /* rule 395 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 396: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_peer): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK -/* */ @@ -8913,7 +8913,7 @@ case 397: /* rule 397 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 398: /* rule 398 can match eol */ YY_RULE_SETUP @@ -8922,24 +8922,24 @@ YY_RULE_SETUP surfxml_platform_version_isset = 0; ENTER(AL_surfxml_platform); pushbuffer(0); } - YY_BREAK + YY_BREAK case 399: /* rule 399 can match eol */ YY_RULE_SETUP if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} surfxml_platform_version_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_version); - YY_BREAK + YY_BREAK case 400: /* rule 400 can match eol */ YY_RULE_SETUP if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} surfxml_platform_version_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_version); - YY_BREAK + YY_BREAK case 401: YY_RULE_SETUP { LEAVE; STag_surfxml_platform();surfxml_pcdata_ix = 0; ENTER(S_surfxml_platform); } - YY_BREAK + YY_BREAK case 402: YY_RULE_SETUP { @@ -8948,18 +8948,18 @@ YY_RULE_SETUP case ROOT_surfxml_platform: SET(EPILOG); break; } } - YY_BREAK + YY_BREAK case 403: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of platform element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 404: YY_RULE_SETUP FAIL("Bad attribute `%s' in `platform' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_platform): FAIL("EOF in attribute list of `platform' element."); - YY_BREAK + YY_BREAK case 405: /* rule 405 can match eol */ @@ -8972,16 +8972,16 @@ YY_RULE_SETUP case ROOT_surfxml_platform: SET(EPILOG); break; } } - YY_BREAK + YY_BREAK case 406: /* rule 406 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 407: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_platform): case YY_STATE_EOF(S_surfxml_platform): case YY_STATE_EOF(S_surfxml_platform_1): @@ -8989,14 +8989,14 @@ case YY_STATE_EOF(S_surfxml_platform_3): case YY_STATE_EOF(S_surfxml_platform_4): case YY_STATE_EOF(S_surfxml_platform_6): case YY_STATE_EOF(S_surfxml_platform_8): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 408: /* rule 408 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 409: /* rule 409 can match eol */ YY_RULE_SETUP @@ -9013,62 +9013,62 @@ YY_RULE_SETUP surfxml_process_start___time_isset = 0; ENTER(AL_surfxml_process); pushbuffer(0); } - YY_BREAK + YY_BREAK case 410: /* rule 410 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); - YY_BREAK + YY_BREAK case 411: /* rule 411 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); - YY_BREAK + YY_BREAK case 412: /* rule 412 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 + YY_BREAK case 413: /* rule 413 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 + YY_BREAK case 414: /* rule 414 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 + YY_BREAK case 415: /* rule 415 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); - YY_BREAK + YY_BREAK case 416: /* rule 416 can match eol */ case 417: /* rule 417 can match eol */ YY_RULE_SETUP A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE; - YY_BREAK + YY_BREAK case 418: /* rule 418 can match eol */ case 419: /* rule 419 can match eol */ YY_RULE_SETUP A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART; - YY_BREAK + YY_BREAK case 420: /* rule 420 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); - YY_BREAK + YY_BREAK case 421: /* rule 421 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); - YY_BREAK + YY_BREAK case 422: YY_RULE_SETUP { @@ -9076,7 +9076,7 @@ YY_RULE_SETUP if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process); } - YY_BREAK + YY_BREAK case 423: YY_RULE_SETUP { @@ -9087,18 +9087,18 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break; } } - YY_BREAK + YY_BREAK case 424: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 425: YY_RULE_SETUP FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_process): FAIL("EOF in attribute list of `process' element."); - YY_BREAK + YY_BREAK case 426: /* rule 426 can match eol */ @@ -9111,21 +9111,21 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break; } } - YY_BREAK + YY_BREAK case 427: /* rule 427 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 428: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_process): case YY_STATE_EOF(S_surfxml_process): case YY_STATE_EOF(S_surfxml_process_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK /* * */ @@ -9133,7 +9133,7 @@ case 429: /* rule 429 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 430: /* rule 430 can match eol */ YY_RULE_SETUP @@ -9144,28 +9144,28 @@ YY_RULE_SETUP surfxml_prop_value_isset = 0; ENTER(AL_surfxml_prop); pushbuffer(0); } - YY_BREAK + YY_BREAK case 431: /* rule 431 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 + YY_BREAK case 432: /* rule 432 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 + YY_BREAK case 433: /* rule 433 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 + YY_BREAK case 434: /* rule 434 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 + YY_BREAK case 435: YY_RULE_SETUP { @@ -9173,7 +9173,7 @@ YY_RULE_SETUP if (!AX_surfxml_prop_value) FAIL("Required attribute `value' not set for `prop' element."); LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop); } - YY_BREAK + YY_BREAK case 436: YY_RULE_SETUP { @@ -9193,18 +9193,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_2: case S_surfxml_zone_3: SET(S_surfxml_zone_3); break; } } - YY_BREAK + YY_BREAK case 437: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 438: YY_RULE_SETUP FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_prop): FAIL("EOF in attribute list of `prop' element."); - YY_BREAK + YY_BREAK case 439: /* rule 439 can match eol */ @@ -9226,25 +9226,25 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_2: case S_surfxml_zone_3: SET(S_surfxml_zone_3); break; } } - YY_BREAK + YY_BREAK case 440: /* rule 440 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 441: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_prop): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 442: /* rule 442 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 443: /* rule 443 can match eol */ YY_RULE_SETUP @@ -9267,7 +9267,7 @@ YY_RULE_SETUP surfxml_random_std___deviation_isset = 0; ENTER(AL_surfxml_random); pushbuffer(0); } - YY_BREAK + YY_BREAK case 444: /* rule 444 can match eol */ @@ -9275,98 +9275,98 @@ case 445: /* rule 445 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_DRAND48; - YY_BREAK + YY_BREAK case 446: /* rule 446 can match eol */ case 447: /* rule 447 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_RAND; - YY_BREAK + YY_BREAK case 448: /* rule 448 can match eol */ case 449: /* rule 449 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_RNGSTREAM; - YY_BREAK + YY_BREAK case 450: /* rule 450 can match eol */ case 451: /* rule 451 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_NONE; - YY_BREAK + YY_BREAK case 452: /* rule 452 can match eol */ YY_RULE_SETUP if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_random_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id); - YY_BREAK + YY_BREAK case 453: /* rule 453 can match eol */ YY_RULE_SETUP if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_random_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id); - YY_BREAK + YY_BREAK case 454: /* rule 454 can match eol */ YY_RULE_SETUP if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in ");} surfxml_random_max_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max); - YY_BREAK + YY_BREAK case 455: /* rule 455 can match eol */ YY_RULE_SETUP if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in ");} surfxml_random_max_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max); - YY_BREAK + YY_BREAK case 456: /* rule 456 can match eol */ YY_RULE_SETUP if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in ");} surfxml_random_mean_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean); - YY_BREAK + YY_BREAK case 457: /* rule 457 can match eol */ YY_RULE_SETUP if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in ");} surfxml_random_mean_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean); - YY_BREAK + YY_BREAK case 458: /* rule 458 can match eol */ YY_RULE_SETUP if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in ");} surfxml_random_min_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min); - YY_BREAK + YY_BREAK case 459: /* rule 459 can match eol */ YY_RULE_SETUP if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in ");} surfxml_random_min_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min); - YY_BREAK + YY_BREAK case 460: /* rule 460 can match eol */ YY_RULE_SETUP if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_random_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_radical); - YY_BREAK + YY_BREAK case 461: /* rule 461 can match eol */ YY_RULE_SETUP if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_random_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_radical); - YY_BREAK + YY_BREAK case 462: /* rule 462 can match eol */ YY_RULE_SETUP if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in ");} surfxml_random_seed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_seed); - YY_BREAK + YY_BREAK case 463: /* rule 463 can match eol */ YY_RULE_SETUP if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in ");} surfxml_random_seed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_seed); - YY_BREAK + YY_BREAK case 464: /* rule 464 can match eol */ YY_RULE_SETUP if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in ");} surfxml_random_std___deviation_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std___deviation); - YY_BREAK + YY_BREAK case 465: /* rule 465 can match eol */ YY_RULE_SETUP if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in ");} surfxml_random_std___deviation_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std___deviation); - YY_BREAK + YY_BREAK case 466: YY_RULE_SETUP { @@ -9377,7 +9377,7 @@ YY_RULE_SETUP if (!AX_surfxml_random_std___deviation) FAIL("Required attribute `std_deviation' not set for `random' element."); LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(E_surfxml_random); } - YY_BREAK + YY_BREAK case 467: YY_RULE_SETUP { @@ -9391,18 +9391,18 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_2: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break; } } - YY_BREAK + YY_BREAK case 468: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of random element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 469: YY_RULE_SETUP FAIL("Bad attribute `%s' in `random' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_random): FAIL("EOF in attribute list of `random' element."); - YY_BREAK + YY_BREAK case 470: /* rule 470 can match eol */ @@ -9415,25 +9415,25 @@ YY_RULE_SETUP case S_surfxml_platform: case S_surfxml_platform_2: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break; } } - YY_BREAK + YY_BREAK case 471: /* rule 471 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 472: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_random): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 473: /* rule 473 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 474: /* rule 474 can match eol */ YY_RULE_SETUP @@ -9446,42 +9446,42 @@ YY_RULE_SETUP surfxml_route_symmetrical_isset = 0; ENTER(AL_surfxml_route); pushbuffer(0); } - YY_BREAK + YY_BREAK case 475: /* rule 475 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 + YY_BREAK case 476: /* rule 476 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); - YY_BREAK + YY_BREAK case 477: /* rule 477 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 + YY_BREAK case 478: /* rule 478 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 + YY_BREAK case 479: /* rule 479 can match eol */ case 480: /* rule 480 can match eol */ YY_RULE_SETUP A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; - YY_BREAK + YY_BREAK case 481: /* rule 481 can match eol */ case 482: /* rule 482 can match eol */ YY_RULE_SETUP A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; - YY_BREAK + YY_BREAK case 483: YY_RULE_SETUP { @@ -9489,7 +9489,7 @@ YY_RULE_SETUP if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route); } - YY_BREAK + YY_BREAK case 484: YY_RULE_SETUP { @@ -9501,18 +9501,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 485: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 486: YY_RULE_SETUP FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_route): FAIL("EOF in attribute list of `route' element."); - YY_BREAK + YY_BREAK case 487: /* rule 487 can match eol */ @@ -9526,27 +9526,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 488: /* rule 488 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 489: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_route): case YY_STATE_EOF(S_surfxml_route): case YY_STATE_EOF(S_surfxml_route_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 490: /* rule 490 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 491: /* rule 491 can match eol */ YY_RULE_SETUP @@ -9557,35 +9557,35 @@ YY_RULE_SETUP surfxml_router_id_isset = 0; ENTER(AL_surfxml_router); pushbuffer(0); } - YY_BREAK + YY_BREAK case 492: /* rule 492 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 + YY_BREAK case 493: /* rule 493 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 + YY_BREAK case 494: /* rule 494 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 + YY_BREAK case 495: /* rule 495 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 + YY_BREAK case 496: 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 + YY_BREAK case 497: YY_RULE_SETUP { @@ -9596,18 +9596,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 498: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 499: YY_RULE_SETUP FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_router): FAIL("EOF in attribute list of `router' element."); - YY_BREAK + YY_BREAK case 500: /* rule 500 can match eol */ @@ -9621,25 +9621,25 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 501: /* rule 501 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 502: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_router): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 503: /* rule 503 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 504: /* rule 504 can match eol */ YY_RULE_SETUP @@ -9654,48 +9654,48 @@ YY_RULE_SETUP surfxml_storage_typeId_isset = 0; ENTER(AL_surfxml_storage); pushbuffer(0); } - YY_BREAK + YY_BREAK case 505: /* rule 505 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 + YY_BREAK case 506: /* rule 506 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 + YY_BREAK case 507: /* rule 507 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 + YY_BREAK case 508: /* rule 508 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 + YY_BREAK case 509: /* rule 509 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 + YY_BREAK case 510: /* rule 510 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 + YY_BREAK case 511: /* rule 511 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 + YY_BREAK case 512: /* rule 512 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 + YY_BREAK case 513: YY_RULE_SETUP { @@ -9704,7 +9704,7 @@ YY_RULE_SETUP 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 + YY_BREAK case 514: YY_RULE_SETUP { @@ -9717,18 +9717,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 515: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 516: YY_RULE_SETUP FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_storage): FAIL("EOF in attribute list of `storage' element."); - YY_BREAK + YY_BREAK case 517: /* rule 517 can match eol */ @@ -9742,27 +9742,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 518: /* rule 518 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 519: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + 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 +FAIL("Premature EOF: `' expected."); + YY_BREAK case 520: /* rule 520 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 521: /* rule 521 can match eol */ YY_RULE_SETUP @@ -9777,48 +9777,48 @@ YY_RULE_SETUP surfxml_storage___type_size_isset = 0; ENTER(AL_surfxml_storage___type); pushbuffer(0); } - YY_BREAK + YY_BREAK case 522: /* rule 522 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content); - YY_BREAK + YY_BREAK case 523: /* rule 523 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content); - YY_BREAK + YY_BREAK case 524: /* rule 524 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id); - YY_BREAK + YY_BREAK case 525: /* rule 525 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id); - YY_BREAK + YY_BREAK case 526: /* rule 526 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model); - YY_BREAK + YY_BREAK case 527: /* rule 527 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model); - YY_BREAK + YY_BREAK case 528: /* rule 528 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size); - YY_BREAK + YY_BREAK case 529: /* rule 529 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size); - YY_BREAK + YY_BREAK case 530: YY_RULE_SETUP { @@ -9826,7 +9826,7 @@ YY_RULE_SETUP if (!AX_surfxml_storage___type_size) FAIL("Required attribute `size' not set for `storage_type' element."); LEAVE; STag_surfxml_storage___type();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage___type); } - YY_BREAK + YY_BREAK case 531: YY_RULE_SETUP { @@ -9838,18 +9838,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 532: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of storage_type element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 533: YY_RULE_SETUP FAIL("Bad attribute `%s' in `storage_type' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_storage___type): FAIL("EOF in attribute list of `storage_type' element."); - YY_BREAK + YY_BREAK case 534: /* rule 534 can match eol */ @@ -9863,27 +9863,27 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 535: /* rule 535 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 536: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_storage___type): case YY_STATE_EOF(S_surfxml_storage___type): case YY_STATE_EOF(S_surfxml_storage___type_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 537: /* rule 537 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 538: /* rule 538 can match eol */ YY_RULE_SETUP @@ -9896,38 +9896,38 @@ YY_RULE_SETUP surfxml_trace_periodicity_isset = 0; ENTER(AL_surfxml_trace); pushbuffer(0); } - YY_BREAK + YY_BREAK case 539: /* rule 539 can match eol */ YY_RULE_SETUP if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_trace_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file); - YY_BREAK + YY_BREAK case 540: /* rule 540 can match eol */ YY_RULE_SETUP if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_trace_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file); - YY_BREAK + YY_BREAK case 541: /* rule 541 can match eol */ YY_RULE_SETUP if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_trace_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id); - YY_BREAK + YY_BREAK case 542: /* rule 542 can match eol */ YY_RULE_SETUP if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_trace_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id); - YY_BREAK + YY_BREAK case 543: /* rule 543 can match eol */ YY_RULE_SETUP if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in ");} surfxml_trace_periodicity_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity); - YY_BREAK + YY_BREAK case 544: /* rule 544 can match eol */ YY_RULE_SETUP if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in ");} surfxml_trace_periodicity_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity); - YY_BREAK + YY_BREAK case 545: YY_RULE_SETUP { @@ -9935,7 +9935,7 @@ YY_RULE_SETUP if (!AX_surfxml_trace_periodicity) FAIL("Required attribute `periodicity' not set for `trace' element."); LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace); } - YY_BREAK + YY_BREAK case 546: YY_RULE_SETUP { @@ -9949,18 +9949,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 547: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of trace element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 548: YY_RULE_SETUP FAIL("Bad attribute `%s' in `trace' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_trace): FAIL("EOF in attribute list of `trace' element."); - YY_BREAK + YY_BREAK case 549: /* rule 549 can match eol */ @@ -9978,21 +9978,21 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 550: /* rule 550 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(IN_trace): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 551: /* rule 551 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 552: /* rule 552 can match eol */ YY_RULE_SETUP @@ -10005,63 +10005,63 @@ YY_RULE_SETUP surfxml_trace___connect_trace_isset = 0; ENTER(AL_surfxml_trace___connect); pushbuffer(0); } - YY_BREAK + YY_BREAK case 553: /* rule 553 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in ");} surfxml_trace___connect_element_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_element); - YY_BREAK + YY_BREAK case 554: /* rule 554 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in ");} surfxml_trace___connect_element_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_element); - YY_BREAK + YY_BREAK case 555: /* rule 555 can match eol */ case 556: /* rule 556 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_HOST___AVAIL; - YY_BREAK + YY_BREAK case 557: /* rule 557 can match eol */ case 558: /* rule 558 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_SPEED; - YY_BREAK + YY_BREAK case 559: /* rule 559 can match eol */ case 560: /* rule 560 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LINK___AVAIL; - YY_BREAK + YY_BREAK case 561: /* rule 561 can match eol */ case 562: /* rule 562 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_BANDWIDTH; - YY_BREAK + YY_BREAK case 563: /* rule 563 can match eol */ case 564: /* rule 564 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LATENCY; - YY_BREAK + YY_BREAK case 565: /* rule 565 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in ");} surfxml_trace___connect_trace_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_trace); - YY_BREAK + YY_BREAK case 566: /* rule 566 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in ");} surfxml_trace___connect_trace_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_trace); - YY_BREAK + YY_BREAK case 567: YY_RULE_SETUP { @@ -10069,7 +10069,7 @@ YY_RULE_SETUP if (!AX_surfxml_trace___connect_trace) FAIL("Required attribute `trace' not set for `trace_connect' element."); LEAVE; STag_surfxml_trace___connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace___connect); } - YY_BREAK + YY_BREAK case 568: YY_RULE_SETUP { @@ -10083,18 +10083,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 569: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of trace_connect element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 570: YY_RULE_SETUP FAIL("Bad attribute `%s' in `trace_connect' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_trace___connect): FAIL("EOF in attribute list of `trace_connect' element."); - YY_BREAK + YY_BREAK case 571: /* rule 571 can match eol */ @@ -10110,25 +10110,25 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 572: /* rule 572 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 573: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_trace___connect): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 574: /* rule 574 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 575: /* rule 575 can match eol */ YY_RULE_SETUP @@ -10139,88 +10139,88 @@ YY_RULE_SETUP surfxml_zone_routing_isset = 0; ENTER(AL_surfxml_zone); pushbuffer(0); } - YY_BREAK + YY_BREAK case 576: /* rule 576 can match eol */ YY_RULE_SETUP if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_zone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zone_id); - YY_BREAK + YY_BREAK case 577: /* rule 577 can match eol */ YY_RULE_SETUP if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_zone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zone_id); - YY_BREAK + YY_BREAK case 578: /* rule 578 can match eol */ case 579: /* rule 579 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_Full; - YY_BREAK + YY_BREAK case 580: /* rule 580 can match eol */ case 581: /* rule 581 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_Floyd; - YY_BREAK + YY_BREAK case 582: /* rule 582 can match eol */ case 583: /* rule 583 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_Dijkstra; - YY_BREAK + YY_BREAK case 584: /* rule 584 can match eol */ case 585: /* rule 585 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_DijkstraCache; - YY_BREAK + YY_BREAK case 586: /* rule 586 can match eol */ case 587: /* rule 587 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_None; - YY_BREAK + YY_BREAK case 588: /* rule 588 can match eol */ case 589: /* rule 589 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_Vivaldi; - YY_BREAK + YY_BREAK case 590: /* rule 590 can match eol */ case 591: /* rule 591 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_Cluster; - YY_BREAK + YY_BREAK case 592: /* rule 592 can match eol */ case 593: /* rule 593 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterTorus; - YY_BREAK + YY_BREAK case 594: /* rule 594 can match eol */ case 595: /* rule 595 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterFatTree; - YY_BREAK + YY_BREAK case 596: /* rule 596 can match eol */ case 597: /* rule 597 can match eol */ YY_RULE_SETUP A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterDragonfly; - YY_BREAK + YY_BREAK case 598: YY_RULE_SETUP { @@ -10228,7 +10228,7 @@ YY_RULE_SETUP if (!AX_surfxml_zone_routing) FAIL("Required attribute `routing' not set for `zone' element."); LEAVE; STag_surfxml_zone();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zone); } - YY_BREAK + YY_BREAK case 599: YY_RULE_SETUP { @@ -10242,18 +10242,18 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 600: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of zone element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 601: YY_RULE_SETUP FAIL("Bad attribute `%s' in `zone' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_zone): FAIL("EOF in attribute list of `zone' element."); - YY_BREAK + YY_BREAK case 602: /* rule 602 can match eol */ @@ -10269,16 +10269,16 @@ YY_RULE_SETUP case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } - YY_BREAK + YY_BREAK case 603: /* rule 603 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 604: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_zone): case YY_STATE_EOF(S_surfxml_zone): case YY_STATE_EOF(S_surfxml_zone_1): @@ -10286,14 +10286,14 @@ case YY_STATE_EOF(S_surfxml_zone_3): case YY_STATE_EOF(S_surfxml_zone_4): case YY_STATE_EOF(S_surfxml_zone_6): case YY_STATE_EOF(S_surfxml_zone_8): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK case 605: /* rule 605 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); - YY_BREAK + YY_BREAK case 606: /* rule 606 can match eol */ YY_RULE_SETUP @@ -10310,62 +10310,62 @@ YY_RULE_SETUP surfxml_zoneRoute_symmetrical_isset = 0; ENTER(AL_surfxml_zoneRoute); pushbuffer(0); } - YY_BREAK + YY_BREAK case 607: /* rule 607 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_dst); - YY_BREAK + YY_BREAK case 608: /* rule 608 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_dst); - YY_BREAK + YY_BREAK case 609: /* rule 609 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___dst); - YY_BREAK + YY_BREAK case 610: /* rule 610 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___dst); - YY_BREAK + YY_BREAK case 611: /* rule 611 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___src); - YY_BREAK + YY_BREAK case 612: /* rule 612 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___src); - YY_BREAK + YY_BREAK case 613: /* rule 613 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_zoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_src); - YY_BREAK + YY_BREAK case 614: /* rule 614 can match eol */ YY_RULE_SETUP if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_zoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_src); - YY_BREAK + YY_BREAK case 615: /* rule 615 can match eol */ case 616: /* rule 616 can match eol */ YY_RULE_SETUP A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_YES; - YY_BREAK + YY_BREAK case 617: /* rule 617 can match eol */ case 618: /* rule 618 can match eol */ YY_RULE_SETUP A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_NO; - YY_BREAK + YY_BREAK case 619: YY_RULE_SETUP { @@ -10375,7 +10375,7 @@ YY_RULE_SETUP if (!AX_surfxml_zoneRoute_src) FAIL("Required attribute `src' not set for `zoneRoute' element."); LEAVE; STag_surfxml_zoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zoneRoute); } - YY_BREAK + YY_BREAK case 620: YY_RULE_SETUP { @@ -10385,24 +10385,24 @@ YY_RULE_SETUP if (!AX_surfxml_zoneRoute_src) FAIL("Required attribute `src' not set for `zoneRoute' element."); LEAVE; STag_surfxml_zoneRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_zoneRoute(); popbuffer(); /* attribute */ switch (YY_START) { - case S_surfxml_AS: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; - case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; - case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_4: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 621: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of zoneRoute element.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 622: YY_RULE_SETUP FAIL("Bad attribute `%s' in `zoneRoute' element start tag.",surf_parse_text); - YY_BREAK + YY_BREAK case YY_STATE_EOF(AL_surfxml_zoneRoute): FAIL("EOF in attribute list of `zoneRoute' element."); - YY_BREAK + YY_BREAK case 623: /* rule 623 can match eol */ @@ -10412,37 +10412,37 @@ YY_RULE_SETUP ETag_surfxml_zoneRoute(); popbuffer(); /* attribute */ switch (YY_START) { - case S_surfxml_AS: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; - case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; - case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_4: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } - YY_BREAK + YY_BREAK case 624: /* rule 624 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK + YY_BREAK case 625: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(E_surfxml_zoneRoute): case YY_STATE_EOF(S_surfxml_zoneRoute): case YY_STATE_EOF(S_surfxml_zoneRoute_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK +FAIL("Premature EOF: `' expected."); + YY_BREAK /* EPILOG: after the root element. */ case 626: YY_RULE_SETUP {SET(PROLOG); yyless(0); CLEANUP; return -1;} - YY_BREAK + YY_BREAK case YY_STATE_EOF(EPILOG): SUCCEED; - YY_BREAK + YY_BREAK /* CHARACTER DATA. */ @@ -10450,32 +10450,32 @@ SUCCEED; case 627: YY_RULE_SETUP BUFFERPUTC('&'); - YY_BREAK + YY_BREAK case 628: YY_RULE_SETUP BUFFERPUTC('<'); - YY_BREAK + YY_BREAK case 629: YY_RULE_SETUP BUFFERPUTC('>'); - YY_BREAK + YY_BREAK case 630: YY_RULE_SETUP BUFFERPUTC('\''); - YY_BREAK + YY_BREAK case 631: YY_RULE_SETUP BUFFERPUTC('"'); - YY_BREAK + YY_BREAK /* Character entities. */ case 632: YY_RULE_SETUP BUFFERPUTC((unsigned char)atoi(surf_parse_text+2)); - YY_BREAK + YY_BREAK case 633: YY_RULE_SETUP BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16)); - YY_BREAK + YY_BREAK case 634: /* rule 634 can match eol */ @@ -10487,55 +10487,55 @@ case 637: /* rule 637 can match eol */ YY_RULE_SETUP BUFFERPUTC('\n'); - YY_BREAK + YY_BREAK case 638: YY_RULE_SETUP ENTER(CDATA); - YY_BREAK + YY_BREAK case 639: YY_RULE_SETUP FAIL("Unexpected `]""]>' in character data."); - YY_BREAK + YY_BREAK case 640: YY_RULE_SETUP BUFFERDONE; LEAVE; - YY_BREAK + YY_BREAK case YY_STATE_EOF(VALUE1): FAIL("EOF in literal (\"'\" expected)."); - YY_BREAK + YY_BREAK case 641: YY_RULE_SETUP BUFFERDONE; LEAVE; - YY_BREAK + YY_BREAK case YY_STATE_EOF(VALUE2): FAIL("EOF in literal (`\"' expected)."); - YY_BREAK + YY_BREAK case 642: /* rule 642 can match eol */ YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); - YY_BREAK + YY_BREAK case 643: YY_RULE_SETUP FAIL("Spurious `%c' in character data.",surf_parse_text[0]); - YY_BREAK + YY_BREAK case 644: YY_RULE_SETUP LEAVE; - YY_BREAK -/* "]""]" BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */ + YY_BREAK +/* "]""]" BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */ case 645: YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); - YY_BREAK + YY_BREAK case YY_STATE_EOF(CDATA): FAIL("EOF in CDATA section."); - YY_BREAK + YY_BREAK /* Impossible rules to avoid warnings from flex(1). */ /* Ideally, this should be replaced by code in flexml.pl that @@ -10545,12 +10545,12 @@ case 646: /* rule 646 can match eol */ YY_RULE_SETUP FAIL("Syntax error on character `%c'.", surf_parse_text[0]); - YY_BREAK + YY_BREAK case 647: YY_RULE_SETUP ECHO; - YY_BREAK + YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(S_surfxml_AS_2): case YY_STATE_EOF(S_surfxml_AS_5): @@ -10578,332 +10578,332 @@ case YY_STATE_EOF(S_surfxml_zone_5): case YY_STATE_EOF(S_surfxml_zone_7): case YY_STATE_EOF(S_surfxml_zoneRoute_1): case YY_STATE_EOF(IMPOSSIBLE): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed surf_parse_in at a new source and called - * surf_parse_lex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = surf_parse_in; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( surf_parse_wrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * surf_parse_text, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed surf_parse_in at a new source and called + * surf_parse_lex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = surf_parse_in; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( surf_parse_wrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * surf_parse_text, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of surf_parse_lex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = (yytext_ptr); - int number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - - else - { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - surf_parse_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ( (yy_n_chars) == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - surf_parse_restart(surf_parse_in ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) surf_parse_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + surf_parse_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + surf_parse_restart(surf_parse_in ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) surf_parse_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; + return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { - yy_state_type yy_current_state; - char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - 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 >= 3886 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; - } - - return yy_current_state; + yy_state_type yy_current_state; + char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + 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 >= 3886 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + } + + return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis - * next_state = yy_try_NUL_trans( current_state ); + * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { - int yy_is_jam; - char *yy_cp = (yy_c_buf_p); - - YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - 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 >= 3886 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; - yy_is_jam = (yy_current_state == 3885); - - return yy_is_jam ? 0 : yy_current_state; + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + 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 >= 3886 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + yy_is_jam = (yy_current_state == 3885); + + return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT @@ -10918,185 +10918,185 @@ static int yy_get_next_buffer (void) #endif { - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - int offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - surf_parse_restart(surf_parse_in ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( surf_parse_wrap( ) ) - return 0; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + surf_parse_restart(surf_parse_in ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( surf_parse_wrap( ) ) + return 0; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; #ifdef __cplusplus - return yyinput(); + return yyinput(); #else - return input(); + return input(); #endif - } + } - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve surf_parse_text */ - (yy_hold_char) = *++(yy_c_buf_p); - - if ( c == '\n' ) + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve surf_parse_text */ + (yy_hold_char) = *++(yy_c_buf_p); + if ( c == '\n' ) + surf_parse_lineno++; ; - return c; + return c; } -#endif /* ifndef YY_NO_INPUT */ +#endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. - * + * * @note This function does not reset the start condition to @c INITIAL . */ void surf_parse_restart (FILE * input_file ) { - - if ( ! YY_CURRENT_BUFFER ){ + + if ( ! YY_CURRENT_BUFFER ){ surf_parse_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = + YY_CURRENT_BUFFER_LVALUE = surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE ); - } + } - surf_parse__init_buffer(YY_CURRENT_BUFFER,input_file ); - surf_parse__load_buffer_state( ); + surf_parse__init_buffer(YY_CURRENT_BUFFER,input_file ); + surf_parse__load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. - * + * */ void surf_parse__switch_to_buffer (YY_BUFFER_STATE new_buffer ) { - - /* TODO. We should be able to replace this entire function body - * with - * surf_parse_pop_buffer_state(); - * surf_parse_push_buffer_state(new_buffer); + + /* TODO. We should be able to replace this entire function body + * with + * surf_parse_pop_buffer_state(); + * surf_parse_push_buffer_state(new_buffer); */ - surf_parse_ensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - surf_parse__load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (surf_parse_wrap()) processing, but the only time this flag - * is looked at is after surf_parse_wrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; + surf_parse_ensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + surf_parse__load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (surf_parse_wrap()) processing, but the only time this flag + * is looked at is after surf_parse_wrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; } static void surf_parse__load_buffer_state (void) { - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - surf_parse_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + surf_parse_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * + * * @return the allocated buffer state. */ YY_BUFFER_STATE surf_parse__create_buffer (FILE * file, int size ) { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) surf_parse_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in surf_parse__create_buffer()" ); + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) surf_parse_alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in surf_parse__create_buffer()" ); - b->yy_buf_size = (yy_size_t)size; + b->yy_buf_size = (yy_size_t)size; - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) surf_parse_alloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in surf_parse__create_buffer()" ); + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) surf_parse_alloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in surf_parse__create_buffer()" ); - b->yy_is_our_buffer = 1; + b->yy_is_our_buffer = 1; - surf_parse__init_buffer(b,file ); + surf_parse__init_buffer(b,file ); - return b; + return b; } /** Destroy the buffer. * @param b a buffer created with surf_parse__create_buffer() - * + * */ void surf_parse__delete_buffer (YY_BUFFER_STATE b ) { + + if ( ! b ) + return; - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - if ( b->yy_is_our_buffer ) - surf_parse_free((void *) b->yy_ch_buf ); + if ( b->yy_is_our_buffer ) + surf_parse_free((void *) b->yy_ch_buf ); - surf_parse_free((void *) b ); + surf_parse_free((void *) b ); } /* Initializes or reinitializes a buffer. @@ -11106,12 +11106,12 @@ static void surf_parse__load_buffer_state (void) static void surf_parse__init_buffer (YY_BUFFER_STATE b, FILE * file ) { - int oerrno = errno; - - surf_parse__flush_buffer(b ); + int oerrno = errno; + + surf_parse__flush_buffer(b ); - b->yy_input_file = file; - b->yy_fill_buffer = 1; + b->yy_input_file = file; + b->yy_fill_buffer = 1; /* If b is the current buffer, then surf_parse__init_buffer was _probably_ * called from surf_parse_restart() or through yy_get_next_buffer. @@ -11123,87 +11123,87 @@ static void surf_parse__load_buffer_state (void) } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; + + errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * + * */ void surf_parse__flush_buffer (YY_BUFFER_STATE b ) { - if ( ! b ) - return; + if ( ! b ) + return; - b->yy_n_chars = 0; + b->yy_n_chars = 0; - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - b->yy_buf_pos = &b->yy_ch_buf[0]; + b->yy_buf_pos = &b->yy_ch_buf[0]; - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == YY_CURRENT_BUFFER ) - surf_parse__load_buffer_state( ); + if ( b == YY_CURRENT_BUFFER ) + surf_parse__load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. - * + * */ void surf_parse_push_buffer_state (YY_BUFFER_STATE new_buffer ) { - if (new_buffer == NULL) - return; + if (new_buffer == NULL) + return; - surf_parse_ensure_buffer_stack(); + surf_parse_ensure_buffer_stack(); - /* This block is copied from surf_parse__switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } + /* This block is copied from surf_parse__switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; - /* copied from surf_parse__switch_to_buffer. */ - surf_parse__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; + /* copied from surf_parse__switch_to_buffer. */ + surf_parse__load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. - * + * */ void surf_parse_pop_buffer_state (void) { - if (!YY_CURRENT_BUFFER) - return; + if (!YY_CURRENT_BUFFER) + return; - surf_parse__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); + surf_parse__delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); - if (YY_CURRENT_BUFFER) { - surf_parse__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } + if (YY_CURRENT_BUFFER) { + surf_parse__load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } } /* Allocates the stack if it does not exist. @@ -11211,163 +11211,163 @@ void surf_parse_pop_buffer_state (void) */ static void surf_parse_ensure_buffer_stack (void) { - int num_to_alloc; + int num_to_alloc; + + if (!(yy_buffer_stack)) { - if (!(yy_buffer_stack)) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - (yy_buffer_stack) = (struct yy_buffer_state**)surf_parse_alloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in surf_parse_ensure_buffer_stack()" ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)surf_parse_realloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in surf_parse_ensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } + (yy_buffer_stack) = (struct yy_buffer_state**)surf_parse_alloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in surf_parse_ensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)surf_parse_realloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in surf_parse_ensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer - * + * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE surf_parse__scan_buffer (char * base, yy_size_t size ) { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return NULL; - - b = (YY_BUFFER_STATE) surf_parse_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - surf_parse__switch_to_buffer(b ); - - return b; + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE) surf_parse_alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + surf_parse__switch_to_buffer(b ); + + return b; } /** Setup the input buffer state to scan a string. The next call to surf_parse_lex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan - * + * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * surf_parse__scan_bytes() instead. */ YY_BUFFER_STATE surf_parse__scan_string (yyconst char * yystr ) { - - return surf_parse__scan_bytes(yystr,(int) strlen(yystr) ); + + return surf_parse__scan_bytes(yystr,(int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to surf_parse_lex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. - * + * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE surf_parse__scan_bytes (yyconst char * yybytes, int _yybytes_len ) { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) (_yybytes_len + 2); - buf = (char *) surf_parse_alloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_bytes()" ); + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) surf_parse_alloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_bytes()" ); - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = surf_parse__scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in surf_parse__scan_bytes()" ); + b = surf_parse__scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in surf_parse__scan_bytes()" ); - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; - return b; + return b; } static void yy_push_state (int _new_state ) { - if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) - { - yy_size_t new_size; + if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) + { + yy_size_t new_size; - (yy_start_stack_depth) += YY_START_STACK_INCR; - new_size = (yy_size_t) (yy_start_stack_depth) * sizeof( int ); + (yy_start_stack_depth) += YY_START_STACK_INCR; + new_size = (yy_size_t) (yy_start_stack_depth) * sizeof( int ); - if ( ! (yy_start_stack) ) - (yy_start_stack) = (int *) surf_parse_alloc(new_size ); + if ( ! (yy_start_stack) ) + (yy_start_stack) = (int *) surf_parse_alloc(new_size ); - else - (yy_start_stack) = (int *) surf_parse_realloc((void *) (yy_start_stack),new_size ); + else + (yy_start_stack) = (int *) surf_parse_realloc((void *) (yy_start_stack),new_size ); - if ( ! (yy_start_stack) ) - YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); - } + if ( ! (yy_start_stack) ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); + } - (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; + (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; - BEGIN(_new_state); + BEGIN(_new_state); } static void yy_pop_state (void) { - if ( --(yy_start_stack_ptr) < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); + if ( --(yy_start_stack_ptr) < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); - BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); + BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } #ifndef YY_EXIT_FAILURE @@ -11376,40 +11376,40 @@ YY_BUFFER_STATE surf_parse__scan_bytes (yyconst char * yybytes, int _yybytes_l static void yynoreturn yy_fatal_error (yyconst char* msg ) { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ - do \ - { \ - /* Undo effects of setting up surf_parse_text. */ \ + do \ + { \ + /* Undo effects of setting up surf_parse_text. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ - surf_parse_text[surf_parse_leng] = (yy_hold_char); \ - (yy_c_buf_p) = surf_parse_text + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - surf_parse_leng = yyless_macro_arg; \ - } \ - while ( 0 ) + surf_parse_text[surf_parse_leng] = (yy_hold_char); \ + (yy_c_buf_p) = surf_parse_text + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + surf_parse_leng = yyless_macro_arg; \ + } \ + while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. - * + * */ int surf_parse_get_lineno (void) { - + return surf_parse_lineno; } /** Get the input stream. - * + * */ FILE *surf_parse_get_in (void) { @@ -11417,7 +11417,7 @@ FILE *surf_parse_get_in (void) } /** Get the output stream. - * + * */ FILE *surf_parse_get_out (void) { @@ -11425,7 +11425,7 @@ FILE *surf_parse_get_out (void) } /** Get the length of the current token. - * + * */ int surf_parse_get_leng (void) { @@ -11433,7 +11433,7 @@ int surf_parse_get_leng (void) } /** Get the current token. - * + * */ char *surf_parse_get_text (void) @@ -11443,18 +11443,18 @@ char *surf_parse_get_text (void) /** Set the current line number. * @param _line_number line number - * + * */ void surf_parse_set_lineno (int _line_number ) { - + surf_parse_lineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. - * + * * @see surf_parse__switch_to_buffer */ void surf_parse_set_in (FILE * _in_str ) @@ -11485,7 +11485,7 @@ static int yy_init_globals (void) /* We do not touch surf_parse_lineno unless the option is enabled. */ surf_parse_lineno = 1; - + (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; @@ -11515,17 +11515,17 @@ static int yy_init_globals (void) /* surf_parse_lex_destroy is for both reentrant and non-reentrant scanners. */ int surf_parse_lex_destroy (void) { - + /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - surf_parse__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - surf_parse_pop_buffer_state(); - } + while(YY_CURRENT_BUFFER){ + surf_parse__delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + surf_parse_pop_buffer_state(); + } - /* Destroy the stack itself. */ - surf_parse_free((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; + /* Destroy the stack itself. */ + surf_parse_free((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; /* Destroy the start condition stack. */ surf_parse_free((yy_start_stack) ); @@ -11545,45 +11545,45 @@ int surf_parse_lex_destroy (void) #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { - - int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { - int n; - for ( n = 0; s[n]; ++n ) - ; + int n; + for ( n = 0; s[n]; ++n ) + ; - return n; + return n; } #endif void *surf_parse_alloc (yy_size_t size ) { - return malloc(size); + return malloc(size); } void *surf_parse_realloc (void * ptr, yy_size_t size ) { - - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return realloc(ptr, size); + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); } void surf_parse_free (void * ptr ) { - free( (char *) ptr ); /* see surf_parse_realloc() for (char *) cast */ + free( (char *) ptr ); /* see surf_parse_realloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" @@ -11592,8 +11592,8 @@ void surf_parse_free (void * ptr ) int surfxml_element_context(int i) { return (0 /* Always include this when calling Lua */ #include /* Always include this when calling Lua */ @@ -33,7 +33,7 @@ XBT_PRIVATE std::unordered_map trace_connect_list_link XBT_PRIVATE std::unordered_map trace_connect_list_link_bw; XBT_PRIVATE std::unordered_map trace_connect_list_link_lat; -SG_BEGIN_DECL() +extern "C" { void sg_platf_trace_connect(TraceConnectCreationArgs* trace_connect) { xbt_assert(traces_set_list.find(trace_connect->trace) != traces_set_list.end(), @@ -102,73 +102,72 @@ void parse_platform_file(const char *file) xbt_die("Lua call failed. See Log"); } lua_close(L); + return; } - else #endif - { // Use XML parser - - int parse_status; - /* init the flex parser */ - after_config_done = 0; - surf_parse_open(file); + // Use XML parser - /* Do the actual parsing */ - parse_status = surf_parse(); + int parse_status; - /* connect all traces relative to hosts */ - for (auto const& elm : trace_connect_list_host_avail) { - xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); - tmgr_trace_t trace = traces_set_list.at(elm.first); + /* init the flex parser */ + after_config_done = 0; + surf_parse_open(file); - simgrid::s4u::Host* host = sg_host_by_name(elm.second.c_str()); - xbt_assert(host, "Host %s undefined", elm.second.c_str()); - simgrid::surf::Cpu *cpu = host->pimpl_cpu; + /* Do the actual parsing */ + parse_status = surf_parse(); - cpu->setStateTrace(trace); - } + /* connect all traces relative to hosts */ + for (auto const& elm : trace_connect_list_host_avail) { + xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); + tmgr_trace_t trace = traces_set_list.at(elm.first); - for (auto const& elm : trace_connect_list_host_speed) { - xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); - tmgr_trace_t trace = traces_set_list.at(elm.first); + simgrid::s4u::Host* host = sg_host_by_name(elm.second.c_str()); + xbt_assert(host, "Host %s undefined", elm.second.c_str()); + simgrid::surf::Cpu* cpu = host->pimpl_cpu; - simgrid::s4u::Host* host = sg_host_by_name(elm.second.c_str()); - xbt_assert(host, "Host %s undefined", elm.second.c_str()); - simgrid::surf::Cpu *cpu = host->pimpl_cpu; + cpu->setStateTrace(trace); + } - cpu->setSpeedTrace(trace); - } + for (auto const& elm : trace_connect_list_host_speed) { + xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); + tmgr_trace_t trace = traces_set_list.at(elm.first); - for (auto const& elm : trace_connect_list_link_avail) { - xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); - tmgr_trace_t trace = traces_set_list.at(elm.first); + simgrid::s4u::Host* host = sg_host_by_name(elm.second.c_str()); + xbt_assert(host, "Host %s undefined", elm.second.c_str()); + simgrid::surf::Cpu* cpu = host->pimpl_cpu; - sg_link_t link = simgrid::s4u::Link::byName(elm.second.c_str()); - xbt_assert(link, "Link %s undefined", elm.second.c_str()); - link->setStateTrace(trace); - } + cpu->setSpeedTrace(trace); + } - for (auto const& elm : trace_connect_list_link_bw) { - xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); - tmgr_trace_t trace = traces_set_list.at(elm.first); - sg_link_t link = simgrid::s4u::Link::byName(elm.second.c_str()); - xbt_assert(link, "Link %s undefined", elm.second.c_str()); - link->setBandwidthTrace(trace); - } + for (auto const& elm : trace_connect_list_link_avail) { + xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); + tmgr_trace_t trace = traces_set_list.at(elm.first); - for (auto const& elm : trace_connect_list_link_lat) { - xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); - tmgr_trace_t trace = traces_set_list.at(elm.first); - sg_link_t link = simgrid::s4u::Link::byName(elm.second.c_str()); - xbt_assert(link, "Link %s undefined", elm.second.c_str()); - link->setLatencyTrace(trace); - } + sg_link_t link = simgrid::s4u::Link::byName(elm.second.c_str()); + xbt_assert(link, "Link %s undefined", elm.second.c_str()); + link->setStateTrace(trace); + } - surf_parse_close(); + for (auto const& elm : trace_connect_list_link_bw) { + xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); + tmgr_trace_t trace = traces_set_list.at(elm.first); + sg_link_t link = simgrid::s4u::Link::byName(elm.second.c_str()); + xbt_assert(link, "Link %s undefined", elm.second.c_str()); + link->setBandwidthTrace(trace); + } - if (parse_status) - surf_parse_error(std::string("Parse error in ") + file); + for (auto const& elm : trace_connect_list_link_lat) { + xbt_assert(traces_set_list.find(elm.first) != traces_set_list.end(), "Trace %s undefined", elm.first.c_str()); + tmgr_trace_t trace = traces_set_list.at(elm.first); + sg_link_t link = simgrid::s4u::Link::byName(elm.second.c_str()); + xbt_assert(link, "Link %s undefined", elm.second.c_str()); + link->setLatencyTrace(trace); } -} -SG_END_DECL() + surf_parse_close(); + + if (parse_status) + surf_parse_error(std::string("Parse error in ") + file); +} +} diff --git a/src/surf/xml/surfxml_sax_cb.cpp b/src/surf/xml/surfxml_sax_cb.cpp index b7f147c737..3d6ead11d1 100644 --- a/src/surf/xml/surfxml_sax_cb.cpp +++ b/src/surf/xml/surfxml_sax_cb.cpp @@ -7,24 +7,25 @@ #include "simgrid/sg_config.h" #include "src/kernel/routing/NetPoint.hpp" #include "src/surf/network_interface.hpp" -#include "xbt/file.h" +#include "xbt/file.hpp" #include "src/surf/xml/platf_private.hpp" #include #include #include +#include #include +#include +#include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, "Logging specific to the SURF parsing module"); -SG_BEGIN_DECL() - -int ETag_surfxml_include_state(); +extern "C" { #include "simgrid_dtd.c" -char* surf_parsed_filename = nullptr; // to locate parse error messages - +static const char* surf_parsed_filename; // Currently parsed file (for the error messages) std::vector parsed_link_list; /* temporary store of current list link of a route */ /* @@ -59,9 +60,8 @@ void surf_parse_assert_netpoint(std::string hostname, std::string pre, std::stri std::vector list; simgrid::s4u::Engine::getInstance()->getNetpointList(&list); - std::sort(list.begin(), list.end(), - [](simgrid::kernel::routing::NetPoint* a, simgrid::kernel::routing::NetPoint* b) { - return a->name() < b->name(); + std::sort(list.begin(), list.end(), [](simgrid::kernel::routing::NetPoint* a, simgrid::kernel::routing::NetPoint* b) { + return a->getName() < b->getName(); }); bool first = true; for (auto const& np : list) { @@ -71,7 +71,7 @@ void surf_parse_assert_netpoint(std::string hostname, std::string pre, std::stri if (not first) msg += ","; first = false; - msg += "'" + np->name() + "'"; + msg += "'" + np->getName() + "'"; if (msg.length() > 4096) { msg.pop_back(); // remove trailing quote msg += "...(list truncated)......"; @@ -105,9 +105,12 @@ int surf_parse_get_int(std::string s) return -1; } } +} + +namespace { /* Turn something like "1-4,6,9-11" into the vector {1,2,3,4,6,9,10,11} */ -static std::vector* explodesRadical(std::string radicals) +std::vector* explodesRadical(std::string radicals) { std::vector* exploded = new std::vector(); @@ -138,18 +141,49 @@ static std::vector* explodesRadical(std::string radicals) return exploded; } -struct unit_scale { - const char *unit; - double scale; +class unit_scale : public std::unordered_map { +public: + using std::unordered_map::unordered_map; + // tuples are : + explicit unit_scale(std::initializer_list> generators); }; +unit_scale::unit_scale(std::initializer_list> generators) +{ + for (const auto& gen : generators) { + const std::string& unit = std::get<0>(gen); + double value = std::get<1>(gen); + const int base = std::get<2>(gen); + const bool abbrev = std::get<3>(gen); + double mult; + std::vector prefixes; + switch (base) { + case 2: + mult = 1024.0; + prefixes = abbrev ? std::vector{"Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi"} + : std::vector{"kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"}; + break; + case 10: + mult = 1000.0; + prefixes = abbrev ? std::vector{"k", "M", "G", "T", "P", "E", "Z", "Y"} + : std::vector{"kilo", "mega", "giga", "tera", "peta", "exa", "zeta", "yotta"}; + break; + default: + THROW_IMPOSSIBLE; + } + emplace(unit, value); + for (const auto& prefix : prefixes) { + value *= mult; + emplace(prefix + unit, value); + } + } +} + /* Note: field `unit' for the last element of parameter `units' should be nullptr. */ -static double surf_parse_get_value_with_unit(const char* string, const struct unit_scale* units, - const char* entity_kind, std::string name, const char* error_msg, - const char* default_unit) +double surf_parse_get_value_with_unit(const char* string, const unit_scale& units, const char* entity_kind, + std::string name, const char* error_msg, const char* default_unit) { char* ptr; - int i; errno = 0; double res = strtod(string, &ptr); if (errno == ERANGE) @@ -163,124 +197,49 @@ static double surf_parse_get_value_with_unit(const char* string, const struct un XBT_WARN("Deprecated unit-less value '%s' for %s %s. %s", string, entity_kind, name.c_str(), error_msg); ptr = (char*)default_unit; } - for (i = 0; units[i].unit != nullptr && strcmp(ptr, units[i].unit) != 0; i++); - - if (units[i].unit != nullptr) - res *= units[i].scale; - else + auto u = units.find(ptr); + if (u == units.end()) surf_parse_error(std::string("unknown unit: ") + ptr); - return res; + return res * u->second; +} } +extern "C" { + double surf_parse_get_time(const char* string, const char* entity_kind, std::string name) { - const struct unit_scale units[] = { - { "w", 7 * 24 * 60 * 60 }, - { "d", 24 * 60 * 60 }, - { "h", 60 * 60 }, - { "m", 60 }, - { "s", 1.0 }, - { "ms", 1e-3 }, - { "us", 1e-6 }, - { "ns", 1e-9 }, - { "ps", 1e-12 }, - { nullptr, 0 } - }; + static const unit_scale units{std::make_pair("w", 7 * 24 * 60 * 60), + std::make_pair("d", 24 * 60 * 60), + std::make_pair("h", 60 * 60), + std::make_pair("m", 60), + std::make_pair("s", 1.0), + std::make_pair("ms", 1e-3), + std::make_pair("us", 1e-6), + std::make_pair("ns", 1e-9), + std::make_pair("ps", 1e-12)}; return surf_parse_get_value_with_unit(string, units, entity_kind, name, "Append 's' to your time to get seconds", "s"); } double surf_parse_get_size(const char* string, const char* entity_kind, std::string name) { - const struct unit_scale units[] = { - { "EiB", pow(1024, 6) }, - { "PiB", pow(1024, 5) }, - { "TiB", pow(1024, 4) }, - { "GiB", pow(1024, 3) }, - { "MiB", pow(1024, 2) }, - { "KiB", 1024 }, - { "EB", 1e18 }, - { "PB", 1e15 }, - { "TB", 1e12 }, - { "GB", 1e9 }, - { "MB", 1e6 }, - { "kB", 1e3 }, - { "B", 1.0 }, - { "Eib", 0.125 * pow(1024, 6) }, - { "Pib", 0.125 * pow(1024, 5) }, - { "Tib", 0.125 * pow(1024, 4) }, - { "Gib", 0.125 * pow(1024, 3) }, - { "Mib", 0.125 * pow(1024, 2) }, - { "Kib", 0.125 * 1024 }, - { "Eb", 0.125 * 1e18 }, - { "Pb", 0.125 * 1e15 }, - { "Tb", 0.125 * 1e12 }, - { "Gb", 0.125 * 1e9 }, - { "Mb", 0.125 * 1e6 }, - { "kb", 0.125 * 1e3 }, - { "b", 0.125 }, - { nullptr, 0 } - }; + static const unit_scale units{std::make_tuple("b", 0.125, 2, true), std::make_tuple("b", 0.125, 10, true), + std::make_tuple("B", 1.0, 2, true), std::make_tuple("B", 1.0, 10, true)}; return surf_parse_get_value_with_unit(string, units, entity_kind, name, "Append 'B' to get bytes (or 'b' for bits but 1B = 8b).", "B"); } double surf_parse_get_bandwidth(const char* string, const char* entity_kind, std::string name) { - const struct unit_scale units[] = { - { "EiBps", pow(1024, 6) }, - { "PiBps", pow(1024, 5) }, - { "TiBps", pow(1024, 4) }, - { "GiBps", pow(1024, 3) }, - { "MiBps", pow(1024, 2) }, - { "KiBps", 1024 }, - { "EBps", 1e18 }, - { "PBps", 1e15 }, - { "TBps", 1e12 }, - { "GBps", 1e9 }, - { "MBps", 1e6 }, - { "kBps", 1e3 }, - { "Bps", 1.0 }, - { "Eibps", 0.125 * pow(1024, 6) }, - { "Pibps", 0.125 * pow(1024, 5) }, - { "Tibps", 0.125 * pow(1024, 4) }, - { "Gibps", 0.125 * pow(1024, 3) }, - { "Mibps", 0.125 * pow(1024, 2) }, - { "Kibps", 0.125 * 1024 }, - { "Tbps", 0.125 * 1e12 }, - { "Gbps", 0.125 * 1e9 }, - { "Mbps", 0.125 * 1e6 }, - { "kbps", 0.125 * 1e3 }, - { "bps", 0.125 }, - { nullptr, 0 } - }; + static const unit_scale units{std::make_tuple("bps", 0.125, 2, true), std::make_tuple("bps", 0.125, 10, true), + std::make_tuple("Bps", 1.0, 2, true), std::make_tuple("Bps", 1.0, 10, true)}; return surf_parse_get_value_with_unit(string, units, entity_kind, name, "Append 'Bps' to get bytes per second (or 'bps' for bits but 1Bps = 8bps)", "Bps"); } double surf_parse_get_speed(const char* string, const char* entity_kind, std::string name) { - const struct unit_scale units[] = { - { "yottaflops", 1e24 }, - { "Yf", 1e24 }, - { "zettaflops", 1e21 }, - { "Zf", 1e21 }, - { "exaflops", 1e18 }, - { "Ef", 1e18 }, - { "petaflops", 1e15 }, - { "Pf", 1e15 }, - { "teraflops", 1e12 }, - { "Tf", 1e12 }, - { "gigaflops", 1e9 }, - { "Gf", 1e9 }, - { "megaflops", 1e6 }, - { "Mf", 1e6 }, - { "kiloflops", 1e3 }, - { "kf", 1e3 }, - { "flops", 1.0 }, - { "f", 1.0 }, - { nullptr, 0 } - }; + static const unit_scale units{std::make_tuple("f", 1.0, 10, true), std::make_tuple("flops", 1.0, 10, false)}; return surf_parse_get_value_with_unit(string, units, entity_kind, name, "Append 'f' or 'flops' to your speed to get flop per second", "f"); } @@ -318,7 +277,6 @@ std::map* current_property_set = nullptr; std::map* current_model_property_set = nullptr; int ZONE_TAG = 0; // Whether we just opened a zone tag (to see what to do with the properties) -YY_BUFFER_STATE surf_input_buffer; FILE *surf_file_to_parse = nullptr; /* Stuff relative to storage */ @@ -382,72 +340,17 @@ void ETag_surfxml_mount() sg_platf_new_mount(&mount); } -/* - * Stuff relative to the tag - */ -static std::vector surf_input_buffer_stack; -static std::vector surf_file_to_parse_stack; -static std::vector surf_parsed_filename_stack; - void STag_surfxml_include() { - XBT_ERROR(" tag is deprecated, and will be removed in SimGrid v3.18. Please stop using it now (or tell us why you need it)."); - parse_after_config(); - XBT_DEBUG("STag_surfxml_include '%s'",A_surfxml_include_file); - surf_parsed_filename_stack.push_back(surf_parsed_filename); // save old file name - surf_parsed_filename = xbt_strdup(A_surfxml_include_file); - - surf_file_to_parse_stack.push_back(surf_file_to_parse); // save old file descriptor - - surf_file_to_parse = surf_fopen(A_surfxml_include_file, "r"); // read new file descriptor - xbt_assert((surf_file_to_parse), "Unable to open \"%s\"\n", A_surfxml_include_file); - - surf_input_buffer_stack.push_back(surf_input_buffer); - surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, YY_BUF_SIZE); - surf_parse_push_buffer_state(surf_input_buffer); - - fflush(nullptr); + xbt_die(" tag was removed in SimGrid v3.18. Please stop using it now."); } -void ETag_surfxml_include() { -/* Nothing to do when done with reading the include tag. - * Instead, the handling should be deferred until the EOF of current buffer -- see below */ -} - -/** @brief When reaching EOF, check whether we are in an include tag, and behave accordingly if yes - * - * This function is called automatically by sedding the parser in tools/cmake/MaintainerMode.cmake - * Every FAIL on "Premature EOF" is preceded by a call to this function, which role is to restore the - * previous buffer if we reached the EOF /of an include file/. Its return code is used to avoid the - * error message in that case. - * - * Yeah, that's terribly hackish, but it works. A better solution should be dealed with in flexml - * directly: a command line flag could instruct it to do the correct thing when the include directive is encountered - * on a line. One day maybe, if the maya allow it. - */ -int ETag_surfxml_include_state() +void ETag_surfxml_include() { - fflush(nullptr); - XBT_DEBUG("ETag_surfxml_include_state '%s'",A_surfxml_include_file); - - if (surf_input_buffer_stack.empty()) // nope, that's a true premature EOF. Let the parser die verbosely. - return 0; - - // Yeah, we were in an Restore state and proceed. - fclose(surf_file_to_parse); - surf_file_to_parse_stack.pop_back(); - surf_parse_pop_buffer_state(); - surf_input_buffer_stack.pop_back(); - - // Restore the filename for error messages - free(surf_parsed_filename); - surf_parsed_filename_stack.pop_back(); - - return 1; + /* Won't happen since is now removed since v3.18. */ } /* Stag and Etag parse functions */ - void STag_surfxml_platform() { XBT_ATTRIB_UNUSED double version = surf_parse_get_double(A_surfxml_platform_version); @@ -524,7 +427,6 @@ void STag_surfxml_prop() void ETag_surfxml_host() { s_sg_platf_host_cbarg_t host; - memset(&host,0,sizeof(host)); host.properties = current_property_set; current_property_set = nullptr; @@ -791,21 +693,16 @@ void STag_surfxml_bypassZoneRoute(){ void ETag_surfxml_route(){ s_sg_platf_route_cbarg_t route; - memset(&route,0,sizeof(route)); route.src = sg_netpoint_by_name_or_null(A_surfxml_route_src); // tested to not be nullptr in start tag route.dst = sg_netpoint_by_name_or_null(A_surfxml_route_dst); // tested to not be nullptr in start tag route.gw_src = nullptr; route.gw_dst = nullptr; - route.link_list = new std::vector(); route.symmetrical = (A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES); - for (auto const& link : parsed_link_list) - route.link_list->push_back(link); - parsed_link_list.clear(); + route.link_list.swap(parsed_link_list); sg_platf_new_route(&route); - delete route.link_list; } void ETag_surfxml_ASroute() @@ -820,7 +717,6 @@ void ETag_surfxml_ASroute() void ETag_surfxml_zoneRoute() { s_sg_platf_route_cbarg_t ASroute; - memset(&ASroute,0,sizeof(ASroute)); ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_src); // tested to not be nullptr in start tag ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_dst); // tested to not be nullptr in start tag @@ -828,11 +724,7 @@ void ETag_surfxml_zoneRoute() ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___src); // tested to not be nullptr in start tag ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___dst); // tested to not be nullptr in start tag - ASroute.link_list = new std::vector(); - - for (auto const& link : parsed_link_list) - ASroute.link_list->push_back(link); - parsed_link_list.clear(); + ASroute.link_list.swap(parsed_link_list); switch (A_surfxml_zoneRoute_symmetrical) { case AU_surfxml_zoneRoute_symmetrical: @@ -842,29 +734,25 @@ void ETag_surfxml_zoneRoute() case A_surfxml_zoneRoute_symmetrical_NO: ASroute.symmetrical = false; break; + default: + THROW_IMPOSSIBLE; } sg_platf_new_route(&ASroute); - delete ASroute.link_list; } void ETag_surfxml_bypassRoute(){ s_sg_platf_route_cbarg_t route; - memset(&route,0,sizeof(route)); route.src = sg_netpoint_by_name_or_null(A_surfxml_bypassRoute_src); // tested to not be nullptr in start tag route.dst = sg_netpoint_by_name_or_null(A_surfxml_bypassRoute_dst); // tested to not be nullptr in start tag route.gw_src = nullptr; route.gw_dst = nullptr; route.symmetrical = false; - route.link_list = new std::vector(); - for (auto const& link : parsed_link_list) - route.link_list->push_back(link); - parsed_link_list.clear(); + route.link_list.swap(parsed_link_list); sg_platf_new_bypassRoute(&route); - delete route.link_list; } void ETag_surfxml_bypassASroute() @@ -878,14 +766,10 @@ void ETag_surfxml_bypassASroute() void ETag_surfxml_bypassZoneRoute() { s_sg_platf_route_cbarg_t ASroute; - memset(&ASroute,0,sizeof(ASroute)); ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_src); ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_dst); - ASroute.link_list = new std::vector(); - for (auto const& link : parsed_link_list) - ASroute.link_list->push_back(link); - parsed_link_list.clear(); + ASroute.link_list.swap(parsed_link_list); ASroute.symmetrical = false; @@ -893,7 +777,6 @@ void ETag_surfxml_bypassZoneRoute() ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___dst); sg_platf_new_bypassRoute(&ASroute); - delete ASroute.link_list; } void ETag_surfxml_trace(){ @@ -994,8 +877,7 @@ void ETag_surfxml_config() current_property_set = nullptr; } -static int argc; -static char **argv; +static std::vector arguments; void STag_surfxml_process() { @@ -1006,9 +888,7 @@ void STag_surfxml_process() void STag_surfxml_actor() { ZONE_TAG = 0; - argc = 1; - argv = xbt_new(char *, 1); - argv[0] = xbt_strdup(A_surfxml_actor_function); + arguments.assign(1, A_surfxml_actor_function); xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); } @@ -1025,13 +905,11 @@ void ETag_surfxml_process() void ETag_surfxml_actor() { s_sg_platf_process_cbarg_t actor; - memset(&actor,0,sizeof(actor)); actor.properties = current_property_set; current_property_set = nullptr; - actor.argc = argc; - actor.argv = (const char **)argv; + actor.args.swap(arguments); actor.host = A_surfxml_actor_host; actor.function = A_surfxml_actor_function; actor.start_time = surf_parse_get_double(A_surfxml_actor_start___time); @@ -1051,17 +929,10 @@ void ETag_surfxml_actor() } sg_platf_new_process(&actor); - - for (int i = 0; i != argc; ++i) - xbt_free(argv[i]); - xbt_free(argv); - argv = nullptr; } void STag_surfxml_argument(){ - argc++; - argv = (char**)xbt_realloc(argv, (argc) * sizeof(char **)); - argv[(argc) - 1] = xbt_strdup(A_surfxml_argument_value); + arguments.push_back(A_surfxml_argument_value); } void STag_surfxml_model___prop(){ @@ -1086,14 +957,15 @@ void ETag_surfxml_argument(){/* Nothing to do */} void ETag_surfxml_model___prop(){/* Nothing to do */} /* Open and Close parse file */ +YY_BUFFER_STATE surf_input_buffer; + void surf_parse_open(const char *file) { xbt_assert(file, "Cannot parse the nullptr file. Bypassing the parser is strongly deprecated nowadays."); - surf_parsed_filename = xbt_strdup(file); - char* dir = xbt_dirname(file); - surf_path.push_back(std::string(dir)); - xbt_free(dir); + surf_parsed_filename = file; + std::string dir = simgrid::xbt::Path(file).getDirname(); + surf_path.push_back(dir); surf_file_to_parse = surf_fopen(file, "r"); if (surf_file_to_parse == nullptr) @@ -1105,12 +977,7 @@ void surf_parse_open(const char *file) void surf_parse_close() { - if (surf_parsed_filename) { - surf_path.pop_back(); - } - - free(surf_parsed_filename); - surf_parsed_filename = nullptr; + surf_path.pop_back(); // remove the dirname of the opened file, that was added in surf_parse_open() if (surf_file_to_parse) { surf_parse__delete_buffer(surf_input_buffer); @@ -1124,5 +991,4 @@ int surf_parse() { return surf_parse_lex(); } - -SG_END_DECL() +} diff --git a/src/xbt/automaton/automaton.c b/src/xbt/automaton/automaton.c index eb1e879f74..9fde6edb14 100644 --- a/src/xbt/automaton/automaton.c +++ b/src/xbt/automaton/automaton.c @@ -7,6 +7,9 @@ #include "xbt/automaton.h" #include /* printf */ +#include + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_automaton, xbt, "Automaton"); struct xbt_automaton_propositional_symbol{ char* pred; @@ -82,6 +85,13 @@ xbt_automaton_exp_label_t xbt_automaton_exp_label_new(int type, ...){ p = va_arg(ap, char*); label->u.predicat = xbt_strdup(p); break; + case 4: + break; + default: + XBT_DEBUG("Invalid type: %d", type); + xbt_free(label); + label = NULL; + break; } va_end(ap); return label; @@ -95,7 +105,9 @@ xbt_dynar_t xbt_automaton_get_transitions(xbt_automaton_t a){ return a->transitions; } -xbt_automaton_transition_t xbt_automaton_get_transition(xbt_automaton_t a, xbt_automaton_state_t src, xbt_automaton_state_t dst){ +xbt_automaton_transition_t xbt_automaton_get_transition(XBT_ATTRIB_UNUSED xbt_automaton_t a, xbt_automaton_state_t src, + xbt_automaton_state_t dst) +{ xbt_automaton_transition_t transition; unsigned int cursor; xbt_dynar_foreach(src->out, cursor, transition){ diff --git a/src/xbt/automaton/automatonparse_promela.c b/src/xbt/automaton/automatonparse_promela.c index f35835daad..c6abfb5634 100644 --- a/src/xbt/automaton/automatonparse_promela.c +++ b/src/xbt/automaton/automatonparse_promela.c @@ -12,6 +12,9 @@ #if HAVE_UNISTD_H # include /* isatty */ #endif +#include + +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_automaton); static xbt_automaton_t parsed_automaton; char* state_id_src; @@ -89,6 +92,9 @@ static xbt_automaton_exp_label_t new_label(int type, ...){ case 4 : label = xbt_automaton_exp_label_new(type); break; + default: + XBT_DEBUG("Invalid type: %d", type); + break; } va_end(ap); return label; diff --git a/src/xbt/backtrace_linux.cpp b/src/xbt/backtrace_linux.cpp index 9bcdf55579..40966765df 100644 --- a/src/xbt/backtrace_linux.cpp +++ b/src/xbt/backtrace_linux.cpp @@ -6,6 +6,9 @@ /* 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 +#include #include #include #include @@ -38,10 +41,9 @@ struct trace_arg { int size; }; -static _Unwind_Reason_Code -backtrace_helper (struct _Unwind_Context *ctx, void *a) +static _Unwind_Reason_Code backtrace_helper(_Unwind_Context* ctx, void* a) { - struct trace_arg *arg = (struct trace_arg *) a; + trace_arg* arg = static_cast(a); /* We are first called with address in the __backtrace function. Skip it. */ @@ -216,17 +218,19 @@ std::vector resolveBacktrace( } else { /* Damn. The symbol is in a dynamic library. Let's get wild */ - char maps_buff[512]; unsigned long int offset = 0; - char* p; int found = 0; /* let's look for the offset of this library in our addressing space */ - char* maps_name = bprintf("/proc/%d/maps", (int) getpid()); - FILE* maps = fopen(maps_name, "r"); - - unsigned long int addr = strtoul(addrs[i].c_str(), &p, 16); - if (*p != '\0') { + std::string maps_name = std::string("/proc/") + std::to_string(getpid()) + "/maps"; + std::ifstream maps(maps_name); + if (not maps) { + XBT_CRITICAL("open(\"%s\") failed: %s", maps_name.c_str(), strerror(errno)); + continue; + } + size_t pos; + unsigned long int addr = std::stoul(addrs[i], &pos, 16); + if (pos != addrs[i].length()) { XBT_CRITICAL("Cannot parse backtrace address '%s' (addr=%#lx)", addrs[i].c_str(), addr); } XBT_DEBUG("addr=%s (as string) =%#lx (as number)", addrs[i].c_str(), addr); @@ -235,15 +239,15 @@ std::vector resolveBacktrace( unsigned long int first; unsigned long int last; - if (fgets(maps_buff, 512, maps) == nullptr) + std::string maps_buff; + if (not std::getline(maps, maps_buff)) break; if (i == 0) { - maps_buff[strlen(maps_buff) - 1] = '\0'; - XBT_DEBUG("map line: %s", maps_buff); + XBT_DEBUG("map line: %s", maps_buff.c_str()); } - sscanf(maps_buff, "%lx", &first); - p = strchr(maps_buff, '-') + 1; - sscanf(p, "%lx", &last); + first = std::stoul(maps_buff, &pos, 16); + maps_buff.erase(0, pos + 1); + last = std::stoul(maps_buff, nullptr, 16); if (first < addr && addr < last) { offset = first; found = 1; @@ -253,8 +257,7 @@ std::vector resolveBacktrace( XBT_DEBUG("Symbol found, map lines not further displayed (even if looking for next ones)"); } } - fclose(maps); - free(maps_name); + maps.close(); addrs[i].clear(); if (not found) { @@ -272,41 +275,35 @@ std::vector resolveBacktrace( XBT_DEBUG("offset=%#lx new addr=%s", offset, addrs[i].c_str()); /* Got it. We have our new address. Let's get the library path and we are set */ - p = xbt_strdup(backtrace_syms[i]); + std::string p(backtrace_syms[i]); if (p[0] == '[') { /* library path not displayed in the map file either... */ - free(p); - snprintf(line_func,3, "??"); + snprintf(line_func, 3, "??"); } else { - char* p2 = strrchr(p, '('); - if (p2) - *p2 = '\0'; - p2 = strrchr(p, ' '); - if (p2) - *p2 = '\0'; + size_t p2 = p.find_first_of("( "); + if (p2 != std::string::npos) + p.erase(p2); /* Here we go, fire an addr2line up */ - char* subcmd = bprintf("%s -f -e %s %s", ADDR2LINE, p, addrs[i].c_str()); - free(p); - XBT_VERB("Fire a new command: '%s'", subcmd); - FILE* subpipe = popen(subcmd, "r"); + std::string subcmd = std::string(ADDR2LINE) + " -f -e " + p + " " + addrs[i]; + XBT_VERB("Fire a new command: '%s'", subcmd.c_str()); + FILE* subpipe = popen(subcmd.c_str(), "r"); if (not subpipe) { xbt_die("Cannot fork addr2line to display the backtrace"); } if (fgets(line_func, 1024, subpipe)) { line_func[strlen(line_func) - 1] = '\0'; } else { - XBT_VERB("Cannot read result of subcommand %s", subcmd); + XBT_VERB("Cannot read result of subcommand %s", subcmd.c_str()); strncpy(line_func, "???",3); } if (fgets(line_pos, 1024, subpipe)) { line_pos[strlen(line_pos) - 1] = '\0'; } else { - XBT_VERB("Cannot read result of subcommand %s", subcmd); + XBT_VERB("Cannot read result of subcommand %s", subcmd.c_str()); strncpy(line_pos, backtrace_syms[i],1024); } pclose(subpipe); - free(subcmd); } /* check whether the trick worked */ @@ -325,9 +322,19 @@ std::vector resolveBacktrace( addrs[i].clear(); /* Mask the bottom of the stack */ - if (not strncmp("main", line_func, strlen("main")) || - not strncmp("xbt_thread_context_wrapper", line_func, strlen("xbt_thread_context_wrapper")) || - not strncmp("smx_ctx_sysv_wrapper", line_func, strlen("smx_ctx_sysv_wrapper"))) + const char* const breakers[] = { + "main", + "_ZN7simgrid6kernel7context13ThreadContext7wrapperE", // simgrid::kernel::context::ThreadContext::wrapper + "_ZN7simgrid6kernel7context8UContext7wrapperE" // simgrid::kernel::context::UContext::wrapper + }; + bool do_break = false; + for (const char* b : breakers) { + if (strncmp(b, line_func, strlen(b)) == 0) { + do_break = true; + break; + } + } + if (do_break) break; } pclose(pipe); diff --git a/src/xbt/config.cpp b/src/xbt/config.cpp index 3947248782..cb26929e8c 100644 --- a/src/xbt/config.cpp +++ b/src/xbt/config.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -38,8 +39,6 @@ namespace config { missing_key_error::~missing_key_error() = default; -class Config; - namespace { const char* true_values[] = { @@ -96,30 +95,34 @@ static long int parseLong(const char* value) // ***** ConfigType ***** /// A trait which define possible options types: -template struct ConfigType; +template class ConfigType; -template<> struct ConfigType { +template <> class ConfigType { +public: static constexpr const char* type_name = "int"; static inline double parse(const char* value) { return parseLong(value); } }; -template<> struct ConfigType { +template <> class ConfigType { +public: static constexpr const char* type_name = "double"; static inline double parse(const char* value) { return parseDouble(value); } }; -template<> struct ConfigType { +template <> class ConfigType { +public: static constexpr const char* type_name = "string"; static inline std::string parse(const char* value) { return std::string(value); } }; -template<> struct ConfigType { +template <> class ConfigType { +public: static constexpr const char* type_name = "boolean"; static inline bool parse(const char* value) { @@ -135,7 +138,7 @@ template class TypedConfigurationElement; // **** ConfigurationElement **** class ConfigurationElement { -protected: +private: std::string key; std::string desc; bool isdefault = true; @@ -144,8 +147,7 @@ public: /* Callback */ xbt_cfg_cb_t old_callback = nullptr; - ConfigurationElement(const char* key, const char* desc) - : key(key ? key : ""), desc(desc ? desc : "") {} + ConfigurationElement(const char* key, const char* desc) : key(key ? key : ""), desc(desc ? desc : "") {} ConfigurationElement(const char* key, const char* desc, xbt_cfg_cb_t cb) : key(key ? key : ""), desc(desc ? desc : ""), old_callback(cb) {} @@ -170,6 +172,7 @@ public: { dynamic_cast&>(*this).setDefaultValue(std::move(value)); } + void unsetDefault() { isdefault = false; } bool isDefault() const { return isdefault; } std::string const& getDescription() const { return desc; } @@ -204,7 +207,7 @@ public: void update() { if (old_callback) - this->old_callback(key.c_str()); + this->old_callback(getKey().c_str()); if (this->callback) this->callback(this->content); } @@ -219,12 +222,12 @@ public: void setDefaultValue(T value) { - if (this->isdefault) { + if (this->isDefault()) { this->content = std::move(value); this->update(); } else { - XBT_DEBUG("Do not override configuration variable '%s' with value '%s' because it was already set.", key.c_str(), - to_string(value).c_str()); + XBT_DEBUG("Do not override configuration variable '%s' with value '%s' because it was already set.", + getKey().c_str(), to_string(value).c_str()); } } }; @@ -239,7 +242,7 @@ template void TypedConfigurationElement::setStringValue(const char* value) // override { this->content = ConfigType::parse(value); - this->isdefault = false; + this->unsetDefault(); this->update(); } @@ -257,7 +260,7 @@ class Config { private: // name -> ConfigElement: std::map options; - // alias -> xbt_dict_elm_t from options: + // alias -> ConfigElement from options: std::map aliases; bool warn_for_aliases = true; @@ -455,8 +458,7 @@ void xbt_cfg_register_string(const char *name, const char *default_value, xbt_cf simgrid_config = xbt_cfg_new(); atexit(sg_config_finalize); } - simgrid_config->registerOption(name, desc, - default_value ? default_value : "", cb_set); + simgrid_config->registerOption(name, desc, default_value ? default_value : "", cb_set); } void xbt_cfg_register_boolean(const char *name, const char*default_value,xbt_cfg_cb_t cb_set, const char *desc) @@ -495,52 +497,37 @@ void xbt_cfg_set_parse(const char *options) if (not options || not strlen(options)) { /* nothing to do */ return; } - char *optionlist_cpy = xbt_strdup(options); XBT_DEBUG("List to parse and set:'%s'", options); - char *option = optionlist_cpy; - while (1) { /* breaks in the code */ - if (not option) - break; - char *name = option; - int len = strlen(name); - XBT_DEBUG("Still to parse and set: '%s'. len=%d; option-name=%ld", name, len, (long) (option - name)); - - /* Pass the value */ - while (option - name <= (len - 1) && *option != ' ' && *option != '\n' && *option != '\t' && *option != ',') { - XBT_DEBUG("Take %c.", *option); - option++; - } - if (option - name == len) { - XBT_DEBUG("Boundary=EOL"); - option = nullptr; /* don't do next iteration */ - } else { - XBT_DEBUG("Boundary on '%c'. len=%d;option-name=%ld", *option, len, (long) (option - name)); - /* Pass the following blank chars */ - *(option++) = '\0'; - while (option - name < (len - 1) && (*option == ' ' || *option == '\n' || *option == '\t')) { - option++; - } - if (option - name == len - 1) - option = nullptr; /* don't do next iteration */ - } - XBT_DEBUG("parse now:'%s'; parse later:'%s'", name, option); - - if (name[0] == ' ' || name[0] == '\n' || name[0] == '\t') + std::string optionlist(options); + while (not optionlist.empty()) { + XBT_DEBUG("Still to parse and set: '%s'", optionlist.c_str()); + + // skip separators + size_t pos = optionlist.find_first_not_of(" \t\n,"); + optionlist.erase(0, pos); + // find option + pos = optionlist.find_first_of(" \t\n,"); + std::string name = optionlist.substr(0, pos); + optionlist.erase(0, pos); + XBT_DEBUG("parse now:'%s'; parse later:'%s'", name.c_str(), optionlist.c_str()); + + if (name.empty()) continue; - if (not strlen(name)) - break; - char *val = strchr(name, ':'); - xbt_assert(val, "Option '%s' badly formatted. Should be of the form 'name:value'", name); - /* don't free(optionlist_cpy) if the assert fails, 'name' points inside it */ - *(val++) = '\0'; + pos = name.find(':'); + xbt_assert(pos != std::string::npos, "Option '%s' badly formatted. Should be of the form 'name:value'", + name.c_str()); - if (strncmp(name, "path", strlen("path"))) - XBT_INFO("Configuration change: Set '%s' to '%s'", name, val); + std::string val = name.substr(pos + 1); + name.erase(pos); + + const std::string path("path"); + if (name.compare(0, path.length(), path) != 0) + XBT_INFO("Configuration change: Set '%s' to '%s'", name.c_str(), val.c_str()); try { - (*simgrid_config)[name].setStringValue(val); + (*simgrid_config)[name.c_str()].setStringValue(val.c_str()); } catch (simgrid::config::missing_key_error& e) { goto on_missing_key; @@ -549,17 +536,12 @@ void xbt_cfg_set_parse(const char *options) goto on_exception; } } - - free(optionlist_cpy); return; /* Do not THROWF from a C++ exception catching context, or some cleanups will be missing */ on_missing_key: - free(optionlist_cpy); THROWF(not_found_error, 0, "Could not set variables %s", options); - return; on_exception: - free(optionlist_cpy); THROWF(unknown_error, 0, "Could not set variables %s", options); } @@ -674,10 +656,10 @@ void xbt_cfg_set_double(const char *key, double value) * @param value the value to be added * */ -void xbt_cfg_set_string(const char *key, const char *value) +void xbt_cfg_set_string(const char* key, const char* value) { try { - (*simgrid_config)[key].setValue(value ? value : ""); + (*simgrid_config)[key].setValue(value); return; } TRANSLATE_EXCEPTIONS("Could not set variable %s to string %s", key, value); @@ -746,10 +728,10 @@ double xbt_cfg_get_double(const char *key) * * \warning the returned value is the actual content of the config set */ -char *xbt_cfg_get_string(const char *key) +std::string xbt_cfg_get_string(const char* key) { try { - return (char*) (*simgrid_config)[key].getValue().c_str(); + return (*simgrid_config)[key].getValue(); } TRANSLATE_EXCEPTIONS("Could not get variable %s", key); } diff --git a/src/xbt/cunit.cpp b/src/xbt/cunit.cpp index 87c869c4f4..7cdedb856c 100644 --- a/src/xbt/cunit.cpp +++ b/src/xbt/cunit.cpp @@ -9,17 +9,20 @@ /* At some point we should use https://github.com/google/googletest instead */ #include "src/internal_config.h" -#include +#include +#include +#include +#include +#include #include -#include "xbt/sysdep.h" /* bvprintf */ -#include "xbt/cunit.h" -#include "xbt/dynar.h" +#include -#define STRLEN 1024 +/* output stream to use everywhere */ +static std::ostream& _xbt_test_out = std::cerr; /* collection of all suites */ -static xbt_dynar_t _xbt_test_suites = nullptr; +static std::vector _xbt_test_suites; /* global statistics */ static int _xbt_test_nb_tests = 0; static int _xbt_test_test_failed = 0; @@ -40,511 +43,413 @@ static int _xbt_test_suite_disabled = 0; xbt_test_unit_t _xbt_test_current_unit = nullptr; /* test suite test log */ -typedef struct s_xbt_test_log { - char *text; - const char *file; - int line; -} *xbt_test_log_t; +class s_xbt_test_log { +public: + s_xbt_test_log(std::string text, std::string file, int line) + : text_(std::move(text)), file_(std::move(file)), line_(line) + { + } + void dump() const; + + std::string text_; + std::string file_; + int line_; +}; -static void xbt_test_log_dump(xbt_test_log_t log) +void s_xbt_test_log::dump() const { - if (log) - fprintf(stderr, " log %p(%s:%d)=%s\n", log, log->file, log->line, log->text); - else - fprintf(stderr, " log=nullptr\n"); + _xbt_test_out << " log " << this << "(" << file_ << ":" << line_ << ")=" << text_ << "\n"; } /* test suite test check */ -typedef struct s_xbt_test_test { - char *title; - int failed; - int expected_failure; - int ignored; - const char *file; - int line; - xbt_dynar_t logs; -} *xbt_test_test_t; - -static void xbt_test_test_dump(xbt_test_test_t test) +class s_xbt_test_test { +public: + s_xbt_test_test(std::string title, std::string file, int line) + : title_(std::move(title)), file_(std::move(file)), line_(line) + { + } + void dump() const; + + std::string title_; + bool failed_ = false; + bool expected_failure_ = false; + bool ignored_ = false; + std::string file_; + int line_; + std::vector logs_; +}; + +void s_xbt_test_test::dump() const { - if (test) { - xbt_test_log_t log; - unsigned int it_log; - fprintf(stderr, " test %p(%s:%d)=%s (%s)\n", test, test->file, test->line, test->title, - test->failed ? "failed" : "not failed"); - xbt_dynar_foreach(test->logs, it_log, log) - xbt_test_log_dump(log); - } else - fprintf(stderr, " test=nullptr\n"); + _xbt_test_out << " test " << this << "(" << file_ << ":" << line_ << ")=" << title_ << " (" + << (failed_ ? "failed" : "not failed") << ")\n"; + for (s_xbt_test_log const& log : this->logs_) + log.dump(); } /* test suite test unit */ -struct s_xbt_test_unit { - int enabled; - char *name; - char *title; - ts_test_cb_t func; - const char *file; - int line; - xbt_dynar_t tests; /* of xbt_test_test_t */ - - int nb_tests; - int test_failed; - int test_ignore; - int test_expect; +class s_xbt_test_unit { +public: + s_xbt_test_unit(std::string name, std::string title, ts_test_cb_t func) + : name_(std::move(name)), title_(std::move(title)), func_(func) + { + } + void dump() const; + + std::string name_; + std::string title_; + ts_test_cb_t func_; + std::vector tests_; + + bool enabled_ = true; + int nb_tests_ = 0; + int test_failed_ = 0; + int test_ignore_ = 0; + int test_expect_ = 0; }; -static void xbt_test_unit_dump(xbt_test_unit_t unit) +void s_xbt_test_unit::dump() const { - if (unit) { - fprintf(stderr, " UNIT %s: %s (%s)\n", unit->name, unit->title, (unit->enabled ? "enabled" : "disabled")); - if (unit->enabled) { - xbt_test_test_t test; - unsigned int it_test; - xbt_dynar_foreach(unit->tests, it_test, test) - xbt_test_test_dump(test); - } - } else { - fprintf(stderr, " unit=nullptr\n"); + _xbt_test_out << " UNIT " << name_ << ": " << title_ << " (" << (this->enabled_ ? "enabled" : "disabled") << ")\n"; + if (this->enabled_) { + for (s_xbt_test_test const& test : this->tests_) + test.dump(); } } /* test suite */ -struct s_xbt_test_suite { - int enabled; - const char *name; - char *title; - xbt_dynar_t units; /* of xbt_test_unit_t */ - - int nb_tests; - int nb_units; - int test_failed; - int test_ignore; - int test_expect; - int unit_failed; - int unit_ignore; - int unit_disabled; +class s_xbt_test_suite { +public: + s_xbt_test_suite(std::string name, std::string title) : name_(std::move(name)), title_(std::move(title)) {} + void dump() const; + void push(s_xbt_test_unit unit) { units_.emplace_back(std::move(unit)); } + int run(int verbosity); + + std::string name_; + std::string title_; + std::vector units_; + + bool enabled_ = true; + int nb_tests_ = 0; + int nb_units_ = 0; + int test_failed_ = 0; + int test_ignore_ = 0; + int test_expect_ = 0; + int unit_failed_ = 0; + int unit_ignore_ = 0; + int unit_disabled_ = 0; }; -/* destroy test suite */ -static void xbt_test_suite_free(void *s) -{ - xbt_test_suite_t suite = *(xbt_test_suite_t *) s; - - if (suite == nullptr) - return; - xbt_dynar_free(&suite->units); - free(suite->title); - free(suite); -} - -static void xbt_test_unit_free(void *unit) -{ - xbt_test_unit_t u = *(xbt_test_unit_t *) unit; - /* name is static */ - free(u->title); - xbt_dynar_free(&u->tests); - free(u); -} - -static void xbt_test_test_free(void *test) -{ - xbt_test_test_t t = *(xbt_test_test_t *) test; - free(t->title); - xbt_dynar_free(&(t->logs)); - free(t); -} - -static void xbt_test_log_free(void *log) -{ - xbt_test_log_t l = *(xbt_test_log_t *) log; - free(l->text); - free(l); -} - -/** @brief create test suite */ -xbt_test_suite_t xbt_test_suite_new(const char *name, const char *fmt, ...) -{ - xbt_test_suite_t suite = xbt_new0(struct s_xbt_test_suite, 1); - va_list ap; - - if (_xbt_test_suites == nullptr) - _xbt_test_suites = xbt_dynar_new(sizeof(xbt_test_suite_t), xbt_test_suite_free); - - va_start(ap, fmt); - suite->title = bvprintf(fmt, ap); - suite->units = xbt_dynar_new(sizeof(xbt_test_unit_t), &xbt_test_unit_free); - va_end(ap); - suite->name = name; - suite->enabled = 1; - - xbt_dynar_push(_xbt_test_suites, &suite); - - return suite; -} - /** @brief retrieve a testsuite from name, or create a new one */ xbt_test_suite_t xbt_test_suite_by_name(const char *name, const char *fmt, ...) { - xbt_test_suite_t suite; - char *bufname; - va_list ap; - - if (_xbt_test_suites) { - unsigned int it_suite; - xbt_dynar_foreach(_xbt_test_suites, it_suite, suite) - if (not strcmp(suite->name, name)) - return suite; - } + auto res = std::find_if(begin(_xbt_test_suites), end(_xbt_test_suites), + [&name](xbt_test_suite_t const& suite) { return suite->name_ == name; }); + if (res != end(_xbt_test_suites)) + return *res; + va_list ap; va_start(ap, fmt); - bufname = bvprintf(fmt, ap); + xbt_test_suite_t suite = new s_xbt_test_suite(name, simgrid::xbt::string_vprintf(fmt, ap)); va_end(ap); - suite = xbt_test_suite_new(name, bufname, nullptr); - free(bufname); + + _xbt_test_suites.push_back(suite); return suite; } -void xbt_test_suite_dump(xbt_test_suite_t suite) +void s_xbt_test_suite::dump() const { - if (suite) { - fprintf(stderr, "TESTSUITE %s: %s (%s)\n", suite->name, suite->title, suite->enabled ? "enabled" : "disabled"); - if (suite->enabled) { - xbt_test_unit_t unit; - unsigned int it_unit; - xbt_dynar_foreach(suite->units, it_unit, unit) - xbt_test_unit_dump(unit); - } - } else { - fprintf(stderr, "TESTSUITE IS NULL!\n"); + _xbt_test_out << "TESTSUITE " << name_ << ": " << title_ << " (" << (this->enabled_ ? "enabled" : "disabled") + << ")\n"; + if (this->enabled_) { + for (s_xbt_test_unit const& unit : this->units_) + unit.dump(); } } /* add test case to test suite */ void xbt_test_suite_push(xbt_test_suite_t suite, const char *name, ts_test_cb_t func, const char *fmt, ...) { - xbt_test_unit_t unit; - va_list ap; - xbt_assert(suite); xbt_assert(func); xbt_assert(fmt); - unit = xbt_new0(struct s_xbt_test_unit, 1); + va_list ap; va_start(ap, fmt); - unit->title = bvprintf(fmt, ap); + s_xbt_test_unit unit(name, simgrid::xbt::string_vprintf(fmt, ap), func); va_end(ap); - unit->name = (char *) name; - unit->func = func; - unit->file = nullptr; - unit->line = 0; - unit->enabled = 1; - unit->tests = xbt_dynar_new(sizeof(xbt_test_test_t), xbt_test_test_free); - - xbt_dynar_push(suite->units, &unit); + suite->push(unit); } /* run test one suite */ -static int xbt_test_suite_run(xbt_test_suite_t suite, int verbosity) +int s_xbt_test_suite::run(int verbosity) { - xbt_test_unit_t unit; - xbt_test_test_t test; - xbt_test_log_t log; - - if (suite == nullptr) - return 0; - /* suite title pretty-printing */ - char suite_title[81]; - int suite_len = strlen(suite->title); - - xbt_assert(suite_len < 68, "suite title \"%s\" too long (%d should be less than 68", suite->title, suite_len); - - suite_title[0] = ' '; - for (int i = 1; i < 79; i++) - suite_title[i] = '='; - suite_title[79] = '\n'; - suite_title[80] = '\0'; - - snprintf(suite_title + 40 - (suite_len + 4) / 2, 81 - (40 - (suite_len + 4) / 2), "[ %s ]", suite->title); - suite_title[40 + (suite_len + 5) / 2] = '='; - if (not suite->enabled) - snprintf(suite_title + 70, 11, " DISABLED "); - fprintf(stderr, "\n%s\n", suite_title); - - if (suite->enabled) { + int suite_len = this->title_.length(); + xbt_assert(suite_len < 68, "suite title \"%s\" too long (%d should be less than 68", this->title_.c_str(), suite_len); + + std::string suite_title = " "; + suite_title.resize(40 - (suite_len + 4) / 2, '='); + suite_title += std::string("[ ") + this->title_ + " ]"; + suite_title.resize(79, '='); + if (not this->enabled_) + suite_title.replace(70, std::string::npos, " DISABLED"); + _xbt_test_out << "\n" << suite_title << "\n"; + + if (this->enabled_) { /* iterate through all tests */ - unsigned int it_unit; - xbt_dynar_foreach(suite->units, it_unit, unit) { + for (s_xbt_test_unit& unit : this->units_) { /* init unit case counters */ - unit->nb_tests = 0; - unit->test_ignore = 0; - unit->test_failed = 0; - unit->test_expect = 0; + unit.nb_tests_ = 0; + unit.test_ignore_ = 0; + unit.test_failed_ = 0; + unit.test_expect_ = 0; /* display unit title */ - char* cp = bprintf(" Unit: %s ......................................" - "......................................", - unit->title); - cp[70] = '\0'; - fprintf(stderr, "%s", cp); - free(cp); + std::string cp = std::string(" Unit: ") + unit.title_ + " "; + cp.resize(70, '.'); + _xbt_test_out << cp; /* run the test case function */ - _xbt_test_current_unit = unit; - if (unit->enabled) - unit->func(); + _xbt_test_current_unit = &unit; + if (unit.enabled_) + unit.func_(); /* iterate through all performed tests to determine status */ - unsigned int it_test; - xbt_dynar_foreach(unit->tests, it_test, test) { - if (test->ignored) { - unit->test_ignore++; + for (s_xbt_test_test const& test : unit.tests_) { + if (test.ignored_) { + unit.test_ignore_++; } else { - unit->nb_tests++; - - if (test->failed && not test->expected_failure) - unit->test_failed++; - if (not test->failed && test->expected_failure) - unit->test_failed++; - if (test->expected_failure) - unit->test_expect++; + unit.nb_tests_++; + + if ((test.failed_ && not test.expected_failure_) || (not test.failed_ && test.expected_failure_)) + unit.test_failed_++; + if (test.expected_failure_) + unit.test_expect_++; } } /* Display whether this unit went well */ - if (unit->test_failed > 0 || unit->test_expect || (verbosity && unit->nb_tests > 0)) { + if (unit.test_failed_ > 0 || unit.test_expect_ || (verbosity && unit.nb_tests_ > 0)) { /* some tests failed (or were supposed to), so do detailed reporting of test case */ - if (unit->test_failed > 0) { - fprintf(stderr, ".. failed\n"); - } else if (unit->nb_tests) { - fprintf(stderr, "...... ok\n"); /* successful, but show about expected */ + if (unit.test_failed_ > 0) { + _xbt_test_out << ".. failed\n"; + } else if (unit.nb_tests_) { + _xbt_test_out << "...... ok\n"; /* successful, but show about expected */ } else { - fprintf(stderr, ".... skip\n"); /* shouldn't happen, but I'm a bit lost with this logic */ + _xbt_test_out << ".... skip\n"; /* shouldn't happen, but I'm a bit lost with this logic */ } - xbt_dynar_foreach(unit->tests, it_test, test) { - const char* file = (test->file != nullptr ? test->file : unit->file); - int line = (test->line != 0 ? test->line : unit->line); - const char* resname; - if (test->ignored) + for (s_xbt_test_test const& test : unit.tests_) { + std::string file = test.file_; + int line = test.line_; + std::string resname; + if (test.ignored_) resname = " SKIP"; - else if (test->expected_failure) { - if (test->failed) + else if (test.expected_failure_) { + if (test.failed_) resname = "EFAIL"; else resname = "EPASS"; } else { - if (test->failed) + if (test.failed_) resname = " FAIL"; else resname = " PASS"; } - fprintf(stderr, " %s: %s [%s:%d]\n", resname, test->title, file, line); - - if ((test->expected_failure && not test->failed) || (not test->expected_failure && test->failed)) { - unsigned int it_log; - xbt_dynar_foreach(test->logs, it_log, log) { - file = (log->file != nullptr ? log->file : file); - line = (log->line != 0 ? log->line : line); - fprintf(stderr, " %s:%d: %s\n", file, line, log->text); + _xbt_test_out << " " << resname << ": " << test.title_ << " [" << file << ":" << line << "]\n"; + + if ((test.expected_failure_ && not test.failed_) || (not test.expected_failure_ && test.failed_)) { + for (s_xbt_test_log const& log : test.logs_) { + file = (log.file_.empty() ? file : log.file_); + line = (log.line_ == 0 ? line : log.line_); + _xbt_test_out << " " << file << ":" << line << ": " << log.text_ << "\n"; } } } - fprintf(stderr, " Summary: %d of %d tests failed", unit->test_failed, unit->nb_tests); - if (unit->test_ignore) { - fprintf(stderr, " (%d tests ignored)\n", unit->test_ignore); + _xbt_test_out << " Summary: " << unit.test_failed_ << " of " << unit.nb_tests_ << " tests failed"; + if (unit.test_ignore_) { + _xbt_test_out << " (" << unit.test_ignore_ << " tests ignored)\n"; } else { - fprintf(stderr, "\n"); + _xbt_test_out << "\n"; } - } else if (not unit->enabled) { - fprintf(stderr, " disabled\n"); /* no test were run */ - } else if (unit->nb_tests) { - fprintf(stderr, "...... ok\n"); /* successful */ + } else if (not unit.enabled_) { + _xbt_test_out << " disabled\n"; /* no test were run */ + } else if (unit.nb_tests_) { + _xbt_test_out << "...... ok\n"; /* successful */ } else { - fprintf(stderr, ".... skip\n"); /* no test were run */ + _xbt_test_out << ".... skip\n"; /* no test were run */ } /* Accumulate test counts into the suite */ - suite->nb_tests += unit->nb_tests; - suite->test_failed += unit->test_failed; - suite->test_ignore += unit->test_ignore; - suite->test_expect += unit->test_expect; + this->nb_tests_ += unit.nb_tests_; + this->test_failed_ += unit.test_failed_; + this->test_ignore_ += unit.test_ignore_; + this->test_expect_ += unit.test_expect_; - _xbt_test_nb_tests += unit->nb_tests; - _xbt_test_test_failed += unit->test_failed; - _xbt_test_test_ignore += unit->test_ignore; - _xbt_test_test_expect += unit->test_expect; + _xbt_test_nb_tests += unit.nb_tests_; + _xbt_test_test_failed += unit.test_failed_; + _xbt_test_test_ignore += unit.test_ignore_; + _xbt_test_test_expect += unit.test_expect_; /* What's the conclusion of this test anyway? */ - if (unit->nb_tests) { - suite->nb_units++; - if (unit->test_failed) - suite->unit_failed++; - } else if (not unit->enabled) { - suite->unit_disabled++; + if (unit.nb_tests_) { + this->nb_units_++; + if (unit.test_failed_) + this->unit_failed_++; + } else if (not unit.enabled_) { + this->unit_disabled_++; } else { - suite->unit_ignore++; + this->unit_ignore_++; } } } - _xbt_test_nb_units += suite->nb_units; - _xbt_test_unit_failed += suite->unit_failed; - _xbt_test_unit_ignore += suite->unit_ignore; - _xbt_test_unit_disabled += suite->unit_disabled; + _xbt_test_nb_units += this->nb_units_; + _xbt_test_unit_failed += this->unit_failed_; + _xbt_test_unit_ignore += this->unit_ignore_; + _xbt_test_unit_disabled += this->unit_disabled_; - if (suite->nb_units) { + if (this->nb_units_) { _xbt_test_nb_suites++; - if (suite->test_failed) + if (this->test_failed_) _xbt_test_suite_failed++; - } else if (not suite->enabled) { + } else if (not this->enabled_) { _xbt_test_suite_disabled++; } else { _xbt_test_suite_ignore++; } /* print test suite summary */ - if (suite->enabled) { - int first = 1; /* for result pretty printing */ - - fprintf(stderr," =====================================================================%s\n", - (suite->nb_units ? (suite->unit_failed ? "== FAILED" : "====== OK") : - (suite->unit_disabled ? " DISABLED" : "==== SKIP"))); - fprintf(stderr, " Summary: Units: %.0f%% ok (%d units: ", suite->nb_units - ? ((1 - (double) suite->unit_failed / (double) suite->nb_units) * 100.0) : 100.0, suite->nb_units); - - if (suite->nb_units != suite->unit_failed) { - fprintf(stderr, "%s%d ok", (first ? "" : ", "), suite->nb_units - suite->unit_failed); - first = 0; + if (this->enabled_) { + bool first = true; /* for result pretty printing */ + + _xbt_test_out << " =====================================================================" + << (this->nb_units_ ? (this->unit_failed_ ? "== FAILED" : "====== OK") + : (this->unit_disabled_ ? " DISABLED" : "==== SKIP")) + << "\n"; + _xbt_test_out.setf(std::ios::fixed); + _xbt_test_out.precision(0); + _xbt_test_out << " Summary: Units: " + << (this->nb_units_ ? ((1 - (double)this->unit_failed_ / (double)this->nb_units_) * 100.0) : 100.0) + << "% ok (" << this->nb_units_ << " units: "; + if (this->nb_units_ != this->unit_failed_) { + _xbt_test_out << (first ? "" : ", ") << (this->nb_units_ - this->unit_failed_) << " ok"; + first = false; } - if (suite->unit_failed) { - fprintf(stderr, "%s%d failed", (first ? "" : ", "), suite->unit_failed); - first = 0; + if (this->unit_failed_) { + _xbt_test_out << (first ? "" : ", ") << this->unit_failed_ << " failed"; + first = false; } - if (suite->unit_ignore) { - fprintf(stderr, "%s%d ignored", (first ? "" : ", "), suite->unit_ignore); - first = 0; + if (this->unit_ignore_) { + _xbt_test_out << (first ? "" : ", ") << this->unit_ignore_ << " ignored"; + first = false; } - if (suite->unit_disabled) { - fprintf(stderr, "%s%d disabled", (first ? "" : ", "), suite->unit_disabled); + if (this->unit_disabled_) { + _xbt_test_out << (first ? "" : ", ") << this->unit_disabled_ << " disabled"; } - fprintf(stderr, ")\n Tests: %.0f%% ok (%d tests: ", suite->nb_tests - ? ((1 - (double) suite->test_failed / (double) suite->nb_tests) * 100.0) : 100.0, suite->nb_tests); - - first = 1; - if (suite->nb_tests != suite->test_failed) { - fprintf(stderr, "%s%d ok", (first ? "" : ", "), suite->nb_tests - suite->test_failed); - first = 0; + _xbt_test_out << ")\n Tests: " + << (this->nb_tests_ ? ((1 - (double)this->test_failed_ / (double)this->nb_tests_) * 100.0) : 100.0) + << "% ok (" << this->nb_tests_ << " tests: "; + first = true; + if (this->nb_tests_ != this->test_failed_) { + _xbt_test_out << (first ? "" : ", ") << (this->nb_tests_ - this->test_failed_) << " ok"; + first = false; } - if (suite->test_failed) { - fprintf(stderr, "%s%d failed", (first ? "" : ", "), suite->test_failed); - first = 0; + if (this->test_failed_) { + _xbt_test_out << (first ? "" : ", ") << this->test_failed_ << " failed"; + first = false; } - if (suite->test_ignore) { - fprintf(stderr, "%s%d ignored", (first ? "" : "; "), suite->test_ignore); - first = 0; + if (this->test_ignore_) { + _xbt_test_out << (first ? "" : "; ") << this->test_ignore_ << " ignored"; + first = false; } - if (suite->test_expect) { - fprintf(stderr, "%s%d expected to fail", (first ? "" : "; "), suite->test_expect); + if (this->test_expect_) { + _xbt_test_out << (first ? "" : "; ") << this->test_expect_ << " expected to fail"; } - fprintf(stderr, ")\n"); + _xbt_test_out << ")\n"; } - return suite->unit_failed; + return this->unit_failed_; } static void apply_selection(char *selection) { - /* for the parsing */ - char *sel = selection; - int done = 0; - char dir[STRLEN]; /* the directive */ - /* iterators */ - unsigned int it_suite; - xbt_test_suite_t suite; - xbt_test_unit_t unit; - unsigned int it_unit; - - char suitename[STRLEN]; - char unitname[STRLEN]; - if (not selection || selection[0] == '\0') return; + /* for the parsing */ + std::string sel = selection; + bool done = false; + std::string dir; /* the directive */ + std::string suitename; + std::string unitname; + /* First apply the selection */ + size_t p0 = 0; while (not done) { - int enabling = 1; + bool enabling = true; - char *p = strchr(sel, ','); - if (p) { - snprintf(dir, STRLEN, "%.*s", (int)(p - sel), sel); - sel = p + 1; + size_t p = sel.find(',', p0); + if (p != std::string::npos) { + dir = sel.substr(p0, p - p0); + p0 = p + 1; } else { - snprintf(dir, STRLEN, "%s", sel); - done = 1; + dir = sel.substr(p0); + done = true; } if (dir[0] == '-') { - enabling = 0; - memmove(dir, dir + 1, strlen(dir)); + enabling = false; + dir.erase(0, 1); } if (dir[0] == '+') { - enabling = 1; - memmove(dir, dir + 1, strlen(dir)); + enabling = true; + dir.erase(0, 1); } - p = strchr(dir, ':'); - if (p) { - snprintf(suitename, STRLEN, "%.*s", (int)(p - dir), dir); - snprintf(unitname, STRLEN, "%s", p + 1); + p = dir.find(':'); + if (p != std::string::npos) { + suitename = dir.substr(0, p); + unitname = dir.substr(p + 1); } else { - snprintf(suitename, STRLEN, "%s", dir); - unitname[0] = '\0'; + suitename = dir; + unitname = ""; } /* Deal with the specific case of 'all' pseudo serie */ - if (not strcmp("all", suitename)) { - xbt_assert(unitname[0] == '\0', "The 'all' pseudo-suite does not accept any unit specification\n"); + if (suitename == "all") { + xbt_assert(unitname.empty(), "The 'all' pseudo-suite does not accept any unit specification\n"); - xbt_dynar_foreach(_xbt_test_suites, it_suite, suite) { - xbt_dynar_foreach(suite->units, it_unit, unit) { - unit->enabled = enabling; + for (xbt_test_suite_t& suite : _xbt_test_suites) { + for (s_xbt_test_unit& unit : suite->units_) { + unit.enabled_ = enabling; } - suite->enabled = enabling; + suite->enabled_ = enabling; } } else { - unsigned int it; - for (it = 0; it < xbt_dynar_length(_xbt_test_suites); it++) { - xbt_test_suite_t thissuite = - xbt_dynar_get_as(_xbt_test_suites, it, xbt_test_suite_t); - if (not strcmp(suitename, thissuite->name)) { + bool suitefound = false; + for (xbt_test_suite_t& thissuite : _xbt_test_suites) { + if (suitename == thissuite->name_) { /* Do not disable the whole suite when we just want to disable a child */ - if (enabling || (unitname[0] == '\0')) - thissuite->enabled = enabling; + if (enabling || unitname.empty()) + thissuite->enabled_ = enabling; - if (unitname[0] == '\0') { - xbt_dynar_foreach(thissuite->units, it_unit, unit) { - unit->enabled = enabling; + if (unitname.empty()) { + for (s_xbt_test_unit& unit : thissuite->units_) { + unit.enabled_ = enabling; } } else { /* act on one child only */ - unsigned int it2_unit; - /* search it, first (we won't reuse it for external loop which gets broken) */ - for (it2_unit = 0; - it2_unit < xbt_dynar_length(thissuite->units); - it2_unit++) { - xbt_test_unit_t thisunit = xbt_dynar_get_as(thissuite->units, it2_unit, xbt_test_unit_t); - if (not strcmp(thisunit->name, unitname)) { - thisunit->enabled = enabling; - break; - } - } /* search relevant unit */ - xbt_assert(it2_unit != xbt_dynar_length(thissuite->units), - "Suite '%s' has no unit of name '%s'. Cannot apply the selection\n", suitename, unitname); + /* search relevant unit */ + auto unit = std::find_if(begin(thissuite->units_), end(thissuite->units_), + [&unitname](s_xbt_test_unit const& unit) { return unit.name_ == unitname; }); + if (unit == end(thissuite->units_)) + xbt_die("Suite '%s' has no unit of name '%s'. Cannot apply the selection\n", suitename.c_str(), + unitname.c_str()); + unit->enabled_ = enabling; } /* act on childs (either all or one) */ - + suitefound = true; break; /* found the relevant serie. We are happy */ } } /* search relevant series */ - xbt_assert(it != xbt_dynar_length(_xbt_test_suites), - "No suite of name '%s' found. Cannot apply the selection\n", suitename); + xbt_assert(suitefound, "No suite of name '%s' found. Cannot apply the selection\n", suitename.c_str()); } } } @@ -553,14 +458,11 @@ void xbt_test_dump(char *selection) { apply_selection(selection); - if (_xbt_test_suites) { - unsigned int it_suite; - xbt_test_suite_t suite; - - xbt_dynar_foreach(_xbt_test_suites, it_suite, suite) - xbt_test_suite_dump(suite); + if (not _xbt_test_suites.empty()) { + for (xbt_test_suite_t suite : _xbt_test_suites) + suite->dump(); } else { - printf(" No suite defined."); + _xbt_test_out << " No suite defined."; } } @@ -568,67 +470,73 @@ int xbt_test_run(char *selection, int verbosity) { apply_selection(selection); - if (_xbt_test_suites) { - unsigned int it_suite; - xbt_test_suite_t suite; - int first = 1; + if (not _xbt_test_suites.empty()) { + bool first = true; /* Run all the suites */ - xbt_dynar_foreach(_xbt_test_suites, it_suite, suite) - xbt_test_suite_run(suite, verbosity); + for (xbt_test_suite_t& suite : _xbt_test_suites) + if (suite) + suite->run(verbosity); /* Display some more statistics */ - fprintf(stderr, "\n\n TOTAL: Suites: %.0f%% ok (%d suites: ",_xbt_test_nb_suites - ? ((1 - (double) _xbt_test_suite_failed / (double) _xbt_test_nb_suites) * 100.0) - : 100.0, _xbt_test_nb_suites); + _xbt_test_out.setf(std::ios::fixed); + _xbt_test_out.precision(0); + _xbt_test_out << "\n\n TOTAL: Suites: " + << (_xbt_test_nb_suites ? ((1 - (double)_xbt_test_suite_failed / (double)_xbt_test_nb_suites) * 100.0) + : 100.0) + << "% ok (" << _xbt_test_nb_suites << " suites: "; if (_xbt_test_nb_suites != _xbt_test_suite_failed) { - fprintf(stderr, "%d ok", _xbt_test_nb_suites - _xbt_test_suite_failed); - first = 0; + _xbt_test_out << (_xbt_test_nb_suites - _xbt_test_suite_failed) << " ok"; + first = false; } if (_xbt_test_suite_failed) { - fprintf(stderr, "%s%d failed", (first ? "" : ", "), _xbt_test_suite_failed); - first = 0; + _xbt_test_out << (first ? "" : ", ") << _xbt_test_suite_failed << " failed"; + first = false; } if (_xbt_test_suite_ignore) { - fprintf(stderr, "%s%d ignored", (first ? "" : ", "), _xbt_test_suite_ignore); + _xbt_test_out << (first ? "" : ", ") << _xbt_test_suite_ignore << " ignored"; } - fprintf(stderr, ")\n Units: %.0f%% ok (%d units: ", _xbt_test_nb_units - ? ((1 - (double) _xbt_test_unit_failed / (double) _xbt_test_nb_units) * 100.0) : 100.0, _xbt_test_nb_units); - first = 1; + _xbt_test_out << ")\n Units: " + << (_xbt_test_nb_units ? ((1 - (double)_xbt_test_unit_failed / (double)_xbt_test_nb_units) * 100.0) + : 100.0) + << "% ok (" << _xbt_test_nb_units << " units: "; + first = true; if (_xbt_test_nb_units != _xbt_test_unit_failed) { - fprintf(stderr, "%d ok", _xbt_test_nb_units - _xbt_test_unit_failed); - first = 0; + _xbt_test_out << (_xbt_test_nb_units - _xbt_test_unit_failed) << " ok"; + first = false; } if (_xbt_test_unit_failed) { - fprintf(stderr, "%s%d failed", (first ? "" : ", "), _xbt_test_unit_failed); - first = 0; + _xbt_test_out << (first ? "" : ", ") << _xbt_test_unit_failed << " failed"; + first = false; } if (_xbt_test_unit_ignore) { - fprintf(stderr, "%s%d ignored", (first ? "" : ", "), _xbt_test_unit_ignore); + _xbt_test_out << (first ? "" : ", ") << _xbt_test_unit_ignore << " ignored"; } - fprintf(stderr, ")\n Tests: %.0f%% ok (%d tests: ", _xbt_test_nb_tests - ? ((1 - (double) _xbt_test_test_failed / (double) _xbt_test_nb_tests) * 100.0) : 100.0, _xbt_test_nb_tests); - first = 1; + _xbt_test_out << ")\n Tests: " + << (_xbt_test_nb_tests ? ((1 - (double)_xbt_test_test_failed / (double)_xbt_test_nb_tests) * 100.0) + : 100.0) + << "% ok (" << _xbt_test_nb_tests << " tests: "; + first = true; if (_xbt_test_nb_tests != _xbt_test_test_failed) { - fprintf(stderr, "%d ok", _xbt_test_nb_tests - _xbt_test_test_failed); - first = 0; + _xbt_test_out << (_xbt_test_nb_tests - _xbt_test_test_failed) << " ok"; + first = false; } if (_xbt_test_test_failed) { - fprintf(stderr, "%s%d failed", (first ? "" : ", "), _xbt_test_test_failed); - first = 0; + _xbt_test_out << (first ? "" : ", ") << _xbt_test_test_failed << " failed"; + first = false; } if (_xbt_test_test_ignore) { - fprintf(stderr, "%s%d ignored", (first ? "" : ", "), _xbt_test_test_ignore); - first = 0; + _xbt_test_out << (first ? "" : ", ") << _xbt_test_test_ignore << " ignored"; + first = false; } if (_xbt_test_test_expect) { - fprintf(stderr, "%s%d expected to fail", (first ? "" : ", "), _xbt_test_test_expect); + _xbt_test_out << (first ? "" : ", ") << _xbt_test_test_expect << " expected to fail"; } - fprintf(stderr, ")\n"); + _xbt_test_out << ")\n"; } else { - fprintf(stderr, "No unit to run!\n"); + _xbt_test_out << "No unit to run!\n"; _xbt_test_unit_failed++; } return _xbt_test_unit_failed; @@ -636,7 +544,9 @@ int xbt_test_run(char *selection, int verbosity) void xbt_test_exit() { - xbt_dynar_free(&_xbt_test_suites); + for (xbt_test_suite_t suite : _xbt_test_suites) + delete suite; + _xbt_test_suites.clear(); } /* annotate test case with test */ @@ -646,17 +556,9 @@ void _xbt_test_add(const char *file, int line, const char *fmt, ...) xbt_assert(unit); va_list ap; - xbt_test_test_t test = xbt_new0(struct s_xbt_test_test, 1); va_start(ap, fmt); - test->title = bvprintf(fmt, ap); + unit->tests_.emplace_back(simgrid::xbt::string_vprintf(fmt, ap), file, line); va_end(ap); - test->failed = 0; - test->expected_failure = 0; - test->ignored = 0; - test->file = file; - test->line = line; - test->logs = xbt_dynar_new(sizeof(xbt_test_log_t), xbt_test_log_free); - xbt_dynar_push(unit->tests, &test); } /* annotate test case with log message and failure */ @@ -664,21 +566,16 @@ void _xbt_test_fail(const char *file, int line, const char *fmt, ...) { xbt_test_unit_t unit = _xbt_test_current_unit; xbt_assert(unit); - xbt_assert(xbt_dynar_length(_xbt_test_current_unit->tests), - "Test failed even before being declared (broken unit: %s)", unit->title); + xbt_assert(not _xbt_test_current_unit->tests_.empty(), "Test failed even before being declared (broken unit: %s)", + unit->title_.c_str()); + s_xbt_test_test& test = unit->tests_.back(); va_list ap; - xbt_test_log_t log = xbt_new(struct s_xbt_test_log, 1); va_start(ap, fmt); - log->text = bvprintf(fmt, ap); + test.logs_.emplace_back(simgrid::xbt::string_vprintf(fmt, ap), file, line); va_end(ap); - log->file = file; - log->line = line; - - xbt_test_test_t test = xbt_dynar_getlast_as(unit->tests, xbt_test_test_t); - xbt_dynar_push(test->logs, &log); - test->failed = 1; + test.failed_ = true; } void xbt_test_exception(xbt_ex_t e) @@ -688,18 +585,17 @@ void xbt_test_exception(xbt_ex_t e) void xbt_test_expect_failure() { - xbt_assert(xbt_dynar_length(_xbt_test_current_unit->tests), - "Cannot expect the failure of a test before declaring it (broken unit: %s)", _xbt_test_current_unit->title); - xbt_test_test_t test = xbt_dynar_getlast_as(_xbt_test_current_unit->tests, xbt_test_test_t); - test->expected_failure = 1; + xbt_assert(not _xbt_test_current_unit->tests_.empty(), + "Cannot expect the failure of a test before declaring it (broken unit: %s)", + _xbt_test_current_unit->title_.c_str()); + _xbt_test_current_unit->tests_.back().expected_failure_ = true; } void xbt_test_skip() { - xbt_assert(xbt_dynar_length(_xbt_test_current_unit->tests), - "Test skipped even before being declared (broken unit: %s)", _xbt_test_current_unit->title); - xbt_test_test_t test = xbt_dynar_getlast_as(_xbt_test_current_unit->tests, xbt_test_test_t); - test->ignored = 1; + xbt_assert(not _xbt_test_current_unit->tests_.empty(), "Test skipped even before being declared (broken unit: %s)", + _xbt_test_current_unit->title_.c_str()); + _xbt_test_current_unit->tests_.back().ignored_ = true; } /* annotate test case with log message only */ @@ -707,19 +603,13 @@ void _xbt_test_log(const char *file, int line, const char *fmt, ...) { xbt_test_unit_t unit = _xbt_test_current_unit; xbt_assert(unit); - xbt_assert(xbt_dynar_length(_xbt_test_current_unit->tests), - "Test logged into even before being declared (broken test unit: %s)", unit->title); + xbt_assert(not _xbt_test_current_unit->tests_.empty(), + "Test logged into even before being declared (broken test unit: %s)", unit->title_.c_str()); va_list ap; - xbt_test_log_t log = xbt_new(struct s_xbt_test_log, 1); va_start(ap, fmt); - log->text = bvprintf(fmt, ap); + unit->tests_.back().logs_.emplace_back(simgrid::xbt::string_vprintf(fmt, ap), file, line); va_end(ap); - log->file = file; - log->line = line; - - xbt_test_test_t test = xbt_dynar_getlast_as(unit->tests, xbt_test_test_t); - xbt_dynar_push(test->logs, &log); } #ifdef SIMGRID_TEST diff --git a/src/xbt/dict_cursor.c b/src/xbt/dict_cursor.c index 38c7930270..574a4e6860 100644 --- a/src/xbt/dict_cursor.c +++ b/src/xbt/dict_cursor.c @@ -1,6 +1,6 @@ /* dict_cursor - iterators over dictionaries */ -/* Copyright (c) 2004-2014. The SimGrid Team. +/* Copyright (c) 2004-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -19,9 +19,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dict_cursor, xbt_dict, "To traverse dictiona /* Don't add or remove entries to the dict while traversing !!! */ /*###########################################################################*/ -#undef xbt_dict_CURSOR_DEBUG -/*#define xbt_dict_CURSOR_DEBUG 1*/ - /** @brief Creator * @param dict the dict */ diff --git a/src/xbt/dynar.cpp b/src/xbt/dynar.cpp index 63bbc4450c..c6a637c834 100644 --- a/src/xbt/dynar.cpp +++ b/src/xbt/dynar.cpp @@ -119,7 +119,7 @@ extern "C" void xbt_dynar_free_data(xbt_dynar_t dynar) { xbt_dynar_reset(dynar); if (dynar) - free(dynar->data); + xbt_free(dynar->data); } /** @brief Destructor of the structure not touching to the content @@ -133,8 +133,8 @@ extern "C" void xbt_dynar_free_container(xbt_dynar_t* dynar) { if (dynar && *dynar) { xbt_dynar_t d = *dynar; - free(d->data); - free(d); + xbt_free(d->data); + xbt_free(d); *dynar = nullptr; } } @@ -627,7 +627,7 @@ extern "C" void* xbt_dynar_to_array(xbt_dynar_t dynar) xbt_dynar_shrink(dynar, 1); memset(xbt_dynar_push_ptr(dynar), 0, dynar->elmsize); res = dynar->data; - free(dynar); + xbt_free(dynar); return res; } @@ -1025,7 +1025,7 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") snprintf(buf,1023, "%d", cpt); xbt_dynar_shift(d, &s2); xbt_test_assert(not strcmp(buf, s2), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s2); - free(s2); + xbt_free(s2); } xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */ @@ -1048,7 +1048,7 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") snprintf(buf,1023, "%d", cpt); xbt_dynar_pop(d, &s2); xbt_test_assert(not strcmp(buf, s2), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s2); - free(s2); + xbt_free(s2); } /* 4. Free the resources */ xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ @@ -1073,21 +1073,21 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") xbt_dynar_shift(d, &s2); xbt_test_assert(not strcmp(buf, s2), "The retrieved value is not the same than the injected one at the begining (%s!=%s)", buf, s2); - free(s2); + xbt_free(s2); } for (int cpt = (NB_ELEM / 5) - 1; cpt >= 0; cpt--) { snprintf(buf,1023, "%d", cpt); xbt_dynar_shift(d, &s2); xbt_test_assert(not strcmp(buf, s2), "The retrieved value is not the same than the injected one in the middle (%s!=%s)", buf, s2); - free(s2); + xbt_free(s2); } for (int cpt = NB_ELEM / 2; cpt < NB_ELEM; cpt++) { snprintf(buf,1023, "%d", cpt); xbt_dynar_shift(d, &s2); xbt_test_assert(not strcmp(buf, s2), "The retrieved value is not the same than the injected one at the end (%s!=%s)", buf, s2); - free(s2); + xbt_free(s2); } xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */ @@ -1104,7 +1104,7 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") snprintf(buf,1023, "%d", cpt); xbt_dynar_remove_at(d, 2 * (NB_ELEM / 5), &s2); xbt_test_assert(not strcmp(buf, s2), "Remove a bad value. Got %s, expected %s", s2, buf); - free(s2); + xbt_free(s2); } xbt_dynar_free(&d); /* end_of_doxygen */ } diff --git a/src/xbt/ex.cpp b/src/xbt/ex.cpp index f167d6d3b6..c4395699b9 100644 --- a/src/xbt/ex.cpp +++ b/src/xbt/ex.cpp @@ -65,7 +65,7 @@ xbt_ex::~xbt_ex() = default; void _xbt_throw(char* message, xbt_errcat_t errcat, int value, const char* file, int line, const char* func) { xbt_ex e(simgrid::xbt::ThrowPoint(file, line, func), message); - free(message); + xbt_free(message); e.category = errcat; e.value = value; throw e; @@ -189,7 +189,7 @@ XBT_TEST_UNIT("variables", test_variables, "variable value preservation") { xbt_ex_t ex; int r1; - int XBT_ATTRIB_UNUSED r2; + XBT_ATTRIB_UNUSED int r2; int v1; int v2; diff --git a/src/xbt/graph.c b/src/xbt/graph.c index b82a58179d..121a842f6b 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -11,10 +11,9 @@ #include "xbt/graph.h" #include "graph_private.h" #include "xbt/dict.h" -#include "xbt/heap.h" -#include "xbt/file.h" #include +#include #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_graph, xbt, "Graph"); @@ -226,11 +225,10 @@ void xbt_floyd_algorithm(xbt_graph_t g, double *adj, double *d, xbt_node_t * p) for (k = 0; k < n; k++) { for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { - if ((d[i*n+k] > -1) && (d[k*n+j] > -1)) { - if ((d[i*n+j] < 0) || (d[i*n+j] > d[i*n+k] + d[k*n+j])) { - d[i*n+j] = d[i*n+k] + d[k*n+j]; - p[i*n+j] = p[k*n+j]; - } + if (d[i * n + k] > -1 && d[k * n + j] > -1 && + (d[i * n + j] < 0 || d[i * n + j] > d[i * n + k] + d[k * n + j])) { + d[i * n + j] = d[i * n + k] + d[k * n + j]; + p[i * n + j] = p[k * n + j]; } } } diff --git a/src/xbt/heap.c b/src/xbt/heap.c deleted file mode 100644 index 2d4964aa5f..0000000000 --- a/src/xbt/heap.c +++ /dev/null @@ -1,281 +0,0 @@ -/* a generic and efficient heap */ - -/* Copyright (c) 2004-2005, 2007-2015. 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 "xbt/sysdep.h" -#include "xbt/log.h" -#include "heap_private.h" - -#include -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_heap, xbt, "Heap"); - -static void xbt_heap_max_heapify(xbt_heap_t H, int i); -static void xbt_heap_increase_key(xbt_heap_t H, int i); - -/** @addtogroup XBT_heap - * \brief This section describes the API to generic heap with O(log(n)) access. - */ - -/** - * @brief Creates a new heap. - * \param init_size initial size of the heap - * \param free_func function to call on each element when you want to free the whole heap (or NULL if nothing to do). - * - * Creates a new heap. - */ -inline xbt_heap_t xbt_heap_new(int init_size, void_f_pvoid_t const free_func) -{ - xbt_heap_t H = xbt_new0(struct xbt_heap, 1); - H->size = init_size; - H->count = 0; - H->items = (xbt_heap_item_t) xbt_new0(struct xbt_heap_item, init_size); - H->free = free_func; - return H; -} - -/** - * @brief Set the update callback function. - * @param H the heap we're working on - * \param update_callback function to call on each element to update its index when needed. - */ -inline void xbt_heap_set_update_callback(xbt_heap_t H, void (*update_callback) (void*, int)) -{ - H->update_callback = update_callback; -} - -/** - * @brief kilkil a heap and its content - * @param H poor victim - */ -void xbt_heap_free(xbt_heap_t H) -{ - if (!H) - return; - - if (H->free) - for (int i = 0; i < H->count; i++) - H->free(H->items[i].content); - free(H->items); - free(H); -} - -/** - * @brief returns the number of elements in the heap - * @param H the heap we're working on - * @return the number of elements in the heap - */ -inline int xbt_heap_size(xbt_heap_t H) -{ - return (H->count); -} - -/** - * @brief Add an element into the heap. - * \param H the heap we're working on - * \param content the object you want to add to the heap - * \param key the key associated to this object - * - * The element with the smallest key is automatically moved at the top of the heap. - */ -void xbt_heap_push(xbt_heap_t H, void *content, double key) -{ - H->count += 1; - int count = H->count; - - int size = H->size; - xbt_heap_item_t item; - - if (count > size) { - H->size = (size << 1) + 1; - H->items = (void *) xbt_realloc(H->items, (H->size) * sizeof(struct xbt_heap_item)); - } - - item = &(H->items[count - 1]); - item->key = key; - item->content = content; - xbt_heap_increase_key(H, count - 1); - XBT_DEBUG("Heap has now %d elements and max elem is %g",xbt_heap_size(H),xbt_heap_maxkey(H)); -} - -/** - * @brief Extracts from the heap and returns the element with the smallest key. - * \param H the heap we're working on - * \return the element with the smallest key - * - * Extracts from the heap and returns the element with the smallest key. The element with the next smallest key is - * automatically moved at the top of the heap. - */ -void *xbt_heap_pop(xbt_heap_t H) -{ - xbt_heap_item_t items = H->items; - int size = H->size; - void *max; - - if (H->count == 0) - return NULL; - - XBT_DEBUG("Heap has %d elements before extraction and max elem was %g",xbt_heap_size(H),xbt_heap_maxkey(H)); - - max = CONTENT(H, 0); - - items[0] = items[(H->count) - 1]; - (H->count)--; - xbt_heap_max_heapify(H,0); - if (H->count < size >> 2 && size > 16) { - size = (size >> 1) + 1; - H->items = (void *) xbt_realloc(items, size * sizeof(struct xbt_heap_item)); - H->size = size; - } - - if (H->update_callback) - H->update_callback(max, -1); - return max; -} - -/** - * @brief Extracts from the heap and returns the element at position i. - * \param H the heap we're working on - * \param i element position - * \return the element at position i if ok, NULL otherwise - * - * Extracts from the heap and returns the element at position i. The heap is automatically reordered. - */ -void *xbt_heap_remove(xbt_heap_t H, int i) -{ - XBT_DEBUG("Heap has %d elements: extracting element %d",xbt_heap_size(H),i); - - if ((i < 0) || (i > H->count - 1)) - return NULL; - /* put element i at head */ - if (i > 0) { - KEY(H, i) = MIN_KEY_VALUE; - xbt_heap_increase_key(H, i); - } - - return xbt_heap_pop(H); -} - -/** @brief Remove an arbitrary element from the heap - * \param H the heap we're working on - * \param content the object you want to remove from the heap - * \param key the key associated to this object - * \return the removed element if found, NULL otherwise - */ -void *xbt_heap_rm_elm(xbt_heap_t H, void *content, double key) -{ - int i=0; - while (i < H->count && (KEY(H, i) != key || CONTENT(H, i) != content)) - i++; - return xbt_heap_remove(H, i); -} - -/** - * @brief Updates an element of the heap with a new value. - * \param H the heap we're working on - * \param i element position - * \param key new value for the element - * - * Updates an element of the heap with a new value. - */ -void xbt_heap_update(xbt_heap_t H, int i, double key) -{ - XBT_DEBUG("Heap has %d elements: updating element %d : was %1.12f to %1.12f ",xbt_heap_size(H),i,KEY(H, i), key); - - if ((i < 0) || (i > H->count - 1) || key == KEY(H, i)) - return ; - - if(key< KEY(H, i)){ - KEY(H, i)=key; - xbt_heap_increase_key(H, i); - }else{ - KEY(H, i)=key; - xbt_heap_max_heapify(H,i); - } -} - -/** - * @brief returns the smallest key in the heap (heap unchanged) - * \param H the heap we're working on - * - * \return the smallest key in the heap without modifying the heap. - */ -inline double xbt_heap_maxkey(xbt_heap_t H) -{ - xbt_assert(H->count != 0, "Empty heap"); - return KEY(H, 0); -} - -/** - * @brief returns the value associated to the smallest key in the heap (heap unchanged) - * \param H the heap we're working on - * - * \return the value associated to the smallest key in the heap - * without modifying the heap. - */ -void *xbt_heap_maxcontent(xbt_heap_t H) -{ - xbt_assert(H->count != 0, "Empty heap"); - return CONTENT(H, 0); -} - -/* <<<< private >>>> - * \param H the heap we're working on - * - * Restores the heap property once an element has been deleted. - */ -static void xbt_heap_max_heapify(xbt_heap_t H, int index) -{ - int i = index; - int count = H->count; - xbt_heap_item_t items = H->items; - - while (1) { - int greatest = i; - int l = LEFT(i); - int r = l + 1; - if (l < count && items[l].key < items[i].key) - greatest = l; - if (r < count && items[r].key < items[greatest].key) - greatest = r; - if (greatest != i) { - struct xbt_heap_item tmp = items[i]; - items[i] = items[greatest]; - items[greatest] = tmp; - if (H->update_callback) - H->update_callback(items[i].content, i); - i = greatest; - } else { - if (H->update_callback) - H->update_callback(items[i].content, i); - return; - } - } -} - -/* <<<< private >>>> - * \param H the heap we're working on - * \param i an item position in the heap - * - * Moves up an item at position i to its correct position. Works only when called from xbt_heap_push. - * Do not use otherwise. - */ -static void xbt_heap_increase_key(xbt_heap_t H, int i) -{ - xbt_heap_item_t items = H->items; - int p = PARENT(i); - while (i > 0 && items[p].key > items[i].key) { - struct xbt_heap_item tmp = items[i]; - items[i] = items[p]; - items[p] = tmp; - if (H->update_callback) - H->update_callback(items[i].content, i); - i = p; - p = PARENT(i); - } - if (H->update_callback) - H->update_callback(items[i].content, i); -} diff --git a/src/xbt/heap_private.h b/src/xbt/heap_private.h deleted file mode 100644 index aeed373793..0000000000 --- a/src/xbt/heap_private.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2004-2017. 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. */ - -#ifndef XBT_HEAP_PRIVATE_H -#define XBT_HEAP_PRIVATE_H - -#include -#include -#include - -typedef struct xbt_heap_item { - void *content; - double key; -} s_xbt_heap_item_t; -typedef s_xbt_heap_item_t* xbt_heap_item_t; - -typedef struct xbt_heap { - int size; - int count; - s_xbt_heap_item_t* items; /* array of structs */ - void_f_pvoid_t free; - void (*update_callback) (void *, int); -} s_xbt_heap_t; - -#define PARENT(i) (i >> 1) -#define LEFT(i) (i << 1) -#define RIGHT(i) ((i << 1) + 1) - -#define KEY(H,i) ((H->items)[i]).key -#define CONTENT(H,i) ((H->items)[i]).content - -#define MIN_KEY_VALUE -DBL_MAX - -#endif diff --git a/src/xbt/log.c b/src/xbt/log.c index ce083fbbf8..767f8835ea 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -108,10 +108,10 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(xbt_dict_elm); XBT_LOG_CONNECT(xbt_dyn); XBT_LOG_CONNECT(xbt_ex); + XBT_LOG_CONNECT(xbt_automaton); XBT_LOG_CONNECT(xbt_backtrace); XBT_LOG_CONNECT(xbt_exception); XBT_LOG_CONNECT(xbt_graph); - XBT_LOG_CONNECT(xbt_heap); XBT_LOG_CONNECT(xbt_mallocator); XBT_LOG_CONNECT(xbt_memory_map); XBT_LOG_CONNECT(xbt_parmap); @@ -238,7 +238,6 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(surf_cpu_cas); XBT_LOG_CONNECT(surf_cpu_ti); XBT_LOG_CONNECT(surf_energy); - XBT_LOG_CONNECT(surf_file); XBT_LOG_CONNECT(surf_kernel); XBT_LOG_CONNECT(surf_lagrange); XBT_LOG_CONNECT(surf_lagrange_dichotomy); @@ -336,7 +335,7 @@ void xbt_log_postexit(void) log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT)); } - /* Size of the static string in which we build the log string */ +/* Size of the static string in which we build the log string */ #define XBT_LOG_STATIC_BUFFER_SIZE 2048 /* Minimum size of the dynamic string in which we build the log string (should be greater than XBT_LOG_STATIC_BUFFER_SIZE) */ @@ -391,23 +390,26 @@ void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...) } } -#undef XBT_LOG_DYNAMIC_BUFFER_SIZE -#undef XBT_LOG_STATIC_BUFFER_SIZE - /* NOTE: * * The standard logging macros use _XBT_LOG_ISENABLED, which calls _xbt_log_cat_init(). Thus, if we want to avoid an * infinite recursion, we can not use the standard logging macros in _xbt_log_cat_init(), and in all functions called * from it. * - * To circumvent the problem, we define the macro_xbt_log_init() as (0) for the length of the affected functions, and - * we do not forget to undefine it at the end! + * To circumvent the problem, we define the macro DISABLE_XBT_LOG_CAT_INIT() to hide the real _xbt_log_cat_init(). The + * macro has to be called at the beginning of the affected functions. */ +static int fake_xbt_log_cat_init(xbt_log_category_t XBT_ATTRIB_UNUSED category, + e_xbt_log_priority_t XBT_ATTRIB_UNUSED priority) +{ + return 0; +} +#define DISABLE_XBT_LOG_CAT_INIT() \ + int (*_xbt_log_cat_init)(xbt_log_category_t, e_xbt_log_priority_t) XBT_ATTRIB_UNUSED = fake_xbt_log_cat_init; static void _xbt_log_cat_apply_set(xbt_log_category_t category, xbt_log_setting_t setting) { -#define _xbt_log_cat_init(a, b) (0) - + DISABLE_XBT_LOG_CAT_INIT(); if (setting->thresh != xbt_log_priority_uninitialized) { xbt_log_threshold_set(category, setting->thresh); @@ -434,7 +436,6 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category, xbt_log_setting_ category->additivity = 0; XBT_DEBUG("Set %p as appender of category '%s'", setting->appender, category->name); } -#undef _xbt_log_cat_init } /* @@ -443,8 +444,7 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category, xbt_log_setting_ */ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority) { -#define _xbt_log_cat_init(a, b) (0) - + DISABLE_XBT_LOG_CAT_INIT(); if (log_cat_init_mutex != NULL) xbt_os_mutex_acquire(log_cat_init_mutex); @@ -522,8 +522,6 @@ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority if (log_cat_init_mutex != NULL) xbt_os_mutex_release(log_cat_init_mutex); return priority >= category->threshold; - -#undef _xbt_log_cat_init } void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent) @@ -782,7 +780,7 @@ void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app) void xbt_log_layout_set(xbt_log_category_t cat, xbt_log_layout_t lay) { -#define _xbt_log_cat_init(a, b) (0) + DISABLE_XBT_LOG_CAT_INIT(); if (!cat->appender) { XBT_VERB ("No appender to category %s. Setting the file appender as default", cat->name); xbt_log_appender_set(cat, xbt_log_appender_file_new(NULL)); @@ -795,7 +793,6 @@ void xbt_log_layout_set(xbt_log_category_t cat, xbt_log_layout_t lay) } cat->layout = lay; xbt_log_additivity_set(cat, 0); -#undef _xbt_log_cat_init } void xbt_log_additivity_set(xbt_log_category_t cat, int additivity) diff --git a/src/xbt/mallocator.c b/src/xbt/mallocator.c index e3a0319599..ec32f179c5 100644 --- a/src/xbt/mallocator.c +++ b/src/xbt/mallocator.c @@ -46,8 +46,7 @@ static inline void lock_reset(xbt_mallocator_t m) static inline void lock_acquire(xbt_mallocator_t m) { if (initialization_done > 1) { - int *lock = &m->lock; - while (__sync_lock_test_and_set(lock, 1)) + while (__atomic_test_and_set(&m->lock, __ATOMIC_ACQUIRE)) /* nop */; } } @@ -55,7 +54,7 @@ static inline void lock_acquire(xbt_mallocator_t m) static inline void lock_release(xbt_mallocator_t m) { if (initialization_done > 1) - __sync_lock_release(&m->lock); + __atomic_clear(&m->lock, __ATOMIC_RELEASE); } /** diff --git a/src/xbt/mallocator_private.h b/src/xbt/mallocator_private.h index a69e26ddb6..ccd5b5237d 100644 --- a/src/xbt/mallocator_private.h +++ b/src/xbt/mallocator_private.h @@ -17,7 +17,7 @@ typedef struct s_xbt_mallocator { pvoid_f_void_t new_f; /* function to call when we are running out of objects */ void_f_pvoid_t free_f; /* function to call when we have got too many objects */ void_f_pvoid_t reset_f; /* function to call when an object is released by the user */ - int lock; /* lock to ensure the mallocator is thread-safe */ + char lock; /* lock to ensure the mallocator is thread-safe */ } s_xbt_mallocator_t; #endif diff --git a/src/xbt/memory_map.cpp b/src/xbt/memory_map.cpp index ed7ee9d53b..b575f5e3ec 100644 --- a/src/xbt/memory_map.cpp +++ b/src/xbt/memory_map.cpp @@ -3,9 +3,12 @@ /* 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 +#include #include +#include +#include +#include #include @@ -45,7 +48,6 @@ #include #include -#include #include #include "memory_map.hpp" @@ -168,27 +170,23 @@ XBT_PRIVATE std::vector get_memory_map(pid_t pid) #elif defined __linux__ /* Open the actual process's proc maps file and create the memory_map_t */ /* to be returned. */ - char* path = bprintf("/proc/%i/maps", (int) pid); - FILE *fp = std::fopen(path, "r"); - if (fp == nullptr) { - std::perror("fopen failed"); - xbt_die("Cannot open %s to investigate the memory map of the process.", path); + std::string path = std::string("/proc/") + std::to_string(pid) + "/maps"; + std::ifstream fp; + fp.rdbuf()->pubsetbuf(0, 0); + fp.open(path); + if (not fp) { + std::perror("open failed"); + xbt_die("Cannot open %s to investigate the memory map of the process.", path.c_str()); } - free(path); - setbuf(fp, nullptr); /* Read one line at the time, parse it and add it to the memory map to be returned */ - ssize_t read; /* Number of bytes readed */ - char* line = nullptr; - std::size_t n = 0; /* Amount of bytes to read by xbt_getline */ - while ((read = xbt_getline(&line, &n, fp)) != -1) { + std::string sline; + while (std::getline(fp, sline)) { /** * The lines that we read have this format: (This is just an example) * 00602000-00603000 rw-p 00002000 00:28 1837264 */ - - /* Wipeout the new line character */ - line[read - 1] = '\0'; + char* line = &sline[0]; /* Tokenize the line using spaces as delimiters and store each token in lfields array. We expect 5 tokens for 6 fields */ char* saveptr = nullptr; // for strtok_r() @@ -301,8 +299,7 @@ XBT_PRIVATE std::vector get_memory_map(pid_t pid) ret.push_back(std::move(memreg)); } - std::free(line); - std::fclose(fp); + fp.close(); #elif defined __FreeBSD__ struct procstat *prstat; struct kinfo_proc *proc; diff --git a/src/xbt/mmalloc/mfree.c b/src/xbt/mmalloc/mfree.c index 7ee5e76c2d..47efab762f 100644 --- a/src/xbt/mmalloc/mfree.c +++ b/src/xbt/mmalloc/mfree.c @@ -24,7 +24,6 @@ void mfree(struct mdesc *mdp, void *ptr) size_t i; int it; - mmalloc_paranoia(mdp); // fprintf(stderr,"free(%p)\n",ptr); if (ptr == NULL) diff --git a/src/xbt/mmalloc/mm_legacy.c b/src/xbt/mmalloc/mm_legacy.c index a8962f7f4d..5afb74a1a5 100644 --- a/src/xbt/mmalloc/mm_legacy.c +++ b/src/xbt/mmalloc/mm_legacy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015. The SimGrid Team. +/* Copyright (c) 2010-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -92,13 +92,14 @@ static void* mm_fake_calloc(size_t nmemb, size_t size) return mm_fake_malloc(n); } -static void* mm_fake_realloc(void *p, size_t s) +static void* mm_fake_realloc(XBT_ATTRIB_UNUSED void* p, size_t s) { return mm_fake_malloc(s); } -static void mm_fake_free(void *p) +static void mm_fake_free(XBT_ATTRIB_UNUSED void* p) { + // Nothing to do } /* Function signatures for the main malloc functions: */ @@ -118,7 +119,7 @@ static int mm_initialized; /** Constructor functions used to initialize the malloc implementation */ -static void __attribute__((constructor(101))) mm_legacy_constructor() +_XBT_GNUC_CONSTRUCTOR(101) static void mm_legacy_constructor() { if (mm_initialized) return; diff --git a/src/xbt/mmalloc/mmalloc.c b/src/xbt/mmalloc/mmalloc.c index ee9dee9219..2636c29f26 100644 --- a/src/xbt/mmalloc/mmalloc.c +++ b/src/xbt/mmalloc/mmalloc.c @@ -95,7 +95,11 @@ static void initialize(xbt_mheap_t mdp) } } -#define update_hook(a,offset) do { if (a) { a = ((char*)a +(offset));} }while(0) +static inline void update_hook(void **a, size_t offset) +{ + if (*a) + *a = (char*)*a + offset; +} /* Get neatly aligned memory from the low level layers, and register it * into the heap info table as necessary. */ @@ -124,13 +128,13 @@ static void *register_morecore(struct mdesc *mdp, size_t size) size_t offset=((char*)newinfo)-((char*)oldinfo); for (int i = 1 /*first element of heapinfo describes the mdesc area*/; i < mdp->heaplimit; i++) { - update_hook(newinfo[i].freehook.next,offset); - update_hook(newinfo[i].freehook.prev,offset); + update_hook(&newinfo[i].freehook.next, offset); + update_hook(&newinfo[i].freehook.prev, offset); } // also update the starting points of the swag for (int i = 0; i < BLOCKLOG; i++) { - update_hook(mdp->fraghead[i].head,offset); - update_hook(mdp->fraghead[i].tail,offset); + update_hook(&mdp->fraghead[i].head, offset); + update_hook(&mdp->fraghead[i].tail, offset); } mdp->heapinfo = newinfo; @@ -152,7 +156,6 @@ static void *register_morecore(struct mdesc *mdp, size_t size) mdp->heaplimit = BLOCK((char *) result + size); return (result); } -#undef update_hook /* Allocate memory from the heap. */ void *mmalloc(xbt_mheap_t mdp, size_t size) { @@ -162,6 +165,25 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) { } return res; } + +static void mmalloc_mark_used(xbt_mheap_t mdp, size_t block, size_t nblocks, size_t requested_size) +{ + for (int it = 0; it < nblocks; it++) { + mdp->heapinfo[block + it].type = MMALLOC_TYPE_UNFRAGMENTED; + mdp->heapinfo[block + it].busy_block.busy_size = 0; + mdp->heapinfo[block + it].busy_block.ignore = 0; + mdp->heapinfo[block + it].busy_block.size = 0; + } + mdp->heapinfo[block].busy_block.size = nblocks; + mdp->heapinfo[block].busy_block.busy_size = requested_size; + // mdp->heapinfo[block].busy_block.bt_size = + // xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt, XBT_BACKTRACE_SIZE); + // mdp->heapinfo[block].busy_block.bt_size = + // xbt_libunwind_backtrace(mdp->heapinfo[block].busy_block.bt, XBT_BACKTRACE_SIZE); + mdp->heapstats.chunks_used++; + mdp->heapstats.bytes_used += nblocks * BLOCKSIZE; +} + /* Spliting mmalloc this way is mandated by a trick in mrealloc, that gives back the memory of big blocks to the system before reallocating them: we don't want to loose the beginning of the area when this happens */ @@ -184,8 +206,6 @@ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) if (!(mdp->flags & MMALLOC_INITIALIZED)) initialize(mdp); - mmalloc_paranoia(mdp); - /* Determine the allocation policy based on the request size. */ if (size <= BLOCKSIZE / 2) { /* Small allocation to receive a fragment of a block. @@ -298,18 +318,7 @@ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) result = register_morecore(mdp, blocks * BLOCKSIZE); block = BLOCK(result); - for (int it = 0; it < blocks; it++) { - mdp->heapinfo[block + it].type = MMALLOC_TYPE_UNFRAGMENTED; - mdp->heapinfo[block + it].busy_block.busy_size = 0; - mdp->heapinfo[block + it].busy_block.ignore = 0; - mdp->heapinfo[block + it].busy_block.size = 0; - } - mdp->heapinfo[block].busy_block.size = blocks; - mdp->heapinfo[block].busy_block.busy_size = requested_size; - //mdp->heapinfo[block].busy_block.bt_size=xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); - //mdp->heapinfo[block].busy_block.bt_size = xbt_libunwind_backtrace(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); - mdp -> heapstats.chunks_used++; - mdp -> heapstats.bytes_used += blocks * BLOCKSIZE; + mmalloc_mark_used(mdp, block, blocks, requested_size); return result; } @@ -340,19 +349,7 @@ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) = mdp->heapindex = mdp->heapinfo[block].free_block.next; } - for (int it = 0; it < blocks; it++) { - mdp->heapinfo[block+it].type = MMALLOC_TYPE_UNFRAGMENTED; - mdp->heapinfo[block+it].busy_block.busy_size = 0; - mdp->heapinfo[block+it].busy_block.ignore = 0; - mdp->heapinfo[block+it].busy_block.size = 0; - } - mdp->heapinfo[block].busy_block.size = blocks; - mdp->heapinfo[block].busy_block.busy_size = requested_size; - //mdp->heapinfo[block].busy_block.bt_size = xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); - //mdp->heapinfo[block].busy_block.bt_size = xbt_libunwind_backtrace(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); - - mdp -> heapstats.chunks_used++; - mdp -> heapstats.bytes_used += blocks * BLOCKSIZE; + mmalloc_mark_used(mdp, block, blocks, requested_size); mdp -> heapstats.bytes_free -= blocks * BLOCKSIZE; } diff --git a/src/xbt/mmalloc/mmprivate.h b/src/xbt/mmalloc/mmprivate.h index 5e6609d9c1..2fdc94c9bd 100644 --- a/src/xbt/mmalloc/mmprivate.h +++ b/src/xbt/mmalloc/mmprivate.h @@ -294,12 +294,6 @@ XBT_PUBLIC( void *)mmorecore(struct mdesc *mdp, ssize_t size); #define LOCK(mdp) pthread_mutex_lock(&mdp->mutex) #define UNLOCK(mdp) pthread_mutex_unlock(&mdp->mutex) -static inline void mmalloc_paranoia(struct mdesc *mdp){ - - /* nothing to fear for no */ - -} - static inline int mmalloc_get_increment(malloc_info* heapinfo) { if (heapinfo->type < 0) { return heapinfo->free_block.size; diff --git a/src/xbt/string.cpp b/src/xbt/string.cpp index afc6445cee..7872cdc828 100644 --- a/src/xbt/string.cpp +++ b/src/xbt/string.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2015. The SimGrid Team. +/* Copyright (c) 2015-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -17,7 +17,7 @@ namespace xbt { #if SIMGRID_HAVE_MC -const char string::NUL = '\0'; +char string::NUL = '\0'; #endif diff --git a/src/xbt/xbt_log_layout_format.c b/src/xbt/xbt_log_layout_format.c index 7c41b5b706..d0d2bf9859 100644 --- a/src/xbt/xbt_log_layout_format.c +++ b/src/xbt/xbt_log_layout_format.c @@ -6,15 +6,13 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "simgrid/host.h" +#include "simgrid/msg.h" /* MSG_get_clock */ #include "src/xbt/log_private.h" -#include "surf/surf.h" #include "xbt/sysdep.h" #include extern const char *xbt_log_priority_names[8]; -static double format_begin_of_time = -1; - #define ERRMSG \ "Unknown %%%c sequence in layout format (%s).\n" \ "Known sequences:\n" \ @@ -78,92 +76,94 @@ static int xbt_log_layout_format_doit(xbt_log_layout_t l, xbt_log_event_t ev, co for (char* q = l->data ; *q != '\0' ; q++) { if (*q == '%') { q++; - handle_modifier: - switch (*q) { - case '\0': - fprintf(stderr, "Layout format (%s) ending with %%\n", (char *)l->data); - xbt_abort(); - break; - case '%': - *p = '%'; - check_overflow(1); - break; - case 'n': /* platform-dependant line separator; LOG4J compliant */ - *p = '\n'; - check_overflow(1); - break; - case 'e': /* plain space; SimGrid extension */ - *p = ' '; - check_overflow(1); - break; - case '.': /* precision specifier */ - precision = strtol(q + 1, &q, 10); - goto handle_modifier; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': /* length modifier */ - length = strtol(q, &q, 10); - goto handle_modifier; - case 'c': /* category name; LOG4J compliant - should accept a precision postfix to show the hierarchy */ - show_string(ev->cat->name); - break; - case 'p': /* priority name; LOG4J compliant */ - show_string(xbt_log_priority_names[ev->priority]); - break; - case 'h': /* host name; SimGrid extension */ - show_string(sg_host_self_get_name()); - break; - case 't': /* thread/process name; LOG4J compliant */ - case 'P': /* process name; SimGrid extension */ - show_string(xbt_procname()); - break; - case 'i': /* process PID name; SimGrid extension */ - show_int(xbt_getpid()); - break; - case 'F': /* file name; LOG4J compliant */ - show_string(ev->fileName); - break; - case 'l': { /* location; LOG4J compliant */ - int sz; - set_sz_from_precision(); - int len = snprintf(p, sz, "%s:%d", ev->fileName, ev->lineNum); - check_overflow(MIN(sz, len)); - break; - } - case 'L': /* line number; LOG4J compliant */ - show_int(ev->lineNum); - break; - case 'M': /* method (ie, function) name; LOG4J compliant */ - show_string(ev->functionName); - break; - case 'd': /* date; LOG4J compliant */ - show_double(surf_get_clock()); - break; - case 'r': /* application age; LOG4J compliant */ - show_double(surf_get_clock() - format_begin_of_time); - break; - case 'm': { /* user-provided message; LOG4J compliant */ - int sz; - set_sz_from_precision(); - va_list ap; - va_copy(ap, ev->ap); - int len = vsnprintf(p, sz, msg_fmt, ap); - va_end(ap); - check_overflow(MIN(sz, len)); - break; - } - default: - fprintf(stderr, ERRMSG, *q, (char *)l->data); - xbt_abort(); - } + do { + switch (*q) { + case '\0': + fprintf(stderr, "Layout format (%s) ending with %%\n", (char*)l->data); + xbt_abort(); + break; + case '%': + *p = '%'; + check_overflow(1); + break; + case 'n': /* platform-dependant line separator; LOG4J compliant */ + *p = '\n'; + check_overflow(1); + break; + case 'e': /* plain space; SimGrid extension */ + *p = ' '; + check_overflow(1); + break; + case '.': /* precision specifier */ + precision = strtol(q + 1, &q, 10); + continue; /* conversion specifier still not found, continue reading */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': /* length modifier */ + length = strtol(q, &q, 10); + continue; /* conversion specifier still not found, continue reading */ + case 'c': /* category name; LOG4J compliant + should accept a precision postfix to show the hierarchy */ + show_string(ev->cat->name); + break; + case 'p': /* priority name; LOG4J compliant */ + show_string(xbt_log_priority_names[ev->priority]); + break; + case 'h': /* host name; SimGrid extension */ + show_string(sg_host_self_get_name()); + break; + case 't': /* thread/process name; LOG4J compliant */ + case 'P': /* process name; SimGrid extension */ + show_string(xbt_procname()); + break; + case 'i': /* process PID name; SimGrid extension */ + show_int(xbt_getpid()); + break; + case 'F': /* file name; LOG4J compliant */ + show_string(ev->fileName); + break; + case 'l': { /* location; LOG4J compliant */ + int sz; + set_sz_from_precision(); + int len = snprintf(p, sz, "%s:%d", ev->fileName, ev->lineNum); + check_overflow(MIN(sz, len)); + break; + } + case 'L': /* line number; LOG4J compliant */ + show_int(ev->lineNum); + break; + case 'M': /* method (ie, function) name; LOG4J compliant */ + show_string(ev->functionName); + break; + case 'd': /* date; LOG4J compliant */ + show_double(MSG_get_clock()); + break; + case 'r': /* application age; LOG4J compliant */ + show_double(MSG_get_clock()); + break; + case 'm': { /* user-provided message; LOG4J compliant */ + int sz; + set_sz_from_precision(); + va_list ap; + va_copy(ap, ev->ap); + int len = vsnprintf(p, sz, msg_fmt, ap); + va_end(ap); + check_overflow(MIN(sz, len)); + break; + } + default: + fprintf(stderr, ERRMSG, *q, (char*)l->data); + xbt_abort(); + } + break; /* done, continue normally */ + } while (1); } else { *p = *q; check_overflow(1); @@ -186,8 +186,5 @@ xbt_log_layout_t xbt_log_layout_format_new(char *arg) res->free_ = &xbt_log_layout_format_free; res->data = xbt_strdup((char *) arg); - if (format_begin_of_time < 0) - format_begin_of_time = surf_get_clock(); - return res; } diff --git a/src/xbt/xbt_log_layout_simple.c b/src/xbt/xbt_log_layout_simple.c index b890b1591d..74374bf325 100644 --- a/src/xbt/xbt_log_layout_simple.c +++ b/src/xbt/xbt_log_layout_simple.c @@ -9,21 +9,19 @@ #include "src/xbt/log_private.h" #include "simgrid/host.h" /* sg_host_self_get_name */ -#include "surf/surf.h" +#include "simgrid/msg.h" /* MSG_get_clock */ #include extern const char *xbt_log_priority_names[8]; extern int xbt_log_no_loc; -static double simple_begin_of_time = -1; - #define check_overflow(len) \ if ((rem_size -= (len)) > 0) { \ p += (len); \ } else \ return 0 -static int xbt_log_layout_simple_doit(xbt_log_layout_t l, xbt_log_event_t ev, const char *fmt) +static int xbt_log_layout_simple_doit(XBT_ATTRIB_UNUSED xbt_log_layout_t l, xbt_log_event_t ev, const char* fmt) { char *p = ev->buffer; int rem_size = ev->buffer_size; @@ -45,7 +43,7 @@ static int xbt_log_layout_simple_doit(xbt_log_layout_t l, xbt_log_event_t ev, co } /* Display the date */ - len = snprintf(p, rem_size, "%f] ", surf_get_clock() - simple_begin_of_time); + len = snprintf(p, rem_size, "%f] ", MSG_get_clock()); check_overflow(len); /* Display file position if not INFO */ @@ -70,13 +68,10 @@ static int xbt_log_layout_simple_doit(xbt_log_layout_t l, xbt_log_event_t ev, co return 1; } -xbt_log_layout_t xbt_log_layout_simple_new(char *arg) +xbt_log_layout_t xbt_log_layout_simple_new(XBT_ATTRIB_UNUSED char* arg) { xbt_log_layout_t res = xbt_new0(s_xbt_log_layout_t, 1); res->do_layout = &xbt_log_layout_simple_doit; - if (simple_begin_of_time < 0) - simple_begin_of_time = surf_get_clock(); - return res; } diff --git a/src/xbt/xbt_main.cpp b/src/xbt/xbt_main.cpp index f1736ce64a..810cd26376 100644 --- a/src/xbt/xbt_main.cpp +++ b/src/xbt/xbt_main.cpp @@ -114,7 +114,6 @@ static void xbt_postexit() xbt_os_thread_mod_postexit(); xbt_dynar_free(&xbt_cmdline); xbt_log_postexit(); - free(xbt_binary_name); #if SIMGRID_HAVE_MC mmalloc_postexit(); #endif @@ -125,13 +124,13 @@ void xbt_init(int *argc, char **argv) { simgrid::xbt::installExceptionHandler(); - if (xbt_initialized) { - xbt_initialized++; + xbt_initialized++; + if (xbt_initialized > 1) { XBT_DEBUG("XBT has been initialized %d times.", xbt_initialized); return; } - xbt_binary_name = xbt_strdup(argv[0]); + xbt_binary_name = argv[0]; xbt_cmdline = xbt_dynar_new(sizeof(char*), NULL); for (int i = 0; i < *argc; i++) xbt_dynar_push(xbt_cmdline,&(argv[i])); @@ -140,16 +139,16 @@ void xbt_init(int *argc, char **argv) } /* these two functions belong to xbt/sysdep.h, which have no corresponding .c file */ -/** @brief like free, but you can be sure that it is a function */ +/** @brief like xbt_free, but you can be sure that it is a function */ void xbt_free_f(void *p) { - free(p); + xbt_free(p); } /** @brief should be given a pointer to pointer, and frees the second one */ void xbt_free_ref(void *d) { - free(*(void **) d); + xbt_free(*(void**)d); } /** @brief Kill the program in silence */ diff --git a/src/xbt/xbt_os_file.c b/src/xbt/xbt_os_file.c deleted file mode 100644 index 692b7c3ab6..0000000000 --- a/src/xbt/xbt_os_file.c +++ /dev/null @@ -1,89 +0,0 @@ -/* xbt_os_file.c -- portable interface to file-related functions */ - -/* Copyright (c) 2007-2010, 2012-2017. 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 "xbt/sysdep.h" -#include "xbt/file.h" /* this module */ -#include "xbt/log.h" -#include "src/internal_config.h" - -#ifdef _WIN32 -#include -#endif - -#include "libgen.h" /* POSIX dirname */ - -/** @brief Get a single line from the stream (reimplementation of the GNU getline) - * - * This is a reimplementation of the GNU getline function, so that our code don't depends on the GNU libc. - * - * xbt_getline() reads an entire line from stream, storing the address of the buffer containing the text into *buf. - * The buffer is null-terminated and includes the newline character, if one was found. - * - * If *buf is NULL, then xbt_getline() will allocate a buffer for storing the line, which should be freed by the user - * program. - * - * Alternatively, before calling xbt_getline(), *buf can contain a pointer to a malloc()-allocated buffer *n bytes in - * size. If the buffer is not large enough to hold the line, xbt_getline() resizes it with realloc(), updating - * *buf and *n as necessary. - * - * In either case, on a successful call, *buf and *n will be updated to reflect the buffer address and allocated size - * respectively. - */ -ssize_t xbt_getline(char **buf, size_t *n, FILE *stream) -{ - int ch = getc(stream); - if (ferror(stream) || feof(stream)) - return -1; - - if (!*buf) { - *n = 512; - *buf = xbt_malloc(*n); - } - - ssize_t i = 0; - do { - if (i == *n) { - *n += 512; - *buf = xbt_realloc(*buf, *n); - } - (*buf)[i] = ch; - i++; - if (ch == '\n') - break; - } while ((ch = getc(stream)) != EOF); - - if (i == *n) { - *n += 1; - *buf = xbt_realloc(*buf, *n); - } - (*buf)[i] = '\0'; - - return i; -} - -/** @brief Returns the directory component of a path (reimplementation of POSIX dirname) - * - * The argument is never modified, and the returned value must be freed after use. - */ -char *xbt_dirname(const char *path) { - char *tmp = xbt_strdup(path); - char *res = xbt_strdup(dirname(tmp)); - free(tmp); - return res; -} - -/** @brief Returns the file component of a path (reimplementation of POSIX basename) - * - * The argument is never modified, and the returned value must be freed after use. - */ -char *xbt_basename(const char *path) { - char *tmp = xbt_strdup(path); - char *res = xbt_strdup(basename(tmp)); - free(tmp); - return res; -} diff --git a/src/xbt/xbt_os_file.cpp b/src/xbt/xbt_os_file.cpp new file mode 100644 index 0000000000..1248350f79 --- /dev/null +++ b/src/xbt/xbt_os_file.cpp @@ -0,0 +1,30 @@ +/* xbt_os_file.cpp -- portable interface to file-related functions */ + +/* Copyright (c) 2017. 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 "xbt/file.hpp" /* this module */ + +#ifdef _WIN32 +#include +#endif + +#include +#include /* POSIX dirname */ + +std::string simgrid::xbt::Path::getDirname() +{ + std::string p(path_); + char *res = dirname(&p[0]); + return std::string(res, strlen(res)); +} + +std::string simgrid::xbt::Path::getBasename() +{ + std::string p(path_); + char *res = basename(&p[0]); + return std::string(res, strlen(res)); +} diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 2652bc952e..503ad7c340 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -162,7 +162,8 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, pvoid_f_pvoid_t start_ro * * If pthread_setaffinity_np is not usable on that (non-gnu) platform, this function does nothing. */ -int xbt_os_thread_bind(xbt_os_thread_t thread, int cpu){ +int xbt_os_thread_bind(XBT_ATTRIB_UNUSED xbt_os_thread_t thread, XBT_ATTRIB_UNUSED int cpu) +{ int errcode = 0; #if HAVE_PTHREAD_SETAFFINITY pthread_t pthread = thread->t; @@ -251,6 +252,12 @@ void xbt_os_thread_key_create(xbt_os_thread_key_t* key) xbt_assert(errcode==0 , "pthread_key_create failed"); } +void xbt_os_thread_key_destroy(xbt_os_thread_key_t key) +{ + int errcode = pthread_key_delete(key); + xbt_assert(errcode == 0, "pthread_key_delete failed"); +} + void xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value) { int errcode = pthread_setspecific(key, value); diff --git a/src/xbt/xbt_os_time.c b/src/xbt/xbt_os_time.c index 0e8951f837..91c81a9e7a 100644 --- a/src/xbt/xbt_os_time.c +++ b/src/xbt/xbt_os_time.c @@ -1,6 +1,6 @@ /* xbt_os_time.c -- portable interface to time-related functions */ -/* Copyright (c) 2007-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2017. 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. */ @@ -38,6 +38,32 @@ #include #endif +#ifdef _WIN32 +static void w32_time_to_timeval(struct timeval* tv, const FILETIME* ft) +{ + unsigned __int64 tm; + tm = (unsigned __int64)ft->dwHighDateTime << 32; + tm |= ft->dwLowDateTime; + tm /= 10; + tm -= 11644473600000000ULL; + tv->tv_sec = (long)(tm / 1000000L); + tv->tv_usec = (long)(tm % 1000000L); +} + +static void w32_times_to_timeval(struct timeval* tv, const FILETIME* kernel_time, const FILETIME* user_time) +{ + unsigned __int64 ktm, utm; + ktm = (unsigned __int64)kernel_time->dwHighDateTime << 32; + ktm |= kernel_time->dwLowDateTime; + ktm /= 10; + utm = (unsigned __int64)user_time->dwHighDateTime << 32; + utm |= user_time->dwLowDateTime; + utm /= 10; + tv->tv_sec = (long)(ktm / 1000000L) + (long)(utm / 1000000L); + tv->tv_usec = (long)(ktm % 1000000L) + (long)(utm % 1000000L); +} +#endif + double xbt_os_time(void) { #if HAVE_GETTIMEOFDAY @@ -46,17 +72,8 @@ double xbt_os_time(void) #elif defined(_WIN32) struct timeval tv; FILETIME ft; - unsigned __int64 tm; - GetSystemTimeAsFileTime(&ft); - tm = (unsigned __int64) ft.dwHighDateTime << 32; - tm |= ft.dwLowDateTime; - tm /= 10; - tm -= 11644473600000000ULL; - - tv.tv_sec = (long) (tm / 1000000L); - tv.tv_usec = (long) (tm % 1000000L); - + w32_time_to_timeval(&tv, &ft); #else /* not windows, no gettimeofday => poor resolution */ return (double) (time(NULL)); #endif /* HAVE_GETTIMEOFDAY? */ @@ -149,16 +166,8 @@ void xbt_os_walltimer_start(xbt_os_timer_t timer) timer->elapse.tv_sec = 0; timer->elapse.tv_usec = 0; FILETIME ft; - unsigned __int64 tm; - GetSystemTimeAsFileTime(&ft); - tm = (unsigned __int64) ft.dwHighDateTime << 32; - tm |= ft.dwLowDateTime; - tm /= 10; - tm -= 11644473600000000ULL; - - timer->start.tv_sec = (long) (tm / 1000000L); - timer->start.tv_usec = (long) (tm % 1000000L); + w32_time_to_timeval(&timer->start, &ft); #else timer->elapse = 0; timer->start = (unsigned long int) (time(NULL)); @@ -180,16 +189,8 @@ void xbt_os_walltimer_resume(xbt_os_timer_t timer) timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; timer->elapse.tv_usec += timer->stop.tv_usec - timer->start.tv_usec; FILETIME ft; - unsigned __int64 tm; - GetSystemTimeAsFileTime(&ft); - tm = (unsigned __int64) ft.dwHighDateTime << 32; - tm |= ft.dwLowDateTime; - tm /= 10; - tm -= 11644473600000000ULL; - - timer->start.tv_sec = (long) (tm / 1000000L); - timer->start.tv_usec = (long) (tm % 1000000L); + w32_time_to_timeval(&timer->start, &ft); #else timer->elapse = timer->stop - timer->start; timer->start = (unsigned long int) (time(NULL)); @@ -204,16 +205,8 @@ void xbt_os_walltimer_stop(xbt_os_timer_t timer) gettimeofday(&(timer->stop), NULL); #elif defined(_WIN32) FILETIME ft; - unsigned __int64 tm; - GetSystemTimeAsFileTime(&ft); - tm = (unsigned __int64) ft.dwHighDateTime << 32; - tm |= ft.dwLowDateTime; - tm /= 10; - tm -= 11644473600000000ULL; - - timer->stop.tv_sec = (long) (tm / 1000000L); - timer->stop.tv_usec = (long) (tm % 1000000L); + w32_time_to_timeval(&timer->stop, &ft); #else timer->stop = (unsigned long int) (time(NULL)); #endif @@ -235,15 +228,7 @@ void xbt_os_cputimer_start(xbt_os_timer_t timer) HANDLE h = GetCurrentProcess(); FILETIME creationTime, exitTime, kernelTime, userTime; GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); - unsigned __int64 ktm, utm; - ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; - ktm |= kernelTime.dwLowDateTime; - ktm /= 10; - utm = (unsigned __int64) userTime.dwHighDateTime << 32; - utm |= userTime.dwLowDateTime; - utm /= 10; - timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); - timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); + w32_times_to_timeval(&timer->start, &kernelTime, &userTime); #endif } @@ -263,15 +248,7 @@ void xbt_os_cputimer_resume(xbt_os_timer_t timer) HANDLE h = GetCurrentProcess(); FILETIME creationTime, exitTime, kernelTime, userTime; GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); - unsigned __int64 ktm, utm; - ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; - ktm |= kernelTime.dwLowDateTime; - ktm /= 10; - utm = (unsigned __int64) userTime.dwHighDateTime << 32; - utm |= userTime.dwLowDateTime; - utm /= 10; - timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); - timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); + w32_times_to_timeval(&timer->start, &kernelTime, &userTime); #endif } @@ -285,15 +262,7 @@ void xbt_os_cputimer_stop(xbt_os_timer_t timer) HANDLE h = GetCurrentProcess(); FILETIME creationTime, exitTime, kernelTime, userTime; GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); - unsigned __int64 ktm, utm; - ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; - ktm |= kernelTime.dwLowDateTime; - ktm /= 10; - utm = (unsigned __int64) userTime.dwHighDateTime << 32; - utm |= userTime.dwLowDateTime; - utm /= 10; - timer->stop.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); - timer->stop.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); + w32_times_to_timeval(&timer->stop, &kernelTime, &userTime); #endif } @@ -320,15 +289,7 @@ void xbt_os_threadtimer_start(xbt_os_timer_t timer) HANDLE h = GetCurrentThread(); FILETIME creationTime, exitTime, kernelTime, userTime; GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); - unsigned __int64 ktm, utm; - ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; - ktm |= kernelTime.dwLowDateTime; - ktm /= 10; - utm = (unsigned __int64) userTime.dwHighDateTime << 32; - utm |= userTime.dwLowDateTime; - utm /= 10; - timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); - timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); + w32_times_to_timeval(&timer->start, &kernelTime, &userTime); #endif } @@ -357,15 +318,7 @@ void xbt_os_threadtimer_resume(xbt_os_timer_t timer) HANDLE h = GetCurrentThread(); FILETIME creationTime, exitTime, kernelTime, userTime; GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); - unsigned __int64 ktm, utm; - ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; - ktm |= kernelTime.dwLowDateTime; - ktm /= 10; - utm = (unsigned __int64) userTime.dwHighDateTime << 32; - utm |= userTime.dwLowDateTime; - utm /= 10; - timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); - timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); + w32_times_to_timeval(&timer->start, &kernelTime, &userTime); #endif } @@ -386,14 +339,6 @@ void xbt_os_threadtimer_stop(xbt_os_timer_t timer) HANDLE h = GetCurrentThread(); FILETIME creationTime, exitTime, kernelTime, userTime; GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); - unsigned __int64 ktm, utm; - ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; - ktm |= kernelTime.dwLowDateTime; - ktm /= 10; - utm = (unsigned __int64) userTime.dwHighDateTime << 32; - utm |= userTime.dwLowDateTime; - utm /= 10; - timer->stop.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); - timer->stop.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); + w32_times_to_timeval(&timer->stop, &kernelTime, &userTime); #endif } diff --git a/src/xbt/xbt_str.cpp b/src/xbt/xbt_str.cpp index b7da3789f8..06f1860fac 100644 --- a/src/xbt/xbt_str.cpp +++ b/src/xbt/xbt_str.cpp @@ -188,40 +188,12 @@ xbt_dynar_t xbt_str_split_quoted(const char *s) char *q=xbt_strdup(p); xbt_dynar_push(res,&q); } - free(str_to_free); + xbt_free(str_to_free); xbt_dynar_shrink(res, 0); xbt_dynar_free(&parsed); return res; } -/** @brief Join a set of strings as a single string */ -char *xbt_str_join(xbt_dynar_t dyn, const char *sep) -{ - int len = 1; - int dyn_len = xbt_dynar_length(dyn); - unsigned int cpt; - char* cursor; - - if (not dyn_len) - return xbt_strdup(""); - - /* compute the length */ - xbt_dynar_foreach(dyn, cpt, cursor) { - len += strlen(cursor); - } - len += strlen(sep) * dyn_len; - /* Do the job */ - char* res = (char*)xbt_malloc(len); - char* p = res; - xbt_dynar_foreach(dyn, cpt, cursor) { - if ((int) cpt < dyn_len - 1) - p += snprintf(p,len, "%s%s", cursor, sep); - else - p += snprintf(p,len, "%s", cursor); - } - return res; -} - /** @brief Join a set of strings as a single string * * The parameter must be a nullptr-terminated array of chars, @@ -299,14 +271,16 @@ XBT_TEST_SUITE("xbt_str", "String Handling"); #define mytest(name, input, expected) \ xbt_test_add(name); \ - d = xbt_str_split_quoted(input); \ - s = xbt_str_join(d, "XXX"); \ + a = static_cast(xbt_dynar_to_array(xbt_str_split_quoted(input))); \ + s = xbt_str_join_array(a, "XXX"); \ xbt_test_assert(not strcmp(s, expected), "Input (%s) leads to (%s) instead of (%s)", input, s, expected); \ - free(s); \ - xbt_dynar_free(&d); -XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted, "test the function xbt_str_split_quoted") + xbt_free(s); \ + for (int i = 0; a[i] != nullptr; i++) \ + xbt_free(a[i]); \ + xbt_free(a); +XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted, "Test the function xbt_str_split_quoted") { - xbt_dynar_t d; + char** a; char *s; mytest("Empty", "", ""); diff --git a/teshsuite/mc/dwarf-expression/dwarf-expression.cpp b/teshsuite/mc/dwarf-expression/dwarf-expression.cpp index 5cd9b4620f..0ebb431cd4 100644 --- a/teshsuite/mc/dwarf-expression/dwarf-expression.cpp +++ b/teshsuite/mc/dwarf-expression/dwarf-expression.cpp @@ -12,7 +12,7 @@ #include #include -#include "src/mc/mc_private.h" +#include "src/mc/mc_private.hpp" #include "src/mc/ObjectInformation.hpp" #include "src/mc/Type.hpp" @@ -56,12 +56,15 @@ void basic_test(simgrid::dwarf::ExpressionContext const& state) { simgrid::dwarf::ExpressionStack stack; + bool caught_ex = false; try { ops[0].atom = DW_OP_drop; simgrid::dwarf::execute(ops, 1, state, stack); - fprintf(stderr,"Exception expected"); + } catch (simgrid::dwarf::evaluation_error& e) { + caught_ex = true; } - catch(simgrid::dwarf::evaluation_error& e) {} + if (not caught_ex) + fprintf(stderr, "Exception expected"); ops[0].atom = DW_OP_lit21; simgrid::dwarf::execute(ops, 1, state, stack); diff --git a/teshsuite/mc/dwarf/dwarf.cpp b/teshsuite/mc/dwarf/dwarf.cpp index 02c26eac9c..c1eb4fa0d9 100644 --- a/teshsuite/mc/dwarf/dwarf.cpp +++ b/teshsuite/mc/dwarf/dwarf.cpp @@ -14,7 +14,7 @@ #include #include "mc/datatypes.h" -#include "src/mc/mc_private.h" +#include "src/mc/mc_private.hpp" #include "src/mc/ObjectInformation.hpp" #include "src/mc/Type.hpp" @@ -25,7 +25,8 @@ int test_some_array[4][5][6]; struct some_struct { int first; int second[4][5]; -} test_some_struct; +}; +some_struct test_some_struct; static simgrid::mc::Type* find_type_by_name(simgrid::mc::ObjectInformation* info, const char* name) { @@ -105,11 +106,13 @@ static simgrid::mc::Member* find_member(simgrid::mc::Type& type, const char* nam int some_local_variable = 0; -typedef struct foo {int i;} s_foo; +struct s_foo { + int i; +}; -static void test_type_by_name(simgrid::mc::RemoteClient& process, s_foo my_foo) +static void test_type_by_name(simgrid::mc::RemoteClient& process, s_foo /*my_foo*/) { - assert(process.binary_info->full_types_by_name.find("struct foo") != process.binary_info->full_types_by_name.end()); + assert(process.binary_info->full_types_by_name.find("struct s_foo") != process.binary_info->full_types_by_name.end()); } int main(int argc, char** argv) diff --git a/teshsuite/msg/CMakeLists.txt b/teshsuite/msg/CMakeLists.txt index 39b4e94075..0556ec3706 100644 --- a/teshsuite/msg/CMakeLists.txt +++ b/teshsuite/msg/CMakeLists.txt @@ -10,7 +10,7 @@ foreach(x actions-comm actions-storage cloud-sharing get_sender host_on_off host endforeach() # CPP examples -foreach(x task_destroy_cancel task_listen_from) +foreach(x task_destroy_cancel task_listen_from task_progress) add_executable (${x} ${x}/${x}.cpp) target_link_libraries(${x} simgrid) set_target_properties(${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x}) @@ -51,7 +51,8 @@ set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/acti ${CMAKE_CURRENT_SOURCE_DIR}/trace_integration/test-hbp1-c1s1-c3s2.xml ${CMAKE_CURRENT_SOURCE_DIR}/trace_integration/test-hbp2.5-hbp1.5.xml PARENT_SCOPE) -foreach(x get_sender host_on_off host_on_off_processes host_on_off_recv task_destroy_cancel task_listen_from trace_integration) +foreach(x get_sender host_on_off host_on_off_processes host_on_off_recv + task_destroy_cancel task_listen_from task_progress trace_integration) ADD_TESH_FACTORIES(tesh-msg-${x} "thread;ucontext;raw;boost" --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/msg/${x} --cd ${CMAKE_BINARY_DIR}/teshsuite/msg/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/${x}/${x}.tesh) endforeach() diff --git a/teshsuite/msg/cloud-sharing/cloud-sharing.tesh b/teshsuite/msg/cloud-sharing/cloud-sharing.tesh index c6c2296313..3ff450c9a8 100644 --- a/teshsuite/msg/cloud-sharing/cloud-sharing.tesh +++ b/teshsuite/msg/cloud-sharing/cloud-sharing.tesh @@ -37,8 +37,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud-sharing$EXEEXT --log=root.fmt:%m%n ${srcdir: > Passed: (Xx)2 with 1 load (100000000flops) took 0.1s as expected > ### Test '( ooo )2'. 3 tasks on a bicore PM > Passed: (xxX)2 with 0.6667 load (66666666flops) took 0.1s as expected -> Passed: (Xxx)2 with 0.6667 load (66666666flops) took 0.1s as expected > Passed: (xXx)2 with 0.6667 load (66666666flops) took 0.1s as expected +> Passed: (Xxx)2 with 0.6667 load (66666666flops) took 0.1s as expected > # TEST ON TWO-CORE PMs AND SINGLE-CORE VMs > ## Check impact of a single VM (no degradation for the moment) > ### Test '( [o]1 )2'. A task in a VM on a bicore PM @@ -62,8 +62,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud-sharing$EXEEXT --log=root.fmt:%m%n ${srcdir: > Passed: ( [x]1 [X]1 [ ]1 )2 with 1 load (100000000flops) took 0.1s as expected > ### Put three VMs on a PM, and put a task to each VM > Passed: ( [X]1 [o]1 [o]1 )2 with 0.6667 load (66666666flops) took 0.1s as expected -> Passed: ( [o]1 [o]1 [X]1 )2 with 0.6667 load (66666666flops) took 0.1s as expected > Passed: ( [o]1 [X]1 [o]1 )2 with 0.6667 load (66666666flops) took 0.1s as expected +> Passed: ( [o]1 [o]1 [X]1 )2 with 0.6667 load (66666666flops) took 0.1s as expected > # TEST ON TWO-CORE PMs AND TWO-CORE VMs > ## Check impact of a single VM (there is no degradation for the moment) > ### Put a VM on a PM, and put a task to the VM @@ -73,8 +73,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud-sharing$EXEEXT --log=root.fmt:%m%n ${srcdir: > Passed: ( [Xo]2 )2 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, and put three tasks to the VM > Passed: ( [ooX]2 )2 with 0.6667 load (66666666flops) took 0.1s as expected -> Passed: ( [Xoo]2 )2 with 0.6667 load (66666666flops) took 0.1s as expected > Passed: ( [oXo]2 )2 with 0.6667 load (66666666flops) took 0.1s as expected +> Passed: ( [Xoo]2 )2 with 0.6667 load (66666666flops) took 0.1s as expected > ## Check impact of a single VM collocated with a task (there is no degradation for the moment) > ### Put a VM on a PM, and put a task to the PM > Passed: ( [ ]2 X )2 with 1 load (100000000flops) took 0.1s as expected @@ -88,26 +88,26 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud-sharing$EXEEXT --log=root.fmt:%m%n ${srcdir: > ### Put a VM on a PM, put one task to the PM and three tasks to the VM > Passed: ( [ooo]2 X )2 with 0.6667 load (66666666flops) took 0.1s as expected > Passed: ( [ooX]2 o )2 with 0.4444 load (44444444flops) took 0.1s as expected -> Passed: ( [Xoo]2 o )2 with 0.4444 load (44444444flops) took 0.1s as expected > Passed: ( [oXo]2 o )2 with 0.4444 load (44444444flops) took 0.1s as expected +> Passed: ( [Xoo]2 o )2 with 0.4444 load (44444444flops) took 0.1s as expected > ### Put a VM on a PM, and put two tasks to the PM > Passed: ( [ ]2 oX )2 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [ ]2 Xo )2 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, put one task to the PM and one task to the VM -> Passed: ( [o]2 Xo )2 with 0.6667 load (66666666flops) took 0.1s as expected > Passed: ( [o]2 oX )2 with 0.6667 load (66666666flops) took 0.1s as expected +> Passed: ( [o]2 Xo )2 with 0.6667 load (66666666flops) took 0.1s as expected > Passed: ( [X]2 oo )2 with 0.6667 load (66666666flops) took 0.1s as expected > ### Put a VM on a PM, put one task to the PM and two tasks to the VM -> Passed: ( [oo]2 Xo )2 with 0.5 load (50000000flops) took 0.1s as expected > Passed: ( [oo]2 oX )2 with 0.5 load (50000000flops) took 0.1s as expected +> Passed: ( [oo]2 Xo )2 with 0.5 load (50000000flops) took 0.1s as expected > Passed: ( [oX]2 oo )2 with 0.5 load (50000000flops) took 0.1s as expected > Passed: ( [Xo]2 oo )2 with 0.5 load (50000000flops) took 0.1s as expected > ### Put a VM on a PM, put one task to the PM and three tasks to the VM -> Passed: ( [ooo]2 Xo )2 with 0.5 load (50000000flops) took 0.1s as expected > Passed: ( [ooo]2 oX )2 with 0.5 load (50000000flops) took 0.1s as expected +> Passed: ( [ooo]2 Xo )2 with 0.5 load (50000000flops) took 0.1s as expected > Passed: ( [ooX]2 oo )2 with 0.3333 load (33333333flops) took 0.1s as expected -> Passed: ( [Xoo]2 oo )2 with 0.3333 load (33333333flops) took 0.1s as expected > Passed: ( [oXo]2 oo )2 with 0.3333 load (33333333flops) took 0.1s as expected +> Passed: ( [Xoo]2 oo )2 with 0.3333 load (33333333flops) took 0.1s as expected > # TEST ON FOUR-CORE PMs AND TWO-CORE VMs > ## Check impact of a single VM > ### Put a VM on a PM, and put a task to the VM @@ -117,8 +117,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud-sharing$EXEEXT --log=root.fmt:%m%n ${srcdir: > Passed: ( [Xo]2 )4 with 1 load (100000000flops) took 0.1s as expected > ### ( [ooo]2 )4: Put a VM on a PM, and put three tasks to the VM > Passed: ( [ooX]2 )4 with 0.6667 load (66666666flops) took 0.1s as expected -> Passed: ( [Xoo]2 )4 with 0.6667 load (66666666flops) took 0.1s as expected > Passed: ( [oXo]2 )4 with 0.6667 load (66666666flops) took 0.1s as expected +> Passed: ( [Xoo]2 )4 with 0.6667 load (66666666flops) took 0.1s as expected > ## Check impact of a single empty VM collocated with tasks > ### Put a VM on a PM, and put a task to the PM > Passed: ( [ ]2 X )4 with 1 load (100000000flops) took 0.1s as expected @@ -127,8 +127,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud-sharing$EXEEXT --log=root.fmt:%m%n ${srcdir: > Passed: ( [ ]2 Xo )4 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, and put three tasks to the PM > Passed: ( [ ]2 ooX )4 with 1 load (100000000flops) took 0.1s as expected -> Passed: ( [ ]2 Xoo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [ ]2 oXo )4 with 1 load (100000000flops) took 0.1s as expected +> Passed: ( [ ]2 Xoo )4 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, and put four tasks to the PM > Passed: ( [ ]2 oooX )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [ ]2 ooXo )4 with 1 load (100000000flops) took 0.1s as expected @@ -139,32 +139,32 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud-sharing$EXEEXT --log=root.fmt:%m%n ${srcdir: > Passed: ( [o]2 X )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [X]2 o )4 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, and put two tasks to the PM and one task to the VM -> Passed: ( [o]2 Xo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [o]2 oX )4 with 1 load (100000000flops) took 0.1s as expected +> Passed: ( [o]2 Xo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [X]2 oo )4 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, and put two tasks to the PM and two tasks to the VM -> Passed: ( [oo]2 Xo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [oo]2 oX )4 with 1 load (100000000flops) took 0.1s as expected +> Passed: ( [oo]2 Xo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [oX]2 oo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [Xo]2 oo )4 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, and put three tasks to the PM and one tasks to the VM > Passed: ( [o]2 ooX )4 with 1 load (100000000flops) took 0.1s as expected -> Passed: ( [o]2 Xoo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [o]2 oXo )4 with 1 load (100000000flops) took 0.1s as expected +> Passed: ( [o]2 Xoo )4 with 1 load (100000000flops) took 0.1s as expected > Passed: ( [X]2 ooo )4 with 1 load (100000000flops) took 0.1s as expected > ### Put a VM on a PM, and put three tasks to the PM and two tasks to the VM > Passed: ( [oo]2 ooX )4 with 0.8 load (80000000flops) took 0.1s as expected -> Passed: ( [oo]2 Xoo )4 with 0.8 load (80000000flops) took 0.1s as expected > Passed: ( [oo]2 oXo )4 with 0.8 load (80000000flops) took 0.1s as expected +> Passed: ( [oo]2 Xoo )4 with 0.8 load (80000000flops) took 0.1s as expected > Passed: ( [oX]2 ooo )4 with 0.8 load (80000000flops) took 0.1s as expected > Passed: ( [Xo]2 ooo )4 with 0.8 load (80000000flops) took 0.1s as expected > ### Put a VM on a PM, and put three tasks to the PM and three tasks to the VM > Passed: ( [ooo]2 ooX )4 with 0.8 load (80000000flops) took 0.1s as expected -> Passed: ( [ooo]2 Xoo )4 with 0.8 load (80000000flops) took 0.1s as expected > Passed: ( [ooo]2 oXo )4 with 0.8 load (80000000flops) took 0.1s as expected +> Passed: ( [ooo]2 Xoo )4 with 0.8 load (80000000flops) took 0.1s as expected > Passed: ( [ooX]2 ooo )4 with 0.5333 load (53333333flops) took 0.1s as expected -> Passed: ( [Xoo]2 ooo )4 with 0.5333 load (53333333flops) took 0.1s as expected > Passed: ( [oXo]2 ooo )4 with 0.5333 load (53333333flops) took 0.1s as expected +> Passed: ( [Xoo]2 ooo )4 with 0.5333 load (53333333flops) took 0.1s as expected > > > ## 0 test failed diff --git a/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.cpp b/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.cpp index 5c22018489..0326f56963 100644 --- a/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.cpp +++ b/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.cpp @@ -98,7 +98,7 @@ static int worker(int /*argc*/, char* /*argv*/ []) MSG_task_execute(task); double end = MSG_get_clock(); XBT_INFO("Task \"%s\" done in %f (amount %f)", MSG_task_get_name(task), end - start, - MSG_task_get_flops_amount(task)); + MSG_task_get_remaining_work_ratio(task)); MSG_task_destroy(task); } diff --git a/teshsuite/msg/task_progress/task_progress.cpp b/teshsuite/msg/task_progress/task_progress.cpp new file mode 100644 index 0000000000..c681ec9f31 --- /dev/null +++ b/teshsuite/msg/task_progress/task_progress.cpp @@ -0,0 +1,111 @@ +/* Copyright (c) 2010-2017. 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 "simgrid/msg.h" + +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example"); + +static std::vector tasks = std::vector(); + +static int seq_task(int /*argc*/, char* /*argv*/ []) +{ + double task_comp_size = 5E7; + double task_comm_size = 1E6; + double progress = 0; + + msg_task_t task = MSG_task_create("simple", task_comp_size, task_comm_size, NULL); + tasks.push_back(task); + + XBT_INFO("get the progress of %s before the task starts", task->name); + progress = MSG_task_get_remaining_work_ratio(task); + xbt_assert(progress == 0, "Progress should be 0 not %f", progress); + + XBT_INFO("Executing task: \"%s\"", task->name); + MSG_task_execute(task); + + XBT_INFO("get the progress of %s after the task finishes", task->name); + progress = MSG_task_get_remaining_work_ratio(task); + xbt_assert(progress == 0, "Progress should be equal to 1 not %f", progress); + + MSG_task_destroy(task); + XBT_INFO("Goodbye now!"); + return 0; +} + +static int par_task(int /*argc*/, char* /*argv*/ []) +{ + double * computation_amount = new double[2] {10E7, 10E7}; + double * communication_amount = new double[4] {1E6, 1E6, 1E6, 1E6}; + double progress = 0; + + std::vector hosts_to_use = std::vector(); + hosts_to_use.push_back(MSG_get_host_by_name("Tremblay")); + hosts_to_use.push_back(MSG_get_host_by_name("Jupiter")); + + msg_task_t task = MSG_parallel_task_create("ptask", 2, hosts_to_use.data(), computation_amount, communication_amount, NULL); + tasks.push_back(task); + + XBT_INFO("get the progress of %s before the task starts", task->name); + progress = MSG_task_get_remaining_work_ratio(task); + xbt_assert(progress == 0, "Progress should be 0 not %f", progress); + + XBT_INFO("Executing task: \"%s\"", task->name); + MSG_parallel_task_execute(task); + + XBT_INFO("get the progress of %s after the task finishes", task->name); + progress = MSG_task_get_remaining_work_ratio(task); + xbt_assert(progress == 0, "Progress should be equal to 1 not %f", progress); + + MSG_task_destroy(task); + delete[] computation_amount; + delete[] communication_amount; + + XBT_INFO("Goodbye now!"); + return 0; +} + +static int get_progress(int /*argc*/, char* /*argv*/ []) +{ + while (tasks.empty()) { + MSG_process_sleep(0.5); + } + double progress; + for(auto const& task: tasks) { + double progress_prev = 1; + for (int i = 0; i < 3; i++) { + MSG_process_sleep(0.2); + progress = MSG_task_get_remaining_work_ratio(task); + xbt_assert(progress >= 0 and progress < 1, "Progress should be in [0, 1[, and not %f", progress); + xbt_assert(progress < progress_prev, "Progress should decrease, not increase"); + XBT_INFO("Progress of \"%s\": %f", task->name, progress); + progress_prev = progress; + } + } + return 0; +} + +int main(int argc, char *argv[]) +{ + MSG_init(&argc, argv); + MSG_config("host/model", "ptask_L07"); + xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s ../examples/platforms/two_hosts.xml\n", argv[0], argv[0]); + + MSG_create_environment(argv[1]); + + MSG_process_create("sequential", seq_task, NULL, MSG_get_host_by_name("Tremblay")); + + MSG_process_create("parallel", par_task, NULL, MSG_get_host_by_name("Tremblay")); + + // Create a process to test in progress task + MSG_process_create("get_progress", get_progress, NULL, MSG_get_host_by_name("Tremblay")); + + msg_error_t res = MSG_main(); + + XBT_INFO("Simulation time %g", MSG_get_clock()); + + return res != MSG_OK; +} diff --git a/teshsuite/msg/task_progress/task_progress.tesh b/teshsuite/msg/task_progress/task_progress.tesh new file mode 100644 index 0000000000..679e1816ea --- /dev/null +++ b/teshsuite/msg/task_progress/task_progress.tesh @@ -0,0 +1,18 @@ +$ ./task_progress ${srcdir:=.}/../../../examples/platforms/small_platform.xml +> [0.000000] [xbt_cfg/INFO] Switching to the L07 model to handle parallel tasks. +> [Tremblay:sequential:(1) 0.000000] [msg_test/INFO] get the progress of simple before the task starts +> [Tremblay:sequential:(1) 0.000000] [msg_test/INFO] Executing task: "simple" +> [Tremblay:parallel:(2) 0.000000] [msg_test/INFO] get the progress of ptask before the task starts +> [Tremblay:parallel:(2) 0.000000] [msg_test/INFO] Executing task: "ptask" +> [Tremblay:get_progress:(3) 0.200000] [msg_test/INFO] Progress of "simple": 0.802376 +> [Tremblay:get_progress:(3) 0.400000] [msg_test/INFO] Progress of "simple": 0.606186 +> [Tremblay:get_progress:(3) 0.600000] [msg_test/INFO] Progress of "simple": 0.409996 +> [Tremblay:get_progress:(3) 0.800000] [msg_test/INFO] Progress of "ptask": 0.608337 +> [Tremblay:get_progress:(3) 1.000000] [msg_test/INFO] Progress of "ptask": 0.510242 +> [Tremblay:sequential:(1) 1.017958] [msg_test/INFO] get the progress of simple after the task finishes +> [Tremblay:sequential:(1) 1.017958] [msg_test/INFO] Goodbye now! +> [Tremblay:get_progress:(3) 1.200000] [msg_test/INFO] Progress of "ptask": 0.362543 +> [Tremblay:parallel:(2) 1.675180] [msg_test/INFO] get the progress of ptask after the task finishes +> [Tremblay:parallel:(2) 1.675180] [msg_test/INFO] Goodbye now! +> [1.675180] [msg_test/INFO] Simulation time 1.67518 + diff --git a/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml b/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml index 7de0dc6231..7b14f7877f 100644 --- a/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml +++ b/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml @@ -5,7 +5,7 @@ - + diff --git a/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml b/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml index 004873453d..e8466466cf 100644 --- a/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml +++ b/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml @@ -5,7 +5,7 @@ - + diff --git a/teshsuite/msg/trace_integration/trace_integration.tesh b/teshsuite/msg/trace_integration/trace_integration.tesh index 3ba862de5b..58b9ad9211 100644 --- a/teshsuite/msg/trace_integration/trace_integration.tesh +++ b/teshsuite/msg/trace_integration/trace_integration.tesh @@ -123,26 +123,26 @@ $ ./trace_integration ${srcdir:=.}/../../../examples/platforms/two_hosts_platfor > [ 10.000000] (1:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI > [ 10.000000] (1:test_trace@Cpu B) Task size: 50.000000 > [ 10.000000] (1:test_trace@Cpu B) Task prio: 2.500000 -> [ 10.000000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI -> [ 10.000000] (2:test_trace@Cpu B) Task size: 70.000000 -> [ 10.000000] (2:test_trace@Cpu B) Task prio: 1.500000 -> [ 20.000000] (1:test_trace@Cpu B) Test finished +> [ 10.500000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI +> [ 10.500000] (2:test_trace@Cpu B) Task size: 70.000000 +> [ 10.500000] (2:test_trace@Cpu B) Task prio: 1.500000 +> [ 19.700000] (1:test_trace@Cpu B) Test finished > [ 30.000000] (2:test_trace@Cpu B) Test finished -p Testing trace integration using trace_B.txt and test-hbp2.5-hbp1.5.xml, two process with different priority +p Testing trace integration using trace_B.txt and test-hbp2.5-hbp1.5.xml, two process with different priority (included) ! output sort -$ ./trace_integration ${srcdir:=.}/../../../examples/platforms/two_hosts_platform_with_availability.xml ${srcdir:=.}/test-hbp2.5-hbp1.5.xml --cfg=host/model:compound --cfg=network/model:CM02 --cfg=cpu/optim:TI --log=simix.thresh:warning "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +$ ./trace_integration ${srcdir:=.}/../../../examples/platforms/two_hosts_platform_with_availability_included.xml ${srcdir:=.}/test-hbp2.5-hbp1.5.xml --cfg=host/model:compound --cfg=network/model:CM02 --cfg=cpu/optim:TI --log=simix.thresh:warning "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:maestro@) Configuration change: Set 'host/model' to 'compound' > [ 0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02' > [ 0.000000] (0:maestro@) Configuration change: Set 'cpu/optim' to 'TI' > [ 10.000000] (1:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI > [ 10.000000] (1:test_trace@Cpu B) Task size: 50.000000 > [ 10.000000] (1:test_trace@Cpu B) Task prio: 2.500000 -> [ 10.000000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI -> [ 10.000000] (2:test_trace@Cpu B) Task size: 70.000000 -> [ 10.000000] (2:test_trace@Cpu B) Task prio: 1.500000 -> [ 20.000000] (1:test_trace@Cpu B) Test finished +> [ 10.500000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI +> [ 10.500000] (2:test_trace@Cpu B) Task size: 70.000000 +> [ 10.500000] (2:test_trace@Cpu B) Task prio: 1.500000 +> [ 19.700000] (1:test_trace@Cpu B) Test finished > [ 30.000000] (2:test_trace@Cpu B) Test finished p Testing trace integration using trace_B.txt and test-hbp1.0-hbp1.0-hbp1.0.xml, three process with same priority @@ -165,26 +165,6 @@ $ ./trace_integration ${srcdir:=.}/../../../examples/platforms/two_hosts_platfor > [ 50.000000] (2:test_trace@Cpu B) Test finished > [ 60.000000] (3:test_trace@Cpu B) Test finished -p Testing trace integration using trace_B.txt and test-hbp1.0-hbp3.0-hbp4.0.xml, three process with same priority - -! output sort -$ ./trace_integration ${srcdir:=.}/../../../examples/platforms/two_hosts_platform_with_availability.xml ${srcdir:=.}/test-hbp1.0-hbp3.0-hbp4.0.xml --cfg=host/model:compound --cfg=network/model:CM02 --cfg=cpu/optim:TI --log=simix.thresh:warning "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" -> [ 0.000000] (0:maestro@) Configuration change: Set 'host/model' to 'compound' -> [ 0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02' -> [ 0.000000] (0:maestro@) Configuration change: Set 'cpu/optim' to 'TI' -> [ 10.000000] (1:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI -> [ 10.000000] (1:test_trace@Cpu B) Task size: 25.000000 -> [ 10.000000] (1:test_trace@Cpu B) Task prio: 1.000000 -> [ 10.000000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI -> [ 10.000000] (2:test_trace@Cpu B) Task size: 75.000000 -> [ 10.000000] (2:test_trace@Cpu B) Task prio: 3.000000 -> [ 20.000000] (3:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI -> [ 20.000000] (3:test_trace@Cpu B) Task size: 120.000000 -> [ 20.000000] (3:test_trace@Cpu B) Task prio: 4.000000 -> [ 30.000000] (1:test_trace@Cpu B) Test finished -> [ 30.000000] (2:test_trace@Cpu B) Test finished -> [ 40.000000] (3:test_trace@Cpu B) Test finished - p Testing trace integration using trace_B.txt and test-hbp1.0-hbp3.0-hbp4.0.xml, three process with different priority ! output sort @@ -195,14 +175,14 @@ $ ./trace_integration ${srcdir:=.}/../../../examples/platforms/two_hosts_platfor > [ 10.000000] (1:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI > [ 10.000000] (1:test_trace@Cpu B) Task size: 25.000000 > [ 10.000000] (1:test_trace@Cpu B) Task prio: 1.000000 -> [ 10.000000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI -> [ 10.000000] (2:test_trace@Cpu B) Task size: 75.000000 -> [ 10.000000] (2:test_trace@Cpu B) Task prio: 3.000000 +> [ 10.500000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI +> [ 10.500000] (2:test_trace@Cpu B) Task size: 75.000000 +> [ 10.500000] (2:test_trace@Cpu B) Task prio: 3.000000 > [ 20.000000] (3:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI > [ 20.000000] (3:test_trace@Cpu B) Task size: 120.000000 > [ 20.000000] (3:test_trace@Cpu B) Task prio: 4.000000 -> [ 30.000000] (1:test_trace@Cpu B) Test finished -> [ 30.000000] (2:test_trace@Cpu B) Test finished +> [ 24.000000] (1:test_trace@Cpu B) Test finished +> [ 30.400000] (2:test_trace@Cpu B) Test finished > [ 40.000000] (3:test_trace@Cpu B) Test finished p Testing trace integration using trace_B.txt and test-hbp1.0-hbp3.0-hbp4.0.xml, three process with different priority (included) @@ -215,12 +195,12 @@ $ ./trace_integration ${srcdir:=.}/../../../examples/platforms/two_hosts_platfor > [ 10.000000] (1:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI > [ 10.000000] (1:test_trace@Cpu B) Task size: 25.000000 > [ 10.000000] (1:test_trace@Cpu B) Task prio: 1.000000 -> [ 10.000000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI -> [ 10.000000] (2:test_trace@Cpu B) Task size: 75.000000 -> [ 10.000000] (2:test_trace@Cpu B) Task prio: 3.000000 +> [ 10.500000] (2:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI +> [ 10.500000] (2:test_trace@Cpu B) Task size: 75.000000 +> [ 10.500000] (2:test_trace@Cpu B) Task prio: 3.000000 > [ 20.000000] (3:test_trace@Cpu B) Testing the trace integration cpu model: CpuTI > [ 20.000000] (3:test_trace@Cpu B) Task size: 120.000000 > [ 20.000000] (3:test_trace@Cpu B) Task prio: 4.000000 -> [ 30.000000] (1:test_trace@Cpu B) Test finished -> [ 30.000000] (2:test_trace@Cpu B) Test finished +> [ 24.000000] (1:test_trace@Cpu B) Test finished +> [ 30.400000] (2:test_trace@Cpu B) Test finished > [ 40.000000] (3:test_trace@Cpu B) Test finished diff --git a/teshsuite/s4u/actor/actor.cpp b/teshsuite/s4u/actor/actor.cpp index 948eca2e00..46b464fd88 100644 --- a/teshsuite/s4u/actor/actor.cpp +++ b/teshsuite/s4u/actor/actor.cpp @@ -26,7 +26,7 @@ static void master() simgrid::s4u::this_actor::getHost()->actorList(actor_list); for (auto const& actor : *actor_list) { - XBT_INFO("Actor (pid=%lu, ppid=%lu, name=%s)", actor->getPid(), actor->getPpid(), actor->getName().c_str()); + XBT_INFO("Actor (pid=%lu, ppid=%lu, name=%s)", actor->getPid(), actor->getPpid(), actor->getCname()); if (simgrid::s4u::this_actor::getPid() != actor->getPid()) actor->kill(); } diff --git a/teshsuite/s4u/concurrent_rw/concurrent_rw.tesh b/teshsuite/s4u/concurrent_rw/concurrent_rw.tesh index 8be078fe9c..6e2576aa2f 100644 --- a/teshsuite/s4u/concurrent_rw/concurrent_rw.tesh +++ b/teshsuite/s4u/concurrent_rw/concurrent_rw.tesh @@ -19,16 +19,16 @@ $ ./concurrent_rw$EXEEXT ${srcdir:=.}/../../../examples/platforms/storage/storag > [ 4.600000] (host@bob) process 4 goes to sleep for 2 seconds > [ 5.500000] (host@bob) process 5 is writing again! > [ 5.600000] (host@bob) process 5 goes to sleep for 1 seconds -> [ 6.600000] (host@bob) process 4 is reading! -> [ 6.600000] (host@bob) process 5 is reading! > [ 6.600000] (host@bob) process 1 is reading! > [ 6.600000] (host@bob) process 2 is reading! > [ 6.600000] (host@bob) process 3 is reading! -> [ 6.750000] (host@bob) process 4 goes to sleep for 4 seconds -> [ 6.750000] (host@bob) process 5 goes to sleep for 5 seconds +> [ 6.600000] (host@bob) process 4 is reading! +> [ 6.600000] (host@bob) process 5 is reading! > [ 6.750000] (host@bob) process 1 goes to sleep for 1 seconds > [ 6.750000] (host@bob) process 2 goes to sleep for 2 seconds > [ 6.750000] (host@bob) process 3 goes to sleep for 3 seconds +> [ 6.750000] (host@bob) process 4 goes to sleep for 4 seconds +> [ 6.750000] (host@bob) process 5 goes to sleep for 5 seconds > [ 7.750000] (host@bob) process 1 is reading again! > [ 7.780000] (host@bob) process 1 => Size of /home/doc/simgrid/examples/platforms/g5k.xml1: 6000000 > [ 8.750000] (host@bob) process 2 is reading again! diff --git a/teshsuite/s4u/pid/pid.cpp b/teshsuite/s4u/pid/pid.cpp index 86dcc627dc..de948f3c56 100644 --- a/teshsuite/s4u/pid/pid.cpp +++ b/teshsuite/s4u/pid/pid.cpp @@ -7,7 +7,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this msg example"); -static int my_onexit(smx_process_exit_status_t status, int* pid) +static int my_onexit(smx_process_exit_status_t /*status*/, int* pid) { XBT_INFO("Process \"%d\" killed.", *pid); return 0; diff --git a/teshsuite/s4u/storage_client_server/storage_client_server.cpp b/teshsuite/s4u/storage_client_server/storage_client_server.cpp index df64ea9a32..9ef8840fa8 100644 --- a/teshsuite/s4u/storage_client_server/storage_client_server.cpp +++ b/teshsuite/s4u/storage_client_server/storage_client_server.cpp @@ -5,6 +5,7 @@ #include "simgrid/s4u.hpp" #include +#include XBT_LOG_NEW_DEFAULT_CATEGORY(storage, "Messages specific for this simulation"); @@ -12,7 +13,7 @@ static void display_storage_properties(simgrid::s4u::Storage* storage) { std::map* props = storage->getProperties(); if (not props->empty()) { - XBT_INFO("\tProperties of mounted storage: %s", storage->getName()); + XBT_INFO("\tProperties of mounted storage: %s", storage->getCname()); for (auto const& elm : *props) { XBT_INFO(" %s->%s", elm.first.c_str(), elm.second.c_str()); @@ -22,37 +23,33 @@ static void display_storage_properties(simgrid::s4u::Storage* storage) } } -static sg_size_t write_local_file(const char* dest, sg_size_t file_size) +static sg_size_t write_local_file(const std::string& dest, sg_size_t file_size) { - simgrid::s4u::File* file = new simgrid::s4u::File(dest, nullptr); - sg_size_t written = file->write(file_size); + simgrid::s4u::File file(dest, nullptr); + sg_size_t written = file.write(file_size); XBT_INFO("%llu bytes on %llu bytes have been written by %s on /sd1", written, file_size, - simgrid::s4u::Actor::self()->getName().c_str()); - delete file; + simgrid::s4u::Actor::self()->getCname()); return written; } -static sg_size_t read_local_file(const char* src) +static sg_size_t read_local_file(const std::string& src) { - simgrid::s4u::File* file = new simgrid::s4u::File(src, nullptr); - sg_size_t file_size = file->size(); - sg_size_t read = file->read(file_size); - - XBT_INFO("%s has read %llu on %s", simgrid::s4u::Actor::self()->getName().c_str(), read, src); - delete file; - + simgrid::s4u::File file(src, nullptr); + sg_size_t file_size = file.size(); + sg_size_t read = file.read(file_size); + XBT_INFO("%s has read %llu on %s", simgrid::s4u::Actor::self()->getCname(), read, src.c_str()); return read; } // Read src file on local disk and send a put message to remote host (size of message = size of src file) -static void hsm_put(const char* remote_host, const char* src, const char* dest) +static void hsm_put(const std::string& remote_host, const std::string& src, const std::string& dest) { // Read local src file, and return the size that was actually read sg_size_t read_size = read_local_file(src); // Send file - XBT_INFO("%s sends %llu to %s", simgrid::s4u::this_actor::getName().c_str(), read_size, remote_host); - char* payload = bprintf("%s %llu", dest, read_size); + XBT_INFO("%s sends %llu to %s", simgrid::s4u::this_actor::getCname(), read_size, remote_host.c_str()); + std::string* payload = new std::string(simgrid::xbt::string_printf("%s %llu", dest.c_str(), read_size)); simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(remote_host); mailbox->put(payload, static_cast(read_size)); simgrid::s4u::this_actor::sleep_for(.4); @@ -60,7 +57,7 @@ static void hsm_put(const char* remote_host, const char* src, const char* dest) static void display_storage_content(simgrid::s4u::Storage* storage) { - XBT_INFO("Print the content of the storage element: %s", storage->getName()); + XBT_INFO("Print the content of the storage element: %s", storage->getCname()); std::map* content = storage->getContent(); if (not content->empty()) { for (auto const& entry : *content) @@ -70,16 +67,16 @@ static void display_storage_content(simgrid::s4u::Storage* storage) } } -static void dump_storage_by_name(const char* name) +static void dump_storage_by_name(const std::string& name) { XBT_INFO("*** Dump a storage element ***"); simgrid::s4u::Storage* storage = simgrid::s4u::Storage::byName(name); display_storage_content(storage); } -static void get_set_storage_data(const char* storage_name) +static void get_set_storage_data(const std::string& storage_name) { - XBT_INFO("*** GET/SET DATA for storage element: %s ***", storage_name); + XBT_INFO("*** GET/SET DATA for storage element: %s ***", storage_name.c_str()); simgrid::s4u::Storage* storage = simgrid::s4u::Storage::byName(storage_name); char* data = static_cast(storage->getUserdata()); @@ -106,9 +103,9 @@ static void storage_info(simgrid::s4u::Host* host) XBT_INFO("*** Storage info on %s ***", host->getCname()); for (auto const& elm : host->getMountedStorages()) { - const char* mount_name = elm.first.c_str(); + const std::string& mount_name = elm.first; simgrid::s4u::Storage* storage = elm.second; - XBT_INFO("\tStorage name: %s, mount name: %s", storage->getName(), mount_name); + XBT_INFO("\tStorage name: %s, mount name: %s", storage->getCname(), mount_name.c_str()); sg_size_t free_size = storage->getSizeFree(); sg_size_t used_size = storage->getSizeUsed(); @@ -117,7 +114,7 @@ static void storage_info(simgrid::s4u::Host* host) XBT_INFO("\t\tUsed size: %llu bytes", used_size); display_storage_properties(storage); - dump_storage_by_name(storage->getName()); + dump_storage_by_name(storage->getCname()); } } @@ -128,7 +125,7 @@ static void client() hsm_put("alice", "/home/doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c", "c:\\Windows\\tata.c"); simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName("alice"); - mailbox->put(xbt_strdup("finalize"), 0); + mailbox->put(new std::string("finalize"), 0); get_set_storage_data("Disk1"); } @@ -140,16 +137,16 @@ static void server() XBT_INFO("Server waiting for transfers ..."); while (1) { - char* msg = static_cast(mailbox->get()); - if (not strcmp(msg, "finalize")) { // Shutdown ... - xbt_free(msg); + std::string* msg = static_cast(mailbox->get()); + if (*msg == "finalize") { // Shutdown ... + delete msg; break; } else { // Receive file to save - char* saveptr; - char* dest = strtok_r(msg, " ", &saveptr); - sg_size_t size_to_write = std::stoull(strtok_r(nullptr, " ", &saveptr)); + size_t pos = msg->find(' '); + std::string dest = msg->substr(0, pos); + sg_size_t size_to_write = std::stoull(msg->substr(pos + 1)); write_local_file(dest, size_to_write); - xbt_free(dest); + delete msg; } } @@ -159,17 +156,15 @@ static void server() int main(int argc, char* argv[]) { - simgrid::s4u::Engine* e = new simgrid::s4u::Engine(&argc, argv); + simgrid::s4u::Engine e(&argc, argv); xbt_assert(argc == 2, "Usage: %s platform_file\n", argv[0]); - e->loadPlatform(argv[1]); + e.loadPlatform(argv[1]); simgrid::s4u::Actor::createActor("server", simgrid::s4u::Host::by_name("alice"), server); simgrid::s4u::Actor::createActor("client", simgrid::s4u::Host::by_name("bob"), client); - e->run(); - - XBT_INFO("Simulated time: %g", e->getClock()); + e.run(); - delete e; + XBT_INFO("Simulated time: %g", e.getClock()); return 0; } diff --git a/teshsuite/simdag/CMakeLists.txt b/teshsuite/simdag/CMakeLists.txt index 2c39100608..3e8259f32c 100644 --- a/teshsuite/simdag/CMakeLists.txt +++ b/teshsuite/simdag/CMakeLists.txt @@ -42,7 +42,6 @@ set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/platforms/four_h ${CMAKE_CURRENT_SOURCE_DIR}/platforms/one_cluster_router_id.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/one_cluster.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/platform_4p_1switch.xml - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/platform_include.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/properties.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/test_of_is_router.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/three_hosts_non_symmetric_route.xml @@ -54,8 +53,6 @@ set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/platforms/four_h ${CMAKE_CURRENT_SOURCE_DIR}/platforms/bogus_two_hosts_asymetric.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/two_hosts_one_link_fullduplex.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/two_hosts_one_link.xml - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/clusterA.xml - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/clusterB.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/Dijkstra.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/platform_2p_1bb.xml ${CMAKE_CURRENT_SOURCE_DIR}/platforms/platform_2p_1fl.xml diff --git a/teshsuite/simdag/evaluate-parse-time/evaluate-parse-time.c b/teshsuite/simdag/evaluate-parse-time/evaluate-parse-time.c index 9bce26c5e3..d2dde0e882 100644 --- a/teshsuite/simdag/evaluate-parse-time/evaluate-parse-time.c +++ b/teshsuite/simdag/evaluate-parse-time/evaluate-parse-time.c @@ -1,5 +1,4 @@ -/* Copyright (c) 2008-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2008-2017. 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. */ @@ -13,7 +12,6 @@ #endif #include "simgrid/simdag.h" -#include "surf/surf.h" #include "xbt/xbt_os_time.h" int main(int argc, char **argv) diff --git a/teshsuite/simdag/flatifier/flatifier.cpp b/teshsuite/simdag/flatifier/flatifier.cpp index 6c3083218e..cd94fdc94b 100644 --- a/teshsuite/simdag/flatifier/flatifier.cpp +++ b/teshsuite/simdag/flatifier/flatifier.cpp @@ -47,17 +47,9 @@ static void create_environment(xbt_os_timer_t parse_time, const char *platformFi } } -static void dump_platform() +static void dump_hosts() { - int version = 4; std::map* props = nullptr; - - std::printf("\n"); - std::printf("\n"); - std::printf("\n", version); - std::printf("\n"); - - // Hosts unsigned int totalHosts = sg_host_count(); sg_host_t* hosts = sg_host_list(); std::sort(hosts, hosts + totalHosts, @@ -79,20 +71,11 @@ static void dump_platform() std::printf("/>\n"); } } + std::free(hosts); +} - // Routers - std::vector netcardList; - simgrid::s4u::Engine::getInstance()->getNetpointList(&netcardList); - std::sort(netcardList.begin(), netcardList.end(), - [](simgrid::kernel::routing::NetPoint* a, simgrid::kernel::routing::NetPoint* b) { - return a->name() < b->name(); - }); - - for (auto const& srcCard : netcardList) - if (srcCard->isRouter()) - std::printf(" \n", srcCard->cname()); - - // Links +static void dump_links() +{ unsigned int totalLinks = sg_link_count(); simgrid::s4u::Link** links = sg_link_list(); @@ -103,7 +86,7 @@ static void dump_platform() simgrid::s4u::Link* link = links[i]; std::printf(" name(), link->bandwidth(), link->latency()); + std::printf("%s\" bandwidth=\"%.0f\" latency=\"%.9f\"", link->getCname(), link->bandwidth(), link->latency()); if (sg_link_is_shared(link)) { std::printf("/>\n"); } else { @@ -111,6 +94,36 @@ static void dump_platform() } } + std::free(links); +} + +static void dump_routers() +{ + std::vector netcardList; + simgrid::s4u::Engine::getInstance()->getNetpointList(&netcardList); + std::sort(netcardList.begin(), netcardList.end(), + [](simgrid::kernel::routing::NetPoint* a, simgrid::kernel::routing::NetPoint* b) { + return a->getName() < b->getName(); + }); + + for (auto const& srcCard : netcardList) + if (srcCard->isRouter()) + std::printf(" \n", srcCard->getCname()); +} + +static void dump_routes() +{ + unsigned int totalHosts = sg_host_count(); + sg_host_t* hosts = sg_host_list(); + std::sort(hosts, hosts + totalHosts, + [](sg_host_t a, sg_host_t b) { return strcmp(sg_host_get_name(a), sg_host_get_name(b)) < 0; }); + std::vector netcardList; + simgrid::s4u::Engine::getInstance()->getNetpointList(&netcardList); + std::sort(netcardList.begin(), netcardList.end(), + [](simgrid::kernel::routing::NetPoint* a, simgrid::kernel::routing::NetPoint* b) { + return a->getName() < b->getName(); + }); + for (unsigned int it_src = 0; it_src < totalHosts; it_src++) { // Routes from host simgrid::s4u::Host* host1 = hosts[it_src]; simgrid::kernel::routing::NetPoint* netcardSrc = host1->pimpl_netpoint; @@ -118,21 +131,22 @@ static void dump_platform() simgrid::s4u::Host* host2 = hosts[it_dst]; std::vector route; simgrid::kernel::routing::NetPoint* netcardDst = host2->pimpl_netpoint; - simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(netcardSrc, netcardDst, &route, nullptr); + simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(netcardSrc, netcardDst, route, nullptr); if (not route.empty()) { std::printf(" \n ", host1->getCname(), host2->getCname()); for (auto const& link : route) - std::printf("", link->cname()); + std::printf("", link->getCname()); std::printf("\n \n"); } } + for (auto const& netcardDst : netcardList) { // to router if (netcardDst->isRouter()) { - std::printf(" \n ", host1->getCname(), netcardDst->cname()); + std::printf(" \n ", host1->getCname(), netcardDst->getCname()); std::vector route; - simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(netcardSrc, netcardDst, &route, nullptr); + simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(netcardSrc, netcardDst, route, nullptr); for (auto const& link : route) - std::printf("", link->cname()); + std::printf("", link->getCname()); std::printf("\n \n"); } } @@ -142,31 +156,52 @@ static void dump_platform() if (value1->isRouter()) { for (auto const& value2 : netcardList) { // to router if (value2->isRouter()) { - std::printf(" \n ", value1->cname(), value2->cname()); + std::printf(" \n ", value1->getCname(), value2->getCname()); std::vector route; - simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(value1, value2, &route, nullptr); + simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(value1, value2, route, nullptr); for (auto const& link : route) - std::printf("", link->cname()); + std::printf("", link->getCname()); std::printf("\n \n"); } } for (unsigned int it_dst = 0; it_dst < totalHosts; it_dst++) { // Routes to host simgrid::s4u::Host* host2 = hosts[it_dst]; - std::printf(" \n ", value1->cname(), host2->getCname()); + std::printf(" \n ", value1->getCname(), host2->getCname()); std::vector route; simgrid::kernel::routing::NetPoint* netcardDst = host2->pimpl_netpoint; - simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(value1, netcardDst, &route, nullptr); + simgrid::kernel::routing::NetZoneImpl::getGlobalRoute(value1, netcardDst, route, nullptr); for (auto const& link : route) - std::printf("", link->cname()); + std::printf("", link->getCname()); std::printf("\n \n"); } } } + std::free(hosts); +} + +static void dump_platform() +{ + int version = 4; + + std::printf("\n"); + std::printf("\n"); + std::printf("\n", version); + std::printf("\n"); + + // Hosts + dump_hosts(); + + // Routers + dump_routers(); + + // Links + dump_links(); + + // Routes + dump_routes(); std::printf("\n"); std::printf("\n"); - std::free(hosts); - std::free(links); } int main(int argc, char** argv) diff --git a/teshsuite/simdag/is-router/is-router.cpp b/teshsuite/simdag/is-router/is-router.cpp index 9858c0cac4..88b653035d 100644 --- a/teshsuite/simdag/is-router/is-router.cpp +++ b/teshsuite/simdag/is-router/is-router.cpp @@ -22,7 +22,7 @@ int main(int argc, char **argv) simgrid::s4u::Engine::getInstance()->getNetpointList(&netcardList); std::sort(netcardList.begin(), netcardList.end(), [](simgrid::kernel::routing::NetPoint* a, simgrid::kernel::routing::NetPoint* b) { - return a->name() < b->name(); + return a->getName() < b->getName(); }); int it; @@ -42,7 +42,7 @@ int main(int argc, char **argv) std::printf("NetCards count: %zu\n", netcardList.size()); for (auto const& nc : netcardList) - std::printf(" - Seen: \"%s\". Type: %s\n", nc->cname(), + std::printf(" - Seen: \"%s\". Type: %s\n", nc->getCname(), nc->isRouter() ? "router" : (nc->isNetZone() ? "netzone" : (nc->isHost() ? "host" : "buggy"))); return 0; diff --git a/teshsuite/simdag/platforms/clusterA.xml b/teshsuite/simdag/platforms/clusterA.xml deleted file mode 100644 index ad7bcdf747..0000000000 --- a/teshsuite/simdag/platforms/clusterA.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/teshsuite/simdag/platforms/clusterB.xml b/teshsuite/simdag/platforms/clusterB.xml deleted file mode 100644 index 45476ed44a..0000000000 --- a/teshsuite/simdag/platforms/clusterB.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/teshsuite/simdag/platforms/platform_include.xml b/teshsuite/simdag/platforms/platform_include.xml deleted file mode 100644 index fa5cede5b9..0000000000 --- a/teshsuite/simdag/platforms/platform_include.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/teshsuite/simix/generic_simcalls/generic_simcalls.cpp b/teshsuite/simix/generic_simcalls/generic_simcalls.cpp index 3ae06a0a6b..c7eb7260e5 100644 --- a/teshsuite/simix/generic_simcalls/generic_simcalls.cpp +++ b/teshsuite/simix/generic_simcalls/generic_simcalls.cpp @@ -18,6 +18,10 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(test, "my log messages"); namespace example { +class exception : public std::runtime_error { + using std::runtime_error::runtime_error; +}; + /** Create a future which becomes ready when the date is reached */ static simgrid::kernel::Future kernel_wait_until(double date) @@ -53,12 +57,11 @@ static int master(int argc, char *argv[]) simgrid::simix::kernelSync([] { return kernel_wait_until(20).then([](simgrid::kernel::Future future) { future.get(); - throw std::runtime_error("Exception throwed from kernel_defer"); + throw example::exception("Exception throwed from kernel_defer"); }); }); XBT_ERROR("No exception caught!"); - } - catch(std::runtime_error& e) { + } catch (const example::exception& e) { XBT_INFO("Exception caught: %s", e.what()); } diff --git a/teshsuite/smpi/coll-allgather/coll-allgather.c b/teshsuite/smpi/coll-allgather/coll-allgather.c index 68cfc76500..83ba94a2c3 100644 --- a/teshsuite/smpi/coll-allgather/coll-allgather.c +++ b/teshsuite/smpi/coll-allgather/coll-allgather.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team. +/* Copyright (c) 2009-2010, 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -46,11 +46,9 @@ int main(int argc, char *argv[]) printf("%d ", rb[i]); printf("]\n"); - if (rank == 0) { - if (status != MPI_SUCCESS) { - printf("allgather returned %d\n", status); - fflush(stdout); - } + if (rank == 0 && status != MPI_SUCCESS) { + printf("allgather returned %d\n", status); + fflush(stdout); } xbt_free(sb); xbt_free(rb); diff --git a/teshsuite/smpi/coll-allgatherv/coll-allgatherv.c b/teshsuite/smpi/coll-allgatherv/coll-allgatherv.c index 30734f17d5..7e2f35e81a 100644 --- a/teshsuite/smpi/coll-allgatherv/coll-allgatherv.c +++ b/teshsuite/smpi/coll-allgatherv/coll-allgatherv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team. +/* Copyright (c) 2009-2010, 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -56,11 +56,9 @@ int main(int argc, char *argv[]) printf("%d ", rb[i]); printf("]\n"); - if (rank == 0) { - if (status != MPI_SUCCESS) { - printf("allgatherv returned %d\n", status); - fflush(stdout); - } + if (rank == 0 && status != MPI_SUCCESS) { + printf("allgatherv returned %d\n", status); + fflush(stdout); } xbt_free(sb); xbt_free(rb); diff --git a/teshsuite/smpi/coll-allreduce/coll-allreduce.c b/teshsuite/smpi/coll-allreduce/coll-allreduce.c index 509aec9883..c35732fce6 100644 --- a/teshsuite/smpi/coll-allreduce/coll-allreduce.c +++ b/teshsuite/smpi/coll-allreduce/coll-allreduce.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team. +/* Copyright (c) 2009-2010, 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -50,11 +50,9 @@ int main(int argc, char *argv[]) printf("%d ", rb[i]); printf("]\n"); - if (rank == 0) { - if (status != MPI_SUCCESS) { - printf("all_to_all returned %d\n", status); - fflush(stdout); - } + if (rank == 0 && status != MPI_SUCCESS) { + printf("all_to_all returned %d\n", status); + fflush(stdout); } xbt_free(sb); xbt_free(rb); diff --git a/teshsuite/smpi/coll-alltoall/coll-alltoall.c b/teshsuite/smpi/coll-alltoall/coll-alltoall.c index 1bbcf69d17..da76146ad3 100644 --- a/teshsuite/smpi/coll-alltoall/coll-alltoall.c +++ b/teshsuite/smpi/coll-alltoall/coll-alltoall.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team. +/* Copyright (c) 2009-2010, 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -46,11 +46,9 @@ int main(int argc, char *argv[]) printf("%d ", rb[i]); printf("]\n"); - if (rank == 0) { - if (status != MPI_SUCCESS) { - printf("all_to_all returned %d\n", status); - fflush(stdout); - } + if (rank == 0 && status != MPI_SUCCESS) { + printf("all_to_all returned %d\n", status); + fflush(stdout); } xbt_free(sb); xbt_free(rb); diff --git a/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c b/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c index 107179fe01..d1e3b4255b 100644 --- a/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c +++ b/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c @@ -44,7 +44,7 @@ <2> rbuf: (#9): [3][4][103][104][203][204][-1][-1][-1] */ -static void print_buffer_int(void *buf, int len, char *msg, int rank) +static void print_buffer_int(void *buf, int len, const char *msg, int rank) { printf("[%d] %s (#%d): ", rank, msg, len); for (int tmp = 0; tmp < len; tmp++) { @@ -52,7 +52,6 @@ static void print_buffer_int(void *buf, int len, char *msg, int rank) printf("[%d]", v[tmp]); } printf("\n"); - free(msg); } int main(int argc, char **argv) @@ -73,11 +72,12 @@ int main(int argc, char **argv) return -1; } MPI_Comm_rank(comm, &rank); - int* sbuf = (int *) xbt_malloc(size * size * sizeof(int)); - int* rbuf = (int *) xbt_malloc(size * size * sizeof(int)); + int size2 = size * size; + int* sbuf = (int*)xbt_malloc(size2 * sizeof(int)); + int* rbuf = (int*)xbt_malloc(size2 * sizeof(int)); /* Load up the buffers */ - for (i = 0; i < size * size; i++) { + for (i = 0; i < size2; i++) { sbuf[i] = i + 100 * rank; rbuf[i] = -1; } @@ -94,15 +94,15 @@ int main(int argc, char **argv) sdispls[i] = (i * (i + 1)) / 2; } - print_buffer_int( sbuf, size*size, strdup("sbuf:"),rank); - print_buffer_int( sendcounts, size, strdup("scount:"),rank); - print_buffer_int( recvcounts, size, strdup("rcount:"),rank); - print_buffer_int( sdispls, size, strdup("sdisp:"),rank); - print_buffer_int( rdispls, size, strdup("rdisp:"),rank); + print_buffer_int(sbuf, size2, "sbuf:", rank); + print_buffer_int(sendcounts, size, "scount:", rank); + print_buffer_int(recvcounts, size, "rcount:", rank); + print_buffer_int(sdispls, size, "sdisp:", rank); + print_buffer_int(rdispls, size, "rdisp:", rank); MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, rbuf, recvcounts, rdispls, MPI_INT, comm); - print_buffer_int( rbuf, size*size, strdup("rbuf:"),rank); + print_buffer_int(rbuf, size2, "rbuf:", rank); MPI_Barrier(MPI_COMM_WORLD); if (0 == rank) { diff --git a/teshsuite/smpi/coll-bcast/coll-bcast.c b/teshsuite/smpi/coll-bcast/coll-bcast.c index e8aeaecc0a..a53771ad4c 100644 --- a/teshsuite/smpi/coll-bcast/coll-bcast.c +++ b/teshsuite/smpi/coll-bcast/coll-bcast.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2013-2014. The SimGrid Team. +/* Copyright (c) 2009, 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -46,11 +46,9 @@ int main(int argc, char **argv) if (values[i]==17) good++; printf("[%d] number of values equals to 17: %d\n", rank, good); - if (rank == 0) { - if (status != MPI_SUCCESS) { - printf("bcast returned %d\n", status); - fflush(stdout); - } + if (rank == 0 && status != MPI_SUCCESS) { + printf("bcast returned %d\n", status); + fflush(stdout); } xbt_free(values); MPI_Finalize(); diff --git a/teshsuite/smpi/isp/umpire/CMakeLists.txt b/teshsuite/smpi/isp/umpire/CMakeLists.txt index fcf19e452b..cc7f9c7ae9 100644 --- a/teshsuite/smpi/isp/umpire/CMakeLists.txt +++ b/teshsuite/smpi/isp/umpire/CMakeLists.txt @@ -208,7 +208,7 @@ if(enable_smpi AND enable_model-checking AND enable_smpi_ISP_testsuite) foreach (test ${umpire_tests_passing} ${umpire_tests_deadlock} ${umpire_tests_problematic} ) add_executable(${test} ${test}.c) target_link_libraries(${test} simgrid) - set_source_files_properties(${test}.c PROPERTIES COMPILE_FLAGS "-Wno-error -Wno-return-type") + set_source_files_properties(${test}.c PROPERTIES COMPILE_FLAGS "-Dlint -Wno-error -Wno-return-type") set(umpire_tesh ${umpire_tesh} ${test}) set(files_to_clean ${files_to_clean} ${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh) endforeach(test) diff --git a/teshsuite/smpi/isp/umpire/change-send-buffer.c b/teshsuite/smpi/isp/umpire/change-send-buffer.c index 4d21ed5c24..e3c9d3ea3f 100644 --- a/teshsuite/smpi/isp/umpire/change-send-buffer.c +++ b/teshsuite/smpi/isp/umpire/change-send-buffer.c @@ -34,7 +34,6 @@ main (int argc, char **argv) MPI_Get_processor_name (processor_name, &namelen); printf ("(%d) is alive on %s\n", rank, processor_name); fflush (stdout); -int j, k; for (i = 0; i < 128; i++) { buf0[i] = i; diff --git a/teshsuite/smpi/isp/umpire/comm-translate-ranks.c b/teshsuite/smpi/isp/umpire/comm-translate-ranks.c index c6e54cada2..7acfc0156c 100644 --- a/teshsuite/smpi/isp/umpire/comm-translate-ranks.c +++ b/teshsuite/smpi/isp/umpire/comm-translate-ranks.c @@ -24,7 +24,6 @@ main (int argc, char **argv) int key = -1; int nrank; int nsize; - int dat = 0; int color = -1; diff --git a/teshsuite/smpi/isp/umpire/irecv-deadlock.c b/teshsuite/smpi/isp/umpire/irecv-deadlock.c index c1a16fe059..a4ab3d0a22 100644 --- a/teshsuite/smpi/isp/umpire/irecv-deadlock.c +++ b/teshsuite/smpi/isp/umpire/irecv-deadlock.c @@ -15,7 +15,6 @@ main (int argc, char **argv) char processor_name[128]; int namelen = 128; int buf0[buf_size]; - int buf1[buf_size]; MPI_Status status; MPI_Request req; diff --git a/teshsuite/smpi/isp/umpire/lost-request-waitall.c b/teshsuite/smpi/isp/umpire/lost-request-waitall.c index 4a6051bafa..9eee182988 100644 --- a/teshsuite/smpi/isp/umpire/lost-request-waitall.c +++ b/teshsuite/smpi/isp/umpire/lost-request-waitall.c @@ -14,7 +14,7 @@ static char *rcsid = #define buf_size 128 -int mydelay () /* about 6 seconds */ +static int mydelay(void) /* about 6 seconds */ { int i; int val; @@ -37,8 +37,8 @@ main (int argc, char **argv) int namelen = 128; int buf0[buf_size]; int buf1[buf_size]; - MPI_Request req, req0, req1; - MPI_Status status, status0, status1; + MPI_Request req; + MPI_Status status; MPI_Request areq[10]; MPI_Status astatus[10]; diff --git a/teshsuite/smpi/isp/umpire/no-error-testany.c b/teshsuite/smpi/isp/umpire/no-error-testany.c index 75bdb656ed..f7924fdc41 100644 --- a/teshsuite/smpi/isp/umpire/no-error-testany.c +++ b/teshsuite/smpi/isp/umpire/no-error-testany.c @@ -47,7 +47,7 @@ main (int argc, char **argv) MPI_Send (&flipbit, 1, MPI_INT, 1, i, MPI_COMM_WORLD); flag = 0; -printf ("req = %0x", (unsigned int)reqs); + printf("req = %p", reqs); while (!flag) MPI_Testany (i, reqs, &done, &flag, &status); diff --git a/teshsuite/smpi/isp/umpire/wait-deadlock.c b/teshsuite/smpi/isp/umpire/wait-deadlock.c index 67acdc0433..e528524b18 100644 --- a/teshsuite/smpi/isp/umpire/wait-deadlock.c +++ b/teshsuite/smpi/isp/umpire/wait-deadlock.c @@ -26,7 +26,6 @@ main (int argc, char **argv) MPI_Get_processor_name (processor_name, &namelen); printf ("(%d) is alive on %s\n", rank, processor_name); fflush (stdout); - int i; MPI_Barrier (MPI_COMM_WORLD); if (nprocs < 2) diff --git a/teshsuite/smpi/macro-shared/macro-shared.c b/teshsuite/smpi/macro-shared/macro-shared.c index 1e09ac43de..51da71b1d6 100644 --- a/teshsuite/smpi/macro-shared/macro-shared.c +++ b/teshsuite/smpi/macro-shared/macro-shared.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2015. The SimGrid Team. +/* Copyright (c) 2009-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -11,9 +11,9 @@ #include #include -static void* hash(char *str, uint64_t* ans) +static void* hash(const char *str, uint64_t* ans) { - char *tohash = str; + const char *tohash = str; *ans=5381; printf("hashing !\n"); int c = *tohash; @@ -45,7 +45,7 @@ int main(int argc, char *argv[]) MPI_Barrier(MPI_COMM_WORLD); //Try SMPI_SHARED_CALL function, which should call hash only once and for all. - char *str = strdup("onceandforall"); + static const char str[] = "onceandforall"; if(rank==size-1){ SMPI_SHARED_CALL(hash,str,str,buf); } @@ -55,7 +55,6 @@ int main(int argc, char *argv[]) printf("[%d] After change, the value in the shared buffer is: %" PRIu64"\n", rank, *buf); SMPI_SHARED_FREE(buf); - free(str); MPI_Finalize(); return 0; diff --git a/teshsuite/smpi/mpich3-test/comm/cmsplit_type.c b/teshsuite/smpi/mpich3-test/comm/cmsplit_type.c index 16681a202d..c9d1d088a5 100644 --- a/teshsuite/smpi/mpich3-test/comm/cmsplit_type.c +++ b/teshsuite/smpi/mpich3-test/comm/cmsplit_type.c @@ -17,7 +17,7 @@ int main(int argc, char *argv[]) int rank, size, verbose = 0, errs=0, tot_errs=0; int wrank; MPI_Comm comm; - MPI_Info __attribute__((unused)) info; + XBT_ATTRIB_UNUSED MPI_Info info; MPI_Init(&argc, &argv); diff --git a/teshsuite/smpi/mpich3-test/perf/CMakeLists.txt b/teshsuite/smpi/mpich3-test/perf/CMakeLists.txt index a9ac6478b5..e92bcd188c 100644 --- a/teshsuite/smpi/mpich3-test/perf/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/perf/CMakeLists.txt @@ -17,7 +17,7 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite) endif() if (enable_smpi_MPICH3_testsuite AND HAVE_RAW_CONTEXTS) - ADD_TEST(test-smpi-mpich3-perf-raw ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/perf ${PERL_EXECUTABLE} ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests ${TESH_OPTION} -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/perf -tests=testlist -execarg=--cfg=contexts/factory:raw -execarg=--cfg=smpi/host-speed:-1) + ADD_TEST(test-smpi-mpich3-perf-raw ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/perf ${PERL_EXECUTABLE} ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests ${TESH_OPTION} -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -tests=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/perf/testlist -execarg=-platform\ ${CMAKE_HOME_DIRECTORY}/examples/platforms/cluster.xml -execarg=--log=root.thr:critical -execarg=--cfg=smpi/async-small-thresh:65536 -execarg=--cfg=contexts/factory:raw -execarg=--cfg=smpi/host-speed:-1) endif() foreach(file allredtrace commcreatep non_zero_root sendrecvl timer transp-datatype twovec dtpack indexperf manyrma diff --git a/teshsuite/smpi/mpich3-test/runtests b/teshsuite/smpi/mpich3-test/runtests index ea6c304149..879319873b 100755 --- a/teshsuite/smpi/mpich3-test/runtests +++ b/teshsuite/smpi/mpich3-test/runtests @@ -282,6 +282,7 @@ else { print "TAP formatted results in $tapfullfile\n"; } } +exit ($err_count > 0); # # --------------------------------------------------------------------------- # Routines diff --git a/teshsuite/smpi/timers/timers.c b/teshsuite/smpi/timers/timers.c index 18ff5d89c5..ad0cab56d8 100644 --- a/teshsuite/smpi/timers/timers.c +++ b/teshsuite/smpi/timers/timers.c @@ -28,7 +28,7 @@ int main(int argc, char* argv[]) gettimeofday(&tv1, NULL); sleep(1); gettimeofday(&tv2, NULL); - long res = ((tv2.tv_sec * 1000000 + tv2.tv_usec)) - ((tv1.tv_sec * 1000000 + tv1.tv_usec)); + long res = (tv2.tv_sec * 1000000 + tv2.tv_usec) - (tv1.tv_sec * 1000000 + tv1.tv_usec); if (res < 999998 || res > 1000002) printf("Error, sleep(1) did not exactly slept 1s\n"); @@ -36,7 +36,7 @@ int main(int argc, char* argv[]) gettimeofday(&tv1, NULL); usleep(100); gettimeofday(&tv2, NULL); - res = ((tv2.tv_sec * 1000000 + tv2.tv_usec)) - ((tv1.tv_sec * 1000000 + tv1.tv_usec)); + res = (tv2.tv_sec * 1000000 + tv2.tv_usec) - (tv1.tv_sec * 1000000 + tv1.tv_usec); if (res < 98 || res > 102) printf("Error, usleep did not really sleep 100us, but %ld\n", res); @@ -48,7 +48,7 @@ int main(int argc, char* argv[]) struct timespec tpsleep; clock_gettime(CLOCK_REALTIME, &tp1); clock_gettime(CLOCK_REALTIME, &tp2); - if ((tp1.tv_sec != tp2.tv_sec) || (tp1.tv_nsec != tp2.tv_nsec)) + if (tp1.tv_sec != tp2.tv_sec || tp1.tv_nsec != tp2.tv_nsec) printf("Error, two consecutive calls to gettimeofday did not return same time (with running power to 0)\n"); // nanosleep for 100ns @@ -57,7 +57,7 @@ int main(int argc, char* argv[]) tpsleep.tv_nsec = 100; nanosleep(&tpsleep, NULL); clock_gettime(CLOCK_REALTIME, &tp2); - res = ((tp2.tv_sec * 1000000000 + tp2.tv_nsec)) - ((tp1.tv_sec * 1000000000 + tp1.tv_nsec)); + res = (tp2.tv_sec * 1000000000 + tp2.tv_nsec) - (tp1.tv_sec * 1000000000 + tp1.tv_nsec); if (res < 98 || res > 102) printf("Error, nanosleep did not really sleep 100ns, but %ld\n", res); #endif diff --git a/teshsuite/surf/lmm_usage/lmm_usage.cpp b/teshsuite/surf/lmm_usage/lmm_usage.cpp index c35f43779c..71c2fd4c58 100644 --- a/teshsuite/surf/lmm_usage/lmm_usage.cpp +++ b/teshsuite/surf/lmm_usage/lmm_usage.cpp @@ -8,10 +8,11 @@ #include "simgrid/msg.h" #include "src/surf/surf_interface.hpp" -#include "surf/maxmin.h" +#include "surf/maxmin.hpp" #include "xbt/log.h" #include "xbt/module.h" #include "xbt/sysdep.h" +#include #include XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test, "Messages specific for surf example"); @@ -23,11 +24,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test, "Messages specific for surf example"); /* ==l1== L2 ==L3== */ /* ------ */ -typedef enum { - MAXMIN, - LAGRANGE_RENO, - LAGRANGE_VEGAS -} method_t; +enum method_t { MAXMIN, LAGRANGE_RENO, LAGRANGE_VEGAS }; static double dichotomy(double func(double), double min, double max, double min_error) { @@ -149,10 +146,10 @@ static void test1(method_t method) lagrange_solve(Sys); double max_deviation = 0.0; - max_deviation = MAX(max_deviation, fabs(lmm_variable_getvalue(R_1) - x)); - max_deviation = MAX(max_deviation, fabs(lmm_variable_getvalue(R_3) - x)); - max_deviation = MAX(max_deviation, fabs(lmm_variable_getvalue(R_2) - (b - a + x))); - max_deviation = MAX(max_deviation, fabs(lmm_variable_getvalue(R_1_2_3) - (a - x))); + max_deviation = std::max(max_deviation, fabs(lmm_variable_getvalue(R_1) - x)); + max_deviation = std::max(max_deviation, fabs(lmm_variable_getvalue(R_3) - x)); + max_deviation = std::max(max_deviation, fabs(lmm_variable_getvalue(R_2) - (b - a + x))); + max_deviation = std::max(max_deviation, fabs(lmm_variable_getvalue(R_1_2_3) - (a - x))); if (max_deviation > 0.00001) { // Legacy value used in lagrange.c XBT_WARN("Max Deviation from optimal solution : %g", max_deviation); @@ -219,12 +216,12 @@ static void test3(method_t method) int flows = 11; int links = 10; - double **A = xbt_new0(double *, links + 5); + double** A = new double*[links + 5]; /* array to add the constraints of fictitious variables */ double B[15] = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1 }; for (int i = 0; i < links + 5; i++) { - A[i] = xbt_new0(double, flows + 5); + A[i] = new double[flows + 5]; for (int j = 0; j < flows + 5; j++) { A[i][j] = 0.0; @@ -259,12 +256,12 @@ static void test3(method_t method) lmm_system_t Sys = lmm_system_new(1); /* Creates the constraints */ - lmm_constraint_t *tmp_cnst = xbt_new0(lmm_constraint_t, 15); + lmm_constraint_t* tmp_cnst = new lmm_constraint_t[15]; for (int i = 0; i < 15; i++) tmp_cnst[i] = lmm_constraint_new(Sys, nullptr, B[i]); /* Creates the variables */ - lmm_variable_t *tmp_var = xbt_new0(lmm_variable_t, 16); + lmm_variable_t* tmp_var = new lmm_variable_t[16]; for (int j = 0; j < 16; j++) { tmp_var[j] = lmm_variable_new(Sys, nullptr, 1.0, -1.0, 15); lmm_update_variable_weight(Sys, tmp_var[j], 1.0); @@ -291,12 +288,12 @@ static void test3(method_t method) for (int j = 0; j < 16; j++) lmm_variable_free(Sys, tmp_var[j]); - xbt_free(tmp_var); - xbt_free(tmp_cnst); + delete[] tmp_var; + delete[] tmp_cnst; lmm_system_free(Sys); for (int i = 0; i < links + 5; i++) - xbt_free(A[i]); - xbt_free(A); + delete[] A[i]; + delete[] A; } int main(int argc, char** argv) diff --git a/teshsuite/surf/maxmin_bench/maxmin_bench.cpp b/teshsuite/surf/maxmin_bench/maxmin_bench.cpp index 6bb1b1eea3..d3408b10fe 100644 --- a/teshsuite/surf/maxmin_bench/maxmin_bench.cpp +++ b/teshsuite/surf/maxmin_bench/maxmin_bench.cpp @@ -6,7 +6,7 @@ /* 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 "surf/maxmin.h" +#include "surf/maxmin.hpp" #include "simgrid/msg.h" #include "xbt/module.h" #include "xbt/sysdep.h" /* time manipulation for benchmarking */ diff --git a/teshsuite/surf/surf_usage/surf_usage.cpp b/teshsuite/surf/surf_usage/surf_usage.cpp index 90914d6477..333ecff1e9 100644 --- a/teshsuite/surf/surf_usage/surf_usage.cpp +++ b/teshsuite/surf/surf_usage/surf_usage.cpp @@ -67,43 +67,35 @@ int main(int argc, char **argv) XBT_DEBUG("\t CPU actions"); simgrid::surf::ActionList* action_list = surf_cpu_model_pm->getFailedActionSet(); - for(simgrid::surf::ActionList::iterator it(action_list->begin()), itNext = it, itend(action_list->end()) ; - it != itend ; it=itNext) { - ++itNext; - simgrid::surf::Action *action = static_cast(&*it); - XBT_INFO(" CPU Failed action"); - XBT_DEBUG("\t * Failed : %p", action); - action->unref(); + while (not action_list->empty()) { + simgrid::surf::Action& action = action_list->front(); + XBT_INFO(" CPU Failed action"); + XBT_DEBUG("\t * Failed : %p", &action); + action.unref(); } action_list = surf_cpu_model_pm->getDoneActionSet(); - for(simgrid::surf::ActionList::iterator it(action_list->begin()), itNext = it, itend(action_list->end()) ; - it != itend ; it=itNext) { - ++itNext; - simgrid::surf::Action *action = static_cast(&*it); + while (not action_list->empty()) { + simgrid::surf::Action& action = action_list->front(); XBT_INFO(" CPU Done action"); - XBT_DEBUG("\t * Done : %p", action); - action->unref(); + XBT_DEBUG("\t * Done : %p", &action); + action.unref(); } action_list = surf_network_model->getFailedActionSet(); - for(simgrid::surf::ActionList::iterator it(action_list->begin()), itNext = it, itend(action_list->end()) ; - it != itend ; it=itNext) { - ++itNext; - simgrid::surf::Action *action = static_cast(&*it); - XBT_INFO(" Network Failed action"); - XBT_DEBUG("\t * Failed : %p", action); - action->unref(); + while (not action_list->empty()) { + simgrid::surf::Action& action = action_list->front(); + XBT_INFO(" Network Failed action"); + XBT_DEBUG("\t * Failed : %p", &action); + action.unref(); } action_list = surf_network_model->getDoneActionSet(); - for(simgrid::surf::ActionList::iterator it(action_list->begin()), itNext = it, itend(action_list->end()) ; - it != itend ; it=itNext) { - ++itNext; - simgrid::surf::Action *action = static_cast(&*it); + while (not action_list->empty()) { + simgrid::surf::Action& action = action_list->front(); XBT_INFO(" Network Done action"); - XBT_DEBUG("\t * Done : %p", action); - action->unref(); + XBT_DEBUG("\t * Done : %p", &action); + action.unref(); } } while ((surf_network_model->getRunningActionSet()->size() || diff --git a/teshsuite/xbt/CMakeLists.txt b/teshsuite/xbt/CMakeLists.txt index 70f58b35b7..8a16af4c43 100644 --- a/teshsuite/xbt/CMakeLists.txt +++ b/teshsuite/xbt/CMakeLists.txt @@ -1,4 +1,4 @@ -foreach(x heap_bench log_large log_usage mallocator parallel_log_crashtest) +foreach(x log_large log_usage mallocator parallel_log_crashtest) add_executable (${x} ${x}/${x}.c) target_link_libraries(${x} simgrid) set_target_properties(${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x}) @@ -27,7 +27,7 @@ set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/log_usage/log_us ${CMAKE_CURRENT_SOURCE_DIR}/mmalloc/mmalloc_32.tesh PARENT_SCOPE) set(teshsuite_src ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/mmalloc/mmalloc_test.cpp PARENT_SCOPE) -foreach(x heap_bench log_large parallel_log_crashtest parmap_test) #mallocator parmap_bench +foreach(x log_large parallel_log_crashtest parmap_test) #mallocator parmap_bench ADD_TESH(tesh-xbt-${x} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/xbt/${x} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/${x} ${x}.tesh) endforeach() diff --git a/teshsuite/xbt/heap_bench/heap_bench.c b/teshsuite/xbt/heap_bench/heap_bench.c deleted file mode 100644 index 47797d2a34..0000000000 --- a/teshsuite/xbt/heap_bench/heap_bench.c +++ /dev/null @@ -1,102 +0,0 @@ -/* A few tests for the xbt_heap module */ - -/* Copyright (c) 2004-2010, 2012-2015. 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 -#include - -#include "simgrid/msg.h" -#include "xbt/heap.h" -#include "xbt/sysdep.h" - -#define MAX_TEST 1000000 - -static int compare_double(const void *a, const void *b) -{ - double pa = *((double *) a); - double pb = *((double *) b); - - if (pa > pb) - return 1; - if (pa < pb) - return -1; - return 0; -} - -static void test_reset_heap(xbt_heap_t * heap, int size) -{ - xbt_heap_free(*heap); - *heap = xbt_heap_new(size, NULL); - - for (int i = 0; i < size; i++) { - xbt_heap_push(*heap, NULL, (10.0 * rand() / (RAND_MAX + 1.0))); - } -} - -static void test_heap_validity(int size) -{ - xbt_heap_t heap = xbt_heap_new(size, NULL); - double *tab = xbt_new0(double, size); - int i; - - for (i = 0; i < size; i++) { - tab[i] = (double) (10.0 * rand() / (RAND_MAX + 1.0)); - xbt_heap_push(heap, NULL, (double) tab[i]); - } - - qsort(tab, size, sizeof(double), compare_double); - - for (i = 0; i < size; i++) { - if (fabs(xbt_heap_maxkey(heap) - tab[i]) > 1e-9) { - fprintf(stderr, "Problem !\n"); - exit(1); - } - xbt_heap_pop(heap); - } - xbt_heap_free(heap); - free(tab); - printf("Validity test complete!\n"); -} - -static void test_heap_mean_operation(int size) -{ - xbt_heap_t heap = xbt_heap_new(size, NULL); - - double date = xbt_os_time() * 1000000; - for (int i = 0; i < size; i++) - xbt_heap_push(heap, NULL, (10.0 * rand() / (RAND_MAX + 1.0))); - - date = xbt_os_time() * 1000000 - date; - printf("Creation time %d size heap : %g\n", size, date); - - date = xbt_os_time() * 1000000; - for (int j = 0; j < MAX_TEST; j++) { - - if (!(j % size) && j) - test_reset_heap(&heap, size); - - double val = xbt_heap_maxkey(heap); - xbt_heap_pop(heap); - xbt_heap_push(heap, NULL, 3.0 * val); - } - date = xbt_os_time() * 1000000 - date; - printf("Mean access time for a %d size heap : %g\n", size, date * 1.0 / (MAX_TEST + 0.0)); - - xbt_heap_free(heap); -} - -int main(int argc, char** argv) -{ - MSG_init(&argc, argv); - - for (int size = 100; size < 10000; size *= 10) { - test_heap_validity(size); - test_heap_mean_operation(size); - } - return 0; -} diff --git a/teshsuite/xbt/heap_bench/heap_bench.tesh b/teshsuite/xbt/heap_bench/heap_bench.tesh deleted file mode 100644 index a07abd42a8..0000000000 --- a/teshsuite/xbt/heap_bench/heap_bench.tesh +++ /dev/null @@ -1,10 +0,0 @@ -#! ./tesh - -! output display -$ $SG_TEST_EXENV ${bindir:=.}/heap_bench -> Validity test complete! -> Creation time 100 size heap : 6 -> Mean access time for a 100 size heap : 0.14687 -> Validity test complete! -> Creation time 1000 size heap : 38 -> Mean access time for a 1000 size heap : 0.179765 diff --git a/teshsuite/xbt/mmalloc/mmalloc_32.tesh b/teshsuite/xbt/mmalloc/mmalloc_32.tesh index 449049d43b..e40a03f31b 100644 --- a/teshsuite/xbt/mmalloc/mmalloc_32.tesh +++ b/teshsuite/xbt/mmalloc/mmalloc_32.tesh @@ -106,4 +106,5 @@ $ ${bindir:=.}/mmalloc_test --log=root.fmt:%m%n > Re-allocate every second block > free all blocks (each one twice, to check that double free are correctly catched) > free again all blocks (to really check that double free are correctly catched) +> Let's try different codepaths for mrealloc > Damnit, I cannot break mmalloc this time. That's SO disappointing. diff --git a/teshsuite/xbt/mmalloc/mmalloc_64.tesh b/teshsuite/xbt/mmalloc/mmalloc_64.tesh index 343e2a4a98..90e01ff2f1 100644 --- a/teshsuite/xbt/mmalloc/mmalloc_64.tesh +++ b/teshsuite/xbt/mmalloc/mmalloc_64.tesh @@ -106,4 +106,5 @@ $ ${bindir:=.}/mmalloc_test --log=root.fmt:%m%n > Re-allocate every second block > free all blocks (each one twice, to check that double free are correctly catched) > free again all blocks (to really check that double free are correctly catched) +> Let's try different codepaths for mrealloc > Damnit, I cannot break mmalloc this time. That's SO disappointing. diff --git a/teshsuite/xbt/mmalloc/mmalloc_test.cpp b/teshsuite/xbt/mmalloc/mmalloc_test.cpp index 759f09e473..a20ee38dbf 100644 --- a/teshsuite/xbt/mmalloc/mmalloc_test.cpp +++ b/teshsuite/xbt/mmalloc/mmalloc_test.cpp @@ -22,6 +22,15 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(test,"this test"); #define TESTSIZE 100 #define size_of_block(i) (((i % 50)+1)* 100) +static void check_block(const void* s, int c, int n) +{ + const unsigned char* p = static_cast(s); + unsigned char b = static_cast(c); + for (int i = 0; i < n; i++) + if (p[i] != b) + xbt_die("value mismatch: %p[%d] = %#hhx, expected %#hhx", p, i, p[i], b); +} + int main(int argc, char**argv) { xbt_mheap_t heapA = nullptr; @@ -87,6 +96,21 @@ int main(int argc, char**argv) xbt_die("FAIL: A double-free went undetected (for size:%d)",size_of_block(i)); } + XBT_INFO("Let's try different codepaths for mrealloc"); + for (i = 0; i < TESTSIZE; i++) { + const std::vector> requests = { + {size_of_block(i) / 2, 0x77}, {size_of_block(i) * 2, 0xaa}, {1, 0xc0}, {0, 0}}; + pointers[i] = nullptr; + for (unsigned k = 0; k < requests.size(); ++k) { + size = requests[k].first; + pointers[i] = mrealloc(heapA, pointers[i], size); + if (k > 0) + check_block(pointers[i], requests[k - 1].second, std::min(size, requests[k - 1].first)); + if (size > 0) + memset(pointers[i], requests[k].second, size); + } + } + XBT_INFO("Damnit, I cannot break mmalloc this time. That's SO disappointing."); return 0; } diff --git a/teshsuite/xbt/parallel_log_crashtest/parallel_log_crashtest.c b/teshsuite/xbt/parallel_log_crashtest/parallel_log_crashtest.c index d904a1a43f..dc863824b7 100644 --- a/teshsuite/xbt/parallel_log_crashtest/parallel_log_crashtest.c +++ b/teshsuite/xbt/parallel_log_crashtest/parallel_log_crashtest.c @@ -1,6 +1,6 @@ /* synchro_crashtest -- tries to crash the logging mechanism by doing parallel logs*/ -/* Copyright (c) 2007-2014. The SimGrid Team. +/* Copyright (c) 2007-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -11,8 +11,8 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(synchro_crashtest, "Logs of this example"); -int test_amount = 99; /* Up to 999 to not break the logs (and thus the testing mechanism) */ -int crasher_amount = 99; /* Up to 99 to not break the logs (and thus the testing mechanism) */ +const int test_amount = 99; /* Up to 99 to not break the logs (and thus the testing mechanism) */ +const int crasher_amount = 99; /* Up to 99 to not break the logs (and thus the testing mechanism) */ int *id; /* to pass a pointer to the threads without race condition */ int more_info = 0; /* SET IT TO TRUE TO GET MORE INFO */ @@ -43,9 +43,9 @@ static int crasher() /* spawn threads */ for (int i = 0; i < crasher_amount; i++) { - char *name = bprintf("thread %d", i); + char name[16]; + snprintf(name, sizeof name, "thread %d", i); crashers[i] = xbt_os_thread_create(name, &crasher_thread, &id[i], NULL ); - free(name); } /* wait for them */ diff --git a/teshsuite/xbt/parmap_bench/parmap_bench.cpp b/teshsuite/xbt/parmap_bench/parmap_bench.cpp index ce1262055c..4fbead41ae 100644 --- a/teshsuite/xbt/parmap_bench/parmap_bench.cpp +++ b/teshsuite/xbt/parmap_bench/parmap_bench.cpp @@ -131,6 +131,7 @@ int main(int argc, char* argv[]) XBT_INFO("Parmap benchmark with %d workers (modes = %#x)...", nthreads, modes); XBT_INFO("%s", ""); + SIMIX_context_set_nthreads(nthreads); fun_to_apply = &fun_small_comp; XBT_INFO("Benchmark for parmap create+apply+destroy (small comp):"); diff --git a/teshsuite/xbt/parmap_test/parmap_test.cpp b/teshsuite/xbt/parmap_test/parmap_test.cpp index e6e209c58a..2e4416f5d8 100644 --- a/teshsuite/xbt/parmap_test/parmap_test.cpp +++ b/teshsuite/xbt/parmap_test/parmap_test.cpp @@ -85,6 +85,7 @@ int main(int argc, char** argv) int status = 0; xbt_log_control_set("parmap_test.fmt:[%c/%p]%e%m%n"); MSG_init(&argc, argv); + SIMIX_context_set_nthreads(16); // dummy value > 1 XBT_INFO("Basic testing posix"); status += test_parmap_basic(XBT_PARMAP_POSIX); diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 5f9b6d74b9..510bb81c52 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -6,36 +6,35 @@ set(EXTRA_DIST src/include/mc/datatypes.h src/include/mc/mc.h src/include/simgrid/sg_config.h - src/include/smpi/smpi_utils.hpp src/include/surf/datatypes.h - src/include/surf/maxmin.h - src/include/surf/surf.h + src/include/surf/maxmin.hpp + src/include/surf/surf.hpp src/include/xbt/parmap.hpp - src/mc/mc_mmu.h - src/mc/mc_record.h + src/mc/mc_mmu.hpp + src/mc/mc_record.hpp src/mc/PageStore.hpp - src/msg/msg_private.h + src/msg/msg_private.hpp src/simdag/dax.dtd src/simdag/dax_dtd.c src/simdag/dax_dtd.h src/simdag/simdag_private.hpp src/simix/simcalls.in src/simix/simcalls.py - src/simix/popping_private.h + src/simix/popping_private.hpp src/simix/popping_bodies.cpp src/simix/popping_generated.cpp src/simix/popping_enum.h - src/simix/popping_accessors.h - src/simix/smx_host_private.h - src/simix/smx_io_private.h - src/simix/smx_network_private.h - src/simix/smx_private.h + src/simix/popping_accessors.hpp + src/simix/smx_host_private.hpp + src/simix/smx_io_private.hpp + src/simix/smx_network_private.hpp + src/simix/smx_private.hpp src/simix/smx_synchro_private.hpp - src/smpi/colls/coll_tuned_topo.h - src/smpi/colls/colls_private.h - src/smpi/colls/smpi_mvapich2_selector_stampede.h - src/smpi/include/private.h + src/smpi/colls/coll_tuned_topo.hpp + src/smpi/colls/colls_private.hpp + src/smpi/colls/smpi_mvapich2_selector_stampede.hpp src/smpi/include/private.hpp + src/smpi/include/smpi_utils.hpp src/surf/cpu_cas01.hpp src/surf/cpu_interface.hpp src/surf/cpu_ti.hpp @@ -46,19 +45,18 @@ set(EXTRA_DIST src/surf/network_ns3.hpp src/surf/network_smpi.hpp src/surf/network_ib.hpp - src/surf/ns3/ns3_interface.h - src/surf/ns3/ns3_simulator.h + src/surf/ns3/ns3_interface.hpp + src/surf/ns3/ns3_simulator.hpp src/surf/trace_mgr_test.cpp src/surf/xml/simgrid.dtd src/surf/xml/simgrid_dtd.h src/surf/xml/simgrid_dtd.c src/surf/xml/surfxml_sax_cb.cpp - src/surf/FileImpl.hpp src/surf/StorageImpl.hpp src/surf/storage_n11.hpp src/surf/surf_interface.hpp - src/surf/surf_private.h + src/surf/surf_private.hpp src/surf/PropertyHolder.hpp src/surf/host_clm03.hpp src/surf/HostImpl.hpp @@ -72,7 +70,6 @@ set(EXTRA_DIST src/xbt/backtrace_linux.cpp src/xbt/dict_private.h src/xbt/graph_private.h - src/xbt/heap_private.h src/xbt/log_private.h src/xbt/mallocator_private.h @@ -276,7 +273,6 @@ set(XBT_SRC src/xbt/ex.cpp src/xbt/exception.cpp src/xbt/graph.c - src/xbt/heap.c src/xbt/log.c src/xbt/mallocator.c src/xbt/memory_map.cpp @@ -289,7 +285,7 @@ set(XBT_SRC src/xbt/xbt_log_layout_format.c src/xbt/xbt_log_layout_simple.c src/xbt/xbt_main.cpp - src/xbt/xbt_os_file.c + src/xbt/xbt_os_file.cpp src/xbt/xbt_os_synchro.cpp src/xbt/xbt_os_time.c src/xbt/xbt_replay.cpp @@ -303,7 +299,7 @@ if(HAVE_MMALLOC) endif() set(NS3_SRC src/surf/network_ns3.cpp - src/surf/ns3/ns3_simulator.cc ) + src/surf/ns3/ns3_simulator.cpp ) set(SURF_SRC src/kernel/routing/ClusterZone.cpp @@ -338,7 +334,6 @@ set(SURF_SRC src/surf/cpu_interface.cpp src/surf/cpu_ti.cpp src/surf/fair_bottleneck.cpp - src/surf/FileImpl.cpp src/surf/instr_routing.cpp src/surf/instr_surf.cpp src/surf/lagrange.cpp @@ -347,6 +342,7 @@ set(SURF_SRC src/surf/network_constant.cpp src/surf/network_interface.cpp src/surf/plugins/host_energy.cpp + src/surf/plugins/link_energy.cpp src/surf/plugins/host_load.cpp src/surf/PropertyHolder.cpp src/surf/sg_platf.cpp @@ -381,6 +377,7 @@ set(SIMIX_SRC src/kernel/context/Context.cpp src/kernel/context/Context.hpp src/kernel/context/ContextRaw.cpp + src/kernel/context/ContextRaw.hpp src/simix/smx_deployment.cpp src/simix/smx_environment.cpp src/simix/smx_global.cpp @@ -468,16 +465,16 @@ set(SIMDAG_SRC ) set(BINDINGS_SRC - src/bindings/lua/lua_private.h - src/bindings/lua/lua_utils.h - src/bindings/lua/simgrid_lua.h + src/bindings/lua/lua_private.hpp + src/bindings/lua/lua_utils.hpp + src/bindings/lua/simgrid_lua.hpp ) set(JMSG_C_SRC src/bindings/java/jmsg.cpp - src/bindings/java/jmsg.h + src/bindings/java/jmsg.hpp src/bindings/java/jmsg_as.cpp - src/bindings/java/jmsg_as.h + src/bindings/java/jmsg_as.hpp src/bindings/java/jmsg_comm.cpp src/bindings/java/jmsg_comm.h src/bindings/java/jmsg_file.cpp @@ -495,7 +492,7 @@ set(JMSG_C_SRC src/bindings/java/jmsg_vm.cpp src/bindings/java/jmsg_vm.h src/bindings/java/jxbt_utilities.cpp - src/bindings/java/jxbt_utilities.h + src/bindings/java/jxbt_utilities.hpp src/bindings/java/JavaContext.cpp src/bindings/java/JavaContext.hpp src/bindings/java/jmsg_storage.cpp @@ -549,12 +546,17 @@ set(TRACING_SRC src/instr/instr_config.cpp src/instr/instr_interface.cpp src/instr/instr_paje_containers.cpp + src/instr/instr_paje_containers.hpp + src/instr/instr_paje_events.cpp + src/instr/instr_paje_events.hpp src/instr/instr_paje_header.cpp src/instr/instr_paje_trace.cpp src/instr/instr_paje_types.cpp + src/instr/instr_paje_types.hpp src/instr/instr_paje_values.cpp - src/instr/instr_private.h - src/instr/instr_smpi.h + src/instr/instr_paje_values.hpp + src/instr/instr_private.hpp + src/instr/instr_smpi.hpp src/instr/instr_resource_utilization.cpp ) @@ -572,8 +574,8 @@ set(JEDULE_SRC set(MC_SRC_BASE src/mc/mc_base.cpp src/mc/mc_base.h - src/mc/mc_record.h - src/mc/mc_replay.h + src/mc/mc_record.hpp + src/mc/mc_replay.hpp src/mc/mc_record.cpp src/mc/mc_config.cpp src/mc/mc_global.cpp @@ -616,11 +618,11 @@ set(MC_SRC src/mc/mc_forward.hpp src/mc/Session.cpp src/mc/Session.hpp - src/mc/mc_unw.h + src/mc/mc_unw.hpp src/mc/mc_unw.cpp src/mc/mc_unw_vmread.cpp src/mc/mc_checkpoint.cpp - src/mc/mc_snapshot.h + src/mc/mc_snapshot.hpp src/mc/mc_snapshot.cpp src/mc/mc_page_snapshot.cpp src/mc/mc_comm_pattern.cpp @@ -640,20 +642,20 @@ set(MC_SRC src/mc/mc_record.cpp src/mc/mc_member.cpp src/mc/mc_memory.cpp - src/mc/mc_private.h - src/mc/mc_request.h + src/mc/mc_private.hpp + src/mc/mc_request.hpp src/mc/mc_request.cpp - src/mc/mc_safety.h - src/mc/mc_state.h + src/mc/mc_safety.hpp + src/mc/mc_state.hpp src/mc/mc_state.cpp src/mc/VisitedState.cpp src/mc/VisitedState.hpp src/mc/mc_client_api.cpp - src/mc/mc_smx.h + src/mc/mc_smx.hpp src/mc/mc_smx.cpp src/mc/mc_xbt.hpp src/mc/mc_xbt.cpp - src/mc/mc_exit.h + src/mc/mc_exit.hpp src/mc/Transition.hpp ) @@ -716,12 +718,11 @@ set(headers_to_install include/xbt/ex.hpp include/xbt/exception.hpp include/xbt/Extendable.hpp - include/xbt/file.h + include/xbt/file.hpp include/xbt/functional.hpp include/xbt/function_types.h include/xbt/future.hpp include/xbt/graph.h - include/xbt/heap.h include/xbt/log.h include/xbt/log.hpp include/xbt/mallocator.h @@ -766,9 +767,11 @@ else() # NOT pthread endif() if(${HAVE_UCONTEXT_CONTEXTS}) #ucontext - set(SURF_SRC ${SURF_SRC} src/kernel/context/ContextUnix.cpp) + set(SURF_SRC ${SURF_SRC} src/kernel/context/ContextUnix.hpp + src/kernel/context/ContextUnix.cpp) else() # NOT ucontext - set(EXTRA_DIST ${EXTRA_DIST} src/kernel/context/ContextUnix.cpp) + set(EXTRA_DIST ${EXTRA_DIST} src/kernel/context/ContextUnix.hpp + src/kernel/context/ContextUnix.cpp) endif() ### Simgrid Lib sources diff --git a/tools/cmake/GCCFlags.cmake b/tools/cmake/GCCFlags.cmake index 432441c9b7..94aaffda7f 100644 --- a/tools/cmake/GCCFlags.cmake +++ b/tools/cmake/GCCFlags.cmake @@ -44,10 +44,10 @@ if(enable_compile_warnings) # the one specific to C but refused by C++ set(warnCFLAGS "${warnCFLAGS} -Wmissing-prototypes") - if(CMAKE_Fotran_COMPILER_ID MATCHES "GCC|PGI") + if(CMAKE_Fortran_COMPILER_ID MATCHES "GCC|PGI") set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wall") endif() - if(CMAKE_Fotran_COMPILER_ID MATCHES "Intel") + if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -warn all") endif() set(CMAKE_JAVA_COMPILE_FLAGS "-Xlint") @@ -145,11 +145,10 @@ if(enable_model-checking AND enable_compile_optimizations) src/xbt/log.c src/xbt/xbt_log_appender_file.c src/xbt/xbt_log_layout_format.c src/xbt/xbt_log_layout_simple.c src/xbt/dict.cpp src/xbt/dict_elm.c src/xbt/dict_cursor.c - src/xbt/dynar.cpp src/xbt/heap.c src/xbt/swag.c - src/xbt/str.c src src/xbt/snprintf.c - src/xbt/queue.c + src/xbt/dynar.cpp src/xbt/swag.c + src/xbt/xbt_str.cpp src/xbt/snprintf.c src/xbt/xbt_os_time.c src/xbt/xbt_os_thread.c - src/xbt/backtrace_linux.c + src/xbt/backtrace_linux.cpp ${MC_SRC_BASE} ${MC_SRC}) set (mcCFLAGS "-O3 -funroll-loops -fno-strict-aliasing") if(CMAKE_COMPILER_IS_GNUCC) diff --git a/tools/cmake/MaintainerMode.cmake b/tools/cmake/MaintainerMode.cmake index eff28d86a2..14a4c81248 100644 --- a/tools/cmake/MaintainerMode.cmake +++ b/tools/cmake/MaintainerMode.cmake @@ -16,7 +16,7 @@ if(enable_maintainer_mode AND NOT WIN32) ${CMAKE_HOME_DIRECTORY}/src/simix/popping_generated.cpp ${CMAKE_HOME_DIRECTORY}/src/simix/popping_bodies.cpp ${CMAKE_HOME_DIRECTORY}/src/simix/popping_enum.h - ${CMAKE_HOME_DIRECTORY}/src/simix/popping_accessors.h + ${CMAKE_HOME_DIRECTORY}/src/simix/popping_accessors.hpp DEPENDS ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls.py @@ -32,11 +32,11 @@ if(enable_maintainer_mode AND NOT WIN32) ${CMAKE_HOME_DIRECTORY}/src/simix/popping_generated.cpp ${CMAKE_HOME_DIRECTORY}/src/simix/popping_bodies.cpp ${CMAKE_HOME_DIRECTORY}/src/simix/popping_enum.h - ${CMAKE_HOME_DIRECTORY}/src/simix/popping_accessors.h + ${CMAKE_HOME_DIRECTORY}/src/simix/popping_accessors.hpp ) SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - "${CMAKE_HOME_DIRECTORY}/src/simix/popping_enum.h;${CMAKE_HOME_DIRECTORY}/src/simix/popping_generated.cpp;${CMAKE_HOME_DIRECTORY}/src/simix/popping_bodies.cpp;${CMAKE_HOME_DIRECTORY}/src/simix/popping_accessors.h" + "${CMAKE_HOME_DIRECTORY}/src/simix/popping_enum.h;${CMAKE_HOME_DIRECTORY}/src/simix/popping_generated.cpp;${CMAKE_HOME_DIRECTORY}/src/simix/popping_bodies.cpp;${CMAKE_HOME_DIRECTORY}/src/simix/popping_accessors.hpp" ) endif() endif() @@ -162,7 +162,6 @@ if(enable_maintainer_mode AND NOT WIN32) set(string5 "'s/SET(DOCTYPE)/SET(ROOT_dax__adag)/'") set(string9 "'s/#include /#if defined(_WIN32)\\n# ifndef __STRICT_ANSI__\\n# include \\n# include \\n# endif\\n#else\\n# include \\n#endif/g'") set(string14 "'\\!^ \\* Generated [0-9/]\\{10\\} [0-9:]\\{8\\}\\.$$!d'") - set(string15 "'s/FAIL(\"Premature EOF/if(!ETag_surfxml_include_state()) FAIL(\"Premature EOF/'") ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_HOME_DIRECTORY}/src/surf/xml/simgrid_dtd.h @@ -206,7 +205,6 @@ if(enable_maintainer_mode AND NOT WIN32) COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/src/surf/xml/simgrid_dtd.c COMMAND ${FLEX_EXE} -o src/surf/xml/simgrid_dtd.c -Psurf_parse_ --noline src/surf/xml/simgrid_dtd.l COMMAND ${SED_EXE} -i ${string9} src/surf/xml/simgrid_dtd.c - COMMAND ${SED_EXE} -i ${string15} src/surf/xml/simgrid_dtd.c COMMAND ${SED_EXE} -i 's/int yyl\;/unsigned int yyl\;/' src/surf/xml/simgrid_dtd.c COMMAND ${SED_EXE} -i 's/int surf_parse_leng\;/unsigned int surf_parse_leng\;/' src/surf/xml/simgrid_dtd.c COMMAND ${SED_EXE} -i 's/n = 0\; n < max_size/n = 0\; n < (size_t) max_size/' src/surf/xml/simgrid_dtd.c diff --git a/tools/cmake/MakeLib.cmake b/tools/cmake/MakeLib.cmake index 6aed72c998..2375082fb6 100644 --- a/tools/cmake/MakeLib.cmake +++ b/tools/cmake/MakeLib.cmake @@ -95,6 +95,26 @@ if(enable_smpi AND APPLE) set(SIMGRID_DEP "${SIMGRID_DEP} -Wl,-U -Wl,_smpi_simulated_main") endif() +# See https://github.com/HewlettPackard/foedus_code/blob/master/foedus-core/cmake/FindGccAtomic.cmake +FIND_LIBRARY(GCCLIBATOMIC_LIBRARY NAMES atomic atomic.so.1 libatomic.so.1 + HINTS + $ENV{HOME}/local/lib64 + $ENV{HOME}/local/lib + /usr/local/lib64 + /usr/local/lib + /opt/local/lib64 + /opt/local/lib + /usr/lib64 + /usr/lib + /lib64 + /lib +) + +# Fix a FTBFS on armel, mips, mipsel and friends (Debian's #872881) +if(CMAKE_COMPILER_IS_GNUCC AND GCCLIBATOMIC_LIBRARY) + set(SIMGRID_DEP "${SIMGRID_DEP} -Wl,--as-needed -latomic -Wl,--no-as-needed") +endif() + target_link_libraries(simgrid ${SIMGRID_DEP}) # Dependencies from maintainer mode diff --git a/tools/generate-dwarf-functions b/tools/generate-dwarf-functions index 6f503c2cb0..f47bec3c92 100755 --- a/tools/generate-dwarf-functions +++ b/tools/generate-dwarf-functions @@ -2,8 +2,8 @@ # Generate files from a given dwarf.h # Usage: tools/generate-dwarf-functions /usr/include/dwarf.h -cat - > src/mc/mc_dwarf_tagnames.cpp < +cat - > src/mc/mc_dwarf_tagnames.cpp < tagname_map = { + {0x00, "DW_TAG_invalid"}, +$(cat "$1" | grep DW_TAG_ | sed 's/.*\(DW_TAG_[^ ]*\) = \(0x[0-9a-f]*\).*/ {\2, "\1"},/') +}; +} namespace simgrid { namespace dwarf { @@ -27,13 +37,8 @@ namespace dwarf { XBT_PRIVATE const char *tagname(int tag) { - switch (tag) { -$(cat "$1" | grep DW_TAG_ | sed 's/.*\(DW_TAG_[^ ]*\) = \(0x[0-9a-f]*\).*/ case \2: return "\1";/') - case DW_TAG_invalid: - return "DW_TAG_invalid"; - default: - return "DW_TAG_unknown"; - } + auto name = tagname_map.find(tag); + return name == tagname_map.end() ? "DW_TAG_unknown" : name->second; } } @@ -41,17 +46,13 @@ $(cat "$1" | grep DW_TAG_ | sed 's/.*\(DW_TAG_[^ ]*\) = \(0x[0-9a-f]*\).*/ case EOF cat - > src/mc/mc_dwarf_attrnames.cpp << EOF -/* Copyright (c) 2014-2015. The SimGrid Team. - * All rights reserved. */ +$HEADER -/* 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. */ - -/* Warning: autogenerated, do not edit! */ - -#include - -#include +namespace { +const std::unordered_map attrname_map = { +$(cat "$1" | grep DW_AT_ | sed 's/.*\(DW_AT_[^ ]*\) = \(0x[0-9a-f]*\).*/ {\2, "\1"},/') +}; +} namespace simgrid { namespace dwarf { @@ -64,11 +65,8 @@ namespace dwarf { XBT_PRIVATE const char *attrname(int attr) { - switch (attr) { -$(cat "$1" | grep DW_AT_ | sed 's/.*\(DW_AT_[^ ]*\) = \(0x[0-9a-f]*\).*/ case \2: return "\1";/') - default: - return "DW_AT_unknown"; - } + auto name = attrname_map.find(attr); + return name == attrname_map.end() ? "DW_AT_unknown" : name->second; } } diff --git a/tools/jenkins/build.sh b/tools/jenkins/build.sh index d92a433ae4..eaae78234c 100755 --- a/tools/jenkins/build.sh +++ b/tools/jenkins/build.sh @@ -83,7 +83,8 @@ echo "XX Get out of the tree" echo "XX" if [ -d $WORKSPACE/build ] then - rm -rf $WORKSPACE/build + # Windows cannot remove the directory if it's still used by the previous build + rm -rf $WORKSPACE/build || sleep 10 && rm -rf $WORKSPACE/build || sleep 10 && rm -rf $WORKSPACE/build fi mkdir $WORKSPACE/build cd $WORKSPACE/build diff --git a/tools/sg_xml_unit_converter.py b/tools/sg_xml_unit_converter.py index ff81d66575..b7104ca62a 100644 --- a/tools/sg_xml_unit_converter.py +++ b/tools/sg_xml_unit_converter.py @@ -12,7 +12,7 @@ import sys import fnmatch import os -from decimal import Decimal +from decimal import Decimal, DecimalException import re @@ -20,7 +20,7 @@ def to_str(dec): return re.sub(r"(\.\d*?)0*$", r"\1", dec.to_eng_string()).rstrip(".") -def format(xml, formats, attrib): +def convert(xml, formats, attrib): res = [] m = re.search(r'%s="(.*?)"' % attrib, xml) while m: @@ -37,7 +37,7 @@ def format(xml, formats, attrib): tmp = "%s%s" % (to_str(d), f) break res.append(tmp) - except: + except DecimalException: print "Error with:", val res.append(val) m = re.search(r'%s="(.*?)"' % attrib, xml) @@ -63,18 +63,18 @@ for root, dirnames, filenames in os.walk(sys.argv[1]): ("1E15", "Pt"), ("1E18", "Ef"), ("1E21", "Zf")]) - xml = format(xml, power_formats, "power") + xml = convert(xml, power_formats, "power") bandwidth_formats = formats([("1E0", "Bps"), ("1E3", "kBps"), ("1E6", "MBps"), ("1E9", "GBps"), ("1E12", "TBps")]) - xml = format(xml, bandwidth_formats, "bandwidth") - xml = format(xml, bandwidth_formats, "bw") - xml = format(xml, bandwidth_formats, "bb_bw") - xml = format(xml, bandwidth_formats, "bw_in") - xml = format(xml, bandwidth_formats, "bw_out") + xml = convert(xml, bandwidth_formats, "bandwidth") + xml = convert(xml, bandwidth_formats, "bw") + xml = convert(xml, bandwidth_formats, "bb_bw") + xml = convert(xml, bandwidth_formats, "bw_in") + xml = convert(xml, bandwidth_formats, "bw_out") time_formats = formats([("1E-12", "ps"), ("1E-9", "ns"), @@ -85,9 +85,9 @@ for root, dirnames, filenames in os.walk(sys.argv[1]): ("3600E0", "h"), ("86400E0", "d"), ("604800E0", "w")]) - xml = format(xml, time_formats, "latency") - xml = format(xml, time_formats, "lat") - xml = format(xml, time_formats, "bb_lat") + xml = convert(xml, time_formats, "latency") + xml = convert(xml, time_formats, "lat") + xml = convert(xml, time_formats, "bb_lat") # print xml outfile = open(path, "w") diff --git a/tools/tesh/tesh.py b/tools/tesh/tesh.py index fd5b08836a..68a661eb64 100755 --- a/tools/tesh/tesh.py +++ b/tools/tesh/tesh.py @@ -65,7 +65,7 @@ SIGNALS_TO_NAMES_DICT = dict((getattr(signal, n), n) \ #exit correctly -def exit(errcode): +def tesh_exit(errcode): #If you do not flush some prints are skipped sys.stdout.flush() #os._exit exit even when executed within a thread @@ -74,7 +74,7 @@ def exit(errcode): def fatal_error(msg): print("[Tesh/CRITICAL] "+str(msg)) - exit(1) + tesh_exit(1) #Set an environment variable. @@ -224,7 +224,7 @@ class Cmd(object): except FileNotFoundError: print("Chdir to "+args[1]+" failed: No such file or directory") print("Test suite `"+FileReader().filename+"': NOK (system error)") - exit(4) + tesh_exit(4) #Run the Cmd if possible. @@ -293,7 +293,7 @@ class Cmd(object): proc = subprocess.Popen(args, bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) except FileNotFoundError: print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': File not found") - exit(3) + tesh_exit(3) except OSError as osE: if osE.errno == 8: osE.strerror += "\nOSError: [Errno 8] Executed scripts should start with shebang line (like #!/bin/sh)" @@ -305,7 +305,7 @@ class Cmd(object): except subprocess.TimeoutExpired: print("Test suite `"+FileReader().filename+"': NOK (<"+cmdName+"> timeout after "+str(self.timeout)+" sec)") proc.kill() - exit(3) + tesh_exit(3) if self.output_display: print(stdout_data) @@ -363,7 +363,7 @@ class Cmd(object): f.write("> "+line+"\n") f.close() print("Obtained output kept as requested: "+os.path.abspath("obtained")) - exit(2) + tesh_exit(2) #print ((proc.returncode, self.expect_return)) @@ -371,11 +371,11 @@ class Cmd(object): if proc.returncode >= 0: print("Test suite `"+FileReader().filename+"': NOK (<"+cmdName+"> returned code "+str(proc.returncode)+")") if lock is not None: lock.release() - exit(2) + tesh_exit(2) else: print("Test suite `"+FileReader().filename+"': NOK (<"+cmdName+"> got signal "+SIGNALS_TO_NAMES_DICT[-proc.returncode]+")") if lock is not None: lock.release() - exit(-proc.returncode) + tesh_exit(-proc.returncode) if lock is not None: lock.release() @@ -410,8 +410,8 @@ if __name__ == '__main__': try: options = parser.parse_args() - except: - exit(1) + except SystemExit: + tesh_exit(1) if options.cd is not None: os.chdir(options.cd) @@ -431,6 +431,7 @@ if __name__ == '__main__': re.compile("For details see http://code.google.com/p/address-sanitizer/issues/detail\\?id=189"), re.compile("For details see https://github.com/google/sanitizers/issues/189"), re.compile("Python runtime initialized with LC_CTYPE=C .*"), + re.compile("^cmake: .*? no version information available (required by cmake)"), # Seen on CircleCI ] TeshState().jenkins = True # This is a Jenkins build @@ -440,7 +441,7 @@ if __name__ == '__main__': else: if not os.path.isfile(options.teshfile): print("Cannot open teshfile '"+options.teshfile+"': File not found") - exit(3) + tesh_exit(3) f = FileReader(options.teshfile) print("Test suite '"+f.abspath+"'")