[test-suite] r311413 - [test-suite] Adding the Pathfinder Benchmark

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 22 07:28:57 PDT 2017


Sure. I'll fix it.

  -Hal

On 08/22/2017 09:25 AM, Adrian Prantl wrote:
> Hal, it looks like this benchmark is failing to build on green dragon 
> because of a warning, could you please take a look?
>
> http://green.lab.llvm.org/green/job/Compiler_Verifiers_GlobalISEL/8407/consoleFull#139682078949ba4694-19c4-4d7e-bec5-911270d8a58c
>
> /Users/buildslave/jenkins/workspace/Compiler_Verifiers_GlobalISEL/test-suite/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c:175:22: 
> warning: comparison of array 'commandLine' not equal to a null pointer 
> is always true [-Wtautological-pointer-compare] if ( commandLine != 
> NULL ) ^~~~~~~~~~~ ~~~~ 
> /Users/buildslave/jenkins/workspace/Compiler_Verifiers_GlobalISEL/test-suite/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c:177:21: 
> error: implicit declaration of function 'YAMLOpen' is invalid in C99 
> [-Werror,-Wimplicit-function-declaration] YAMLOpen(); ^ 
> /Users/buildslave/jenkins/workspace/Compiler_Verifiers_GlobalISEL/test-suite/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c:181:21: 
> error: implicit declaration of function 'YAMLWriteString' is invalid 
> in C99 [-Werror,-Wimplicit-function-declaration] 
> YAMLWriteString("Command", commandLine+1); ^ 
> /Users/buildslave/jenkins/workspace/Compiler_Verifiers_GlobalISEL/test-suite/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c:227:5: 
> error: implicit declaration of function 'YAMLClose' is invalid in C99 
> [-Werror,-Wimplicit-function-declaration] YAMLClose(); /* works even 
> if YAML logging isn't present */ ^ 
> /Users/buildslave/jenkins/workspace/Compiler_Verifiers_GlobalISEL/test-suite/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c:271:9: 
> error: implicit declaration of function 'doMultiSearches' is invalid 
> in C99 [-Werror,-Wimplicit-function-declaration] 
> doMultiSearches(config); ^ 
> /Users/buildslave/jenkins/workspace/Compiler_Verifiers_GlobalISEL/test-suite/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c:271:9: 
> note: did you mean 'doMultiSearchesQT'? 
> /Users/buildslave/jenkins/workspace/Compiler_Verifiers_GlobalISEL/test-suite/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h:104:6: 
> note: 'doMultiSearchesQT' declared here void 
> doMultiSearchesQT(Configuration *config); ^ 1 warning and 4 errors 
> generated.
>> On Aug 21, 2017, at 5:38 PM, Hal Finkel via llvm-commits 
>> <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>>
>> Author: hfinkel
>> Date: Mon Aug 21 17:38:53 2017
>> New Revision: 311413
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=311413&view=rev
>> Log:
>> [test-suite] Adding the Pathfinder Benchmark
>>
>> PathFinder searches for "signatures" within graphs. Graphs being 
>> searched are
>> directed and cyclic. Many, but not all nodes within the graph have 
>> labels. Any
>> given node may have more than one label, and any label may be applied 
>> to more
>> than one node. A signature is an orderd list of labels. PathFinder 
>> searches for
>> paths between labels within the signature. PathFinder returns success 
>> if there
>> is a path from a node with the first label in the signature that 
>> passes through
>> nodes with each label in order, ultimately reaching a node with the 
>> last label
>> in the signature. Labeled nodes need not be contiguous on any given path.
>>
>> At the current time, PathFinder does not do any pathway analysis 
>> (e.g. shortest
>> path) for discovered signatures. PathFinder simply searches until a 
>> signature
>> is satisfied or all pathways have been exhausted.
>>
>> Web: https://mantevo.org/packages/
>> Github: https://github.com/Mantevo/PathFinder
>>
>> When run on an Intel Xeon CPU E5-2699 v4 @ 2.20GHz:
>> compile_time: 13.3092
>> exec_time: 3.1158
>> Maximum resident set size (kbytes): 6256
>>
>> Patch by Brian Homerding, thanks!
>>
>> Differential Revision: https://reviews.llvm.org/D36680
>>
>> Added:
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h
>> Modified:
>>    test-suite/trunk/LICENSE.TXT
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt
>>    test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile
>>
>> Modified: test-suite/trunk/LICENSE.TXT
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/LICENSE.TXT?rev=311413&r1=311412&r2=311413&view=diff
>> ==============================================================================
>> --- test-suite/trunk/LICENSE.TXT (original)
>> +++ test-suite/trunk/LICENSE.TXT Mon Aug 21 17:38:53 2017
>> @@ -84,6 +84,7 @@ ASC Sequoia:        llvm-test/MultiSourc
>>                     llvm-test/MultiSource/Benchmarks/ASC_Sequoia/sphot
>> smg2000:            llvm-test/MultiSource/Benchmarks/ASCI_Purple/SMG2000
>> miniAMR: 
>>            llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C/miniAMR
>> +Pathfinder: 
>>         llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder
>> XSBench: 
>>            llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C/XSBench
>> HPCCG: 
>>              llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C++/HPCCG
>> PENNANT: 
>>            llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C++/PENNANT
>>
>> Modified: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt?rev=311413&r1=311412&r2=311413&view=diff
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt 
>> (original)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt 
>> Mon Aug 21 17:38:53 2017
>> @@ -1,2 +1,3 @@
>> add_subdirectory(XSBench)
>> +add_subdirectory(Pathfinder)
>> add_subdirectory(miniAMR)
>>
>> Modified: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile?rev=311413&r1=311412&r2=311413&view=diff
>> ==============================================================================
>> --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile 
>> (original)
>> +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile 
>> Mon Aug 21 17:38:53 2017
>> @@ -2,7 +2,7 @@
>>
>> LEVEL = ../../..
>> PARALLEL_DIRS = XSBench    \
>> -                miniAMR
>> -
>> +                miniAMR    \
>> +                Pathfinder
>>
>> include $(LEVEL)/Makefile.programs
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,4 @@
>> +set(PROG PathFinder)
>> +list(APPEND LDFLAGS -lm)
>> +set(RUN_OPTIONS -x ${CMAKE_CURRENT_SOURCE_DIR}/medsmall1.adj_list)
>> +llvm_multisource()
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,674 @@
>> +                    GNU GENERAL PUBLIC LICENSE
>> +                       Version 3, 29 June 2007
>> +
>> + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
>> + Everyone is permitted to copy and distribute verbatim copies
>> + of this license document, but changing it is not allowed.
>> +
>> +                            Preamble
>> +
>> +  The GNU General Public License is a free, copyleft license for
>> +software and other kinds of works.
>> +
>> +  The licenses for most software and other practical works are designed
>> +to take away your freedom to share and change the works.  By contrast,
>> +the GNU General Public License is intended to guarantee your freedom to
>> +share and change all versions of a program--to make sure it remains free
>> +software for all its users.  We, the Free Software Foundation, use the
>> +GNU General Public License for most of our software; it applies also to
>> +any other work released this way by its authors.  You can apply it to
>> +your programs, too.
>> +
>> +  When we speak of free software, we are referring to freedom, not
>> +price.  Our General Public Licenses are designed to make sure that you
>> +have the freedom to distribute copies of free software (and charge for
>> +them if you wish), that you receive source code or can get it if you
>> +want it, that you can change the software or use pieces of it in new
>> +free programs, and that you know you can do these things.
>> +
>> +  To protect your rights, we need to prevent others from denying you
>> +these rights or asking you to surrender the rights.  Therefore, you have
>> +certain responsibilities if you distribute copies of the software, or if
>> +you modify it: responsibilities to respect the freedom of others.
>> +
>> +  For example, if you distribute copies of such a program, whether
>> +gratis or for a fee, you must pass on to the recipients the same
>> +freedoms that you received.  You must make sure that they, too, receive
>> +or can get the source code.  And you must show them these terms so they
>> +know their rights.
>> +
>> +  Developers that use the GNU GPL protect your rights with two steps:
>> +(1) assert copyright on the software, and (2) offer you this License
>> +giving you legal permission to copy, distribute and/or modify it.
>> +
>> +  For the developers' and authors' protection, the GPL clearly explains
>> +that there is no warranty for this free software.  For both users' and
>> +authors' sake, the GPL requires that modified versions be marked as
>> +changed, so that their problems will not be attributed erroneously to
>> +authors of previous versions.
>> +
>> +  Some devices are designed to deny users access to install or run
>> +modified versions of the software inside them, although the manufacturer
>> +can do so.  This is fundamentally incompatible with the aim of
>> +protecting users' freedom to change the software.  The systematic
>> +pattern of such abuse occurs in the area of products for individuals to
>> +use, which is precisely where it is most unacceptable.  Therefore, we
>> +have designed this version of the GPL to prohibit the practice for those
>> +products.  If such problems arise substantially in other domains, we
>> +stand ready to extend this provision to those domains in future versions
>> +of the GPL, as needed to protect the freedom of users.
>> +
>> +  Finally, every program is threatened constantly by software patents.
>> +States should not allow patents to restrict development and use of
>> +software on general-purpose computers, but in those that do, we wish to
>> +avoid the special danger that patents applied to a free program could
>> +make it effectively proprietary.  To prevent this, the GPL assures that
>> +patents cannot be used to render the program non-free.
>> +
>> +  The precise terms and conditions for copying, distribution and
>> +modification follow.
>> +
>> +                       TERMS AND CONDITIONS
>> +
>> +  0. Definitions.
>> +
>> +  "This License" refers to version 3 of the GNU General Public License.
>> +
>> +  "Copyright" also means copyright-like laws that apply to other 
>> kinds of
>> +works, such as semiconductor masks.
>> +
>> +  "The Program" refers to any copyrightable work licensed under this
>> +License.  Each licensee is addressed as "you".  "Licensees" and
>> +"recipients" may be individuals or organizations.
>> +
>> +  To "modify" a work means to copy from or adapt all or part of the work
>> +in a fashion requiring copyright permission, other than the making of an
>> +exact copy.  The resulting work is called a "modified version" of the
>> +earlier work or a work "based on" the earlier work.
>> +
>> +  A "covered work" means either the unmodified Program or a work based
>> +on the Program.
>> +
>> +  To "propagate" a work means to do anything with it that, without
>> +permission, would make you directly or secondarily liable for
>> +infringement under applicable copyright law, except executing it on a
>> +computer or modifying a private copy.  Propagation includes copying,
>> +distribution (with or without modification), making available to the
>> +public, and in some countries other activities as well.
>> +
>> +  To "convey" a work means any kind of propagation that enables other
>> +parties to make or receive copies.  Mere interaction with a user through
>> +a computer network, with no transfer of a copy, is not conveying.
>> +
>> +  An interactive user interface displays "Appropriate Legal Notices"
>> +to the extent that it includes a convenient and prominently visible
>> +feature that (1) displays an appropriate copyright notice, and (2)
>> +tells the user that there is no warranty for the work (except to the
>> +extent that warranties are provided), that licensees may convey the
>> +work under this License, and how to view a copy of this License.  If
>> +the interface presents a list of user commands or options, such as a
>> +menu, a prominent item in the list meets this criterion.
>> +
>> +  1. Source Code.
>> +
>> +  The "source code" for a work means the preferred form of the work
>> +for making modifications to it.  "Object code" means any non-source
>> +form of a work.
>> +
>> +  A "Standard Interface" means an interface that either is an official
>> +standard defined by a recognized standards body, or, in the case of
>> +interfaces specified for a particular programming language, one that
>> +is widely used among developers working in that language.
>> +
>> +  The "System Libraries" of an executable work include anything, other
>> +than the work as a whole, that (a) is included in the normal form of
>> +packaging a Major Component, but which is not part of that Major
>> +Component, and (b) serves only to enable use of the work with that
>> +Major Component, or to implement a Standard Interface for which an
>> +implementation is available to the public in source code form.  A
>> +"Major Component", in this context, means a major essential component
>> +(kernel, window system, and so on) of the specific operating system
>> +(if any) on which the executable work runs, or a compiler used to
>> +produce the work, or an object code interpreter used to run it.
>> +
>> +  The "Corresponding Source" for a work in object code form means all
>> +the source code needed to generate, install, and (for an executable
>> +work) run the object code and to modify the work, including scripts to
>> +control those activities.  However, it does not include the work's
>> +System Libraries, or general-purpose tools or generally available free
>> +programs which are used unmodified in performing those activities but
>> +which are not part of the work.  For example, Corresponding Source
>> +includes interface definition files associated with source files for
>> +the work, and the source code for shared libraries and dynamically
>> +linked subprograms that the work is specifically designed to require,
>> +such as by intimate data communication or control flow between those
>> +subprograms and other parts of the work.
>> +
>> +  The Corresponding Source need not include anything that users
>> +can regenerate automatically from other parts of the Corresponding
>> +Source.
>> +
>> +  The Corresponding Source for a work in source code form is that
>> +same work.
>> +
>> +  2. Basic Permissions.
>> +
>> +  All rights granted under this License are granted for the term of
>> +copyright on the Program, and are irrevocable provided the stated
>> +conditions are met.  This License explicitly affirms your unlimited
>> +permission to run the unmodified Program.  The output from running a
>> +covered work is covered by this License only if the output, given its
>> +content, constitutes a covered work.  This License acknowledges your
>> +rights of fair use or other equivalent, as provided by copyright law.
>> +
>> +  You may make, run and propagate covered works that you do not
>> +convey, without conditions so long as your license otherwise remains
>> +in force.  You may convey covered works to others for the sole purpose
>> +of having them make modifications exclusively for you, or provide you
>> +with facilities for running those works, provided that you comply with
>> +the terms of this License in conveying all material for which you do
>> +not control copyright.  Those thus making or running the covered works
>> +for you must do so exclusively on your behalf, under your direction
>> +and control, on terms that prohibit them from making any copies of
>> +your copyrighted material outside their relationship with you.
>> +
>> +  Conveying under any other circumstances is permitted solely under
>> +the conditions stated below.  Sublicensing is not allowed; section 10
>> +makes it unnecessary.
>> +
>> +  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
>> +
>> +  No covered work shall be deemed part of an effective technological
>> +measure under any applicable law fulfilling obligations under article
>> +11 of the WIPO copyright treaty adopted on 20 December 1996, or
>> +similar laws prohibiting or restricting circumvention of such
>> +measures.
>> +
>> +  When you convey a covered work, you waive any legal power to forbid
>> +circumvention of technological measures to the extent such circumvention
>> +is effected by exercising rights under this License with respect to
>> +the covered work, and you disclaim any intention to limit operation or
>> +modification of the work as a means of enforcing, against the work's
>> +users, your or third parties' legal rights to forbid circumvention of
>> +technological measures.
>> +
>> +  4. Conveying Verbatim Copies.
>> +
>> +  You may convey verbatim copies of the Program's source code as you
>> +receive it, in any medium, provided that you conspicuously and
>> +appropriately publish on each copy an appropriate copyright notice;
>> +keep intact all notices stating that this License and any
>> +non-permissive terms added in accord with section 7 apply to the code;
>> +keep intact all notices of the absence of any warranty; and give all
>> +recipients a copy of this License along with the Program.
>> +
>> +  You may charge any price or no price for each copy that you convey,
>> +and you may offer support or warranty protection for a fee.
>> +
>> +  5. Conveying Modified Source Versions.
>> +
>> +  You may convey a work based on the Program, or the modifications to
>> +produce it from the Program, in the form of source code under the
>> +terms of section 4, provided that you also meet all of these conditions:
>> +
>> +    a) The work must carry prominent notices stating that you modified
>> +    it, and giving a relevant date.
>> +
>> +    b) The work must carry prominent notices stating that it is
>> +    released under this License and any conditions added under section
>> +    7.  This requirement modifies the requirement in section 4 to
>> +    "keep intact all notices".
>> +
>> +    c) You must license the entire work, as a whole, under this
>> +    License to anyone who comes into possession of a copy.  This
>> +    License will therefore apply, along with any applicable section 7
>> +    additional terms, to the whole of the work, and all its parts,
>> +    regardless of how they are packaged.  This License gives no
>> +    permission to license the work in any other way, but it does not
>> +    invalidate such permission if you have separately received it.
>> +
>> +    d) If the work has interactive user interfaces, each must display
>> +    Appropriate Legal Notices; however, if the Program has interactive
>> +    interfaces that do not display Appropriate Legal Notices, your
>> +    work need not make them do so.
>> +
>> +  A compilation of a covered work with other separate and independent
>> +works, which are not by their nature extensions of the covered work,
>> +and which are not combined with it such as to form a larger program,
>> +in or on a volume of a storage or distribution medium, is called an
>> +"aggregate" if the compilation and its resulting copyright are not
>> +used to limit the access or legal rights of the compilation's users
>> +beyond what the individual works permit.  Inclusion of a covered work
>> +in an aggregate does not cause this License to apply to the other
>> +parts of the aggregate.
>> +
>> +  6. Conveying Non-Source Forms.
>> +
>> +  You may convey a covered work in object code form under the terms
>> +of sections 4 and 5, provided that you also convey the
>> +machine-readable Corresponding Source under the terms of this License,
>> +in one of these ways:
>> +
>> +    a) Convey the object code in, or embodied in, a physical product
>> +    (including a physical distribution medium), accompanied by the
>> +    Corresponding Source fixed on a durable physical medium
>> +    customarily used for software interchange.
>> +
>> +    b) Convey the object code in, or embodied in, a physical product
>> +    (including a physical distribution medium), accompanied by a
>> +    written offer, valid for at least three years and valid for as
>> +    long as you offer spare parts or customer support for that product
>> +    model, to give anyone who possesses the object code either (1) a
>> +    copy of the Corresponding Source for all the software in the
>> +    product that is covered by this License, on a durable physical
>> +    medium customarily used for software interchange, for a price no
>> +    more than your reasonable cost of physically performing this
>> +    conveying of source, or (2) access to copy the
>> +    Corresponding Source from a network server at no charge.
>> +
>> +    c) Convey individual copies of the object code with a copy of the
>> +    written offer to provide the Corresponding Source.  This
>> +    alternative is allowed only occasionally and noncommercially, and
>> +    only if you received the object code with such an offer, in accord
>> +    with subsection 6b.
>> +
>> +    d) Convey the object code by offering access from a designated
>> +    place (gratis or for a charge), and offer equivalent access to the
>> +    Corresponding Source in the same way through the same place at no
>> +    further charge.  You need not require recipients to copy the
>> +    Corresponding Source along with the object code.  If the place to
>> +    copy the object code is a network server, the Corresponding Source
>> +    may be on a different server (operated by you or a third party)
>> +    that supports equivalent copying facilities, provided you maintain
>> +    clear directions next to the object code saying where to find the
>> +    Corresponding Source.  Regardless of what server hosts the
>> +    Corresponding Source, you remain obligated to ensure that it is
>> +    available for as long as needed to satisfy these requirements.
>> +
>> +    e) Convey the object code using peer-to-peer transmission, provided
>> +    you inform other peers where the object code and Corresponding
>> +    Source of the work are being offered to the general public at no
>> +    charge under subsection 6d.
>> +
>> +  A separable portion of the object code, whose source code is excluded
>> +from the Corresponding Source as a System Library, need not be
>> +included in conveying the object code work.
>> +
>> +  A "User Product" is either (1) a "consumer product", which means any
>> +tangible personal property which is normally used for personal, family,
>> +or household purposes, or (2) anything designed or sold for 
>> incorporation
>> +into a dwelling.  In determining whether a product is a consumer 
>> product,
>> +doubtful cases shall be resolved in favor of coverage.  For a particular
>> +product received by a particular user, "normally used" refers to a
>> +typical or common use of that class of product, regardless of the status
>> +of the particular user or of the way in which the particular user
>> +actually uses, or expects or is expected to use, the product.  A product
>> +is a consumer product regardless of whether the product has substantial
>> +commercial, industrial or non-consumer uses, unless such uses represent
>> +the only significant mode of use of the product.
>> +
>> +  "Installation Information" for a User Product means any methods,
>> +procedures, authorization keys, or other information required to install
>> +and execute modified versions of a covered work in that User Product 
>> from
>> +a modified version of its Corresponding Source.  The information must
>> +suffice to ensure that the continued functioning of the modified object
>> +code is in no case prevented or interfered with solely because
>> +modification has been made.
>> +
>> +  If you convey an object code work under this section in, or with, or
>> +specifically for use in, a User Product, and the conveying occurs as
>> +part of a transaction in which the right of possession and use of the
>> +User Product is transferred to the recipient in perpetuity or for a
>> +fixed term (regardless of how the transaction is characterized), the
>> +Corresponding Source conveyed under this section must be accompanied
>> +by the Installation Information.  But this requirement does not apply
>> +if neither you nor any third party retains the ability to install
>> +modified object code on the User Product (for example, the work has
>> +been installed in ROM).
>> +
>> +  The requirement to provide Installation Information does not include a
>> +requirement to continue to provide support service, warranty, or updates
>> +for a work that has been modified or installed by the recipient, or for
>> +the User Product in which it has been modified or installed.  Access 
>> to a
>> +network may be denied when the modification itself materially and
>> +adversely affects the operation of the network or violates the rules and
>> +protocols for communication across the network.
>> +
>> +  Corresponding Source conveyed, and Installation Information provided,
>> +in accord with this section must be in a format that is publicly
>> +documented (and with an implementation available to the public in
>> +source code form), and must require no special password or key for
>> +unpacking, reading or copying.
>> +
>> +  7. Additional Terms.
>> +
>> +  "Additional permissions" are terms that supplement the terms of this
>> +License by making exceptions from one or more of its conditions.
>> +Additional permissions that are applicable to the entire Program shall
>> +be treated as though they were included in this License, to the extent
>> +that they are valid under applicable law.  If additional permissions
>> +apply only to part of the Program, that part may be used separately
>> +under those permissions, but the entire Program remains governed by
>> +this License without regard to the additional permissions.
>> +
>> +  When you convey a copy of a covered work, you may at your option
>> +remove any additional permissions from that copy, or from any part of
>> +it.  (Additional permissions may be written to require their own
>> +removal in certain cases when you modify the work.)  You may place
>> +additional permissions on material, added by you to a covered work,
>> +for which you have or can give appropriate copyright permission.
>> +
>> +  Notwithstanding any other provision of this License, for material you
>> +add to a covered work, you may (if authorized by the copyright 
>> holders of
>> +that material) supplement the terms of this License with terms:
>> +
>> +    a) Disclaiming warranty or limiting liability differently from the
>> +    terms of sections 15 and 16 of this License; or
>> +
>> +    b) Requiring preservation of specified reasonable legal notices or
>> +    author attributions in that material or in the Appropriate Legal
>> +    Notices displayed by works containing it; or
>> +
>> +    c) Prohibiting misrepresentation of the origin of that material, or
>> +    requiring that modified versions of such material be marked in
>> +    reasonable ways as different from the original version; or
>> +
>> +    d) Limiting the use for publicity purposes of names of licensors or
>> +    authors of the material; or
>> +
>> +    e) Declining to grant rights under trademark law for use of some
>> +    trade names, trademarks, or service marks; or
>> +
>> +    f) Requiring indemnification of licensors and authors of that
>> +    material by anyone who conveys the material (or modified versions of
>> +    it) with contractual assumptions of liability to the recipient, for
>> +    any liability that these contractual assumptions directly impose on
>> +    those licensors and authors.
>> +
>> +  All other non-permissive additional terms are considered "further
>> +restrictions" within the meaning of section 10.  If the Program as you
>> +received it, or any part of it, contains a notice stating that it is
>> +governed by this License along with a term that is a further
>> +restriction, you may remove that term.  If a license document contains
>> +a further restriction but permits relicensing or conveying under this
>> +License, you may add to a covered work material governed by the terms
>> +of that license document, provided that the further restriction does
>> +not survive such relicensing or conveying.
>> +
>> +  If you add terms to a covered work in accord with this section, you
>> +must place, in the relevant source files, a statement of the
>> +additional terms that apply to those files, or a notice indicating
>> +where to find the applicable terms.
>> +
>> +  Additional terms, permissive or non-permissive, may be stated in the
>> +form of a separately written license, or stated as exceptions;
>> +the above requirements apply either way.
>> +
>> +  8. Termination.
>> +
>> +  You may not propagate or modify a covered work except as expressly
>> +provided under this License.  Any attempt otherwise to propagate or
>> +modify it is void, and will automatically terminate your rights under
>> +this License (including any patent licenses granted under the third
>> +paragraph of section 11).
>> +
>> +  However, if you cease all violation of this License, then your
>> +license from a particular copyright holder is reinstated (a)
>> +provisionally, unless and until the copyright holder explicitly and
>> +finally terminates your license, and (b) permanently, if the copyright
>> +holder fails to notify you of the violation by some reasonable means
>> +prior to 60 days after the cessation.
>> +
>> +  Moreover, your license from a particular copyright holder is
>> +reinstated permanently if the copyright holder notifies you of the
>> +violation by some reasonable means, this is the first time you have
>> +received notice of violation of this License (for any work) from that
>> +copyright holder, and you cure the violation prior to 30 days after
>> +your receipt of the notice.
>> +
>> +  Termination of your rights under this section does not terminate the
>> +licenses of parties who have received copies or rights from you under
>> +this License.  If your rights have been terminated and not permanently
>> +reinstated, you do not qualify to receive new licenses for the same
>> +material under section 10.
>> +
>> +  9. Acceptance Not Required for Having Copies.
>> +
>> +  You are not required to accept this License in order to receive or
>> +run a copy of the Program.  Ancillary propagation of a covered work
>> +occurring solely as a consequence of using peer-to-peer transmission
>> +to receive a copy likewise does not require acceptance.  However,
>> +nothing other than this License grants you permission to propagate or
>> +modify any covered work.  These actions infringe copyright if you do
>> +not accept this License.  Therefore, by modifying or propagating a
>> +covered work, you indicate your acceptance of this License to do so.
>> +
>> +  10. Automatic Licensing of Downstream Recipients.
>> +
>> +  Each time you convey a covered work, the recipient automatically
>> +receives a license from the original licensors, to run, modify and
>> +propagate that work, subject to this License.  You are not responsible
>> +for enforcing compliance by third parties with this License.
>> +
>> +  An "entity transaction" is a transaction transferring control of an
>> +organization, or substantially all assets of one, or subdividing an
>> +organization, or merging organizations.  If propagation of a covered
>> +work results from an entity transaction, each party to that
>> +transaction who receives a copy of the work also receives whatever
>> +licenses to the work the party's predecessor in interest had or could
>> +give under the previous paragraph, plus a right to possession of the
>> +Corresponding Source of the work from the predecessor in interest, if
>> +the predecessor has it or can get it with reasonable efforts.
>> +
>> +  You may not impose any further restrictions on the exercise of the
>> +rights granted or affirmed under this License.  For example, you may
>> +not impose a license fee, royalty, or other charge for exercise of
>> +rights granted under this License, and you may not initiate litigation
>> +(including a cross-claim or counterclaim in a lawsuit) alleging that
>> +any patent claim is infringed by making, using, selling, offering for
>> +sale, or importing the Program or any portion of it.
>> +
>> +  11. Patents.
>> +
>> +  A "contributor" is a copyright holder who authorizes use under this
>> +License of the Program or a work on which the Program is based.  The
>> +work thus licensed is called the contributor's "contributor version".
>> +
>> +  A contributor's "essential patent claims" are all patent claims
>> +owned or controlled by the contributor, whether already acquired or
>> +hereafter acquired, that would be infringed by some manner, permitted
>> +by this License, of making, using, or selling its contributor version,
>> +but do not include claims that would be infringed only as a
>> +consequence of further modification of the contributor version.  For
>> +purposes of this definition, "control" includes the right to grant
>> +patent sublicenses in a manner consistent with the requirements of
>> +this License.
>> +
>> +  Each contributor grants you a non-exclusive, worldwide, royalty-free
>> +patent license under the contributor's essential patent claims, to
>> +make, use, sell, offer for sale, import and otherwise run, modify and
>> +propagate the contents of its contributor version.
>> +
>> +  In the following three paragraphs, a "patent license" is any express
>> +agreement or commitment, however denominated, not to enforce a patent
>> +(such as an express permission to practice a patent or covenant not to
>> +sue for patent infringement).  To "grant" such a patent license to a
>> +party means to make such an agreement or commitment not to enforce a
>> +patent against the party.
>> +
>> +  If you convey a covered work, knowingly relying on a patent license,
>> +and the Corresponding Source of the work is not available for anyone
>> +to copy, free of charge and under the terms of this License, through a
>> +publicly available network server or other readily accessible means,
>> +then you must either (1) cause the Corresponding Source to be so
>> +available, or (2) arrange to deprive yourself of the benefit of the
>> +patent license for this particular work, or (3) arrange, in a manner
>> +consistent with the requirements of this License, to extend the patent
>> +license to downstream recipients.  "Knowingly relying" means you have
>> +actual knowledge that, but for the patent license, your conveying the
>> +covered work in a country, or your recipient's use of the covered work
>> +in a country, would infringe one or more identifiable patents in that
>> +country that you have reason to believe are valid.
>> +
>> +  If, pursuant to or in connection with a single transaction or
>> +arrangement, you convey, or propagate by procuring conveyance of, a
>> +covered work, and grant a patent license to some of the parties
>> +receiving the covered work authorizing them to use, propagate, modify
>> +or convey a specific copy of the covered work, then the patent license
>> +you grant is automatically extended to all recipients of the covered
>> +work and works based on it.
>> +
>> +  A patent license is "discriminatory" if it does not include within
>> +the scope of its coverage, prohibits the exercise of, or is
>> +conditioned on the non-exercise of one or more of the rights that are
>> +specifically granted under this License.  You may not convey a covered
>> +work if you are a party to an arrangement with a third party that is
>> +in the business of distributing software, under which you make payment
>> +to the third party based on the extent of your activity of conveying
>> +the work, and under which the third party grants, to any of the
>> +parties who would receive the covered work from you, a discriminatory
>> +patent license (a) in connection with copies of the covered work
>> +conveyed by you (or copies made from those copies), or (b) primarily
>> +for and in connection with specific products or compilations that
>> +contain the covered work, unless you entered into that arrangement,
>> +or that patent license was granted, prior to 28 March 2007.
>> +
>> +  Nothing in this License shall be construed as excluding or limiting
>> +any implied license or other defenses to infringement that may
>> +otherwise be available to you under applicable patent law.
>> +
>> +  12. No Surrender of Others' Freedom.
>> +
>> +  If conditions are imposed on you (whether by court order, agreement or
>> +otherwise) that contradict the conditions of this License, they do not
>> +excuse you from the conditions of this License.  If you cannot convey a
>> +covered work so as to satisfy simultaneously your obligations under this
>> +License and any other pertinent obligations, then as a consequence 
>> you may
>> +not convey it at all.  For example, if you agree to terms that 
>> obligate you
>> +to collect a royalty for further conveying from those to whom you convey
>> +the Program, the only way you could satisfy both those terms and this
>> +License would be to refrain entirely from conveying the Program.
>> +
>> +  13. Use with the GNU Affero General Public License.
>> +
>> +  Notwithstanding any other provision of this License, you have
>> +permission to link or combine any covered work with a work licensed
>> +under version 3 of the GNU Affero General Public License into a single
>> +combined work, and to convey the resulting work.  The terms of this
>> +License will continue to apply to the part which is the covered work,
>> +but the special requirements of the GNU Affero General Public License,
>> +section 13, concerning interaction through a network will apply to the
>> +combination as such.
>> +
>> +  14. Revised Versions of this License.
>> +
>> +  The Free Software Foundation may publish revised and/or new 
>> versions of
>> +the GNU General Public License from time to time.  Such new versions 
>> will
>> +be similar in spirit to the present version, but may differ in detail to
>> +address new problems or concerns.
>> +
>> +  Each version is given a distinguishing version number.  If the
>> +Program specifies that a certain numbered version of the GNU General
>> +Public License "or any later version" applies to it, you have the
>> +option of following the terms and conditions either of that numbered
>> +version or of any later version published by the Free Software
>> +Foundation.  If the Program does not specify a version number of the
>> +GNU General Public License, you may choose any version ever published
>> +by the Free Software Foundation.
>> +
>> +  If the Program specifies that a proxy can decide which future
>> +versions of the GNU General Public License can be used, that proxy's
>> +public statement of acceptance of a version permanently authorizes you
>> +to choose that version for the Program.
>> +
>> +  Later license versions may give you additional or different
>> +permissions.  However, no additional obligations are imposed on any
>> +author or copyright holder as a result of your choosing to follow a
>> +later version.
>> +
>> +  15. Disclaimer of Warranty.
>> +
>> +  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
>> +APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
>> +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT 
>> WARRANTY
>> +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
>> +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> +PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 
>> PROGRAM
>> +IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
>> +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
>> +
>> +  16. Limitation of Liability.
>> +
>> +  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
>> +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR 
>> CONVEYS
>> +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 
>> INCLUDING ANY
>> +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
>> +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO 
>> LOSS OF
>> +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR 
>> THIRD
>> +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
>> +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 
>> POSSIBILITY OF
>> +SUCH DAMAGES.
>> +
>> +  17. Interpretation of Sections 15 and 16.
>> +
>> +  If the disclaimer of warranty and limitation of liability provided
>> +above cannot be given local legal effect according to their terms,
>> +reviewing courts shall apply local law that most closely approximates
>> +an absolute waiver of all civil liability in connection with the
>> +Program, unless a warranty or assumption of liability accompanies a
>> +copy of the Program in return for a fee.
>> +
>> +                     END OF TERMS AND CONDITIONS
>> +
>> +            How to Apply These Terms to Your New Programs
>> +
>> +  If you develop a new program, and you want it to be of the greatest
>> +possible use to the public, the best way to achieve this is to make it
>> +free software which everyone can redistribute and change under these 
>> terms.
>> +
>> +  To do so, attach the following notices to the program.  It is safest
>> +to attach them to the start of each source file to most effectively
>> +state the exclusion of warranty; and each file should have at least
>> +the "copyright" line and a pointer to where the full notice is found.
>> +
>> +    <one line to give the program's name and a brief idea of what it 
>> does.>
>> +    Copyright (C) <year>  <name of author>
>> +
>> +    This program is free software: you can redistribute it and/or modify
>> +    it under the terms of the GNU General Public License as published by
>> +    the Free Software Foundation, either version 3 of the License, or
>> +    (at your option) any later version.
>> +
>> +    This program is distributed in the hope that it will be useful,
>> +    but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +    GNU General Public License for more details.
>> +
>> +    You should have received a copy of the GNU General Public License
>> +    along with this program.  If not, see 
>> <http://www.gnu.org/licenses/>.
>> +
>> +Also add information on how to contact you by electronic and paper mail.
>> +
>> +  If the program does terminal interaction, make it output a short
>> +notice like this when it starts in an interactive mode:
>> +
>> +    <program>  Copyright (C) <year>  <name of author>
>> +    This program comes with ABSOLUTELY NO WARRANTY; for details type 
>> `show w'.
>> +    This is free software, and you are welcome to redistribute it
>> +    under certain conditions; type `show c' for details.
>> +
>> +The hypothetical commands `show w' and `show c' should show the 
>> appropriate
>> +parts of the General Public License.  Of course, your program's commands
>> +might be different; for a GUI interface, you would use an "about box".
>> +
>> +  You should also get your employer (if you work as a programmer) or 
>> school,
>> +if any, to sign a "copyright disclaimer" for the program, if necessary.
>> +For more information on this, and how to apply and follow the GNU 
>> GPL, see
>> +<http://www.gnu.org/licenses/>.
>> +
>> +  The GNU General Public License does not permit incorporating your 
>> program
>> +into proprietary programs.  If your program is a subroutine library, you
>> +may consider it more useful to permit linking proprietary 
>> applications with
>> +the library.  If this is what you want to do, use the GNU Lesser General
>> +Public License instead of this License.  But first, please read
>> +<http://www.gnu.org/philosophy/why-not-lgpl.html>.
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,165 @@
>> +                   GNU LESSER GENERAL PUBLIC LICENSE
>> +                       Version 3, 29 June 2007
>> +
>> + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
>> + Everyone is permitted to copy and distribute verbatim copies
>> + of this license document, but changing it is not allowed.
>> +
>> +
>> +  This version of the GNU Lesser General Public License incorporates
>> +the terms and conditions of version 3 of the GNU General Public
>> +License, supplemented by the additional permissions listed below.
>> +
>> +  0. Additional Definitions.
>> +
>> +  As used herein, "this License" refers to version 3 of the GNU Lesser
>> +General Public License, and the "GNU GPL" refers to version 3 of the GNU
>> +General Public License.
>> +
>> +  "The Library" refers to a covered work governed by this License,
>> +other than an Application or a Combined Work as defined below.
>> +
>> +  An "Application" is any work that makes use of an interface provided
>> +by the Library, but which is not otherwise based on the Library.
>> +Defining a subclass of a class defined by the Library is deemed a mode
>> +of using an interface provided by the Library.
>> +
>> +  A "Combined Work" is a work produced by combining or linking an
>> +Application with the Library.  The particular version of the Library
>> +with which the Combined Work was made is also called the "Linked
>> +Version".
>> +
>> +  The "Minimal Corresponding Source" for a Combined Work means the
>> +Corresponding Source for the Combined Work, excluding any source code
>> +for portions of the Combined Work that, considered in isolation, are
>> +based on the Application, and not on the Linked Version.
>> +
>> +  The "Corresponding Application Code" for a Combined Work means the
>> +object code and/or source code for the Application, including any data
>> +and utility programs needed for reproducing the Combined Work from the
>> +Application, but excluding the System Libraries of the Combined Work.
>> +
>> +  1. Exception to Section 3 of the GNU GPL.
>> +
>> +  You may convey a covered work under sections 3 and 4 of this License
>> +without being bound by section 3 of the GNU GPL.
>> +
>> +  2. Conveying Modified Versions.
>> +
>> +  If you modify a copy of the Library, and, in your modifications, a
>> +facility refers to a function or data to be supplied by an Application
>> +that uses the facility (other than as an argument passed when the
>> +facility is invoked), then you may convey a copy of the modified
>> +version:
>> +
>> +   a) under this License, provided that you make a good faith effort to
>> +   ensure that, in the event an Application does not supply the
>> +   function or data, the facility still operates, and performs
>> +   whatever part of its purpose remains meaningful, or
>> +
>> +   b) under the GNU GPL, with none of the additional permissions of
>> +   this License applicable to that copy.
>> +
>> +  3. Object Code Incorporating Material from Library Header Files.
>> +
>> +  The object code form of an Application may incorporate material from
>> +a header file that is part of the Library.  You may convey such object
>> +code under terms of your choice, provided that, if the incorporated
>> +material is not limited to numerical parameters, data structure
>> +layouts and accessors, or small macros, inline functions and templates
>> +(ten or fewer lines in length), you do both of the following:
>> +
>> +   a) Give prominent notice with each copy of the object code that the
>> +   Library is used in it and that the Library and its use are
>> +   covered by this License.
>> +
>> +   b) Accompany the object code with a copy of the GNU GPL and this 
>> license
>> +   document.
>> +
>> +  4. Combined Works.
>> +
>> +  You may convey a Combined Work under terms of your choice that,
>> +taken together, effectively do not restrict modification of the
>> +portions of the Library contained in the Combined Work and reverse
>> +engineering for debugging such modifications, if you also do each of
>> +the following:
>> +
>> +   a) Give prominent notice with each copy of the Combined Work that
>> +   the Library is used in it and that the Library and its use are
>> +   covered by this License.
>> +
>> +   b) Accompany the Combined Work with a copy of the GNU GPL and 
>> this license
>> +   document.
>> +
>> +   c) For a Combined Work that displays copyright notices during
>> +   execution, include the copyright notice for the Library among
>> +   these notices, as well as a reference directing the user to the
>> +   copies of the GNU GPL and this license document.
>> +
>> +   d) Do one of the following:
>> +
>> +       0) Convey the Minimal Corresponding Source under the terms of 
>> this
>> +       License, and the Corresponding Application Code in a form
>> +       suitable for, and under terms that permit, the user to
>> +       recombine or relink the Application with a modified version of
>> +       the Linked Version to produce a modified Combined Work, in the
>> +       manner specified by section 6 of the GNU GPL for conveying
>> +       Corresponding Source.
>> +
>> +       1) Use a suitable shared library mechanism for linking with the
>> +       Library.  A suitable mechanism is one that (a) uses at run time
>> +       a copy of the Library already present on the user's computer
>> +       system, and (b) will operate properly with a modified version
>> +       of the Library that is interface-compatible with the Linked
>> +       Version.
>> +
>> +   e) Provide Installation Information, but only if you would otherwise
>> +   be required to provide such information under section 6 of the
>> +   GNU GPL, and only to the extent that such information is
>> +   necessary to install and execute a modified version of the
>> +   Combined Work produced by recombining or relinking the
>> +   Application with a modified version of the Linked Version. (If
>> +   you use option 4d0, the Installation Information must accompany
>> +   the Minimal Corresponding Source and Corresponding Application
>> +   Code. If you use option 4d1, you must provide the Installation
>> +   Information in the manner specified by section 6 of the GNU GPL
>> +   for conveying Corresponding Source.)
>> +
>> +  5. Combined Libraries.
>> +
>> +  You may place library facilities that are a work based on the
>> +Library side by side in a single library together with other library
>> +facilities that are not Applications and are not covered by this
>> +License, and convey such a combined library under terms of your
>> +choice, if you do both of the following:
>> +
>> +   a) Accompany the combined library with a copy of the same work based
>> +   on the Library, uncombined with any other library facilities,
>> +   conveyed under the terms of this License.
>> +
>> +   b) Give prominent notice with the combined library that part of it
>> +   is a work based on the Library, and explaining where to find the
>> +   accompanying uncombined form of the same work.
>> +
>> +  6. Revised Versions of the GNU Lesser General Public License.
>> +
>> +  The Free Software Foundation may publish revised and/or new versions
>> +of the GNU Lesser General Public License from time to time. Such new
>> +versions will be similar in spirit to the present version, but may
>> +differ in detail to address new problems or concerns.
>> +
>> +  Each version is given a distinguishing version number. If the
>> +Library as you received it specifies that a certain numbered version
>> +of the GNU Lesser General Public License "or any later version"
>> +applies to it, you have the option of following the terms and
>> +conditions either of that published version or of any later version
>> +published by the Free Software Foundation. If the Library as you
>> +received it does not specify a version number of the GNU Lesser
>> +General Public License, you may choose any version of the GNU Lesser
>> +General Public License ever published by the Free Software Foundation.
>> +
>> +  If the Library as you received it specifies that a proxy can decide
>> +whether future versions of the GNU Lesser General Public License shall
>> +apply, that proxy's public statement of acceptance of any version is
>> +permanent authorization for you to choose that version for the
>> +Library.
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,6 @@
>> +LEVEL = ../../../..
>> +
>> +PROG = PathFinder
>> +LDFLAGS = -lm
>> +RUN_OPTIONS = -x $(PROJ_SRC_DIR)/medsmall1.adj_list
>> +include $(LEVEL)/MultiSource/Makefile.multisrc
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,28 @@
>> +
>> +
>> +        PathFinder: finding a series of labeled nodes within a
>> +                two-layer directed, cyclic graph.
>> +               Copyright (2013) Sandia Corporation
>> +
>> + Sandia National Laboratories is a multi-program laboratory managed and
>> + operated by Sandia Corporation, a wholly owned subsidiary of Lockheed
>> + Martin Corporation, for the U.S. Department of Energy's National 
>> Nuclear
>> + Security Administration under terms of Contract DE-AC04-94AL85000,
>> + there is a non-exclusive license for use of this work by or on behalf
>> + of the U.S. Government. Export of this program may require a license
>> + from the United States Government.
>> +
>> +
>> +500 functions specified
>> +3463 basic blocks specified
>> +371 total System Call Map elements
>> +...parsing complete.
>> +Immediately before parallel
>> +
>> +
>> +44669 found out of 137641 searches. Overall Time: 0:0:0.000
>> +
>> +
>> +Total 44669 legs found
>> +
>> +exit 0
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,220 @@
>> +**************************************************************************
>> +LLVM Test-suite Note:
>> +**************************************************************************
>> +The original source is located at https://github.com/Mantevo/PathFinder.
>> +Beyond this paragraph is the original README contained with the source
>> +code.  The Makefile refered to within is not utilized within the
>> +test-suite.  The test-suite builds a serial version (openmp and
>> +mpi disabled) with its own cmake and make build system.
>> +**************************************************************************
>> +
>> +PathFinder graph pathway analysis mini-application
>> +
>> +------------------------------------
>> +Contents of this README file:
>> +1. PathFinder overview
>> +2. PathFinder versions
>> +3. Building PathFinder
>> +4. Running PathFinder
>> +5. PathFinder search algorithm/pseudo code
>> +------------------------------------
>> +
>> +------------------------------------
>> +1. PathFinder overview:
>> +
>> +PathFinder searches for "signatures" within graphs. Graphs being 
>> searched are
>> +directed and cyclic. Many, but not all nodes within the graph have 
>> labels. Any
>> +given node may have more than one label, and any label may be 
>> applied to more
>> +than one node. A signature is an orderd list of labels. PathFinder 
>> searches for
>> +paths between labels within the signature. PathFinder returns 
>> success if there
>> +is a path from a node with the first label in the signature that 
>> passes through
>> +nodes with each label in order, ultimately reaching a node with the 
>> last label
>> +in the signature. Labeled nodes need not be contiguous on any given 
>> path.
>> +
>> +At the current time, PathFinder does not do any pathway analysis 
>> (e.g. shortest
>> +path) for discovered signatures. PathFinder simply searches until a 
>> signature is
>> +satisfied or all pathways have been exhausted.
>> +
>> +------------------------------------
>> +2. PathFinder versions:
>> +
>> +- PathFinder_ref:
>> +    reference version: self-contained. Includes serial and OpenMP 
>> parallel
>> +    implementations. MPI is not yet supported.
>> +
>> +------------------------------------
>> +3. Building PathFinder:
>> +
>> +The standard build is to cd into the 'PathFinder_ref' directory and 
>> type 'make'.
>> +Doing so builds an OpenMP enabled version of PathFinder (named 
>> PathFinder.x). For
>> +serial execution, run it with the OMP_NUM_THREADS environment 
>> variable set to 1.
>> +
>> +Alternative build targets:
>> +    * clean -- removes all .o files
>> +    * realclean -- removes all .o and .x files
>> +    * debug -- PathFinder.x+dbg - serial executable with debug 
>> information
>> +    * mpi -- currently not implemented; prints an error message
>> +
>> +To verify execution, type 'make check' which builds a serial 
>> version, runs it
>> +against one of the known data sets and compares the results.
>> +
>> +------------------------------------
>> +4. Running PathFinder:
>> +
>> +The simplest execution is to simply type './PathFinder.x'. This will 
>> run
>> +PathFinder with a trivial graph (MicroTestData.adj_list in the source
>> +directory). It will find 6 legs out of 9 searches, by doing an 
>> "exhaustive"
>> +search on that graph.
>> +
>> +An exhaustive search is PathFinder determining if paths exist 
>> between any pair
>> +of labels for every label existing in the graph. Exhaustive searches 
>> are
>> +embarrassingly parallel, and can be quite time consuming depending 
>> on the size
>> +of the graph and number of labels. Running PathFinder exhaustively 
>> is done with
>> +the -x switch:
>> +    PathFinder.x -x <data file>
>> +    e.g. PathFinder.x -x ../scaleData/1kx750.adj_list
>> +
>> +To search for specific signatures, PathFinder can be run 
>> interactively or with
>> +a configuration file. To run interactively, use the -i switch:
>> +    PathFinder.x -i <data file>
>> +PathFinder will prompt the operator for a series of labels to define 
>> the
>> +signature for which PathFinder will search.
>> +
>> +Multiple data files and multiple signatures can be specified to 
>> PathFinder in a
>> +configuration file. A python script (config_builder.py) exists to 
>> assist the
>> +operator in creating a configuration file. A sample configuration 
>> file is
>> +included in the PathFinder source directory. To run PathFinder with 
>> a config
>> +file, use the -c switch:
>> +    PathFinder.x -c <config file>
>> +    e.g. PathFinder.x -c sampleConfig
>> +
>> +Typing 'PathFinder -h' will print a help message describing the 
>> available
>> +execution switches. Sample data files are provided in the 'data' and
>> +'generatedData' directories. The python script used to generate 
>> representative
>> +graph data is in the PathFinder_ref directory. It is named graph_gen.py.
>> +
>> +YAML output files can be generated by using the -y switch.
>> +
>> +Sample data sets are included in the "generatedData" and "scaleData"
>> +subdirectories. The scaleData files are intended for performance
>> +characterization. They are named with the convention:
>> +    <NodeCount>x<LabelCount>.adj_list
>> +For expected results, see scaleData/README
>> +
>> +------------------------------------
>> +5. PathFinder search algorithm / pseudo code
>> +
>> +PathFinder does a modified depth-first search through the graph. For 
>> each
>> +signature, PathFinder begins searching from the set of nodes which 
>> have the
>> +first label in the signature. From these nodes, it finds a path to 
>> any node that
>> +is labeled with the second label in the signature. This is repeated 
>> until a path
>> +is found to the last label in the signature. If at any point in the 
>> search a
>> +path to a label is not found, that search fails.
>> +
>> +Searches are done recursively. At each node, the target of each edge 
>> is checked
>> +to see if it is labeled with the next label in the signature. If a 
>> match is
>> +made, The search continues from the matched node and the subsequent 
>> label in the
>> +signature. If there are no remaining labels in the signature, the 
>> search has
>> +succeeded. If no direct edge from the current node matches, then the 
>> search
>> +continues recursively for the current label along each edge from the 
>> current
>> +node. If no match exists along any edge, the search fails.
>> +
>> +Pseudo code:
>> +
>> +For each file in config file:
>> +    Parse file into a Graph
>> +
>> +For each signature in config file:
>> +    Store for processing
>> +
>> +For each signature
>> +{
>> +    For each Graph
>> +    {
>> +        Make sure the graph contains at least one node labeled with 
>> every label
>> +            in the signature
>> +
>> +        Get set of nodes with signature[0], the first label in signature
>> +        for each “Start” node
>> +        {
>> +            // Recursive procedure to find remaining signature. Requires
>> +            // current node, the remaining “unfound” signature legs
>> +            // a result stack of nodes to store path traversed and
>> +            // a stack of nodes visited so far to detect cycles and
>> +            // redundant searches
>> +            Create empty result stack
>> +            Create empty visited stack
>> +            success = FindRemainingSignatureFromCurrentNode ( 
>> startNode,
>> +                                                &signature[1], 
>> result, visited )
>> +        } // end of for each “Start” node
>> +    } // end of for each Graph
>> +} // end of for each Signature
>> +
>> +
>> +// Recursive procedure to find remaining signature.
>> +//      currentNode – the node whose edges *might* reach the
>> +//                    next label in the signature
>> +//      signature – an array of pointers to C strings. These strings
>> +//                  are the labels being matched by the nodes being
>> +//                  searched. Each sequential pair of labels is a
>> +//                  “leg” of the search. The last pointer is NULL to
>> +//                  terminate the array.
>> +//      result – a stack of nodes containing the path currently
>> +//               traversed to reach this node
>> +//      visited – a stack of ALL nodes searched during the attempt
>> +//                to find the current label
>> +
>> +boolean FindRemainingSignatureFromCurrentNode ( currentNode, 
>> signature, result,
>> +                                                    visited )
>> +{
>> +    If currentNode is in visited
>> +        return FALSE – we have reached a cycle or a subgraph that has
>> +                       already been searched
>> +    else
>> +        push currentNode onto visited stack
>> +
>> +    push currentNode onto result stack
>> +    For each edge from currentNode
>> +    {
>> +        If edge->targetNode->label == signature[0]
>> +        {
>> +            If signature[1] != NULL we have more legs in the search
>> +                Create nextResult for next leg search
>> +                Create nextVisited for next leg search
>> +                success = FindRemainingSignatureFromCurrentNode
>> +                                    ( edge->targetNode, &signature[1],
>> +                                      nextResult, nextVisited )
>> +                if success
>> +                    result += nextResult
>> +                    delete nextVisited
>> +                    return TRUE, weÂ’ve found the path
>> +                else
>> +                    continue through edge checking
>> +            else signature[1] == NULL
>> +                push edge->targetNode onto result
>> +                return true, weÂ’ve found the path
>> +        }
>> +        else
>> +            continue through edge checking
>> +    } // end of for each edge target compared against signature [0]
>> +
>> +    // If weÂ’ve made it this far, none of the edges is a direct
>> +    // match to the current label, do a deeper search
>> +    For each edge from current node
>> +    {
>> +        success = FindRemainingSignatureFromCurrentNode ( 
>> edge->targetNode,
>> +                                    &signature[0], result, visited )
>> +        if success
>> +            return TRUE, weÂ’ve found the path
>> +        else
>> +            continue through edge searching loop
>> +    }
>> +
>> +    // If weÂ’ve made it this far, we have no path
>> +    pop currentNode off of result (but not off of visited)
>> +    return FALSE;
>> +} // end of find remaining signature
>> +
>> +
>> +
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,114 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +#include "bitfield.h"
>> +#include "node.h"
>> +#include <stdio.h>
>> +
>> +
>> +/* --------
>> + * Bitfield is a mask around a character pointer. An array of character
>> + * pointers is allocated such that there is a sequence of available bits
>> + * equal in length to the number of nodes in a given graph. Bitfield
>> + * defines operations that check if a bit corresponding to a node index
>> + * is set. This is used by the graph traversal path finding algorithms
>> + * to determine if a node has been visited.
>> + */
>> +
>> +
>> +/* constructor */
>> +Bitfield *Bitfield_new(int bitsNeeded)
>> +{
>> +    int size = (bitsNeeded+7) / 8; /* CHAR_BIT; */
>> +    Bitfield *new = malloc(sizeof(Bitfield));
>> +    if ( !new )
>> +        return(NULL);
>> +    new->bitfield = calloc(size, sizeof(char));
>> +    if ( !new->bitfield )
>> +    {
>> +        free(new);
>> +        return(NULL);
>> +    }
>> +
>> +    new->bitsNeeded = bitsNeeded;
>> +    return new;
>> +}
>> +
>> +/* destructor */
>> +void Bitfield_delete(Bitfield *this)
>> +{
>> +    if ( this )
>> +    {
>> +        if ( this->bitfield )
>> +            free(this->bitfield);
>> +        free(this);
>> +    }
>> +}
>> +
>> +/* Returns true if the specified node has been visited */
>> +bool Bitfield_nodeVisited(Bitfield *this, struct NodeStruct *node)
>> +{
>> +    int index = node->nodeCount >> 3;
>> +    char byte = this->bitfield[index];
>> +    char bit = 1 << (node->nodeCount & 0x07);
>> +    bool set = byte & bit;
>> +
>> +    this->bitfield[index] |= bit;
>> +
>> +    /* printf ( "Inside Bitfield nodeVisited: Node: %d, index %d, 
>> byte %x, bit: %x\n",
>> +             node->nodeCount, index, byte, bit ); */
>> +    return(set);
>> +}
>> +
>> +
>> +/* Makes a byte-by-byte copy of the "from" bitfield */
>> +Bitfield *Bitfield_copy(Bitfield *from)
>> +{
>> +    int i;
>> +
>> +    if ( !from )
>> +        return(NULL);
>> +
>> +    Bitfield *new = Bitfield_new(from->bitsNeeded);
>> +    if ( new )
>> +    {
>> +        for ( i = 0; i*8 < from->bitsNeeded; ++i )
>> +            new->bitfield[i] = from->bitfield[i];
>> +        return(new);
>> +    }
>> +    else
>> +        return(NULL);
>> +}
>> +
>> +
>> +void Bitfield_clear(Bitfield *this)
>> +{
>> +    int size = (this->bitsNeeded+7) / 8;
>> +    memset(this->bitfield, 0, size);
>> +}
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,69 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +#ifndef BITFIELD_H
>> +#define BITFIELD_H
>> +
>> +#include <stdbool.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +
>> +struct NodeStruct;
>> +
>> +/* --------
>> + * Bitfield is a mask around a character pointer. An array of character
>> + * pointers is allocated such that there is a sequence of available bits
>> + * equal in length to the number of nodes in a given graph. Bitfield
>> + * defines operations that check if a bit corresponding to a node index
>> + * is set. This is used by the graph traversal path finding algorithms
>> + * to determine if a node has been visited.
>> + */
>> +
>> +typedef struct BitfieldStruct Bitfield;
>> +
>> +struct BitfieldStruct
>> +{
>> +    int bitsNeeded; /* in BYTES!!! */
>> +    char *bitfield;
>> +};
>> +
>> +
>> +Bitfield *Bitfield_new(int bitsNeeded); /* constructor */
>> +void Bitfield_delete(Bitfield *this); /* destructor */
>> +
>> +/* Returns true if the specified node has been visited */
>> +bool Bitfield_nodeVisited(Bitfield *this, struct NodeStruct *node);
>> +
>> +/* Makes a byte-by-byte copy of the "from" bitfield */
>> +Bitfield *Bitfield_copy(Bitfield *from);
>> +
>> +void Bitfield_clear();
>> +
>> +#endif
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,69 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * configuration.c
>> + *
>> + *  Created on: October 1, 2013
>> + *      Author: Brian "Rig" Rigdon
>> + */
>> +
>> +#include <stdio.h>
>> + #include "configuration.h"
>> +
>> + SearchOptions* SearchOptions_new()
>> + {
>> +    SearchOptions *options = malloc(sizeof(SearchOptions));
>> +    if ( !options )
>> +        return(NULL);
>> +    options->searchType = treeSearch;
>> +    options->multiThreaded = false;
>> +    options->doStatistics = false;
>> +    options->writeOutputFile = false;
>> +    options->outputFile = NULL;
>> +    options->buildType = endNodesOnly;
>> +    return(options);
>> + }
>> +
>> + Configuration* Configuration_new()
>> + {
>> +    Configuration *new = malloc(sizeof(Configuration));
>> +    SearchOptions *options = malloc(sizeof(SearchOptions));
>> +    if ( !new || !options )
>> +    {
>> +        if ( new ) free(new);
>> +        if ( options ) free(options);
>> +        return(NULL);
>> +    }
>> +    new->graphs = NULL;
>> +    new->signatures = NULL;
>> +    new->searchOptions = options;
>> +    new->qThreadCount = 0;
>> +    return(new);
>> + }
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,80 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +
>> +/*
>> + * configuration.h
>> + *
>> + *  Created on: October 1, 2013
>> + *      Author: Brian "Rig" Rigdon
>> + */
>> +
>> +#ifndef CONFIGURATION_H_
>> +#define CONFIGURATION_H_
>> +
>> +#include <stdbool.h>
>> +#include "graph.h"
>> +#include "graphGen.h"
>> +
>> +/* I was hoping to avoid this - however because we are dealing with
>> + * pointers to arrays of pointers, passing the address of an such
>> + * a beast becomes really confusing: Graph *(**pointer)[]
>> + * Ergo, I am building a structure to contain all the information
>> + * necessary for a given running of this software. For lack of
>> + * a better name, we are calling it the "configuration".
>> + */
>> +
>> +/* A simple enum to define which search is to be done */
>> +typedef enum { treeSearch, diagramSearch } SearchType;
>> +
>> +typedef struct SearchOptionsStruct SearchOptions;
>> +struct SearchOptionsStruct
>> +{
>> +    SearchType searchType;
>> +    bool multiThreaded;
>> +    bool doStatistics;
>> +    bool writeOutputFile;
>> +    char *outputFile;
>> +    BuildType buildType;
>> +};
>> +
>> +SearchOptions * SearchOptions_new();
>> +
>> +typedef struct ConfigurationStruct Configuration;
>> +struct ConfigurationStruct
>> +{
>> +    Graph **graphs; /* a pointer to a NULL terminated array of 
>> pointers */
>> +    Signature *signatures; /* a pointer to a NULL terminated array 
>> of Signatures */
>> +    SearchOptions *searchOptions;
>> +    int qThreadCount; /* recursion depth to STOP spawning new tasks */
>> +};
>> +
>> +Configuration* Configuration_new();
>> +
>> +#endif /*  CONFIGURATION_H_  */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,43 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +#include <sys/time.h>
>> +#ifdef USE_OMP
>> +#include <omp.h>
>> +#endif
>> +
>> +extern double currentTime()
>> +{
>> +#ifdef USE_OMP
>> +    return omp_get_wtime();
>> +#else
>> +    return 0;
>> +#endif
>> +}
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,186 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * graph.c
>> + *
>> + *  Created on: Jan 9, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +/* --------
>> + * Graphs are made up of nodes and edges. Nodes hold data and edges
>> + * connect nodes to each other. In this representation, edges are
>> + * directional (they lead from one node to the next) and may create
>> + * looped paths. The data sets from which these graphs are defined
>> + * define two-layered graphs. The outer layer may contain one or
>> + * more interior nodes. These interior nodes may be linked among each
>> + * other. Each containing node may have up to two "entrance" nodes;
>> + * that is, an edge goes from the containing node to its entrance node.
>> + *
>> + * As mentioned above, the graphs are defined in data files. The graph
>> + * data structure contains the file name, a count of nodes, a list of
>> + * exterior nodes, and structures that assist in the searching through
>> + * the graph for "signatures"
>> + */
>> +
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <time.h>
>> +#include <math.h>
>> +
>> +#ifdef USE_OMP
>> +#include <omp.h>
>> +#endif
>> +
>> +#include "graph.h"
>> +#include "systemCallMap.h"
>> +#include "bitfield.h"
>> +#include "utils.h"
>> +
>> +
>> +
>> +
>> +/* -------------------------------------------
>> + * Graph Method Definitions
>> + *
>> + */
>> +/* We deleted the code that made a graph singleton. Now we may have
>> + * more than one graph. Ergo, the main method (or whatever) will 
>> maintain
>> + * the graph pointer.
>> + */
>> +
>> +Graph *Graph_new()
>> +{
>> +    Graph *graph= NULL;
>> +    graph = malloc( sizeof( Graph ));
>> +    if ( graph )
>> +    {
>> +        /* The malloc worked! */
>> +        graph->fileName = NULL;
>> +        graph->totalNodes = 0;
>> +        graph->outerNodes = NULL;
>> +        graph->searchDiagram = NULL;
>> +    }
>> +
>> +    return( graph );
>> +}
>> +
>> +/* Destructor - erases current graph, sets singleton to NULL */
>> +void Graph_delete( Graph *trash )
>> +{
>> +    SearchDiagram *element;
>> +    if ( trash )
>> +    {
>> +        free( trash->fileName );
>> +        NodeList_clear( trash->outerNodes, true );
>> +        if ( trash->searchDiagram ) {
>> +            for ( element = trash->searchDiagram; element->node != 
>> NULL; ++element )
>> +            {
>> +                free( element->edgeReferenceArray );
>> +            }
>> +            free( trash->searchDiagram );
>> +        }
>> +        free( trash );
>> +    }
>> +}
>> +
>> +bool Graph_addOuterNode( Graph *graph, Node *newOuterNode )
>> +{
>> +    /* a little basic error checking */
>> +    if ( !graph || !newOuterNode )
>> +        return (false);
>> +
>> +    /* Is this the first outer node? */
>> +    if ( graph->outerNodes == NULL ) /* Allocates singletonGraph if 
>> it's not there */
>> +        {
>> +        graph->outerNodes = NodeList_new();
>> +            if ( !graph->outerNodes )
>> +                return( false ); /* the malloc failed */
>> +            graph->outerNodes->node = newOuterNode;
>> +            return( true );
>> +        }
>> +
>> +    /* Otherwise, insert the new node at the tail of the singleton 
>> graph */
>> +    return( NodeList_insertBack( graph->outerNodes, newOuterNode ));
>> +}
>> +
>> +
>> +/* Finds a node within the graph. If deep is true, we check interior 
>> nodes as well.
>> + * If deep is false, we only check to see if the id is an outer 
>> node. This does NOT
>> + * find the path to the node.
>> + */
>> +Node *Graph_findNode( Graph *graph, int id, bool deep )
>> +{
>> +    NodeList *nodes;
>> +    Node *node;
>> +
>> +    for ( nodes = graph->outerNodes; nodes != NULL; nodes = 
>> nodes->nextNode )
>> +    {
>> +        if ( nodes->node->id == id )
>> +            return( nodes->node );
>> +        /* If that wasn't the node, and we're going deep, see if 
>> it's there. */
>> +        if ( deep )
>> +        {
>> +            node = Graph_findContainedNode( nodes->node, id );
>> +            if ( node )
>> +                return( node );
>> +        }
>> +    }
>> +
>> +    return( NULL );
>> +}
>> +
>> +
>> +
>> +
>> +/* Determine if a given node contains the node specified by id. If 
>> this problem extended
>> + * beyond two layers, this method would be recursive. Returns NULL 
>> if node is not contained.
>> + * This does NOT find the path to the node.
>> + */
>> +Node *Graph_findContainedNode( Node *node, int id )
>> +{
>> +    NodeList *nodes;
>> +
>> +    for ( nodes = node->interiorNodes; nodes != NULL; nodes = 
>> nodes->nextNode )
>> +    {
>> +        if ( nodes->node->id == id )
>> +            return( nodes->node );
>> +    }
>> +
>> +    return( NULL );
>> +}
>> +
>> +
>> +
>> +
>> +
>> +
>> +/* Search Algorithms */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,101 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +
>> +/*
>> + * Graph.h
>> + *
>> + *  Created on: Jan 9, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +
>> +/* --------
>> + * Graphs are made up of nodes and edges. Nodes hold data and edges
>> + * connect nodes to each other. In this representation, edges are
>> + * directional (they lead from one node to the next) and may create
>> + * looped paths. The data sets from which these graphs are defined
>> + * define two-layered graphs. The outer layer may contain one or
>> + * more interior nodes. These interior nodes may be linked among each
>> + * other. Each containing node may have up to two "entrance" nodes;
>> + * that is, an edge goes from the containing node to its entrance node.
>> + *
>> + * As mentioned above, the graphs are defined in data files. The graph
>> + * data structure contains the file name, a count of nodes, a list of
>> + * exterior nodes, and structures that assist in the searching through
>> + * the graph for "signatures"
>> + */
>> +
>> +#ifndef GRAPH_H_
>> +#define GRAPH_H_
>> +
>> +#include <stdbool.h> /* bool is no longer part of the C language */
>> +#include "node.h"
>> +#include "searchDiagram.h"
>> +#include "systemCallMap.h"
>> +
>> +
>> +/* -------------------------------------------
>> + * Graph Definitions
>> + *
>> + */
>> +
>> +typedef struct GraphStruct Graph;
>> +
>> +struct GraphStruct
>> +{
>> +    char *fileName; /* the file parsed to give us this graph */
>> +    int totalNodes; /* Nodes, both outer and interior */
>> +    NodeList *outerNodes; /* The Linked-List capture of the node data */
>> +    SearchDiagram *searchDiagram; /* The compressed Node/Edge search 
>> structures */
>> +    SystemCallMap *systemCallMap;
>> +};
>> +
>> +
>> +/* "methods" */
>> +
>> +Graph *Graph_new(); /* Graph constructor */
>> +void Graph_delete( Graph *trash ); /* Destructor - erases current 
>> graph */
>> +bool Graph_addOuterNode( Graph *graph, Node *newOuterNode );
>> +/* Finds a node within the graph. If deep is true, we check interior 
>> nodes as well.
>> + * If deep is false, we only check to see if the id is an outer 
>> node. This does NOT
>> + * find the path to the node.
>> + */
>> +Node *Graph_findNode( Graph *graph, int id, bool deep );
>> +
>> +
>> +
>> +/* Determine if a given node contains the node specified by id. If 
>> this problem extended
>> + * beyond two layers, this method would be recursive. Returns NULL 
>> if node is not contained.
>> + * This does NOT find the path to the node.
>> + */
>> +Node *Graph_findContainedNode( Node *node, int id );
>> +
>> +
>> +#endif /* GRAPH_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,195 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * graphGen.c
>> + *
>> + *  Created on: Aug 2, 2013
>> + *      Author: jbrigdo
>> + */
>> +
>> +#include <stdbool.h>
>> +#include <stdio.h>
>> +#include "graphGen.h"
>> +#include "vectorUtils.h"
>> +
>> +
>> +/* getDuplicateNodeForGraph takes a node from another graph and sees if
>> + * a duplicate has previously been created for this graph. If not, 
>> it tries
>> + * to create and insert a new duplicate. If that fails, we're out of 
>> memory.
>> + * In that circumstance, we have a significant error condition. It is
>> + * time to delete the graph being built and report that error to the
>> + * calling method (buildGraphFromPaths).
>> + */
>> +static Node *getDuplicateNodeForGraph(Graph *graph, Node *from)
>> +{
>> +    Node *newNode = Graph_findNode(graph, from->id, true); /* true 
>> == deep search */
>> +    if ( newNode )
>> +        return(newNode);
>> +
>> +    /* else */
>> +    newNode = Node_duplicate(from, graph->totalNodes++ ); /* POST 
>> increment */
>> +    if ( newNode )
>> +    {
>> +        Graph_addOuterNode(graph,newNode); /* all nodes are exterior 
>> in this graph */
>> +        newNode->type = exteriorNode;
>> +        return(newNode);
>> +    }
>> +
>> +    /* else */
>> +    Graph_delete(graph); /* Failure is DESTRUCTIVE at this point */
>> +    return NULL;
>> +}
>> +
>> +
>> +Graph *buildGraphFromPaths(NodeVecVec **pathList, BuildType build)
>> +{
>> +    Graph *newGraph = Graph_new();
>> +    Node *pathNode; /* The node we're looking at in the path */
>> +    Node *currentNode;
>> +    Node *nextNode;
>> +    int i; /* Iterator through the path List array */
>> +    int j; /* Iterator through each path List */
>> +    int k; /* Iterator through each path in the path List */
>> +
>> +    if ( !pathList || !newGraph )
>> +        return(NULL);
>> +
>> +    for ( i = 0; pathList[i] ; ++i )
>> +    {
>> +        for (j = 0; j < pathList[i]->contentSize; ++j)
>> +        {
>> +            pathNode = pathList[i]->vector[j]->vector[0];
>> +            currentNode = getDuplicateNodeForGraph(newGraph, pathNode);
>> +            if ( !currentNode )
>> +                return(NULL); /* out of memory: crashing! newGraph 
>> has already been cleaned up */
>> +
>> +            for ( k = 1; k < pathList[i]->vector[j]->contentSize; 
>> ++k /*also incremented below*/ )
>> +            {
>> +                if ( build == endNodesOnly )
>> +                {
>> +                    k = pathList[i]->vector[j]->contentSize - 1;
>> +                }
>> +                else if ( build == labeledNodes )
>> +                {
>> +                    while ( 
>> pathList[i]->vector[j]->vector[k]->labelIdx < 0 )
>> +                        ++k;
>> +                }
>> +                /* else if ( build == completePath ) no-op */
>> +
>> +                pathNode = pathList[i]->vector[j]->vector[k];
>> +                nextNode = getDuplicateNodeForGraph(newGraph, pathNode);
>> +                if ( !nextNode )
>> +                    return(NULL); /* out of memory: crashing! 
>> newGraph has already been cleaned up */
>> +                Node_addEdgeToNode(currentNode, nextNode);
>> +                // printf ( "Adding edge: %d ==> %d\n", 
>> currentNode->id, nextNode->id );
>> +                currentNode = nextNode;
>> +            }
>> +        }
>> +    }
>> +
>> +    return(newGraph);
>> +}
>> +
>> +
>> +/* Write the given graph to a file */
>> +bool exportGraph(Graph *graph, char *fileName)
>> +{
>> +    FILE *out = NULL;
>> +    NodeList *nodes = NULL;
>> +    EdgeList *edges = NULL;
>> +    int nodeCount = 0;
>> +
>> +    if ( !graph || !fileName ) /* A little basic error checking */
>> +        return(false);
>> +
>> +    out = fopen(fileName, "w");
>> +
>> +    if ( !out ) /* A little more basic error checking */
>> +        return(false);
>> +
>> +    /* Write out the header */
>> +    /* ... find out how many functions (outer nodes) the graph holds */
>> +    for ( nodes = graph->outerNodes; nodes != NULL; nodes = 
>> nodes->nextNode )
>> +    {
>> +        ++nodeCount;
>> +    }
>> +    fprintf(out, "Functions: %d\n", nodeCount);
>> +    fprintf(out, "Basic blocks: %d\n\n", graph->totalNodes);
>> +
>> +    /* First, write out the graph's outer nodes */
>> +    for ( nodes = graph->outerNodes; nodes != NULL; nodes = 
>> nodes->nextNode )
>> +    {
>> +        fprintf(out, "%d ", nodes->node->id);
>> +        //printf("Node: %d ", nodes->node->id);
>> +        if ( nodes->node->edges )
>> +        {
>> +            nodeCount = 0;
>> +            /* Wow is this inefficient, but two passes is the 
>> easiest way to do it. */
>> +            for ( edges = nodes->node->edges; edges != NULL; edges = 
>> edges->nextEdge )
>> +            {
>> +                if ( edges->targetNode->type == exteriorNode )
>> +                    ++nodeCount;
>> +            }
>> +            fprintf(out, "%d ", nodeCount);
>> +            //printf("has %d edges: ", nodeCount);
>> +            for ( edges = nodes->node->edges; edges != NULL; edges = 
>> edges->nextEdge )
>> +                {
>> +                    if ( edges->targetNode->type == exteriorNode )
>> +                    {
>> +                        fprintf(out, "%d ", edges->targetNodeId);
>> +                        //printf("%d, ", edges->targetNodeId);
>> +                    }
>> +                }
>> +            fprintf(out, "\n");
>> +            //printf("\n");
>> +        }
>> +        else
>> +        {
>> +            fprintf(out, "0 \n" );
>> +            //printf(" no edges.\n");
>> +        }
>> +    }
>> +
>> +    /* then, for each of the outer nodes, write out its interior 
>> nodes (if any) */
>> +    /* We are skipping this for the time being. This currently is 
>> being called with flat graphs. */
>> +
>> +    /* Finally, write out the labels. */
>> +    fprintf(out, "-------------------------------------------- 
>> \nSYSTEM CALLS \n\n");
>> +
>> +    for ( nodes = graph->outerNodes; nodes != NULL; nodes = 
>> nodes->nextNode )
>> +    {
>> +        if ( nodes->node->label != NULL )
>> +            fprintf(out, "%d %s \n", nodes->node->id, 
>> nodes->node->label );
>> +        /* If we were worried about interior nodes, we'd need a 
>> duplicate loop here. */
>> +    }
>> +
>> +    return(true);
>> +
>> +}
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,52 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * graphGen.h
>> + *
>> + *  Created on: Aug 2, 2013
>> + *      Author: J. Brian Rigdon
>> + */
>> +
>> +#ifndef GRAPHGEN_H
>> +#define GRAPHGEN_H
>> +
>> +#include "graph.h"
>> +
>> +typedef enum { endNodesOnly, labeledNodes, completePath } BuildType;
>> +
>> +Graph *buildGraphFromPaths(NodeVecVec **pathList, BuildType build);
>> +
>> +/* Write the given graph to a file */
>> +bool exportGraph(Graph *graph, char *fileName);
>> +
>> +
>> +
>> +
>> +#endif /* GRAPHGEN_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,361 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * main.c
>> + *
>> + *  Created on: Jan 9, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +
>> +#include <string.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <ctype.h>
>> +#include <unistd.h>
>> +#include <stdbool.h>
>> +#include <math.h>
>> +#include "parsing.h"
>> +#include "utils.h"
>> +#include "searchAlgorithms.h"
>> +#include "vectorUtils.h"
>> +#include "statistics.h"
>> +#include "configuration.h"
>> +
>> +#ifdef QT
>> +   #include "qThreadSearch.h"
>> +#endif /* QT */
>> +
>> +extern double currentTime();
>> +
>> +#define helpString "\nUsage: PathFinder.exe [OPTIONS] [<fileName>]\n\n\
>> +  Operation:\n\
>> +    -c  <config file>   use configuration file\n\
>> +    -i  <data file>     interactive search of specified data file\n\
>> +    -x  <data file>     exhaustive leg search (any label to any 
>> label) of data file\n\n\
>> +  Other:\n\
>> +    -o  <output file>   save optimized graph to file\n\
>> +    -h,u                prints this help message.\n\
>> +    -q  <depth>         use qthread parallelism (config file only). 
>> The depth value\n\
>> +                        specifies how deep in recursion to continue 
>> spawning new tasks\n\
>> +                        during searches\n\
>> +    -y                  create YAML output\n"
>> +
>> +/* Forward declarations so that main is the first function we read */
>> +void runBatch(char *configFile, Configuration *config);
>> +void runInteractively(char *fileName, Configuration *config);
>> +void exhaustiveLegSearch(char *fileName, Configuration *config);
>> +
>> +int main(int argc, char *argv[])
>> +{
>> +    char defaultFile[] = "MicroTestData.adj_list";
>> +    char *fileName = NULL;
>> +    Configuration *config = Configuration_new();
>> +    signed char c;
>> +    int cFlag = 0; // Why did I make these ints instead of bool? JBR 
>> - 10/25/13
>> +    int iFlag = 0;
>> +    int xFlag = 0;
>> +    int tFlag = 0;
>> +    int dFlag = 0;
>> +    int oFlag = 0;
>> +    bool qFlag = 0;
>> +    int qCount = 0;
>> +    char commandLine[200];
>> +    int i;
>> +
>> +        printf ( "\n\n"
>> +    "        PathFinder: finding a series of labeled nodes within a\n"
>> +    "                two-layer directed, cyclic graph.\n"
>> +    "               Copyright (2013) Sandia Corporation\n"
>> +    "\n"
>> +    " Sandia National Laboratories is a multi-program laboratory 
>> managed and\n"
>> +    " operated by Sandia Corporation, a wholly owned subsidiary of 
>> Lockheed\n"
>> +    " Martin Corporation, for the U.S. Department of Energy's 
>> National Nuclear\n"
>> +    " Security Administration under terms of Contract 
>> DE-AC04-94AL85000,\n"
>> +    " there is a non-exclusive license for use of this work by or on 
>> behalf\n"
>> +    " of the U.S. Government. Export of this program may require a 
>> license \n"
>> +    " from the United States Government.\n\n\n" );
>> +
>> +    #ifdef DEBUG
>> +        printf("\tRunning debug build\n\n");
>> +    #endif
>> +    #ifdef OPENMP
>> +        printf("\tRunning Open MP build\n\n");
>> +    #endif
>> +    #ifdef QT
>> +        printf("\tRunning Q Thread build\n\n");
>> +    #endif
>> +
>> +    if ( !config )
>> +    {
>> +        printf("Error: Could not allocation configuration 
>> structure.\n\n\t---Exiting\n\n");
>> +        exit(0);
>> +    }
>> +
>> +    if ( argc < 2 )
>> +    {
>> +        exhaustiveLegSearch(defaultFile, config);
>> +    }
>> +    else
>> +    {
>> +        while ( (c = getopt(argc, argv, "c:i:x:o:q:huy")) != -1 )
>> +        {
>> +            switch (c)
>> +            {
>> +            case '?': /* we had a problem */
>> +                if ( optopt == 'c' )
>> +                    fprintf(stderr, "\tPlease specify configuration 
>> file.\n\n");
>> +                else if ( optopt == 'i' || optopt == 'x' )
>> +                    fprintf(stderr, "\tPlease specify data file.\n\n");
>> +                else if ( optopt == 'o' )
>> +                    fprintf(stderr, "\tPlease specify output graph 
>> data file.\n\n");
>> +                else if ( optopt == 'q' )
>> +                    fprintf(stderr, "\tPlease specify recursion 
>> depth to keep spawning tasks.\n\n");
>> +                return(1);
>> +                break; /* Superfluous, I know */
>> +            case 'h':
>> +            case 'u':
>> +                printf ("\n%s\n\n", helpString);
>> +                return(0); /* Nothing else matters */
>> +                break; /* Superfluous, I know. */
>> +            case 'c': /* configuration file */
>> +                fileName = optarg;
>> +                cFlag = 1;
>> +                break;
>> +            case 'i': /* interactive */
>> +                fileName = optarg;
>> +                iFlag = 1;
>> +                break;
>> +            case 'x': /* exhaustive leg search */
>> +                fileName = optarg;
>> +                xFlag = 1;
>> +                break;
>> +            case 'o': /* Save optimized paths in a new graph 
>> definition data file */
>> +                config->searchOptions->outputFile = optarg;
>> +                config->searchOptions->writeOutputFile = true;
>> +                oFlag = 1;
>> +                break;
>> +            case 's':
>> +                config->searchOptions->doStatistics = true;
>> +                break;
>> +            case 'q':
>> +                qCount = atoi(optarg);
>> +                if ( qCount < 1 )
>> +                    qCount =  1;
>> +                config->qThreadCount = qCount;
>> +                break;
>> +            case 'y':
>> +                if ( commandLine != NULL )
>> +                {
>> +                    YAMLOpen();
>> +                    commandLine[0] = '\0';
>> +                    for ( i = 0; i < argc; ++i )
>> +                        sprintf(commandLine, "%s %s", commandLine, 
>> argv[i] );
>> +                    YAMLWriteString("Command", commandLine+1);
>> +                }
>> +                break;
>> +            default :
>> +                break;
>> +            }
>> +        }
>> +
>> +        /* Debug --* /
>> +        if (cFlag) printf ("cFlag ");
>> +        if (iFlag) printf ("iFlag ");
>> +        if (xFlag) printf ("xFlag ");
>> +        if (oFlag) printf ("oFlag ");
>> +        if (fileName) printf ( " - %s", fileName );
>> +        if (outFile) printf ( " - %s", outFile);
>> +        printf ("\n");
>> +        / *-- End Debug */
>> +
>> +        if ( (cFlag+iFlag+xFlag) > 1 )
>> +        {
>> +            fprintf(stderr, "-c -i and -x are mutually exclusive, 
>> PathFinder can only do one of those.\n\n");
>> +            return(1);
>> +        }
>> +
>> +        if ( (cFlag+iFlag+xFlag) == 0 )
>> +        {
>> +            fprintf(stderr, "-c (config file) -i (interactive) or -x 
>> (exhaustive) must be specified.\n\n");
>> +            return(1);
>> +        }
>> +
>> +        if ( oFlag && !xFlag )
>> +        {
>> +            fprintf(stderr, "-o (optimized graph output) is only 
>> compatible with -x (exhaustive searches).\n\n");
>> +            return(1);
>> +        }
>> +
>> +        if ( cFlag )
>> +            runBatch(fileName, config);
>> +        else if ( iFlag )
>> +            runInteractively(fileName, config);
>> +        else
>> +        {
>> +            exhaustiveLegSearch(fileName, config);
>> +        }
>> +    }
>> +
>> +    YAMLClose(); /* works even if YAML logging isn't present */
>> +    return(0); /* zero means no error */
>> +}
>> +
>> +void runBatch(char *configFile, Configuration *config)
>> +{
>> +    bool success;
>> +    int i;
>> +    int j;
>> +    double tick, tock;
>> +    int hours;
>> +    int min;
>> +    double sec;
>> +
>> +    if ( !configFile )
>> +    {
>> +        printf("Error: No config file entered.\n\n\t---Exiting---");
>> +        exit(0);
>> +    }
>> +
>> +    // printf("config file: %s\n", configFile);
>> +
>> +    tick = currentTime();
>> +    success = parseConfigFile(configFile, config);
>> +    tock = currentTime();
>> +    sec = tock-tick;
>> +    hours = (int)sec/3600;
>> +    sec = fmod( sec, 3600.0 );
>> +    min = (int)sec/60;
>> +    sec = fmod(sec, 60.0);
>> +    printf ("\n\nOverall Parse Time: %02d:%02d:%02.3f\n", hours, 
>> min, sec);
>> +
>> +    /* Debug --* /
>> +    for ( i = 0; config->signatures[i] != NULL; ++i );
>> +    for ( j = 0; config->graphs[j] != NULL; ++j );
>> +    printf( "%d files, %d signatures \n", j, i );
>> +    exit(1);
>> +    / *-- End Debug */
>> +
>> +    if ( success )
>> +    {
>> +    #ifdef QT
>> +        doMultiSearchesQT(config);
>> +    #else
>> +        doMultiSearches(config);
>> +    #endif
>> +    }
>> +
>> +    printf ("\n\nSearches complete.\n");
>> +}
>> +
>> +
>> +void runInteractively(char *fileName, Configuration *config)
>> +{
>> +    char stringBuffer[200];
>> +    Graph *graph;
>> +    char *labels[25]; /* Do we need an interactive signature bigger 
>> than 25? */
>> +    NodePtrVec *path = NULL;
>> +    bool success = false;
>> +    int i, j;
>> +    int fullIntSignature[3] = { 0, 0, -1 };
>> +
>> +
>> +    graph = parseFile(fileName);
>> +
>> +    if ( !graph )
>> +        return;
>> +
>> +    while ( 1 )
>> +    {
>> +        i = 0;
>> +        do {
>> +
>> +            printf("\nPlease insert a node label for this signature 
>> (\"\" to complete, \"bail\" to exit):\n");
>> +            gets(stringBuffer);
>> +
>> +            if ( strcmp (stringBuffer, "bail") == 0 )
>> +                exit(1);
>> +
>> +            if ( strcmp(stringBuffer, "") != 0 )
>> +            {
>> +                labels[i] = strdup(stringBuffer);
>> +                ++i;
>> +            }
>> +
>> +        } while ( i < 25 && strcmp(stringBuffer, "") != 0 );
>> +
>> +        labels[i] = NULL;
>> +
>> +        /* Debug */
>> +        printf("\nSignature: ");
>> +        for ( j = 0; j < i; ++j )
>> +        {
>> +            printf("'%s'", labels[j]);
>> +            if ( j < i-1 )
>> +                printf(" -> ");
>> +            else
>> +                printf("\n\n");
>> +        }
>> +        /* end debug */
>> +
>> +        path = NodePtrVec_new(50);
>> +        success = findLabelPath(graph, (Signature)labels, path, 
>> config->searchOptions->searchType);
>> +
>> +        /* Sanity check to verify that a valid path exists */
>> +        if( success )
>> +        {
>> +            /* printStack ( path ); */
>> +            printf ("Found, resultant path has %d steps.\n", 
>> path->contentSize);
>> +        }
>> +        else
>> +            printf("\n\tPath not found for signature.\n");
>> +
>> +        NodePtrVec_delete(path);
>> +    }
>> +
>> +}
>> +
>> +void exhaustiveLegSearch(char *fileName, Configuration *config)
>> +{
>> +    Graph *graph;
>> +    int found;
>> +
>> +    graph = parseFile(fileName);
>> +
>> +    if ( !graph || !config )
>> +        return;
>> +
>> +    if ( config->searchOptions->outputFile == NULL )
>> +        found = findAllPossibleLegs(graph, 
>> config->searchOptions->searchType);
>> +    else
>> +        found = findAndLogAllPossibleLegs(graph, config->searchOptions);
>> +    printf("\n\nTotal %d legs found\n\n", found);
>> +    Graph_delete(graph);
>> +}
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,6153 @@
>> +Functions: 500
>> +Basic blocks: 3463
>> +
>> +0 0
>> +32000000 0
>> +34900000 0
>> +4600000 0
>> +39500000 0
>> +44100000 0
>> +48700000 0
>> +15700000 0
>> +36800000 0
>> +41400000 0
>> +18600000 0
>> +6300000 0
>> +46000000 0
>> +2300000 0
>> +3800000 0
>> +38700000 0
>> +43300000 0
>> +47900000 0
>> +18000000 0
>> +12600000 0
>> +31400000 0
>> +1100000 0
>> +36000000 0
>> +5700000 0
>> +40600000 0
>> +45200000 0
>> +20900000 0
>> +19500000 0
>> +24100000 0
>> +28700000 0
>> +33300000 0
>> +3000000 0
>> +37900000 0
>> +17400000 0
>> +6100000 0
>> +7600000 0
>> +42500000 0
>> +12200000 0
>> +47100000 0
>> +16800000 0
>> +21400000 0
>> +26000000 0
>> +20300000 0
>> +300000 0
>> +35200000 0
>> +4900000 0
>> +39800000 0
>> +43100000 0
>> +9500000 0
>> +44400000 0
>> +14100000 0
>> +49000000 0
>> +18700000 0
>> +23200000 0
>> +22000000 0
>> +23300000 0
>> +27900000 0
>> +2200000 0
>> +37100000 0
>> +49800000 0
>> +6800000 0
>> +30600000 0
>> +21000000 0
>> +11400000 0
>> +1800000 0
>> +19700000 0
>> +46300000 0
>> +16000000 0
>> +20600000 0
>> +25200000 0
>> +29800000 0
>> +34400000 0
>> +22600000 0
>> +5900000 0
>> +4100000 0
>> +39000000 0
>> +8700000 0
>> +43600000 0
>> +13300000 0
>> +48200000 0
>> +17900000 0
>> +22500000 0
>> +25500000 0
>> +27100000 0
>> +31700000 0
>> +1400000 0
>> +36300000 0
>> +6000000 1 37500000
>> +40900000 0
>> +10600000 0
>> +45500000 0
>> +15200000 0
>> +9200000 0
>> +5800000 0
>> +19800000 0
>> +24400000 0
>> +29000000 0
>> +33600000 0
>> +3300000 0
>> +38200000 0
>> +24900000 0
>> +7900000 0
>> +42800000 0
>> +12500000 1 33700000
>> +47400000 0
>> +17100000 19 1700000 6600000 41500000 27400000 23500000 37800000 
>> 5500000 14800000 42700000 10100000 36500000 12700000 25200000 
>> 31000000 26900000 32700000 28200000 6300000 29300000
>> +21700000 0
>> +26300000 0
>> +30900000 0
>> +27800000 0
>> +28100000 0
>> +600000 0
>> +35500000 0
>> +5200000 0
>> +40100000 0
>> +9800000 0
>> +44700000 0
>> +14400000 0
>> +49300000 0
>> +19000000 0
>> +11500000 0
>> +23600000 0
>> +28200000 0
>> +32800000 0
>> +2500000 0
>> +37400000 0
>> +7100000 0
>> +42000000 0
>> +11700000 0
>> +8000000 0
>> +31200000 0
>> +34700000 0
>> +30100000 0
>> +4400000 1 29100000
>> +39300000 0
>> +43900000 0
>> +48500000 0
>> +13800000 0
>> +24700000 0
>> +36600000 0
>> +40200000 0
>> +41200000 0
>> +10900000 0
>> +45800000 0
>> +29500000 0
>> +3600000 0
>> +38500000 0
>> +32400000 0
>> +8600000 1 40800000
>> +12800000 0
>> +47700000 0
>> +16100000 1 15400000
>> +900000 0
>> +35800000 0
>> +40400000 0
>> +10100000 0
>> +45000000 0
>> +14700000 0
>> +49600000 0
>> +19300000 0
>> +31800000 0
>> +14900000 1 30900000
>> +28500000 0
>> +33100000 0
>> +2800000 0
>> +37700000 0
>> +7400000 0
>> +42300000 0
>> +12000000 0
>> +46900000 0
>> +15500000 0
>> +16600000 0
>> +21200000 0
>> +25800000 0
>> +30400000 0
>> +100000 0
>> +35000000 0
>> +18400000 0
>> +8400000 0
>> +39600000 0
>> +9300000 0
>> +44200000 0
>> +13900000 0
>> +48800000 0
>> +18500000 0
>> +23100000 0
>> +27700000 0
>> +34100000 0
>> +32300000 0
>> +2000000 0
>> +36900000 0
>> +6600000 0
>> +41500000 0
>> +11200000 0
>> +46100000 0
>> +15800000 0
>> +24200000 0
>> +33900000 0
>> +20400000 0
>> +25000000 0
>> +29600000 0
>> +34200000 0
>> +3900000 0
>> +38800000 0
>> +8500000 0
>> +20700000 0
>> +13100000 0
>> +48000000 0
>> +17700000 0
>> +22300000 0
>> +26900000 0
>> +31500000 0
>> +17200000 0
>> +27400000 0
>> +1200000 0
>> +36100000 0
>> +40700000 0
>> +10400000 0
>> +45300000 0
>> +15000000 0
>> +49900000 0
>> +49500000 0
>> +19600000 0
>> +30300000 0
>> +11100000 0
>> +20100000 0
>> +28800000 0
>> +33400000 0
>> +3100000 1 34600000
>> +38000000 0
>> +7700000 0
>> +42600000 0
>> +12300000 0
>> +47200000 0
>> +23000000 0
>> +1700000 0
>> +16900000 0
>> +46600000 0
>> +37000000 0
>> +17800000 0
>> +8200000 0
>> +21500000 0
>> +26100000 0
>> +30700000 0
>> +400000 0
>> +35300000 0
>> +5000000 0
>> +39900000 0
>> +9600000 0
>> +44500000 0
>> +14200000 0
>> +49100000 0
>> +18800000 0
>> +23400000 0
>> +28000000 0
>> +22400000 0
>> +27200000 0
>> +37200000 0
>> +6900000 0
>> +41800000 0
>> +46400000 0
>> +25300000 0
>> +34500000 1 8100000
>> +39100000 0
>> +43700000 0
>> +9000000 1 7000000
>> +1500000 0
>> +48300000 0
>> +5500000 0
>> +36400000 0
>> +41000000 0
>> +45600000 0
>> +27600000 0
>> +7800000 0
>> +33700000 0
>> +3400000 0
>> +38300000 0
>> +42900000 0
>> +41700000 0
>> +47500000 0
>> +11300000 0
>> +21800000 1 1300000
>> +26400000 0
>> +31000000 0
>> +700000 0
>> +35600000 0
>> +5300000 0
>> +27000000 0
>> +4500000 0
>> +9900000 0
>> +44800000 0
>> +14500000 0
>> +49400000 0
>> +19100000 0
>> +23700000 0
>> +28300000 0
>> +29900000 0
>> +32900000 0
>> +2600000 0
>> +37500000 0
>> +7200000 0
>> +42100000 0
>> +11800000 0
>> +46700000 0
>> +16400000 0
>> +13600000 0
>> +26800000 0
>> +25600000 0
>> +30200000 0
>> +34800000 0
>> +39400000 0
>> +9100000 0
>> +44000000 0
>> +29300000 0
>> +13700000 0
>> +48600000 0
>> +18300000 0
>> +22900000 0
>> +27500000 0
>> +32100000 0
>> +32200000 0
>> +10700000 0
>> +6400000 0
>> +41300000 0
>> +11000000 0
>> +45900000 0
>> +15600000 0
>> +20200000 1 31600000
>> +24800000 0
>> +15900000 0
>> +29400000 73 48400000 17800000 29100000 10700000 36800000 15100000 
>> 30200000 10400000 2200000 18400000 26600000 35900000 32400000 
>> 41700000 12600000 9100000 2100000 14900000 46900000 900000 23000000 
>> 9000000 7800000 17100000 48500000 5400000 37100000 24000000 17000000 
>> 13500000 10000000 21600000 30900000 36200000 10500000 46000000 600000 
>> 40900000 34300000 2900000 21500000 43600000 27300000 45900000 
>> 49800000 28400000 34200000 49300000 30500000 13200000 35300000 
>> 6200000 28300000 34100000 1500000 37500000 22700000 4900000 36300000 
>> 45600000 43700000 33800000 22300000 44400000 5900000 46700000 
>> 47200000 18800000 4600000 35000000 31500000 40800000 37300000
>> +34000000 0
>> +3700000 0
>> +38600000 0
>> +8300000 0
>> +43200000 0
>> +12900000 169 32000000 25600000 14000000 37200000 9200000 46400000 
>> 48700000 16100000 30100000 4400000 39300000 6700000 41600000 27600000 
>> 11300000 15900000 18200000 20500000 39100000 41400000 25100000 
>> 5800000 3900000 29700000 13400000 36700000 15700000 18000000 20300000 
>> 38900000 43500000 27200000 48100000 31800000 15500000 40700000 
>> 24700000 8400000 43400000 31600000 15300000 1300000 3600000 22200000 
>> 38800000 15000000 45400000 31400000 33700000 36000000 19700000 
>> 22000000 5700000 28900000 36900000 33500000 17200000 35800000 3200000 
>> 45000000 47300000 700000 35600000 5300000 46200000 26100000 42500000 
>> 47100000 33100000 35400000 19100000 2800000 5000000 42300000 26000000 
>> 9700000 26700000 14300000 16600000 300000 18900000 21200000 43100000 
>> 25800000 23900000 100000 2400000 26400000 24400000 27900000 11600000 
>> 16200000 34800000 18500000 20800000 23100000 6800000 1800000 21300000 
>> 7400000 30000000 34600000 18300000 2000000 8900000 43800000 27500000 
>> 32100000 15800000 34400000 3400000 7500000 6400000 11000000 13300000 
>> 31900000 15600000 17900000 20200000 41100000 24800000 35100000 
>> 27100000 45700000 13100000 31700000 34000000 17700000 3700000 
>> 24600000 43200000 10600000 29200000 1200000 30600000 3500000 43000000 
>> 45300000 47600000 31300000 49900000 33600000 49500000 3300000 
>> 21900000 48900000 12500000 19400000 21700000 26300000 26200000 
>> 26500000 16900000 19200000 5200000 42400000 44700000 14400000 
>> 16700000 400000 48300000 7300000 25900000 44500000 46800000 49100000 
>> 21100000 23400000 11700000
>> +47800000 0
>> +31600000 0
>> +26600000 0
>> +22100000 0
>> +26700000 0
>> +31300000 0
>> +1000000 0
>> +35900000 0
>> +5600000 0
>> +40500000 0
>> +15300000 0
>> +10200000 0
>> +45100000 0
>> +14800000 0
>> +49700000 0
>> +19400000 0
>> +24000000 0
>> +28600000 0
>> +18200000 0
>> +10500000 0
>> +33200000 0
>> +2900000 0
>> +37800000 0
>> +7500000 0
>> +42400000 0
>> +12100000 0
>> +47000000 0
>> +16700000 0
>> +21300000 0
>> +1900000 0
>> +25900000 0
>> +30500000 0
>> +200000 0
>> +35100000 0
>> +4800000 0
>> +39700000 0
>> +9400000 0
>> +44300000 0
>> +17600000 0
>> +4000000 0
>> +48900000 0
>> +2100000 0
>> +20500000 0
>> +6700000 0
>> +41600000 0
>> +46200000 0
>> +4200000 0
>> +10300000 0
>> +36700000 0
>> +17500000 0
>> +34300000 0
>> +38900000 0
>> +43500000 0
>> +48100000 0
>> +19900000 0
>> +43400000 0
>> +14600000 0
>> +1300000 0
>> +36200000 0
>> +40800000 0
>> +22800000 0
>> +13400000 0
>> +45400000 0
>> +15100000 0
>> +24300000 0
>> +6500000 0
>> +33500000 0
>> +3200000 0
>> +38100000 0
>> +42700000 0
>> +12400000 1 26200000
>> +47300000 0
>> +17000000 0
>> +21600000 0
>> +22200000 0
>> +32500000 0
>> +26200000 0
>> +30800000 0
>> +500000 0
>> +35400000 0
>> +5100000 0
>> +40000000 0
>> +9700000 0
>> +44600000 0
>> +25100000 0
>> +14300000 0
>> +49200000 0
>> +18900000 0
>> +23500000 0
>> +32700000 16 17600000 21000000 3800000 48000000 47700000 39800000 
>> 28700000 38000000 37700000 34500000 1600000 39400000 22500000 9400000 
>> 11100000 37600000
>> +2400000 1 16400000
>> +37300000 0
>> +8800000 0
>> +13200000 0
>> +7000000 0
>> +41900000 0
>> +11600000 0
>> +46500000 0
>> +16200000 0
>> +20800000 0
>> +25400000 0
>> +24500000 0
>> +30000000 0
>> +34600000 0
>> +4300000 0
>> +39200000 0
>> +8900000 0
>> +43800000 0
>> +13500000 0
>> +48400000 0
>> +18100000 0
>> +33800000 0
>> +29100000 0
>> +22700000 0
>> +27300000 0
>> +31900000 0
>> +1600000 0
>> +36500000 0
>> +6200000 0
>> +41100000 0
>> +4700000 0
>> +10800000 0
>> +45700000 0
>> +15400000 0
>> +20000000 0
>> +24600000 0
>> +29200000 0
>> +14000000 0
>> +13000000 0
>> +3500000 0
>> +38400000 0
>> +8100000 1 3100000
>> +43000000 0
>> +23900000 0
>> +12700000 0
>> +47600000 0
>> +17300000 0
>> +21900000 0
>> +29700000 0
>> +26500000 0
>> +31100000 0
>> +800000 0
>> +35700000 132 0 31200000 32600000 18600000 2300000 39500000 23200000 
>> 6900000 44100000 27800000 34700000 28500000 1900000 6500000 8800000 
>> 42600000 20700000 17500000 36600000 22600000 10900000 29500000 
>> 11900000 20100000 22400000 41000000 43300000 27000000 13000000 
>> 24200000 14600000 33900000 19900000 38500000 19600000 48600000 
>> 17400000 1100000 42900000 47500000 49700000 19500000 38100000 
>> 40400000 14700000 33300000 3000000 37900000 33400000 34900000 7600000 
>> 9900000 44800000 30800000 49400000 16800000 500000 21400000 5100000 
>> 12000000 12300000 49200000 32900000 35200000 47900000 4700000 
>> 11800000 16400000 18700000 13600000 36400000 41900000 46500000 
>> 48800000 40200000 11400000 44000000 40500000 16000000 20600000 
>> 46100000 29800000 9800000 32300000 20400000 39000000 41300000 
>> 29600000 30300000 29400000 15400000 20000000 6000000 8300000 10800000 
>> 21800000 36100000 19800000 38400000 22100000 17300000 38200000 
>> 5600000 23300000 42800000 10200000 47400000 800000 7000000 28100000 
>> 33200000 46600000 37000000 8200000 23800000 47000000 33000000 
>> 19000000 2700000 16300000 23600000 42200000 14200000 32800000 2500000 
>> 37400000 4800000 39700000 7100000 42000000 25700000 44300000
>> +5400000 1 42700000
>> +40300000 0
>> +10000000 0
>> +44900000 0
>> +32600000 0
>> +28900000 0
>> +19200000 0
>> +23800000 0
>> +28400000 1 42600000
>> +33000000 0
>> +2700000 0
>> +37600000 0
>> +16300000 0
>> +7300000 0
>> +42200000 0
>> +11900000 0
>> +46800000 88 12800000 8000000 41800000 13800000 9300000 25300000 
>> 29900000 32200000 4200000 22800000 44200000 10300000 4000000 8600000 
>> 45800000 43900000 38700000 6100000 24500000 45200000 25400000 
>> 38300000 24300000 20900000 24100000 12400000 49600000 19300000 
>> 28600000 4500000 12200000 14500000 40000000 23700000 44600000 
>> 13900000 2600000 7200000 42100000 9500000 30400000 14100000 49000000 
>> 39200000 41200000 39600000 27700000 32500000 46300000 4300000 
>> 22900000 11200000 18100000 29000000 45100000 4100000 25000000 8700000 
>> 48200000 8500000 25500000 1400000 38600000 45500000 47800000 15200000 
>> 26800000 1000000 24900000 7900000 28800000 31100000 35700000 40300000 
>> 7700000 44900000 40600000 13700000 35500000 40100000 12100000 
>> 30700000 11500000 39900000 9600000 16500000 200000 28000000
>> +16500000 0
>> +21100000 0
>> +25700000 0
>> +
>> +--------------------------------------------
>> +0
>> +0 2 0 1
>> +1 1 2
>> +2 1 3
>> +3 1 4
>> +4 1 5
>> +5 1 4
>> +
>> +--------------------------------------------
>> +32000000
>> +32000000 1 32000001
>> +32000001 2 32000001 32000002
>> +32000002 1 32000003
>> +32000003 1 32000004
>> +32000004 1 32000005
>> +32000005 2 32000002 32000006
>> +32000006 1 32000007
>> +32000007 1 32000008
>> +32000008 2 32000009 32000006
>> +32000009 2 32000010 32000003
>> +32000010 1 32000011
>> +32000011 2 32000009 32000012
>> +32000012 2 32000008 32000013
>> +32000013 2 32000001 32000014
>> +32000014 1 32000010
>> +
>> +--------------------------------------------
>> +34900000
>> +34900000 1 34900001
>> +34900001 1 34900002
>> +34900002 1 34900003
>> +34900003 1 34900004
>> +34900004 0
>> +
>> +--------------------------------------------
>> +4600000
>> +4600000 1 4600001
>> +4600001 1 4600002
>> +4600002 2 4600000 4600003
>> +4600003 2 4600001 4600004
>> +4600004 1 4600005
>> +4600005 2 4600002 4600006
>> +4600006 0
>> +
>> +--------------------------------------------
>> +39500000
>> +39500000 1 39500001
>> +39500001 1 39500002
>> +39500002 1 39500003
>> +39500003 0
>> +
>> +--------------------------------------------
>> +44100000
>> +44100000 2 44100001 44100002
>> +44100001 1 44100002
>> +44100002 1 44100000
>> +
>> +--------------------------------------------
>> +15700000
>> +15700000 1 15700001
>> +15700001 0
>> +
>> +--------------------------------------------
>> +1900000
>> +1900000 1 1900001
>> +1900001 1 1900002
>> +1900002 1 1900000
>> +
>> +--------------------------------------------
>> +6500000
>> +6500000 2 6500000 6500001
>> +6500001 0
>> +
>> +--------------------------------------------
>> +18600000
>> +18600000 2 18600000 18600001
>> +18600001 1 18600002
>> +18600002 1 18600003
>> +18600003 2 18600001 18600004
>> +18600004 1 18600005
>> +18600005 1 18600006
>> +18600006 1 18600007
>> +18600007 1 18600001
>> +
>> +--------------------------------------------
>> +47900000
>> +47900000 0
>> +
>> +--------------------------------------------
>> +2300000
>> +2300000 1 2300000
>> +
>> +--------------------------------------------
>> +8400000
>> +8400000 2 8400000 8400001
>> +8400001 2 8400002 8400004
>> +8400002 2 8400002 8400003
>> +8400003 2 8400000 8400004
>> +8400004 1 8400002
>> +
>> +--------------------------------------------
>> +13000000
>> +13000000 1 13000001
>> +13000001 2 13000000 13000002
>> +13000002 0
>> +
>> +--------------------------------------------
>> +17600000
>> +17600000 0
>> +
>> +--------------------------------------------
>> +22200000
>> +22200000 1 22200001
>> +22200001 2 22200001 22200002
>> +22200002 1 22200003
>> +22200003 2 22200003 22200004
>> +22200004 2 22200003 22200005
>> +22200005 1 22200006
>> +22200006 2 22200000 22200007
>> +22200007 1 22200006
>> +
>> +--------------------------------------------
>> +37200000
>> +37200000 1 37200000
>> +
>> +--------------------------------------------
>> +12600000
>> +12600000 1 12600001
>> +12600001 2 12600002 12600010
>> +12600002 1 12600003
>> +12600003 1 12600004
>> +12600004 2 12600002 12600005
>> +12600005 2 12600000 12600006
>> +12600006 1 12600007
>> +12600007 1 12600008
>> +12600008 2 12600009 12600004
>> +12600009 2 12600010 12600005
>> +12600010 2 12600009 12600011
>> +12600011 1 12600012
>> +12600012 0
>> +
>> +--------------------------------------------
>> +26800000
>> +26800000 0
>> +
>> +--------------------------------------------
>> +1100000
>> +1100000 2 1100001 1100003
>> +1100001 1 1100002
>> +1100002 1 1100003
>> +1100003 1 1100004
>> +1100004 1 1100005
>> +1100005 1 1100006
>> +1100006 2 1100001 1100007
>> +1100007 1 1100008
>> +1100008 1 1100004
>> +
>> +--------------------------------------------
>> +36000000
>> +36000000 1 36000000
>> +
>> +--------------------------------------------
>> +40600000
>> +40600000 2 40600000 40600001
>> +40600001 1 40600001
>> +
>> +--------------------------------------------
>> +10300000
>> +10300000 2 10300000 10300001
>> +10300001 1 10300002
>> +10300002 0
>> +
>> +--------------------------------------------
>> +45200000
>> +45200000 1 45200001
>> +45200001 1 45200002
>> +45200002 2 45200003 45200004
>> +45200003 1 45200004
>> +45200004 1 45200005
>> +45200005 2 45200006 45200007
>> +45200006 1 45200007
>> +45200007 2 45200008 45200005
>> +45200008 0
>> +
>> +--------------------------------------------
>> +1700000
>> +1700000 2 1700001 1700005
>> +1700001 1 1700002
>> +1700002 1 1700003
>> +1700003 1 1700004
>> +1700004 1 1700005
>> +1700005 1 1700006
>> +1700006 1 1700007
>> +1700007 2 1700008 1700002
>> +1700008 2 1700009 1700004
>> +1700009 0
>> +
>> +--------------------------------------------
>> +19500000
>> +19500000 1 19500001
>> +19500001 2 19500001 19500002
>> +19500002 1 19500003
>> +19500003 1 19500004
>> +19500004 0
>> +
>> +--------------------------------------------
>> +24100000
>> +24100000 1 24100001
>> +24100001 1 24100002
>> +24100002 2 24100003 24100007
>> +24100003 1 24100004
>> +24100004 2 24100003 24100005
>> +24100005 2 24100000 24100006
>> +24100006 2 24100001 24100007
>> +24100007 1 24100008
>> +24100008 0
>> +
>> +--------------------------------------------
>> +28700000
>> +28700000 1 28700001
>> +28700001 0
>> +
>> +--------------------------------------------
>> +3000000
>> +3000000 1 3000001
>> +3000001 1 3000002
>> +3000002 2 3000003 3000004
>> +3000003 1 3000004
>> +3000004 0
>> +
>> +--------------------------------------------
>> +37900000
>> +37900000 1 37900001
>> +37900001 1 37900002
>> +37900002 2 37900002 37900003
>> +37900003 2 37900000 37900004
>> +37900004 1 37900002
>> +
>> +--------------------------------------------
>> +36600000
>> +36600000 1 36600001
>> +36600001 0
>> +
>> +--------------------------------------------
>> +25300000
>> +25300000 2 25300000 25300001
>> +25300001 1 25300000
>> +
>> +--------------------------------------------
>> +7600000
>> +7600000 1 7600001
>> +7600001 2 7600002 7600005
>> +7600002 1 7600003
>> +7600003 2 7600001 7600004
>> +7600004 2 7600003 7600005
>> +7600005 2 7600002 7600006
>> +7600006 1 7600006
>> +
>> +--------------------------------------------
>> +12200000
>> +12200000 1 12200001
>> +12200001 1 12200002
>> +12200002 1 12200000
>> +
>> +--------------------------------------------
>> +47100000
>> +47100000 1 47100001
>> +47100001 0
>> +
>> +--------------------------------------------
>> +16800000
>> +16800000 1 16800001
>> +16800001 2 16800000 16800002
>> +16800002 1 16800003
>> +16800003 1 16800004
>> +16800004 2 16800001 16800005
>> +16800005 1 16800006
>> +16800006 1 16800007
>> +16800007 1 16800008
>> +16800008 1 16800009
>> +16800009 1 16800010
>> +16800010 1 16800001
>> +
>> +--------------------------------------------
>> +21400000
>> +21400000 2 21400001 21400003
>> +21400001 1 21400002
>> +21400002 1 21400003
>> +21400003 2 21400004 21400005
>> +21400004 2 21400004 21400005
>> +21400005 1 21400000
>> +
>> +--------------------------------------------
>> +26000000
>> +26000000 1 26000001
>> +26000001 1 26000002
>> +26000002 0
>> +
>> +--------------------------------------------
>> +20300000
>> +20300000 1 20300000
>> +
>> +--------------------------------------------
>> +300000
>> +300000 1 300001
>> +300001 1 300002
>> +300002 1 300003
>> +300003 1 300004
>> +300004 1 300005
>> +300005 1 300006
>> +300006 1 300005
>> +
>> +--------------------------------------------
>> +35200000
>> +35200000 1 35200001
>> +35200001 0
>> +
>> +--------------------------------------------
>> +4900000
>> +4900000 2 4900000 4900001
>> +4900001 2 4900001 4900002
>> +4900002 0
>> +
>> +--------------------------------------------
>> +39800000
>> +39800000 1 39800000
>> +
>> +--------------------------------------------
>> +9500000
>> +9500000 1 9500001
>> +9500001 1 9500002
>> +9500002 2 9500000 9500003
>> +9500003 2 9500003 9500004
>> +9500004 2 9500018 9500005
>> +9500005 2 9500012 9500006
>> +9500006 1 9500007
>> +9500007 1 9500008
>> +9500008 1 9500009
>> +9500009 1 9500010
>> +9500010 2 9500016 9500011
>> +9500011 2 9500012 9500013
>> +9500012 1 9500013
>> +9500013 2 9500010 9500014
>> +9500014 2 9500019 9500015
>> +9500015 2 9500016 9500012
>> +9500016 2 9500017 9500006
>> +9500017 2 9500018 9500010
>> +9500018 1 9500019
>> +9500019 1 9500014
>> +
>> +--------------------------------------------
>> +44400000
>> +44400000 2 44400000 44400001
>> +44400001 1 44400002
>> +44400002 1 44400003
>> +44400003 1 44400004
>> +44400004 2 44400001 44400005
>> +44400005 1 44400006
>> +44400006 0
>> +
>> +--------------------------------------------
>> +4700000
>> +4700000 1 4700001
>> +4700001 2 4700000 4700002
>> +4700002 1 4700003
>> +4700003 1 4700004
>> +4700004 0
>> +
>> +--------------------------------------------
>> +14100000
>> +14100000 2 14100000 14100001
>> +14100001 2 14100002 14100003
>> +14100002 1 14100003
>> +14100003 0
>> +
>> +--------------------------------------------
>> +18700000
>> +18700000 2 18700000 18700001
>> +18700001 0
>> +
>> +--------------------------------------------
>> +23200000
>> +23200000 0
>> +
>> +--------------------------------------------
>> +41200000
>> +41200000 1 41200001
>> +41200001 1 41200002
>> +41200002 1 41200002
>> +
>> +--------------------------------------------
>> +23300000
>> +23300000 1 23300001
>> +23300001 1 23300002
>> +23300002 2 23300003 23300005
>> +23300003 2 23300009 23300004
>> +23300004 1 23300005
>> +23300005 2 23300003 23300006
>> +23300006 2 23300016 23300007
>> +23300007 1 23300008
>> +23300008 2 23300009 23300002
>> +23300009 1 23300010
>> +23300010 2 23300010 23300011
>> +23300011 1 23300012
>> +23300012 2 23300013 23300006
>> +23300013 1 23300014
>> +23300014 1 23300015
>> +23300015 2 23300016 23300011
>> +23300016 1 23300004
>> +
>> +--------------------------------------------
>> +27900000
>> +27900000 2 27900001 27900002
>> +27900001 1 27900002
>> +27900002 2 27900001 27900003
>> +27900003 2 27900002 27900004
>> +27900004 0
>> +
>> +--------------------------------------------
>> +32500000
>> +32500000 1 32500001
>> +32500001 1 32500002
>> +32500002 1 32500003
>> +32500003 2 32500002 32500004
>> +32500004 1 32500001
>> +
>> +--------------------------------------------
>> +2200000
>> +2200000 1 2200001
>> +2200001 0
>> +
>> +--------------------------------------------
>> +37100000
>> +37100000 2 37100000 37100001
>> +37100001 2 37100002 37100007
>> +37100002 1 37100003
>> +37100003 1 37100004
>> +37100004 2 37100001 37100005
>> +37100005 1 37100006
>> +37100006 1 37100007
>> +37100007 1 37100000
>> +
>> +--------------------------------------------
>> +49800000
>> +49800000 1 49800001
>> +49800001 2 49800000 49800002
>> +49800002 1 49800003
>> +49800003 1 49800004
>> +49800004 1 49800005
>> +49800005 1 49800006
>> +49800006 0
>> +
>> +--------------------------------------------
>> +40200000
>> +40200000 1 40200000
>> +
>> +--------------------------------------------
>> +41700000
>> +41700000 2 41700001 41700002
>> +41700001 2 41700001 41700002
>> +41700002 0
>> +
>> +--------------------------------------------
>> +21000000
>> +21000000 1 21000000
>> +
>> +--------------------------------------------
>> +11400000
>> +11400000 1 11400001
>> +11400001 2 11400002 11400005
>> +11400002 2 11400000 11400003
>> +11400003 1 11400004
>> +11400004 2 11400003 11400005
>> +11400005 2 11400001 11400006
>> +11400006 1 11400007
>> +11400007 1 11400008
>> +11400008 1 11400001
>> +
>> +--------------------------------------------
>> +1800000
>> +1800000 2 1800001 1800005
>> +1800001 1 1800002
>> +1800002 1 1800003
>> +1800003 1 1800004
>> +1800004 1 1800005
>> +1800005 2 1800002 1800006
>> +1800006 2 1800002 1800007
>> +1800007 1 1800000
>> +
>> +--------------------------------------------
>> +6900000
>> +6900000 1 6900001
>> +6900001 1 6900002
>> +6900002 2 6900003 6900007
>> +6900003 2 6900000 6900004
>> +6900004 2 6900003 6900005
>> +6900005 1 6900006
>> +6900006 1 6900007
>> +6900007 1 6900008
>> +6900008 2 6900000 6900009
>> +6900009 1 6900006
>> +
>> +--------------------------------------------
>> +46300000
>> +46300000 1 46300001
>> +46300001 2 46300001 46300002
>> +46300002 0
>> +
>> +--------------------------------------------
>> +16000000
>> +16000000 1 16000001
>> +16000001 2 16000002 16000010
>> +16000002 1 16000003
>> +16000003 1 16000004
>> +16000004 2 16000010 16000005
>> +16000005 1 16000006
>> +16000006 2 16000003 16000007
>> +16000007 2 16000008 16000006
>> +16000008 1 16000009
>> +16000009 1 16000010
>> +16000010 1 16000011
>> +16000011 1 16000012
>> +16000012 1 16000005
>> +
>> +--------------------------------------------
>> +20600000
>> +20600000 1 20600001
>> +20600001 2 20600002 20600006
>> +20600002 2 20600000 20600003
>> +20600003 1 20600004
>> +20600004 1 20600005
>> +20600005 1 20600006
>> +20600006 1 20600007
>> +20600007 1 20600008
>> +20600008 1 20600009
>> +20600009 2 20600010 20600004
>> +20600010 1 20600011
>> +20600011 1 20600012
>> +20600012 2 20600001 20600013
>> +20600013 2 20600013 20600014
>> +20600014 0
>> +
>> +--------------------------------------------
>> +30600000
>> +30600000 1 30600001
>> +30600001 0
>> +
>> +--------------------------------------------
>> +25200000
>> +25200000 1 25200001
>> +25200001 1 25200002
>> +25200002 0
>> +
>> +--------------------------------------------
>> +29800000
>> +29800000 1 29800001
>> +29800001 1 29800002
>> +29800002 0
>> +
>> +--------------------------------------------
>> +41800000
>> +41800000 1 41800001
>> +41800001 2 41800001 41800002
>> +41800002 2 41800000 41800003
>> +41800003 0
>> +
>> +--------------------------------------------
>> +9100000
>> +9100000 1 9100001
>> +9100001 1 9100002
>> +9100002 1 9100000
>> +
>> +--------------------------------------------
>> +4100000
>> +4100000 1 4100001
>> +4100001 1 4100002
>> +4100002 2 4100002 4100003
>> +4100003 1 4100000
>> +
>> +--------------------------------------------
>> +43600000
>> +43600000 2 43600000 43600001
>> +43600001 1 43600002
>> +43600002 0
>> +
>> +--------------------------------------------
>> +13300000
>> +13300000 0
>> +
>> +--------------------------------------------
>> +48200000
>> +48200000 1 48200001
>> +48200001 1 48200000
>> +
>> +--------------------------------------------
>> +17900000
>> +17900000 1 17900001
>> +17900001 0
>> +
>> +--------------------------------------------
>> +22500000
>> +22500000 2 22500001 22500006
>> +22500001 1 22500002
>> +22500002 1 22500003
>> +22500003 1 22500004
>> +22500004 1 22500005
>> +22500005 1 22500006
>> +22500006 1 22500006
>> +
>> +--------------------------------------------
>> +6300000
>> +6300000 1 6300001
>> +6300001 1 6300002
>> +6300002 1 6300003
>> +6300003 1 6300004
>> +6300004 1 6300005
>> +6300005 1 6300006
>> +6300006 1 6300000
>> +
>> +--------------------------------------------
>> +27100000
>> +27100000 2 27100000 27100001
>> +27100001 0
>> +
>> +--------------------------------------------
>> +1400000
>> +1400000 1 1400000
>> +
>> +--------------------------------------------
>> +36300000
>> +36300000 1 36300001
>> +36300001 2 36300002 36300006
>> +36300002 1 36300003
>> +36300003 1 36300004
>> +36300004 2 36300002 36300005
>> +36300005 1 36300006
>> +36300006 1 36300004
>> +
>> +--------------------------------------------
>> +6000000
>> +6000000 1 6000001
>> +6000001 1 6000002
>> +6000002 1 37500000
>> +
>> +--------------------------------------------
>> +40900000
>> +40900000 1 40900000
>> +
>> +--------------------------------------------
>> +10600000
>> +10600000 0
>> +
>> +--------------------------------------------
>> +45500000
>> +45500000 1 45500001
>> +45500001 1 45500002
>> +45500002 2 45500000 45500003
>> +45500003 1 45500004
>> +45500004 2 45500003 45500005
>> +45500005 1 45500006
>> +45500006 0
>> +
>> +--------------------------------------------
>> +15200000
>> +15200000 1 15200001
>> +15200001 1 15200002
>> +15200002 1 15200003
>> +15200003 1 15200004
>> +15200004 2 15200003 15200005
>> +15200005 1 15200001
>> +
>> +--------------------------------------------
>> +9200000
>> +9200000 1 9200001
>> +9200001 1 9200000
>> +
>> +--------------------------------------------
>> +31400000
>> +31400000 1 31400001
>> +31400001 1 31400002
>> +31400002 1 31400003
>> +31400003 1 31400004
>> +31400004 2 31400002 31400005
>> +31400005 1 31400006
>> +31400006 0
>> +
>> +--------------------------------------------
>> +19800000
>> +19800000 0
>> +
>> +--------------------------------------------
>> +24400000
>> +24400000 2 24400001 24400003
>> +24400001 1 24400002
>> +24400002 1 24400003
>> +24400003 2 24400003 24400004
>> +24400004 1 24400003
>> +
>> +--------------------------------------------
>> +29000000
>> +29000000 1 29000000
>> +
>> +--------------------------------------------
>> +33600000
>> +33600000 1 33600001
>> +33600001 1 33600001
>> +
>> +--------------------------------------------
>> +3300000
>> +3300000 1 3300001
>> +3300001 1 3300002
>> +3300002 1 3300003
>> +3300003 2 3300001 3300004
>> +3300004 2 3300004 3300005
>> +3300005 0
>> +
>> +--------------------------------------------
>> +38200000
>> +38200000 1 38200001
>> +38200001 2 38200002 38200003
>> +38200002 1 38200003
>> +38200003 1 38200004
>> +38200004 1 38200005
>> +38200005 0
>> +
>> +--------------------------------------------
>> +24900000
>> +24900000 1 24900001
>> +24900001 1 24900002
>> +24900002 1 24900003
>> +24900003 2 24900002 24900004
>> +24900004 1 24900005
>> +24900005 1 24900006
>> +24900006 1 24900007
>> +24900007 1 24900008
>> +24900008 2 24900009 24900006
>> +24900009 1 24900010
>> +24900010 2 24900011 24900005
>> +24900011 1 24900001
>> +
>> +--------------------------------------------
>> +7900000
>> +7900000 1 7900001
>> +7900001 1 7900002
>> +7900002 1 7900003
>> +7900003 2 7900000 7900004
>> +7900004 1 7900005
>> +7900005 1 7900006
>> +7900006 2 7900004 7900007
>> +7900007 0
>> +
>> +--------------------------------------------
>> +42800000
>> +42800000 1 42800001
>> +42800001 1 42800002
>> +42800002 2 42800000 42800003
>> +42800003 0
>> +
>> +--------------------------------------------
>> +12500000
>> +12500000 1 12500001
>> +12500001 1 12500002
>> +12500002 1 12500003
>> +12500003 2 12500003 12500004
>> +12500004 2 12500004 12500005
>> +12500005 2 12500004 12500006
>> +12500006 2 12500006 12500007
>> +12500007 2 12500008 12500006
>> +12500008 2 12500007 33700000
>> +
>> +--------------------------------------------
>> +47400000
>> +47400000 0
>> +
>> +--------------------------------------------
>> +17100000
>> +17100032 2 17100033 17100028
>> +17100033 2 17100033 17100034
>> +17100034 2 17100035 14800000
>> +17100035 2 17100028 17100036
>> +17100036 2 17100037 41500000
>> +17100037 2 17100038 42700000
>> +17100038 2 17100035 17100039
>> +17100039 2 17100040 1700000
>> +17100040 2 17100041 6600000
>> +17100041 2 17100042 36500000
>> +17100042 2 17100043 28200000
>> +17100043 1 27400000
>> +17100000 2 17100001 10100000
>> +17100001 2 17100002 31000000
>> +17100002 2 17100003 17100030
>> +17100003 2 17100043 17100004
>> +17100004 2 17100005 5500000
>> +17100005 2 17100006 17100031
>> +17100006 2 17100011 17100007
>> +17100007 1 17100008
>> +17100008 2 17100009 17100001
>> +17100009 1 17100010
>> +17100010 2 17100011 26900000
>> +17100011 2 17100012 25200000
>> +17100012 2 17100009 17100013
>> +17100013 2 17100014 17100007
>> +17100014 2 17100015 37800000
>> +17100015 2 17100016 12700000
>> +17100016 2 17100017 23500000
>> +17100017 2 17100018 17100037
>> +17100018 2 17100019 29300000
>> +17100019 2 17100020 6300000
>> +17100020 2 17100003 17100021
>> +17100021 1 17100022
>> +17100022 2 17100020 17100023
>> +17100023 2 17100024 17100041
>> +17100024 2 17100025 17100020
>> +17100025 2 17100026 17100023
>> +17100026 2 17100010 17100027
>> +17100027 2 17100028 32700000
>> +17100028 2 17100029 17100022
>> +17100029 2 17100014 17100030
>> +17100030 2 17100034 17100031
>> +17100031 2 17100032 17100023
>> +
>> +--------------------------------------------
>> +21700000
>> +21700000 1 21700001
>> +21700001 0
>> +
>> +--------------------------------------------
>> +26300000
>> +26300000 1 26300001
>> +26300001 1 26300002
>> +26300002 1 26300003
>> +26300003 2 26300002 26300004
>> +26300004 1 26300005
>> +26300005 1 26300006
>> +26300006 1 26300007
>> +26300007 2 26300008 26300007
>> +26300008 0
>> +
>> +--------------------------------------------
>> +30900000
>> +30900000 0
>> +
>> +--------------------------------------------
>> +27800000
>> +27800000 1 27800000
>> +
>> +--------------------------------------------
>> +5700000
>> +5700000 1 5700001
>> +5700001 2 5700002 5700007
>> +5700002 1 5700003
>> +5700003 1 5700004
>> +5700004 1 5700005
>> +5700005 2 5700002 5700006
>> +5700006 2 5700006 5700007
>> +5700007 1 5700008
>> +5700008 1 5700009
>> +5700009 0
>> +
>> +--------------------------------------------
>> +600000
>> +600000 1 600001
>> +600001 2 600000 600002
>> +600002 0
>> +
>> +--------------------------------------------
>> +35500000
>> +35500000 0
>> +
>> +--------------------------------------------
>> +5200000
>> +5200000 1 5200001
>> +5200001 0
>> +
>> +--------------------------------------------
>> +40100000
>> +40100000 1 40100000
>> +
>> +--------------------------------------------
>> +9800000
>> +9800000 1 9800000
>> +
>> +--------------------------------------------
>> +44700000
>> +44700000 1 44700000
>> +
>> +--------------------------------------------
>> +14400000
>> +14400000 0
>> +
>> +--------------------------------------------
>> +49300000
>> +49300000 2 49300001 49300003
>> +49300001 1 49300002
>> +49300002 2 49300002 49300003
>> +49300003 2 49300003 49300004
>> +49300004 2 49300002 49300005
>> +49300005 1 49300001
>> +
>> +--------------------------------------------
>> +19000000
>> +19000000 1 19000001
>> +19000001 1 19000002
>> +19000002 1 19000003
>> +19000003 1 19000004
>> +19000004 1 19000005
>> +19000005 2 19000003 19000006
>> +19000006 1 19000007
>> +19000007 1 19000008
>> +19000008 0
>> +
>> +--------------------------------------------
>> +11500000
>> +11500000 2 11500000 11500001
>> +11500001 1 11500002
>> +11500002 1 11500003
>> +11500003 1 11500001
>> +
>> +--------------------------------------------
>> +23600000
>> +23600000 2 23600000 23600001
>> +23600001 1 23600002
>> +23600002 1 23600002
>> +
>> +--------------------------------------------
>> +28200000
>> +28200000 1 28200001
>> +28200001 1 28200002
>> +28200002 0
>> +
>> +--------------------------------------------
>> +32800000
>> +32800000 1 32800001
>> +32800001 0
>> +
>> +--------------------------------------------
>> +2500000
>> +2500000 1 2500001
>> +2500001 1 2500002
>> +2500002 1 2500003
>> +2500003 2 2500001 2500004
>> +2500004 1 2500000
>> +
>> +--------------------------------------------
>> +37400000
>> +37400000 1 37400000
>> +
>> +--------------------------------------------
>> +7100000
>> +7100000 1 7100001
>> +7100001 2 7100000 7100002
>> +7100002 2 7100002 7100003
>> +7100003 1 7100004
>> +7100004 1 7100005
>> +7100005 0
>> +
>> +--------------------------------------------
>> +42000000
>> +42000000 1 42000001
>> +42000001 1 42000002
>> +42000002 1 42000003
>> +42000003 2 42000003 42000004
>> +42000004 2 42000005 42000007
>> +42000005 2 42000008 42000006
>> +42000006 2 42000005 42000007
>> +42000007 1 42000008
>> +42000008 1 42000009
>> +42000009 0
>> +
>> +--------------------------------------------
>> +11700000
>> +11700000 1 11700001
>> +11700001 0
>> +
>> +--------------------------------------------
>> +46400000
>> +46400000 1 46400001
>> +46400001 1 46400001
>> +
>> +--------------------------------------------
>> +31200000
>> +31200000 1 31200001
>> +31200001 1 31200002
>> +31200002 2 31200000 31200003
>> +31200003 1 31200004
>> +31200004 0
>> +
>> +--------------------------------------------
>> +16300000
>> +16300000 2 16300001 16300010
>> +16300001 1 16300002
>> +16300002 1 16300003
>> +16300003 1 16300004
>> +16300004 2 16300000 16300005
>> +16300005 2 16300012 16300006
>> +16300006 1 16300007
>> +16300007 2 16300008 16300000
>> +16300008 2 16300009 16300005
>> +16300009 1 16300010
>> +16300010 1 16300011
>> +16300011 1 16300012
>> +16300012 2 16300000 16300013
>> +16300013 0
>> +
>> +--------------------------------------------
>> +20900000
>> +20900000 1 20900001
>> +20900001 1 20900002
>> +20900002 1 20900003
>> +20900003 2 20900003 20900004
>> +20900004 1 20900001
>> +
>> +--------------------------------------------
>> +25500000
>> +25500000 1 25500001
>> +25500001 2 25500008 25500002
>> +25500002 1 25500003
>> +25500003 2 25500000 25500004
>> +25500004 2 25500002 25500005
>> +25500005 1 25500006
>> +25500006 2 25500003 25500007
>> +25500007 2 25500008 25500004
>> +25500008 1 25500009
>> +25500009 2 25500010 25500003
>> +25500010 1 25500010
>> +
>> +--------------------------------------------
>> +30100000
>> +30100000 2 30100000 30100001
>> +30100001 1 30100002
>> +30100002 1 30100003
>> +30100003 1 30100004
>> +30100004 1 30100005
>> +30100005 2 30100005 30100006
>> +30100006 1 30100007
>> +30100007 1 30100001
>> +
>> +--------------------------------------------
>> +18200000
>> +18200000 2 18200001 18200002
>> +18200001 2 18200002 18200003
>> +18200002 2 18200000 18200003
>> +18200003 0
>> +
>> +--------------------------------------------
>> +22800000
>> +22800000 2 22800000 22800001
>> +22800001 1 22800002
>> +22800002 1 22800001
>> +
>> +--------------------------------------------
>> +13800000
>> +13800000 0
>> +
>> +--------------------------------------------
>> +8700000
>> +8700000 2 8700008 8700001
>> +8700001 2 8700000 8700002
>> +8700002 2 8700003 8700013
>> +8700003 1 8700004
>> +8700004 1 8700005
>> +8700005 1 8700006
>> +8700006 1 8700007
>> +8700007 1 8700008
>> +8700008 1 8700009
>> +8700009 1 8700010
>> +8700010 1 8700011
>> +8700011 2 8700012 8700006
>> +8700012 2 8700002 8700013
>> +8700013 0
>> +
>> +--------------------------------------------
>> +15500000
>> +15500000 0
>> +
>> +--------------------------------------------
>> +48700000
>> +48700000 2 48700000 48700001
>> +48700001 2 48700001 48700002
>> +48700002 1 48700003
>> +48700003 2 48700001 48700004
>> +48700004 1 48700005
>> +48700005 2 48700004 48700006
>> +48700006 1 48700005
>> +
>> +--------------------------------------------
>> +24700000
>> +24700000 1 24700001
>> +24700001 2 24700001 24700002
>> +24700002 1 24700000
>> +
>> +--------------------------------------------
>> +32400000
>> +32400000 1 32400001
>> +32400001 0
>> +
>> +--------------------------------------------
>> +8600000
>> +8600000 1 8600001
>> +8600001 1 8600002
>> +8600002 1 8600003
>> +8600003 2 8600001 8600004
>> +8600004 2 8600001 40800000
>> +
>> +--------------------------------------------
>> +12800000
>> +12800000 2 12800000 12800001
>> +12800001 1 12800002
>> +12800002 2 12800002 12800003
>> +12800003 1 12800004
>> +12800004 1 12800005
>> +12800005 0
>> +
>> +--------------------------------------------
>> +47700000
>> +47700000 0
>> +
>> +--------------------------------------------
>> +22000000
>> +22000000 2 22000000 22000001
>> +22000001 2 22000001 22000002
>> +22000002 0
>> +
>> +--------------------------------------------
>> +26600000
>> +26600000 1 26600001
>> +26600001 2 26600001 26600002
>> +26600002 1 26600002
>> +
>> +--------------------------------------------
>> +16100000
>> +16100000 1 16100001
>> +16100001 2 16100002 15400000
>> +16100002 1 16100003
>> +16100003 1 16100004
>> +16100004 1 16100000
>> +
>> +--------------------------------------------
>> +900000
>> +900000 0
>> +
>> +--------------------------------------------
>> +35800000
>> +35800000 1 35800000
>> +
>> +--------------------------------------------
>> +5500000
>> +5500000 1 5500001
>> +5500001 1 5500002
>> +5500002 1 5500003
>> +5500003 2 5500009 5500004
>> +5500004 1 5500005
>> +5500005 2 5500000 5500006
>> +5500006 1 5500007
>> +5500007 2 5500008 5500007
>> +5500008 1 5500009
>> +5500009 1 5500010
>> +5500010 1 5500011
>> +5500011 2 5500012 5500007
>> +5500012 2 5500003 5500013
>> +5500013 0
>> +
>> +--------------------------------------------
>> +40400000
>> +40400000 1 40400001
>> +40400001 2 40400002 40400004
>> +40400002 2 40400003 40400011
>> +40400003 2 40400012 40400004
>> +40400004 2 40400011 40400005
>> +40400005 1 40400006
>> +40400006 2 40400011 40400007
>> +40400007 1 40400008
>> +40400008 1 40400009
>> +40400009 2 40400010 40400003
>> +40400010 1 40400011
>> +40400011 2 40400000 40400012
>> +40400012 2 40400009 40400013
>> +40400013 2 40400013 40400014
>> +40400014 1 40400008
>> +
>> +--------------------------------------------
>> +10100000
>> +10100000 0
>> +
>> +--------------------------------------------
>> +45000000
>> +45000000 2 45000001 45000004
>> +45000001 1 45000002
>> +45000002 1 45000003
>> +45000003 1 45000004
>> +45000004 0
>> +
>> +--------------------------------------------
>> +49600000
>> +49600000 2 49600001 49600004
>> +49600001 1 49600002
>> +49600002 2 49600001 49600003
>> +49600003 1 49600004
>> +49600004 2 49600002 49600005
>> +49600005 1 49600006
>> +49600006 1 49600007
>> +49600007 1 49600008
>> +49600008 2 49600009 49600003
>> +49600009 2 49600010 49600003
>> +49600010 2 49600002 49600011
>> +49600011 0
>> +
>> +--------------------------------------------
>> +31800000
>> +31800000 1 31800000
>> +
>> +--------------------------------------------
>> +14900000
>> +14900000 1 14900001
>> +14900001 1 30900000
>> +
>> +--------------------------------------------
>> +28500000
>> +28500000 2 28500001 28500007
>> +28500001 2 28500009 28500002
>> +28500002 1 28500003
>> +28500003 1 28500004
>> +28500004 1 28500005
>> +28500005 2 28500001 28500006
>> +28500006 1 28500007
>> +28500007 2 28500008 28500007
>> +28500008 2 28500009 28500006
>> +28500009 1 28500010
>> +28500010 1 28500011
>> +28500011 1 28500012
>> +28500012 2 28500008 28500013
>> +28500013 1 28500014
>> +28500014 1 28500015
>> +28500015 1 28500004
>> +
>> +--------------------------------------------
>> +33100000
>> +33100000 2 33100000 33100001
>> +33100001 1 33100002
>> +33100002 0
>> +
>> +--------------------------------------------
>> +2800000
>> +2800000 2 2800000 2800001
>> +2800001 2 2800001 2800002
>> +2800002 1 2800003
>> +2800003 1 2800002
>> +
>> +--------------------------------------------
>> +37700000
>> +37700000 1 37700001
>> +37700001 1 37700002
>> +37700002 2 37700001 37700003
>> +37700003 1 37700004
>> +37700004 2 37700003 37700005
>> +37700005 2 37700001 37700006
>> +37700006 2 37700002 37700007
>> +37700007 1 37700008
>> +37700008 2 37700009 37700002
>> +37700009 0
>> +
>> +--------------------------------------------
>> +7400000
>> +7400000 1 7400001
>> +7400001 2 7400002 7400003
>> +7400002 2 7400002 7400003
>> +7400003 1 7400004
>> +7400004 1 7400003
>> +
>> +--------------------------------------------
>> +42300000
>> +42300000 2 42300001 42300002
>> +42300001 2 42300000 42300002
>> +42300002 1 42300003
>> +42300003 1 42300001
>> +
>> +--------------------------------------------
>> +12000000
>> +12000000 2 12000000 12000001
>> +12000001 1 12000002
>> +12000002 2 12000001 12000003
>> +12000003 1 12000004
>> +12000004 0
>> +
>> +--------------------------------------------
>> +46900000
>> +46900000 0
>> +
>> +--------------------------------------------
>> +34700000
>> +34700000 2 34700000 34700001
>> +34700001 1 34700001
>> +
>> +--------------------------------------------
>> +16600000
>> +16600000 1 16600001
>> +16600001 1 16600002
>> +16600002 2 16600001 16600003
>> +16600003 1 16600004
>> +16600004 1 16600005
>> +16600005 2 16600000 16600006
>> +16600006 1 16600004
>> +
>> +--------------------------------------------
>> +21200000
>> +21200000 1 21200001
>> +21200001 1 21200002
>> +21200002 1 21200003
>> +21200003 1 21200004
>> +21200004 1 21200005
>> +21200005 2 21200001 21200006
>> +21200006 1 21200007
>> +21200007 1 21200008
>> +21200008 1 21200009
>> +21200009 1 21200010
>> +21200010 0
>> +
>> +--------------------------------------------
>> +25800000
>> +25800000 1 25800001
>> +25800001 2 25800000 25800002
>> +25800002 1 25800003
>> +25800003 1 25800004
>> +25800004 1 25800005
>> +25800005 1 25800006
>> +25800006 2 25800002 25800007
>> +25800007 1 25800008
>> +25800008 1 25800009
>> +25800009 0
>> +
>> +--------------------------------------------
>> +30400000
>> +30400000 2 30400000 30400001
>> +30400001 0
>> +
>> +--------------------------------------------
>> +100000
>> +100000 1 100001
>> +100001 1 100002
>> +100002 1 100003
>> +100003 2 100002 100004
>> +100004 1 100005
>> +100005 0
>> +
>> +--------------------------------------------
>> +35000000
>> +35000000 1 35000000
>> +
>> +--------------------------------------------
>> +18400000
>> +18400000 2 18400001 18400006
>> +18400001 1 18400002
>> +18400002 1 18400003
>> +18400003 1 18400004
>> +18400004 1 18400005
>> +18400005 1 18400006
>> +18400006 0
>> +
>> +--------------------------------------------
>> +18000000
>> +18000000 1 18000001
>> +18000001 1 18000000
>> +
>> +--------------------------------------------
>> +39600000
>> +39600000 1 39600001
>> +39600001 1 39600000
>> +
>> +--------------------------------------------
>> +9300000
>> +9300000 1 9300001
>> +9300001 1 9300002
>> +9300002 1 9300003
>> +9300003 2 9300002 9300004
>> +9300004 0
>> +
>> +--------------------------------------------
>> +44200000
>> +44200000 2 44200000 44200001
>> +44200001 0
>> +
>> +--------------------------------------------
>> +13900000
>> +13900000 1 13900001
>> +13900001 1 13900001
>> +
>> +--------------------------------------------
>> +48800000
>> +48800000 0
>> +
>> +--------------------------------------------
>> +18500000
>> +18500000 2 18500001 18500005
>> +18500001 2 18500002 18500004
>> +18500002 2 18500003 18500005
>> +18500003 1 18500004
>> +18500004 1 18500005
>> +18500005 1 18500005
>> +
>> +--------------------------------------------
>> +23100000
>> +23100000 2 23100001 23100003
>> +23100001 2 23100002 23100004
>> +23100002 1 23100003
>> +23100003 2 23100002 23100004
>> +23100004 1 23100005
>> +23100005 1 23100006
>> +23100006 2 23100003 23100007
>> +23100007 2 23100008 23100006
>> +23100008 1 23100009
>> +23100009 2 23100010 23100003
>> +23100010 0
>> +
>> +--------------------------------------------
>> +27700000
>> +27700000 1 27700001
>> +27700001 0
>> +
>> +--------------------------------------------
>> +34100000
>> +34100000 1 34100001
>> +34100001 2 34100000 34100002
>> +34100002 0
>> +
>> +--------------------------------------------
>> +32300000
>> +32300000 0
>> +
>> +--------------------------------------------
>> +2000000
>> +2000000 1 2000001
>> +2000001 2 2000001 2000002
>> +2000002 2 2000003 2000006
>> +2000003 1 2000004
>> +2000004 1 2000005
>> +2000005 2 2000004 2000006
>> +2000006 0
>> +
>> +--------------------------------------------
>> +36900000
>> +36900000 1 36900001
>> +36900001 1 36900000
>> +
>> +--------------------------------------------
>> +6600000
>> +6600000 1 6600001
>> +6600001 1 6600002
>> +6600002 1 6600001
>> +
>> +--------------------------------------------
>> +41500000
>> +41500000 0
>> +
>> +--------------------------------------------
>> +11200000
>> +11200000 1 11200000
>> +
>> +--------------------------------------------
>> +46100000
>> +46100000 0
>> +
>> +--------------------------------------------
>> +15800000
>> +15800000 0
>> +
>> +--------------------------------------------
>> +5000000
>> +5000000 2 5000001 5000015
>> +5000001 2 5000001 5000002
>> +5000002 2 5000000 5000003
>> +5000003 1 5000004
>> +5000004 2 5000008 5000005
>> +5000005 1 5000006
>> +5000006 1 5000007
>> +5000007 2 5000008 5000004
>> +5000008 1 5000009
>> +5000009 2 5000010 5000018
>> +5000010 1 5000011
>> +5000011 2 5000000 5000012
>> +5000012 1 5000013
>> +5000013 1 5000014
>> +5000014 1 5000015
>> +5000015 2 5000016 5000013
>> +5000016 1 5000017
>> +5000017 2 5000016 5000018
>> +5000018 1 5000009
>> +
>> +--------------------------------------------
>> +14700000
>> +14700000 1 14700001
>> +14700001 1 14700002
>> +14700002 0
>> +
>> +--------------------------------------------
>> +20400000
>> +20400000 1 20400001
>> +20400001 1 20400001
>> +
>> +--------------------------------------------
>> +25000000
>> +25000000 2 25000001 25000003
>> +25000001 1 25000002
>> +25000002 1 25000003
>> +25000003 2 25000001 25000004
>> +25000004 1 25000002
>> +
>> +--------------------------------------------
>> +29600000
>> +29600000 1 29600001
>> +29600001 1 29600000
>> +
>> +--------------------------------------------
>> +34200000
>> +34200000 1 34200001
>> +34200001 1 34200002
>> +34200002 1 34200003
>> +34200003 1 34200003
>> +
>> +--------------------------------------------
>> +3900000
>> +3900000 1 3900001
>> +3900001 1 3900002
>> +3900002 2 3900002 3900003
>> +3900003 1 3900000
>> +
>> +--------------------------------------------
>> +38800000
>> +38800000 1 38800001
>> +38800001 2 38800009 38800002
>> +38800002 1 38800003
>> +38800003 2 38800001 38800004
>> +38800004 2 38800010 38800005
>> +38800005 1 38800006
>> +38800006 2 38800006 38800007
>> +38800007 1 38800008
>> +38800008 2 38800000 38800009
>> +38800009 1 38800010
>> +38800010 0
>> +
>> +--------------------------------------------
>> +8500000
>> +8500000 1 8500001
>> +8500001 2 8500001 8500002
>> +8500002 1 8500000
>> +
>> +--------------------------------------------
>> +20700000
>> +20700000 1 20700001
>> +20700001 2 20700000 20700002
>> +20700002 1 20700003
>> +20700003 1 20700001
>> +
>> +--------------------------------------------
>> +13100000
>> +13100000 1 13100001
>> +13100001 2 13100001 13100002
>> +13100002 1 13100003
>> +13100003 0
>> +
>> +--------------------------------------------
>> +48000000
>> +48000000 1 48000001
>> +48000001 1 48000001
>> +
>> +--------------------------------------------
>> +17700000
>> +17700000 0
>> +
>> +--------------------------------------------
>> +22300000
>> +22300000 0
>> +
>> +--------------------------------------------
>> +26900000
>> +26900000 2 26900000 26900001
>> +26900001 2 26900000 26900002
>> +26900002 0
>> +
>> +--------------------------------------------
>> +31500000
>> +31500000 2 31500001 31500004
>> +31500001 1 31500002
>> +31500002 2 31500003 31500006
>> +31500003 2 31500001 31500004
>> +31500004 1 31500005
>> +31500005 2 31500000 31500006
>> +31500006 0
>> +
>> +--------------------------------------------
>> +4400000
>> +4400000 2 4400000 4400001
>> +4400001 2 4400002 29100000
>> +4400002 0
>> +
>> +--------------------------------------------
>> +37000000
>> +37000000 1 37000000
>> +
>> +--------------------------------------------
>> +1200000
>> +1200000 2 1200000 1200001
>> +1200001 1 1200002
>> +1200002 1 1200003
>> +1200003 1 1200004
>> +1200004 1 1200005
>> +1200005 1 1200001
>> +
>> +--------------------------------------------
>> +36100000
>> +36100000 1 36100001
>> +36100001 1 36100002
>> +36100002 1 36100003
>> +36100003 1 36100004
>> +36100004 1 36100005
>> +36100005 2 36100003 36100006
>> +36100006 1 36100007
>> +36100007 0
>> +
>> +--------------------------------------------
>> +5800000
>> +5800000 1 5800000
>> +
>> +--------------------------------------------
>> +40700000
>> +40700000 1 40700001
>> +40700001 1 40700002
>> +40700002 1 40700003
>> +40700003 2 40700000 40700004
>> +40700004 1 40700000
>> +
>> +--------------------------------------------
>> +10400000
>> +10400000 1 10400001
>> +10400001 1 10400002
>> +10400002 1 10400003
>> +10400003 2 10400004 10400015
>> +10400004 1 10400005
>> +10400005 1 10400006
>> +10400006 2 10400005 10400007
>> +10400007 1 10400008
>> +10400008 1 10400009
>> +10400009 1 10400010
>> +10400010 1 10400011
>> +10400011 2 10400003 10400012
>> +10400012 2 10400003 10400013
>> +10400013 1 10400014
>> +10400014 2 10400000 10400015
>> +10400015 1 10400016
>> +10400016 1 10400017
>> +10400017 2 10400018 10400004
>> +10400018 0
>> +
>> +--------------------------------------------
>> +45300000
>> +45300000 2 45300001 45300004
>> +45300001 1 45300002
>> +45300002 1 45300003
>> +45300003 2 45300003 45300004
>> +45300004 2 45300017 45300005
>> +45300005 2 45300003 45300006
>> +45300006 2 45300002 45300007
>> +45300007 2 45300008 45300005
>> +45300008 2 45300009 45300001
>> +45300009 2 45300001 45300010
>> +45300010 2 45300008 45300011
>> +45300011 1 45300012
>> +45300012 2 45300001 45300013
>> +45300013 1 45300014
>> +45300014 2 45300002 45300015
>> +45300015 1 45300016
>> +45300016 2 45300017 45300003
>> +45300017 1 45300018
>> +45300018 1 45300003
>> +
>> +--------------------------------------------
>> +15000000
>> +15000000 1 15000001
>> +15000001 1 15000002
>> +15000002 0
>> +
>> +--------------------------------------------
>> +49900000
>> +49900000 1 49900001
>> +49900001 1 49900000
>> +
>> +--------------------------------------------
>> +49500000
>> +49500000 1 49500001
>> +49500001 0
>> +
>> +--------------------------------------------
>> +19600000
>> +19600000 1 19600001
>> +19600001 1 19600002
>> +19600002 1 19600003
>> +19600003 1 19600004
>> +19600004 1 19600005
>> +19600005 2 19600001 19600006
>> +19600006 2 19600002 19600007
>> +19600007 2 19600008 19600012
>> +19600008 1 19600009
>> +19600009 2 19600010 19600013
>> +19600010 1 19600011
>> +19600011 1 19600012
>> +19600012 1 19600013
>> +19600013 0
>> +
>> +--------------------------------------------
>> +30300000
>> +30300000 1 30300001
>> +30300001 1 30300000
>> +
>> +--------------------------------------------
>> +11100000
>> +11100000 1 11100000
>> +
>> +--------------------------------------------
>> +39300000
>> +39300000 1 39300001
>> +39300001 1 39300002
>> +39300002 2 39300001 39300003
>> +39300003 1 39300004
>> +39300004 1 39300005
>> +39300005 2 39300003 39300006
>> +39300006 2 39300004 39300007
>> +39300007 1 39300008
>> +39300008 1 39300009
>> +39300009 1 39300010
>> +39300010 1 39300011
>> +39300011 2 39300008 39300012
>> +39300012 1 39300013
>> +39300013 1 39300014
>> +39300014 0
>> +
>> +--------------------------------------------
>> +28800000
>> +28800000 1 28800001
>> +28800001 0
>> +
>> +--------------------------------------------
>> +33400000
>> +33400000 2 33400008 33400001
>> +33400001 1 33400002
>> +33400002 1 33400003
>> +33400003 2 33400008 33400004
>> +33400004 1 33400005
>> +33400005 2 33400003 33400006
>> +33400006 1 33400007
>> +33400007 1 33400008
>> +33400008 0
>> +
>> +--------------------------------------------
>> +3100000
>> +3100000 2 3100001 34600000
>> +3100001 2 3100000 3100002
>> +3100002 1 3100000
>> +
>> +--------------------------------------------
>> +38000000
>> +38000000 1 38000001
>> +38000001 1 38000002
>> +38000002 1 38000003
>> +38000003 1 38000004
>> +38000004 1 38000005
>> +38000005 1 38000006
>> +38000006 1 38000007
>> +38000007 1 38000003
>> +
>> +--------------------------------------------
>> +7700000
>> +7700000 2 7700000 7700001
>> +7700001 1 7700002
>> +7700002 2 7700000 7700003
>> +7700003 0
>> +
>> +--------------------------------------------
>> +42600000
>> +42600000 2 42600008 42600001
>> +42600001 1 42600002
>> +42600002 2 42600000 42600003
>> +42600003 1 42600004
>> +42600004 1 42600005
>> +42600005 2 42600001 42600006
>> +42600006 2 42600005 42600007
>> +42600007 1 42600008
>> +42600008 2 42600000 42600009
>> +42600009 1 42600009
>> +
>> +--------------------------------------------
>> +12300000
>> +12300000 0
>> +
>> +--------------------------------------------
>> +47200000
>> +47200000 2 47200000 47200001
>> +47200001 1 47200002
>> +47200002 1 47200003
>> +47200003 1 47200004
>> +47200004 2 47200000 47200005
>> +47200005 1 47200006
>> +47200006 1 47200007
>> +47200007 2 47200008 47200000
>> +47200008 0
>> +
>> +--------------------------------------------
>> +23000000
>> +23000000 2 23000000 23000001
>> +23000001 2 23000001 23000002
>> +23000002 2 23000001 23000003
>> +23000003 1 23000004
>> +23000004 2 23000000 23000005
>> +23000005 0
>> +
>> +--------------------------------------------
>> +43300000
>> +43300000 1 43300001
>> +43300001 1 43300001
>> +
>> +--------------------------------------------
>> +16900000
>> +16900000 1 16900001
>> +16900001 1 16900002
>> +16900002 2 16900001 16900003
>> +16900003 1 16900004
>> +16900004 2 16900003 16900005
>> +16900005 1 16900006
>> +16900006 2 16900004 16900007
>> +16900007 1 16900003
>> +
>> +--------------------------------------------
>> +27400000
>> +27400000 2 27400000 27400001
>> +27400001 1 27400002
>> +27400002 0
>> +
>> +--------------------------------------------
>> +17800000
>> +17800000 1 17800000
>> +
>> +--------------------------------------------
>> +8200000
>> +8200000 1 8200001
>> +8200001 1 8200002
>> +8200002 1 8200003
>> +8200003 1 8200003
>> +
>> +--------------------------------------------
>> +21500000
>> +21500000 0
>> +
>> +--------------------------------------------
>> +26100000
>> +26100000 1 26100001
>> +26100001 1 26100002
>> +26100002 2 26100000 26100003
>> +26100003 1 26100004
>> +26100004 1 26100005
>> +26100005 1 26100006
>> +26100006 1 26100007
>> +26100007 1 26100008
>> +26100008 1 26100009
>> +26100009 1 26100010
>> +26100010 1 26100005
>> +
>> +--------------------------------------------
>> +30700000
>> +30700000 2 30700000 30700001
>> +30700001 2 30700000 30700002
>> +30700002 1 30700003
>> +30700003 1 30700004
>> +30700004 2 30700000 30700005
>> +30700005 1 30700006
>> +30700006 1 30700003
>> +
>> +--------------------------------------------
>> +400000
>> +400000 1 400001
>> +400001 2 400000 400002
>> +400002 1 400003
>> +400003 1 400004
>> +400004 0
>> +
>> +--------------------------------------------
>> +35300000
>> +35300000 1 35300001
>> +35300001 1 35300002
>> +35300002 1 35300000
>> +
>> +--------------------------------------------
>> +38700000
>> +38700000 1 38700001
>> +38700001 2 38700001 38700002
>> +38700002 2 38700003 38700004
>> +38700003 1 38700004
>> +38700004 1 38700005
>> +38700005 0
>> +
>> +--------------------------------------------
>> +39900000
>> +39900000 2 39900000 39900001
>> +39900001 1 39900002
>> +39900002 1 39900003
>> +39900003 2 39900004 39900007
>> +39900004 1 39900005
>> +39900005 1 39900006
>> +39900006 1 39900007
>> +39900007 2 39900008 39900006
>> +39900008 1 39900008
>> +
>> +--------------------------------------------
>> +9600000
>> +9600000 0
>> +
>> +--------------------------------------------
>> +44500000
>> +44500000 1 44500001
>> +44500001 1 44500002
>> +44500002 1 44500003
>> +44500003 2 44500003 44500004
>> +44500004 1 44500005
>> +44500005 1 44500006
>> +44500006 1 44500007
>> +44500007 2 44500008 44500011
>> +44500008 1 44500009
>> +44500009 1 44500010
>> +44500010 1 44500011
>> +44500011 1 44500012
>> +44500012 1 44500002
>> +
>> +--------------------------------------------
>> +14200000
>> +14200000 2 14200000 14200001
>> +14200001 1 14200002
>> +14200002 2 14200001 14200003
>> +14200003 1 14200004
>> +14200004 1 14200005
>> +14200005 2 14200005 14200006
>> +14200006 1 14200007
>> +14200007 0
>> +
>> +--------------------------------------------
>> +49100000
>> +49100000 1 49100001
>> +49100001 1 49100002
>> +49100002 2 49100000 49100003
>> +49100003 1 49100004
>> +49100004 2 49100001 49100005
>> +49100005 1 49100003
>> +
>> +--------------------------------------------
>> +18800000
>> +18800000 1 18800000
>> +
>> +--------------------------------------------
>> +23400000
>> +23400000 1 23400001
>> +23400001 1 23400002
>> +23400002 0
>> +
>> +--------------------------------------------
>> +28000000
>> +28000000 2 28000001 28000002
>> +28000001 2 28000000 28000002
>> +28000002 1 28000000
>> +
>> +--------------------------------------------
>> +22400000
>> +22400000 2 22400000 22400001
>> +22400001 1 22400000
>> +
>> +--------------------------------------------
>> +27200000
>> +27200000 2 27200000 27200001
>> +27200001 0
>> +
>> +--------------------------------------------
>> +32600000
>> +32600000 2 32600000 32600001
>> +32600001 2 32600002 32600003
>> +32600002 1 32600003
>> +32600003 2 32600003 32600004
>> +32600004 1 32600005
>> +32600005 1 32600002
>> +
>> +--------------------------------------------
>> +31700000
>> +31700000 0
>> +
>> +--------------------------------------------
>> +4200000
>> +4200000 2 4200000 4200001
>> +4200001 1 4200000
>> +
>> +--------------------------------------------
>> +8800000
>> +8800000 1 8800001
>> +8800001 2 8800002 8800005
>> +8800002 2 8800002 8800003
>> +8800003 1 8800004
>> +8800004 2 8800002 8800005
>> +8800005 1 8800002
>> +
>> +--------------------------------------------
>> +9000000
>> +9000000 1 7000000
>> +
>> +--------------------------------------------
>> +1500000
>> +1500000 1 1500001
>> +1500001 1 1500002
>> +1500002 1 1500003
>> +1500003 1 1500004
>> +1500004 0
>> +
>> +--------------------------------------------
>> +13400000
>> +13400000 1 13400001
>> +13400001 1 13400001
>> +
>> +--------------------------------------------
>> +43900000
>> +43900000 1 43900001
>> +43900001 2 43900001 43900002
>> +43900002 1 43900003
>> +43900003 1 43900004
>> +43900004 1 43900005
>> +43900005 2 43900006 43900007
>> +43900006 1 43900007
>> +43900007 1 43900008
>> +43900008 2 43900009 43900007
>> +43900009 1 43900010
>> +43900010 1 43900011
>> +43900011 1 43900012
>> +43900012 2 43900013 43900007
>> +43900013 2 43900009 43900014
>> +43900014 2 43900012 43900015
>> +43900015 1 43900016
>> +43900016 1 43900017
>> +43900017 2 43900018 43900013
>> +43900018 2 43900019 43900007
>> +43900019 1 43900020
>> +43900020 0
>> +
>> +--------------------------------------------
>> +6100000
>> +6100000 2 6100000 6100001
>> +6100001 1 6100002
>> +6100002 2 6100001 6100003
>> +6100003 2 6100009 6100004
>> +6100004 2 6100001 6100005
>> +6100005 2 6100010 6100006
>> +6100006 2 6100005 6100007
>> +6100007 1 6100008
>> +6100008 1 6100009
>> +6100009 1 6100010
>> +6100010 1 6100002
>> +
>> +--------------------------------------------
>> +41000000
>> +41000000 2 41000001 41000011
>> +41000001 1 41000002
>> +41000002 1 41000003
>> +41000003 1 41000004
>> +41000004 2 41000004 41000005
>> +41000005 2 41000006 41000007
>> +41000006 1 41000007
>> +41000007 1 41000008
>> +41000008 1 41000009
>> +41000009 1 41000010
>> +41000010 2 41000008 41000011
>> +41000011 0
>> +
>> +--------------------------------------------
>> +15300000
>> +15300000 2 15300000 15300001
>> +15300001 1 15300002
>> +15300002 1 15300003
>> +15300003 2 15300004 15300006
>> +15300004 1 15300005
>> +15300005 2 15300005 15300006
>> +15300006 2 15300002 15300007
>> +15300007 0
>> +
>> +--------------------------------------------
>> +19900000
>> +19900000 2 19900000 19900001
>> +19900001 1 19900000
>> +
>> +--------------------------------------------
>> +24500000
>> +24500000 0
>> +
>> +--------------------------------------------
>> +27600000
>> +27600000 1 27600000
>> +
>> +--------------------------------------------
>> +17400000
>> +17400000 1 17400001
>> +17400001 1 17400001
>> +
>> +--------------------------------------------
>> +29100000
>> +29100000 1 29100000
>> +
>> +--------------------------------------------
>> +33700000
>> +33700000 1 33700001
>> +33700001 0
>> +
>> +--------------------------------------------
>> +3400000
>> +3400000 1 3400001
>> +3400001 1 3400002
>> +3400002 1 3400003
>> +3400003 2 3400003 3400004
>> +3400004 1 3400005
>> +3400005 0
>> +
>> +--------------------------------------------
>> +38300000
>> +38300000 0
>> +
>> +--------------------------------------------
>> +8000000
>> +8000000 1 8000000
>> +
>> +--------------------------------------------
>> +42900000
>> +42900000 1 42900001
>> +42900001 1 42900002
>> +42900002 1 42900003
>> +42900003 1 42900004
>> +42900004 2 42900002 42900005
>> +42900005 0
>> +
>> +--------------------------------------------
>> +47500000
>> +47500000 1 47500001
>> +47500001 0
>> +
>> +--------------------------------------------
>> +11300000
>> +11300000 2 11300001 11300004
>> +11300001 1 11300002
>> +11300002 2 11300003 11300004
>> +11300003 1 11300004
>> +11300004 1 11300005
>> +11300005 1 11300006
>> +11300006 2 11300003 11300007
>> +11300007 2 11300008 11300000
>> +11300008 0
>> +
>> +--------------------------------------------
>> +17200000
>> +17200000 1 17200001
>> +17200001 1 17200000
>> +
>> +--------------------------------------------
>> +21800000
>> +21800000 2 21800000 21800001
>> +21800001 1 1300000
>> +
>> +--------------------------------------------
>> +26400000
>> +26400000 1 26400001
>> +26400001 1 26400002
>> +26400002 1 26400003
>> +26400003 2 26400000 26400004
>> +26400004 1 26400005
>> +26400005 1 26400006
>> +26400006 1 26400002
>> +
>> +--------------------------------------------
>> +700000
>> +700000 2 700001 700004
>> +700001 1 700002
>> +700002 1 700003
>> +700003 2 700001 700004
>> +700004 1 700005
>> +700005 2 700001 700006
>> +700006 1 700007
>> +700007 0
>> +
>> +--------------------------------------------
>> +35600000
>> +35600000 1 35600001
>> +35600001 1 35600002
>> +35600002 1 35600003
>> +35600003 1 35600002
>> +
>> +--------------------------------------------
>> +5300000
>> +5300000 1 5300001
>> +5300001 1 5300001
>> +
>> +--------------------------------------------
>> +27000000
>> +27000000 2 27000001 27000005
>> +27000001 1 27000002
>> +27000002 1 27000003
>> +27000003 2 27000002 27000004
>> +27000004 2 27000002 27000005
>> +27000005 1 27000001
>> +
>> +--------------------------------------------
>> +10900000
>> +10900000 1 10900000
>> +
>> +--------------------------------------------
>> +44800000
>> +44800000 1 44800000
>> +
>> +--------------------------------------------
>> +14500000
>> +14500000 1 14500001
>> +14500001 1 14500002
>> +14500002 0
>> +
>> +--------------------------------------------
>> +49400000
>> +49400000 0
>> +
>> +--------------------------------------------
>> +19100000
>> +19100000 1 19100001
>> +19100001 1 19100002
>> +19100002 1 19100003
>> +19100003 1 19100003
>> +
>> +--------------------------------------------
>> +23700000
>> +23700000 1 23700001
>> +23700001 1 23700002
>> +23700002 0
>> +
>> +--------------------------------------------
>> +28300000
>> +28300000 1 28300001
>> +28300001 1 28300002
>> +28300002 2 28300001 28300003
>> +28300003 1 28300004
>> +28300004 1 28300005
>> +28300005 2 28300005 28300006
>> +28300006 1 28300007
>> +28300007 1 28300008
>> +28300008 2 28300000 28300009
>> +28300009 1 28300010
>> +28300010 1 28300011
>> +28300011 1 28300012
>> +28300012 2 28300013 28300006
>> +28300013 0
>> +
>> +--------------------------------------------
>> +29900000
>> +29900000 1 29900001
>> +29900001 1 29900002
>> +29900002 0
>> +
>> +--------------------------------------------
>> +32900000
>> +32900000 2 32900001 32900002
>> +32900001 2 32900000 32900002
>> +32900002 0
>> +
>> +--------------------------------------------
>> +2600000
>> +2600000 0
>> +
>> +--------------------------------------------
>> +37500000
>> +37500000 1 37500001
>> +37500001 1 37500002
>> +37500002 2 37500000 37500003
>> +37500003 2 37500001 37500004
>> +37500004 1 37500005
>> +37500005 1 37500006
>> +37500006 1 37500007
>> +37500007 2 37500008 37500006
>> +37500008 1 37500009
>> +37500009 0
>> +
>> +--------------------------------------------
>> +7200000
>> +7200000 1 7200001
>> +7200001 1 7200002
>> +7200002 2 7200002 7200003
>> +7200003 1 7200004
>> +7200004 2 7200003 7200005
>> +7200005 1 7200006
>> +7200006 2 7200001 7200007
>> +7200007 2 7200008 7200006
>> +7200008 1 7200009
>> +7200009 2 7200010 7200006
>> +7200010 2 7200011 7200004
>> +7200011 2 7200009 7200012
>> +7200012 2 7200009 7200013
>> +7200013 2 7200003 7200014
>> +7200014 1 7200015
>> +7200015 1 7200016
>> +7200016 1 7200017
>> +7200017 2 7200017 7200018
>> +7200018 2 7200019 7200006
>> +7200019 2 7200003 7200020
>> +7200020 1 7200021
>> +7200021 2 7200008 7200022
>> +7200022 0
>> +
>> +--------------------------------------------
>> +42100000
>> +42100000 2 42100001 42100004
>> +42100001 1 42100002
>> +42100002 1 42100003
>> +42100003 1 42100004
>> +42100004 0
>> +
>> +--------------------------------------------
>> +11800000
>> +11800000 2 11800000 11800001
>> +11800001 1 11800002
>> +11800002 1 11800003
>> +11800003 2 11800004 11800006
>> +11800004 1 11800005
>> +11800005 1 11800006
>> +11800006 1 11800007
>> +11800007 2 11800008 11800002
>> +11800008 0
>> +
>> +--------------------------------------------
>> +46700000
>> +46700000 1 46700001
>> +46700001 2 46700000 46700002
>> +46700002 1 46700003
>> +46700003 2 46700003 46700004
>> +46700004 1 46700005
>> +46700005 1 46700003
>> +
>> +--------------------------------------------
>> +16400000
>> +16400000 1 16400000
>> +
>> +--------------------------------------------
>> +13600000
>> +13600000 2 13600008 13600001
>> +13600001 2 13600001 13600002
>> +13600002 2 13600002 13600003
>> +13600003 1 13600004
>> +13600004 2 13600004 13600005
>> +13600005 2 13600004 13600006
>> +13600006 1 13600007
>> +13600007 1 13600008
>> +13600008 2 13600009 13600002
>> +13600009 2 13600010 13600004
>> +13600010 1 13600011
>> +13600011 1 13600003
>> +
>> +--------------------------------------------
>> +36400000
>> +36400000 2 36400001 36400003
>> +36400001 1 36400002
>> +36400002 2 36400002 36400003
>> +36400003 1 36400004
>> +36400004 1 36400005
>> +36400005 1 36400006
>> +36400006 1 36400007
>> +36400007 1 36400008
>> +36400008 1 36400001
>> +
>> +--------------------------------------------
>> +25600000
>> +25600000 2 25600001 25600002
>> +25600001 1 25600002
>> +25600002 2 25600001 25600003
>> +25600003 1 25600004
>> +25600004 0
>> +
>> +--------------------------------------------
>> +30200000
>> +30200000 1 30200001
>> +30200001 1 30200002
>> +30200002 2 30200002 30200003
>> +30200003 1 30200004
>> +30200004 1 30200005
>> +30200005 2 30200003 30200006
>> +30200006 1 30200007
>> +30200007 1 30200008
>> +30200008 2 30200009 30200005
>> +30200009 2 30200001 30200010
>> +30200010 2 30200010 30200011
>> +30200011 1 30200005
>> +
>> +--------------------------------------------
>> +34800000
>> +34800000 1 34800001
>> +34800001 1 34800002
>> +34800002 1 34800000
>> +
>> +--------------------------------------------
>> +4500000
>> +4500000 1 4500001
>> +4500001 0
>> +
>> +--------------------------------------------
>> +39400000
>> +39400000 0
>> +
>> +--------------------------------------------
>> +44000000
>> +44000000 1 44000001
>> +44000001 2 44000001 44000002
>> +44000002 1 44000002
>> +
>> +--------------------------------------------
>> +48500000
>> +48500000 2 48500000 48500001
>> +48500001 1 48500002
>> +48500002 0
>> +
>> +--------------------------------------------
>> +13700000
>> +13700000 1 13700001
>> +13700001 0
>> +
>> +--------------------------------------------
>> +48600000
>> +48600000 1 48600001
>> +48600001 1 48600002
>> +48600002 1 48600003
>> +48600003 0
>> +
>> +--------------------------------------------
>> +18300000
>> +18300000 1 18300001
>> +18300001 1 18300002
>> +18300002 1 18300003
>> +18300003 1 18300003
>> +
>> +--------------------------------------------
>> +22900000
>> +22900000 2 22900000 22900001
>> +22900001 2 22900001 22900002
>> +22900002 1 22900002
>> +
>> +--------------------------------------------
>> +27500000
>> +27500000 2 27500000 27500001
>> +27500001 0
>> +
>> +--------------------------------------------
>> +32100000
>> +32100000 1 32100001
>> +32100001 1 32100002
>> +32100002 2 32100002 32100003
>> +32100003 2 32100001 32100004
>> +32100004 1 32100005
>> +32100005 2 32100003 32100006
>> +32100006 1 32100007
>> +32100007 2 32100008 32100002
>> +32100008 2 32100008 32100009
>> +32100009 1 32100010
>> +32100010 0
>> +
>> +--------------------------------------------
>> +32200000
>> +32200000 2 32200000 32200001
>> +32200001 1 32200002
>> +32200002 1 32200003
>> +32200003 0
>> +
>> +--------------------------------------------
>> +10700000
>> +10700000 2 10700000 10700001
>> +10700001 2 10700001 10700002
>> +10700002 2 10700003 10700004
>> +10700003 1 10700004
>> +10700004 1 10700005
>> +10700005 1 10700006
>> +10700006 2 10700001 10700007
>> +10700007 2 10700008 10700003
>> +10700008 2 10700009 10700005
>> +10700009 1 10700010
>> +10700010 1 10700011
>> +10700011 0
>> +
>> +--------------------------------------------
>> +6400000
>> +6400000 1 6400001
>> +6400001 1 6400002
>> +6400002 2 6400003 6400006
>> +6400003 2 6400004 6400007
>> +6400004 1 6400005
>> +6400005 1 6400006
>> +6400006 1 6400007
>> +6400007 0
>> +
>> +--------------------------------------------
>> +41300000
>> +41300000 1 41300001
>> +41300001 1 41300002
>> +41300002 1 41300002
>> +
>> +--------------------------------------------
>> +11000000
>> +11000000 2 11000000 11000001
>> +11000001 2 11000000 11000002
>> +11000002 2 11000002 11000003
>> +11000003 0
>> +
>> +--------------------------------------------
>> +45900000
>> +45900000 1 45900001
>> +45900001 1 45900002
>> +45900002 1 45900001
>> +
>> +--------------------------------------------
>> +15600000
>> +15600000 1 15600001
>> +15600001 0
>> +
>> +--------------------------------------------
>> +20200000
>> +20200000 2 20200001 31600000
>> +20200001 0
>> +
>> +--------------------------------------------
>> +24800000
>> +24800000 1 24800001
>> +24800001 0
>> +
>> +--------------------------------------------
>> +15900000
>> +15900000 2 15900000 15900001
>> +15900001 0
>> +
>> +--------------------------------------------
>> +29400000
>> +29400064 2 29400065 29400001
>> +29400065 2 29400066 29400019
>> +29400066 2 29400067 29400051
>> +29400067 2 29400068 29400063
>> +29400068 2 29400069 10000000
>> +29400069 2 29400070 1500000
>> +29400070 2 29400071 46000000
>> +29400071 2 29400072 29400036
>> +29400072 2 29400073 43700000
>> +29400073 2 29400074 35000000
>> +29400074 2 29400075 29400011
>> +29400075 2 29400035 29400076
>> +29400076 2 29400077 27300000
>> +29400077 2 29400078 41700000
>> +29400078 1 29400079
>> +29400079 2 29400080 36800000
>> +29400080 2 29400081 13500000
>> +29400081 2 29400082 29400141
>> +29400082 2 29400083 23000000
>> +29400083 2 29400065 29400084
>> +29400084 2 29400085 29400087
>> +29400085 2 29400086 30500000
>> +29400086 2 29400087 36200000
>> +29400087 2 29400088 29400126
>> +29400088 2 29400089 29400041
>> +29400089 2 29400090 29400047
>> +29400090 2 29400091 5400000
>> +29400091 2 29400107 29400092
>> +29400092 2 29400093 29400095
>> +29400093 2 29400025 29400094
>> +29400094 2 29400000 29400095
>> +29400095 2 29400096 29400070
>> +29400096 2 29400097 4900000
>> +29400097 2 29400098 29400092
>> +29400098 2 29400099 18400000
>> +29400099 2 29400073 29400100
>> +29400100 2 29400101 29400069
>> +29400101 2 29400032 29400102
>> +29400102 2 29400103 21600000
>> +29400103 2 29400104 12600000
>> +29400104 2 29400104 29400105
>> +29400105 2 29400106 10700000
>> +29400106 2 29400107 29400046
>> +29400107 2 29400001 29400108
>> +29400108 2 29400109 37100000
>> +29400109 2 29400057 29400110
>> +29400110 2 29400111 34200000
>> +29400111 2 29400112 46700000
>> +29400112 2 29400113 10500000
>> +29400113 2 29400114 15100000
>> +29400114 2 29400115 30200000
>> +29400115 2 29400116 29400030
>> +29400116 2 29400117 31500000
>> +29400117 2 29400016 29400118
>> +29400118 2 29400061 29400119
>> +29400119 2 29400120 37500000
>> +29400120 2 29400121 29400098
>> +29400121 2 29400122 40800000
>> +29400122 2 29400123 24000000
>> +29400123 2 29400112 29400124
>> +29400124 2 29400125 29400086
>> +29400125 2 29400126 46900000
>> +29400126 2 29400127 9100000
>> +29400127 2 29400128 28400000
>> +29400128 2 29400129 4600000
>> +29400129 2 29400130 29400125
>> +29400130 2 29400131 600000
>> +29400131 2 29400132 18800000
>> +29400132 2 29400133 17000000
>> +29400133 2 29400134 29400047
>> +29400134 2 29400135 13200000
>> +29400135 2 29400136 29100000
>> +29400136 2 29400137 6200000
>> +29400137 2 29400138 29400010
>> +29400138 2 29400139 10400000
>> +29400139 2 29400056 29400140
>> +29400140 2 29400027 29400141
>> +29400141 2 29400142 22300000
>> +29400142 2 29400032 29400143
>> +29400143 2 29400144 49800000
>> +29400144 2 29400145 48400000
>> +29400145 2 29400146 49300000
>> +29400146 2 29400139 26600000
>> +29400000 2 29400001 35900000
>> +29400001 2 29400002 48500000
>> +29400002 2 29400003 29400035
>> +29400003 2 29400003 29400004
>> +29400004 2 29400005 36300000
>> +29400005 2 29400123 29400006
>> +29400006 2 29400007 32400000
>> +29400007 2 29400008 29400042
>> +29400008 2 29400009 29400006
>> +29400009 2 29400010 45900000
>> +29400010 2 29400010 29400011
>> +29400011 2 29400012 2100000
>> +29400012 2 29400013 17100000
>> +29400013 2 29400130 29400014
>> +29400014 2 29400113 29400015
>> +29400015 2 29400016 7800000
>> +29400016 2 29400017 22700000
>> +29400017 2 29400018 34100000
>> +29400018 2 29400019 43600000
>> +29400019 2 29400020 29400014
>> +29400020 2 29400021 44400000
>> +29400021 2 29400022 29400087
>> +29400022 2 29400132 29400023
>> +29400023 2 29400024 37300000
>> +29400024 2 29400025 28300000
>> +29400025 2 29400026 29400021
>> +29400026 2 29400027 900000
>> +29400027 2 29400028 29400006
>> +29400028 2 29400029 29400071
>> +29400029 2 29400030 40900000
>> +29400030 2 29400031 17800000
>> +29400031 2 29400032 2900000
>> +29400032 2 29400033 21500000
>> +29400033 2 29400034 29400011
>> +29400034 2 29400035 29400007
>> +29400035 2 29400034 29400036
>> +29400036 2 29400081 29400037
>> +29400037 2 29400038 45600000
>> +29400038 2 29400010 29400039
>> +29400039 2 29400040 29400020
>> +29400040 2 29400041 29400028
>> +29400041 2 29400042 29400004
>> +29400042 2 29400064 29400043
>> +29400043 2 29400084 29400044
>> +29400044 2 29400045 29400085
>> +29400045 2 29400026 29400046
>> +29400046 2 29400047 2200000
>> +29400047 2 29400048 29400006
>> +29400048 2 29400049 35300000
>> +29400049 2 29400050 47200000
>> +29400050 2 29400064 29400051
>> +29400051 2 29400052 9000000
>> +29400052 2 29400053 29400005
>> +29400053 2 29400054 5900000
>> +29400054 2 29400031 29400055
>> +29400055 2 29400056 33800000
>> +29400056 2 29400057 29400132
>> +29400057 2 29400129 29400058
>> +29400058 2 29400080 29400059
>> +29400059 2 29400060 34300000
>> +29400060 2 29400010 29400061
>> +29400061 2 29400099 29400062
>> +29400062 2 29400063 30900000
>> +29400063 2 29400064 14900000
>> +
>> +--------------------------------------------
>> +34000000
>> +34000000 0
>> +
>> +--------------------------------------------
>> +3700000
>> +3700000 1 3700001
>> +3700001 2 3700002 3700007
>> +3700002 2 3700002 3700003
>> +3700003 1 3700004
>> +3700004 1 3700005
>> +3700005 1 3700006
>> +3700006 2 3700003 3700007
>> +3700007 2 3700008 3700006
>> +3700008 2 3700009 3700005
>> +3700009 1 3700009
>> +
>> +--------------------------------------------
>> +38600000
>> +38600000 2 38600000 38600001
>> +38600001 1 38600002
>> +38600002 1 38600003
>> +38600003 0
>> +
>> +--------------------------------------------
>> +8300000
>> +8300000 2 8300001 8300004
>> +8300001 1 8300002
>> +8300002 1 8300003
>> +8300003 1 8300004
>> +8300004 0
>> +
>> +--------------------------------------------
>> +43200000
>> +43200000 2 43200001 43200002
>> +43200001 2 43200000 43200002
>> +43200002 0
>> +
>> +--------------------------------------------
>> +12900000
>> +12900000 2 12900001 47100000
>> +12900001 2 12900002 15000000
>> +12900002 2 12900003 40700000
>> +12900003 2 12900004 14400000
>> +12900004 2 12900005 20500000
>> +12900005 2 12900006 48100000
>> +12900006 2 12900007 18500000
>> +12900007 2 12900008 44700000
>> +12900008 2 12900009 12900002
>> +12900009 2 12900010 23900000
>> +12900010 2 12900011 3900000
>> +12900011 2 12900012 39100000
>> +12900012 2 12900013 30000000
>> +12900013 2 12900014 3300000
>> +12900014 2 12900012 12900015
>> +12900015 2 12900016 12900003
>> +12900016 2 12900017 46200000
>> +12900017 2 12900018 5200000
>> +12900018 2 12900200 12900019
>> +12900019 2 12900020 12900005
>> +12900020 2 12900021 18000000
>> +12900021 2 12900014 12900022
>> +12900022 2 12900019 12900023
>> +12900023 2 12900024 12900228
>> +12900024 2 12900025 15700000
>> +12900025 2 12900026 12900003
>> +12900026 2 12900027 21300000
>> +12900027 2 12900028 20300000
>> +12900028 2 12900322 12900029
>> +12900029 2 12900018 12900030
>> +12900030 2 12900031 43400000
>> +12900031 2 12900032 12900190
>> +12900032 2 12900033 15900000
>> +12900033 2 12900034 12900018
>> +12900034 2 12900035 12900246
>> +12900035 2 12900036 24800000
>> +12900036 2 12900256 12900037
>> +12900037 2 12900038 18200000
>> +12900038 2 12900131 12900039
>> +12900039 2 12900040 12900039
>> +12900040 2 12900041 26100000
>> +12900041 2 12900042 12900027
>> +12900042 2 12900043 12900275
>> +12900043 2 12900034 12900044
>> +12900044 2 12900045 31400000
>> +12900045 2 12900046 44500000
>> +12900046 2 12900145 12900047
>> +12900047 2 12900048 49500000
>> +12900048 2 12900048 12900049
>> +12900049 2 12900050 18900000
>> +12900050 2 12900051 12900045
>> +12900051 2 12900052 23100000
>> +12900052 2 12900053 49100000
>> +12900053 2 12900035 12900054
>> +12900054 2 12900315 12900055
>> +12900055 2 12900056 100000
>> +12900056 2 12900057 12900053
>> +12900057 2 12900058 6400000
>> +12900058 2 12900059 12900027
>> +12900059 2 12900000 12900060
>> +12900060 2 12900177 12900061
>> +12900061 2 12900062 12900135
>> +12900062 2 12900063 9700000
>> +12900063 2 12900064 12900041
>> +12900064 2 12900065 45300000
>> +12900065 2 12900066 12900005
>> +12900066 2 12900067 11700000
>> +12900067 2 12900000 12900068
>> +12900068 2 12900069 21200000
>> +12900069 2 12900070 16100000
>> +12900070 2 12900007 12900071
>> +12900071 2 12900072 20200000
>> +12900072 2 12900073 21100000
>> +12900073 2 12900074 12900019
>> +12900074 2 12900075 12900046
>> +12900075 2 12900036 12900076
>> +12900076 2 12900077 12900061
>> +12900077 2 12900078 26400000
>> +12900078 2 12900254 12900079
>> +12900079 2 12900080 12900016
>> +12900080 2 12900081 12900075
>> +12900081 2 12900082 12900002
>> +12900082 2 12900082 12900083
>> +12900083 2 12900018 12900084
>> +12900084 2 12900085 33600000
>> +12900085 2 12900086 16700000
>> +12900086 2 12900087 26200000
>> +12900087 2 12900088 12900300
>> +12900088 2 12900089 3200000
>> +12900089 2 12900090 22200000
>> +12900090 2 12900091 7400000
>> +12900091 2 12900092 400000
>> +12900092 2 12900093 2400000
>> +12900093 2 12900094 24600000
>> +12900094 2 12900095 15600000
>> +12900095 2 12900096 39300000
>> +12900096 2 12900097 12900068
>> +12900097 2 12900098 34000000
>> +12900098 2 12900217 12900099
>> +12900099 2 12900100 14300000
>> +12900100 2 12900101 31900000
>> +12900101 2 12900102 1200000
>> +12900102 2 12900103 11300000
>> +12900103 2 12900104 8400000
>> +12900104 2 12900105 12900257
>> +12900105 2 12900106 19700000
>> +12900106 2 12900107 12900075
>> +12900107 2 12900267 12900108
>> +12900108 2 12900109 1800000
>> +12900109 2 12900004 12900110
>> +12900110 2 12900245 12900111
>> +12900111 2 12900112 30100000
>> +12900112 2 12900000 12900113
>> +12900113 2 12900114 5700000
>> +12900114 2 12900115 13400000
>> +12900115 2 12900116 12900326
>> +12900116 2 12900088 12900117
>> +12900117 2 12900118 15800000
>> +12900118 2 12900233 12900119
>> +12900119 2 12900120 33100000
>> +12900120 2 12900121 32100000
>> +12900121 2 12900122 12900270
>> +12900122 2 12900123 34600000
>> +12900123 2 12900124 31300000
>> +12900124 2 12900125 12900045
>> +12900125 2 12900118 12900126
>> +12900126 2 12900076 12900127
>> +12900127 2 12900128 33500000
>> +12900128 2 12900129 12900169
>> +12900129 2 12900130 14000000
>> +12900130 2 12900131 24400000
>> +12900131 2 12900060 12900132
>> +12900132 2 12900133 19100000
>> +12900133 2 12900134 35600000
>> +12900134 2 12900135 700000
>> +12900135 1 12900136
>> +12900136 2 12900137 19400000
>> +12900137 2 12900138 42400000
>> +12900138 2 12900139 43800000
>> +12900139 2 12900153 12900140
>> +12900140 2 12900141 12900245
>> +12900141 2 12900142 12900191
>> +12900142 2 12900143 35100000
>> +12900143 2 12900144 48300000
>> +12900144 2 12900336 12900145
>> +12900145 2 12900146 27100000
>> +12900146 2 12900147 12900038
>> +12900147 2 12900176 12900148
>> +12900148 2 12900149 27500000
>> +12900149 2 12900121 12900150
>> +12900150 2 12900089 12900151
>> +12900151 2 12900152 12900086
>> +12900152 2 12900153 12900189
>> +12900153 2 12900154 36000000
>> +12900154 2 12900155 36900000
>> +12900155 2 12900156 12900029
>> +12900156 2 12900157 41400000
>> +12900157 2 12900158 41600000
>> +12900158 2 12900108 12900159
>> +12900159 2 12900160 12900113
>> +12900160 2 12900161 17700000
>> +12900161 2 12900162 16900000
>> +12900162 2 12900163 12900067
>> +12900163 2 12900128 12900164
>> +12900164 2 12900232 12900165
>> +12900165 2 12900029 12900166
>> +12900166 2 12900167 25900000
>> +12900167 2 12900168 12900048
>> +12900168 2 12900169 2000000
>> +12900169 2 12900016 12900170
>> +12900170 2 12900171 21900000
>> +12900171 2 12900153 12900172
>> +12900172 2 12900173 33700000
>> +12900173 2 12900174 42300000
>> +12900174 2 12900178 12900175
>> +12900175 2 12900176 12900191
>> +12900176 2 12900177 12900130
>> +12900177 2 12900178 12900132
>> +12900178 2 12900106 12900179
>> +12900179 2 12900180 29200000
>> +12900180 2 12900181 35400000
>> +12900181 2 12900041 12900182
>> +12900182 2 12900227 12900183
>> +12900183 2 12900184 12900109
>> +12900184 2 12900185 12900300
>> +12900185 2 12900186 9200000
>> +12900186 2 12900187 12900023
>> +12900187 2 12900188 26700000
>> +12900188 2 12900189 30600000
>> +12900189 2 12900064 12900190
>> +12900190 2 12900177 12900191
>> +12900191 2 12900192 35800000
>> +12900192 2 12900080 12900193
>> +12900193 2 12900194 17900000
>> +12900194 2 12900105 12900195
>> +12900195 2 12900196 12900062
>> +12900196 2 12900197 12900142
>> +12900197 2 12900198 41100000
>> +12900198 2 12900199 13100000
>> +12900199 2 12900200 12900185
>> +12900200 2 12900104 12900201
>> +12900201 2 12900202 27600000
>> +12900202 2 12900203 38900000
>> +12900203 2 12900204 36700000
>> +12900204 2 12900180 12900205
>> +12900205 2 12900206 12900311
>> +12900206 2 12900028 12900207
>> +12900207 2 12900208 12900010
>> +12900208 2 12900209 12900186
>> +12900209 2 12900210 31800000
>> +12900210 2 12900211 26300000
>> +12900211 2 12900212 29700000
>> +12900212 2 12900213 11600000
>> +12900213 2 12900214 300000
>> +12900214 2 12900215 4400000
>> +12900215 2 12900216 34800000
>> +12900216 2 12900217 22000000
>> +12900217 2 12900218 37200000
>> +12900218 2 12900219 18300000
>> +12900219 2 12900220 12900069
>> +12900220 2 12900221 12900222
>> +12900221 2 12900222 16600000
>> +12900222 2 12900223 3700000
>> +12900223 2 12900224 47600000
>> +12900224 2 12900225 17200000
>> +12900225 2 12900226 12900038
>> +12900226 2 12900227 12900207
>> +12900227 2 12900228 26500000
>> +12900228 2 12900229 12500000
>> +12900229 2 12900162 12900230
>> +12900230 2 12900231 23400000
>> +12900231 2 12900232 25800000
>> +12900232 2 12900233 12900265
>> +12900233 2 12900032 12900234
>> +12900234 2 12900235 48900000
>> +12900235 2 12900236 21700000
>> +12900236 2 12900155 12900237
>> +12900237 2 12900012 12900238
>> +12900238 2 12900239 6800000
>> +12900239 2 12900240 7300000
>> +12900240 2 12900241 12900170
>> +12900241 2 12900242 12900246
>> +12900242 2 12900243 25600000
>> +12900243 2 12900099 12900244
>> +12900244 2 12900050 12900245
>> +12900245 2 12900068 12900246
>> +12900246 2 12900247 3500000
>> +12900247 2 12900248 45700000
>> +12900248 2 12900249 6700000
>> +12900249 2 12900250 12900181
>> +12900250 2 12900251 20800000
>> +12900251 2 12900252 12900270
>> +12900252 2 12900120 12900253
>> +12900253 2 12900254 19200000
>> +12900254 2 12900255 26000000
>> +12900255 2 12900256 12900118
>> +12900256 2 12900257 12900004
>> +12900257 2 12900258 12900135
>> +12900258 2 12900154 12900259
>> +12900259 2 12900260 43000000
>> +12900260 2 12900096 12900261
>> +12900261 2 12900010 12900262
>> +12900262 2 12900263 46400000
>> +12900263 2 12900264 12900223
>> +12900264 2 12900265 12900002
>> +12900265 2 12900266 32000000
>> +12900266 2 12900267 2800000
>> +12900267 2 12900114 12900268
>> +12900268 2 12900269 7500000
>> +12900269 2 12900156 12900270
>> +12900270 2 12900005 12900271
>> +12900271 2 12900272 12900154
>> +12900272 2 12900273 12900085
>> +12900273 2 12900274 8900000
>> +12900274 2 12900275 42500000
>> +12900275 2 12900050 12900276
>> +12900276 2 12900277 43500000
>> +12900277 2 12900098 12900278
>> +12900278 2 12900217 12900279
>> +12900279 2 12900280 31700000
>> +12900280 2 12900281 12900002
>> +12900281 2 12900282 48700000
>> +12900282 2 12900146 12900283
>> +12900283 2 12900284 11000000
>> +12900284 2 12900128 12900285
>> +12900285 2 12900286 12900079
>> +12900286 2 12900152 12900287
>> +12900287 2 12900288 12900183
>> +12900288 2 12900289 12900012
>> +12900289 2 12900290 12900310
>> +12900290 2 12900291 27200000
>> +12900291 2 12900292 31600000
>> +12900292 2 12900293 45400000
>> +12900293 2 12900118 12900294
>> +12900294 2 12900307 12900295
>> +12900295 2 12900296 12900180
>> +12900296 2 12900297 25100000
>> +12900297 2 12900298 15300000
>> +12900298 2 12900299 16200000
>> +12900299 2 12900300 43100000
>> +12900300 2 12900301 12900262
>> +12900301 2 12900302 12900279
>> +12900302 2 12900239 12900303
>> +12900303 2 12900304 38800000
>> +12900304 2 12900305 12900121
>> +12900305 2 12900306 24700000
>> +12900306 2 12900307 46800000
>> +12900307 2 12900009 12900308
>> +12900308 2 12900309 5800000
>> +12900309 2 12900310 12900199
>> +12900310 2 12900311 28900000
>> +12900311 2 12900312 13300000
>> +12900312 2 12900313 3400000
>> +12900313 2 12900314 1300000
>> +12900314 2 12900315 43200000
>> +12900315 2 12900051 12900316
>> +12900316 2 12900317 47300000
>> +12900317 2 12900224 12900318
>> +12900318 2 12900014 12900319
>> +12900319 2 12900320 12900247
>> +12900320 2 12900321 12900103
>> +12900321 2 12900322 12900111
>> +12900322 2 12900323 15500000
>> +12900323 2 12900324 49900000
>> +12900324 2 12900156 12900325
>> +12900325 2 12900065 12900326
>> +12900326 2 12900327 5300000
>> +12900327 2 12900328 5000000
>> +12900328 2 12900329 12900156
>> +12900329 2 12900330 12900301
>> +12900330 2 12900331 27900000
>> +12900331 2 12900332 10600000
>> +12900332 2 12900333 12900325
>> +12900333 2 12900334 3600000
>> +12900334 2 12900080 12900335
>> +12900335 2 12900336 12900182
>> +12900336 2 12900337 34400000
>> +12900337 1 45000000
>> +
>> +--------------------------------------------
>> +47800000
>> +47800000 1 47800001
>> +47800001 1 47800002
>> +47800002 1 47800003
>> +47800003 1 47800003
>> +
>> +--------------------------------------------
>> +31600000
>> +31600000 2 31600000 31600001
>> +31600001 1 31600002
>> +31600002 1 31600003
>> +31600003 0
>> +
>> +--------------------------------------------
>> +45800000
>> +45800000 2 45800001 45800002
>> +45800001 1 45800002
>> +45800002 1 45800003
>> +45800003 2 45800002 45800004
>> +45800004 1 45800002
>> +
>> +--------------------------------------------
>> +22100000
>> +22100000 1 22100001
>> +22100001 1 22100002
>> +22100002 1 22100003
>> +22100003 0
>> +
>> +--------------------------------------------
>> +26700000
>> +26700000 1 26700000
>> +
>> +--------------------------------------------
>> +31300000
>> +31300000 1 31300001
>> +31300001 1 31300002
>> +31300002 2 31300003 31300005
>> +31300003 2 31300000 31300004
>> +31300004 1 31300005
>> +31300005 1 31300006
>> +31300006 1 31300007
>> +31300007 2 31300008 31300000
>> +31300008 1 31300009
>> +31300009 1 31300010
>> +31300010 2 31300002 31300011
>> +31300011 1 31300005
>> +
>> +--------------------------------------------
>> +1000000
>> +1000000 1 1000001
>> +1000001 1 1000002
>> +1000002 1 1000003
>> +1000003 1 1000004
>> +1000004 2 1000000 1000005
>> +1000005 1 1000006
>> +1000006 2 1000002 1000007
>> +1000007 1 1000008
>> +1000008 2 1000009 1000005
>> +1000009 1 1000006
>> +
>> +--------------------------------------------
>> +35900000
>> +35900000 1 35900000
>> +
>> +--------------------------------------------
>> +5600000
>> +5600000 1 5600001
>> +5600001 2 5600008 5600002
>> +5600002 1 5600003
>> +5600003 2 5600002 5600004
>> +5600004 1 5600005
>> +5600005 2 5600002 5600006
>> +5600006 1 5600007
>> +5600007 1 5600008
>> +5600008 2 5600009 5600004
>> +5600009 1 5600010
>> +5600010 2 5600003 5600011
>> +5600011 1 5600008
>> +
>> +--------------------------------------------
>> +40500000
>> +40500000 1 40500001
>> +40500001 1 40500002
>> +40500002 1 40500000
>> +
>> +--------------------------------------------
>> +34500000
>> +34500000 1 8100000
>> +
>> +--------------------------------------------
>> +10200000
>> +10200000 1 10200001
>> +10200001 0
>> +
>> +--------------------------------------------
>> +45100000
>> +45100000 1 45100001
>> +45100001 1 45100002
>> +45100002 1 45100003
>> +45100003 2 45100003 45100004
>> +45100004 1 45100005
>> +45100005 1 45100006
>> +45100006 1 45100001
>> +
>> +--------------------------------------------
>> +14800000
>> +14800000 1 14800001
>> +14800001 1 14800002
>> +14800002 1 14800003
>> +14800003 2 14800000 14800004
>> +14800004 2 14800000 14800005
>> +14800005 1 14800000
>> +
>> +--------------------------------------------
>> +49700000
>> +49700000 1 49700001
>> +49700001 1 49700001
>> +
>> +--------------------------------------------
>> +19400000
>> +19400000 1 19400001
>> +19400001 1 19400002
>> +19400002 1 19400003
>> +19400003 1 19400004
>> +19400004 0
>> +
>> +--------------------------------------------
>> +24000000
>> +24000000 1 24000001
>> +24000001 1 24000002
>> +24000002 2 24000000 24000003
>> +24000003 1 24000004
>> +24000004 1 24000005
>> +24000005 1 24000006
>> +24000006 2 24000001 24000007
>> +24000007 2 24000008 24000010
>> +24000008 1 24000009
>> +24000009 1 24000010
>> +24000010 1 24000008
>> +
>> +--------------------------------------------
>> +28600000
>> +28600000 2 28600001 28600002
>> +28600001 2 28600002 28600012
>> +28600002 1 28600003
>> +28600003 2 28600004 28600007
>> +28600004 1 28600005
>> +28600005 1 28600006
>> +28600006 1 28600007
>> +28600007 1 28600008
>> +28600008 1 28600009
>> +28600009 1 28600010
>> +28600010 1 28600011
>> +28600011 2 28600003 28600012
>> +28600012 2 28600000 28600013
>> +28600013 0
>> +
>> +--------------------------------------------
>> +31000000
>> +31000000 1 31000001
>> +31000001 2 31000001 31000002
>> +31000002 2 31000001 31000003
>> +31000003 1 31000004
>> +31000004 2 31000003 31000005
>> +31000005 0
>> +
>> +--------------------------------------------
>> +20100000
>> +20100000 2 20100000 20100001
>> +20100001 1 20100002
>> +20100002 0
>> +
>> +--------------------------------------------
>> +33200000
>> +33200000 1 33200000
>> +
>> +--------------------------------------------
>> +2900000
>> +2900000 1 2900001
>> +2900001 1 2900001
>> +
>> +--------------------------------------------
>> +37800000
>> +37800000 2 37800000 37800001
>> +37800001 2 37800000 37800002
>> +37800002 1 37800003
>> +37800003 1 37800002
>> +
>> +--------------------------------------------
>> +7500000
>> +7500000 0
>> +
>> +--------------------------------------------
>> +42400000
>> +42400000 2 42400000 42400001
>> +42400001 2 42400000 42400002
>> +42400002 2 42400000 42400003
>> +42400003 1 42400004
>> +42400004 1 42400005
>> +42400005 1 42400006
>> +42400006 1 42400007
>> +42400007 2 42400008 42400006
>> +42400008 1 42400009
>> +42400009 2 42400010 42400006
>> +42400010 1 42400011
>> +42400011 1 42400012
>> +42400012 1 42400013
>> +42400013 1 42400014
>> +42400014 1 42400004
>> +
>> +--------------------------------------------
>> +12100000
>> +12100000 1 12100001
>> +12100001 1 12100001
>> +
>> +--------------------------------------------
>> +47000000
>> +47000000 1 47000001
>> +47000001 1 47000002
>> +47000002 2 47000001 47000003
>> +47000003 2 47000001 47000004
>> +47000004 1 47000005
>> +47000005 0
>> +
>> +--------------------------------------------
>> +16700000
>> +16700000 1 16700000
>> +
>> +--------------------------------------------
>> +21300000
>> +21300000 1 21300000
>> +
>> +--------------------------------------------
>> +33900000
>> +33900000 2 33900001 33900003
>> +33900001 1 33900002
>> +33900002 2 33900003 33900007
>> +33900003 1 33900004
>> +33900004 1 33900005
>> +33900005 1 33900006
>> +33900006 2 33900005 33900007
>> +33900007 0
>> +
>> +--------------------------------------------
>> +25900000
>> +25900000 0
>> +
>> +--------------------------------------------
>> +30500000
>> +30500000 1 30500000
>> +
>> +--------------------------------------------
>> +200000
>> +200000 0
>> +
>> +--------------------------------------------
>> +35100000
>> +35100000 1 35100001
>> +35100001 2 35100001 35100002
>> +35100002 1 35100003
>> +35100003 2 35100000 35100004
>> +35100004 0
>> +
>> +--------------------------------------------
>> +4800000
>> +4800000 1 4800001
>> +4800001 0
>> +
>> +--------------------------------------------
>> +39700000
>> +39700000 2 39700001 39700002
>> +39700001 2 39700000 39700002
>> +39700002 2 39700000 39700003
>> +39700003 1 39700003
>> +
>> +--------------------------------------------
>> +9400000
>> +9400000 1 9400001
>> +9400001 1 9400002
>> +9400002 2 9400002 9400003
>> +9400003 1 9400004
>> +9400004 1 9400005
>> +9400005 0
>> +
>> +--------------------------------------------
>> +44300000
>> +44300000 1 44300001
>> +44300001 0
>> +
>> +--------------------------------------------
>> +36800000
>> +36800000 1 36800001
>> +36800001 1 36800001
>> +
>> +--------------------------------------------
>> +45600000
>> +45600000 1 45600001
>> +45600001 2 45600000 45600002
>> +45600002 0
>> +
>> +--------------------------------------------
>> +14000000
>> +14000000 0
>> +
>> +--------------------------------------------
>> +48900000
>> +48900000 1 48900001
>> +48900001 1 48900001
>> +
>> +--------------------------------------------
>> +2100000
>> +2100000 1 2100001
>> +2100001 1 2100002
>> +2100002 2 2100002 2100003
>> +2100003 2 2100002 2100004
>> +2100004 1 2100005
>> +2100005 1 2100006
>> +2100006 1 2100007
>> +2100007 1 2100008
>> +2100008 0
>> +
>> +--------------------------------------------
>> +33300000
>> +33300000 1 33300001
>> +33300001 1 33300002
>> +33300002 2 33300001 33300003
>> +33300003 2 33300000 33300004
>> +33300004 1 33300005
>> +33300005 1 33300006
>> +33300006 0
>> +
>> +--------------------------------------------
>> +6700000
>> +6700000 2 6700000 6700001
>> +6700001 1 6700002
>> +6700002 1 6700001
>> +
>> +--------------------------------------------
>> +41600000
>> +41600000 0
>> +
>> +--------------------------------------------
>> +46200000
>> +46200000 2 46200001 46200006
>> +46200001 1 46200002
>> +46200002 2 46200003 46200005
>> +46200003 2 46200004 46200007
>> +46200004 1 46200005
>> +46200005 2 46200005 46200006
>> +46200006 1 46200007
>> +46200007 1 46200008
>> +46200008 2 46200009 46200006
>> +46200009 1 46200001
>> +
>> +--------------------------------------------
>> +20500000
>> +20500000 1 20500001
>> +20500001 1 20500000
>> +
>> +--------------------------------------------
>> +25100000
>> +25100000 1 25100001
>> +25100001 2 25100002 25100003
>> +25100002 2 25100000 25100003
>> +25100003 1 25100004
>> +25100004 1 25100005
>> +25100005 1 25100006
>> +25100006 2 25100006 25100007
>> +25100007 2 25100008 25100007
>> +25100008 1 25100009
>> +25100009 1 25100010
>> +25100010 1 25100006
>> +
>> +--------------------------------------------
>> +49000000
>> +49000000 2 49000001 49000003
>> +49000001 2 49000002 49000004
>> +49000002 1 49000003
>> +49000003 2 49000003 49000004
>> +49000004 1 49000000
>> +
>> +--------------------------------------------
>> +29500000
>> +29500000 2 29500001 29500012
>> +29500001 1 29500002
>> +29500002 2 29500009 29500003
>> +29500003 1 29500004
>> +29500004 1 29500005
>> +29500005 1 29500006
>> +29500006 1 29500007
>> +29500007 1 29500008
>> +29500008 2 29500009 29500007
>> +29500009 1 29500010
>> +29500010 1 29500011
>> +29500011 2 29500002 29500012
>> +29500012 0
>> +
>> +--------------------------------------------
>> +29700000
>> +29700000 0
>> +
>> +--------------------------------------------
>> +36700000
>> +36700000 1 36700001
>> +36700001 2 36700000 36700002
>> +36700002 1 36700003
>> +36700003 2 36700001 36700004
>> +36700004 1 36700005
>> +36700005 2 36700005 36700006
>> +36700006 1 36700004
>> +
>> +--------------------------------------------
>> +17500000
>> +17500000 1 17500000
>> +
>> +--------------------------------------------
>> +34300000
>> +34300000 1 34300000
>> +
>> +--------------------------------------------
>> +4000000
>> +4000000 1 4000000
>> +
>> +--------------------------------------------
>> +38900000
>> +38900000 2 38900000 38900001
>> +38900001 1 38900002
>> +38900002 1 38900001
>> +
>> +--------------------------------------------
>> +43500000
>> +43500000 1 43500001
>> +43500001 1 43500002
>> +43500002 2 43500000 43500003
>> +43500003 2 43500001 43500004
>> +43500004 2 43500002 43500005
>> +43500005 1 43500003
>> +
>> +--------------------------------------------
>> +13200000
>> +13200000 1 13200001
>> +13200001 1 13200002
>> +13200002 1 13200003
>> +13200003 2 13200000 13200004
>> +13200004 0
>> +
>> +--------------------------------------------
>> +48100000
>> +48100000 1 48100001
>> +48100001 1 48100001
>> +
>> +--------------------------------------------
>> +39100000
>> +39100000 1 39100001
>> +39100001 2 39100000 39100002
>> +39100002 2 39100001 39100003
>> +39100003 0
>> +
>> +--------------------------------------------
>> +43400000
>> +43400000 2 43400001 43400005
>> +43400001 1 43400002
>> +43400002 1 43400003
>> +43400003 2 43400004 43400006
>> +43400004 2 43400002 43400005
>> +43400005 2 43400003 43400006
>> +43400006 1 43400003
>> +
>> +--------------------------------------------
>> +33800000
>> +33800000 1 33800000
>> +
>> +--------------------------------------------
>> +24200000
>> +24200000 2 24200008 24200001
>> +24200001 1 24200002
>> +24200002 2 24200002 24200003
>> +24200003 2 24200008 24200004
>> +24200004 2 24200001 24200005
>> +24200005 2 24200004 24200006
>> +24200006 2 24200008 24200007
>> +24200007 1 24200008
>> +24200008 0
>> +
>> +--------------------------------------------
>> +14600000
>> +14600000 1 14600001
>> +14600001 2 14600000 14600002
>> +14600002 2 14600002 14600003
>> +14600003 1 14600004
>> +14600004 1 14600005
>> +14600005 2 14600001 14600006
>> +14600006 1 14600007
>> +14600007 2 14600008 14600005
>> +14600008 1 14600009
>> +14600009 0
>> +
>> +--------------------------------------------
>> +1300000
>> +1300000 2 1300000 1300001
>> +1300001 1 1300000
>> +
>> +--------------------------------------------
>> +36200000
>> +36200000 1 36200001
>> +36200001 1 36200001
>> +
>> +--------------------------------------------
>> +40800000
>> +40800000 2 40800001 40800002
>> +40800001 1 40800002
>> +40800002 2 40800001 40800003
>> +40800003 2 40800003 40800004
>> +40800004 1 40800005
>> +40800005 1 40800002
>> +
>> +--------------------------------------------
>> +3600000
>> +3600000 2 3600001 3600002
>> +3600001 1 3600002
>> +3600002 2 3600001 3600003
>> +3600003 0
>> +
>> +--------------------------------------------
>> +3800000
>> +3800000 1 3800001
>> +3800001 1 3800002
>> +3800002 1 3800003
>> +3800003 1 3800004
>> +3800004 1 3800005
>> +3800005 1 3800006
>> +3800006 2 3800000 3800007
>> +3800007 1 3800007
>> +
>> +--------------------------------------------
>> +10500000
>> +10500000 0
>> +
>> +--------------------------------------------
>> +45400000
>> +45400000 1 45400001
>> +45400001 2 45400000 45400002
>> +45400002 1 45400003
>> +45400003 1 45400004
>> +45400004 0
>> +
>> +--------------------------------------------
>> +15100000
>> +15100000 1 15100001
>> +15100001 2 15100002 15100003
>> +15100002 2 15100001 15100003
>> +15100003 1 15100002
>> +
>> +--------------------------------------------
>> +19700000
>> +19700000 1 19700001
>> +19700001 1 19700002
>> +19700002 1 19700003
>> +19700003 2 19700004 19700007
>> +19700004 1 19700005
>> +19700005 1 19700006
>> +19700006 2 19700002 19700007
>> +19700007 1 19700008
>> +19700008 1 19700009
>> +19700009 1 19700010
>> +19700010 1 19700011
>> +19700011 1 19700012
>> +19700012 1 19700011
>> +
>> +--------------------------------------------
>> +24300000
>> +24300000 1 24300001
>> +24300001 1 24300002
>> +24300002 2 24300000 24300003
>> +24300003 1 24300004
>> +24300004 0
>> +
>> +--------------------------------------------
>> +28900000
>> +28900000 2 28900000 28900001
>> +28900001 0
>> +
>> +--------------------------------------------
>> +38500000
>> +38500000 0
>> +
>> +--------------------------------------------
>> +33500000
>> +33500000 2 33500000 33500001
>> +33500001 1 33500001
>> +
>> +--------------------------------------------
>> +3200000
>> +3200000 0
>> +
>> +--------------------------------------------
>> +38100000
>> +38100000 1 38100001
>> +38100001 0
>> +
>> +--------------------------------------------
>> +7800000
>> +7800000 1 7800001
>> +7800001 2 7800000 7800002
>> +7800002 2 7800002 7800003
>> +7800003 1 7800001
>> +
>> +--------------------------------------------
>> +42700000
>> +42700000 2 42700000 42700001
>> +42700001 2 42700000 42700002
>> +42700002 1 42700003
>> +42700003 1 42700004
>> +42700004 1 42700005
>> +42700005 2 42700001 42700006
>> +42700006 1 42700007
>> +42700007 1 42700008
>> +42700008 1 42700009
>> +42700009 2 42700000 42700010
>> +42700010 1 42700011
>> +42700011 1 42700012
>> +42700012 1 42700002
>> +
>> +--------------------------------------------
>> +12400000
>> +12400000 2 12400000 12400001
>> +12400001 2 12400000 26200000
>> +
>> +--------------------------------------------
>> +47300000
>> +47300000 1 47300001
>> +47300001 2 47300002 47300007
>> +47300002 2 47300000 47300003
>> +47300003 2 47300000 47300004
>> +47300004 2 47300005 47300006
>> +47300005 1 47300006
>> +47300006 2 47300004 47300007
>> +47300007 2 47300008 47300006
>> +47300008 1 47300009
>> +47300009 2 47300000 47300010
>> +47300010 2 47300011 47300007
>> +47300011 0
>> +
>> +--------------------------------------------
>> +17000000
>> +17000000 1 17000001
>> +17000001 1 17000001
>> +
>> +--------------------------------------------
>> +21600000
>> +21600000 2 21600001 21600007
>> +21600001 2 21600002 21600006
>> +21600002 1 21600003
>> +21600003 2 21600009 21600004
>> +21600004 2 21600009 21600005
>> +21600005 2 21600000 21600006
>> +21600006 1 21600007
>> +21600007 1 21600008
>> +21600008 1 21600009
>> +21600009 1 21600010
>> +21600010 2 21600011 21600007
>> +21600011 1 21600012
>> +21600012 0
>> +
>> +--------------------------------------------
>> +41400000
>> +41400000 0
>> +
>> +--------------------------------------------
>> +29300000
>> +29300000 1 29300000
>> +
>> +--------------------------------------------
>> +26200000
>> +26200000 2 26200000 26200001
>> +26200001 0
>> +
>> +--------------------------------------------
>> +30800000
>> +30800000 0
>> +
>> +--------------------------------------------
>> +500000
>> +500000 1 500001
>> +500001 2 500000 500002
>> +500002 1 500003
>> +500003 1 500004
>> +500004 1 500005
>> +500005 2 500001 500006
>> +500006 2 500005 500007
>> +500007 1 500008
>> +500008 2 500000 500009
>> +500009 1 500004
>> +
>> +--------------------------------------------
>> +35400000
>> +35400000 0
>> +
>> +--------------------------------------------
>> +5100000
>> +5100000 1 5100001
>> +5100001 0
>> +
>> +--------------------------------------------
>> +40000000
>> +40000000 0
>> +
>> +--------------------------------------------
>> +9700000
>> +9700000 1 9700001
>> +9700001 2 9700001 9700002
>> +9700002 0
>> +
>> +--------------------------------------------
>> +44600000
>> +44600000 1 44600001
>> +44600001 2 44600001 44600002
>> +44600002 1 44600003
>> +44600003 2 44600000 44600004
>> +44600004 1 44600005
>> +44600005 1 44600004
>> +
>> +--------------------------------------------
>> +5900000
>> +5900000 1 5900001
>> +5900001 1 5900002
>> +5900002 2 5900001 5900003
>> +5900003 1 5900004
>> +5900004 1 5900005
>> +5900005 2 5900001 5900006
>> +5900006 2 5900009 5900007
>> +5900007 2 5900008 5900000
>> +5900008 2 5900009 5900006
>> +5900009 2 5900009 5900010
>> +5900010 2 5900011 5900006
>> +5900011 2 5900012 5900006
>> +5900012 2 5900009 5900013
>> +5900013 0
>> +
>> +--------------------------------------------
>> +14300000
>> +14300000 2 14300001 14300003
>> +14300001 2 14300001 14300002
>> +14300002 1 14300003
>> +14300003 2 14300002 14300004
>> +14300004 1 14300005
>> +14300005 1 14300006
>> +14300006 0
>> +
>> +--------------------------------------------
>> +49200000
>> +49200000 1 49200001
>> +49200001 2 49200009 49200002
>> +49200002 1 49200003
>> +49200003 1 49200004
>> +49200004 1 49200005
>> +49200005 1 49200006
>> +49200006 2 49200000 49200007
>> +49200007 1 49200008
>> +49200008 1 49200009
>> +49200009 1 49200010
>> +49200010 0
>> +
>> +--------------------------------------------
>> +18900000
>> +18900000 1 18900001
>> +18900001 0
>> +
>> +--------------------------------------------
>> +23500000
>> +23500000 1 23500001
>> +23500001 1 23500001
>> +
>> +--------------------------------------------
>> +28100000
>> +28100000 2 28100000 28100001
>> +28100001 1 28100001
>> +
>> +--------------------------------------------
>> +32700000
>> +32700032 2 32700033 21000000
>> +32700033 2 32700034 48000000
>> +32700034 1 32700002
>> +32700000 2 32700001 32700021
>> +32700001 2 32700002 37700000
>> +32700002 2 32700003 9400000
>> +32700003 1 32700004
>> +32700004 2 32700000 32700005
>> +32700005 2 32700002 32700006
>> +32700006 2 32700007 39800000
>> +32700007 2 32700008 32700033
>> +32700008 2 32700008 32700009
>> +32700009 2 32700010 38000000
>> +32700010 2 32700011 11100000
>> +32700011 2 32700012 47700000
>> +32700012 1 32700013
>> +32700013 2 32700005 32700014
>> +32700014 2 32700032 32700015
>> +32700015 1 32700016
>> +32700016 2 32700017 32700009
>> +32700017 2 32700018 32700015
>> +32700018 1 32700019
>> +32700019 2 32700020 32700021
>> +32700020 2 32700021 39400000
>> +32700021 2 32700022 1600000
>> +32700022 2 32700023 17600000
>> +32700023 2 32700024 32700019
>> +32700024 2 32700025 22500000
>> +32700025 2 32700026 32700013
>> +32700026 2 32700027 34500000
>> +32700027 2 32700028 3800000
>> +32700028 2 32700029 28700000
>> +32700029 2 32700030 37600000
>> +32700030 2 32700015 32700031
>> +32700031 2 32700032 32700000
>> +
>> +--------------------------------------------
>> +2400000
>> +2400000 2 2400000 2400001
>> +2400001 2 2400001 2400002
>> +2400002 1 16400000
>> +
>> +--------------------------------------------
>> +37300000
>> +37300000 1 37300001
>> +37300001 1 37300002
>> +37300002 1 37300003
>> +37300003 0
>> +
>> +--------------------------------------------
>> +34400000
>> +34400000 1 34400001
>> +34400001 1 34400002
>> +34400002 2 34400000 34400003
>> +34400003 1 34400004
>> +34400004 2 34400001 34400005
>> +34400005 2 34400000 34400006
>> +34400006 1 34400000
>> +
>> +--------------------------------------------
>> +6800000
>> +6800000 1 6800001
>> +6800001 1 6800002
>> +6800002 1 6800003
>> +6800003 1 6800004
>> +6800004 1 6800005
>> +6800005 1 6800006
>> +6800006 1 6800007
>> +6800007 1 6800008
>> +6800008 2 6800009 6800002
>> +6800009 1 6800010
>> +6800010 0
>> +
>> +--------------------------------------------
>> +7000000
>> +7000000 1 7000001
>> +7000001 2 7000001 7000002
>> +7000002 1 7000001
>> +
>> +--------------------------------------------
>> +41900000
>> +41900000 2 41900000 41900001
>> +41900001 1 41900000
>> +
>> +--------------------------------------------
>> +11600000
>> +11600000 2 11600001 11600006
>> +11600001 1 11600002
>> +11600002 2 11600001 11600003
>> +11600003 2 11600002 11600004
>> +11600004 2 11600004 11600005
>> +11600005 1 11600006
>> +11600006 2 11600005 11600007
>> +11600007 1 11600008
>> +11600008 1 11600009
>> +11600009 1 11600010
>> +11600010 2 11600011 11600003
>> +11600011 0
>> +
>> +--------------------------------------------
>> +46500000
>> +46500000 1 46500001
>> +46500001 1 46500002
>> +46500002 1 46500003
>> +46500003 1 46500003
>> +
>> +--------------------------------------------
>> +16200000
>> +16200000 1 16200001
>> +16200001 1 16200002
>> +16200002 1 16200001
>> +
>> +--------------------------------------------
>> +20800000
>> +20800000 2 20800000 20800001
>> +20800001 1 20800002
>> +20800002 2 20800018 20800003
>> +20800003 1 20800004
>> +20800004 1 20800005
>> +20800005 1 20800006
>> +20800006 1 20800007
>> +20800007 2 20800008 20800006
>> +20800008 2 20800016 20800009
>> +20800009 1 20800010
>> +20800010 2 20800010 20800011
>> +20800011 1 20800012
>> +20800012 1 20800013
>> +20800013 2 20800006 20800014
>> +20800014 2 20800000 20800015
>> +20800015 1 20800016
>> +20800016 1 20800017
>> +20800017 1 20800018
>> +20800018 2 20800019 20800005
>> +20800019 1 20800020
>> +20800020 1 20800005
>> +
>> +--------------------------------------------
>> +25400000
>> +25400000 1 25400001
>> +25400001 2 25400002 25400004
>> +25400002 1 25400003
>> +25400003 2 25400003 25400004
>> +25400004 2 25400005 25400006
>> +25400005 1 25400006
>> +25400006 0
>> +
>> +--------------------------------------------
>> +43700000
>> +43700000 1 43700001
>> +43700001 2 43700002 43700006
>> +43700002 1 43700003
>> +43700003 1 43700004
>> +43700004 1 43700005
>> +43700005 1 43700006
>> +43700006 1 43700000
>> +
>> +--------------------------------------------
>> +30000000
>> +30000000 2 30000000 30000001
>> +30000001 1 30000002
>> +30000002 1 30000003
>> +30000003 2 30000000 30000004
>> +30000004 1 30000005
>> +30000005 2 30000008 30000006
>> +30000006 2 30000006 30000007
>> +30000007 1 30000008
>> +30000008 1 30000009
>> +30000009 1 30000010
>> +30000010 1 30000011
>> +30000011 1 30000010
>> +
>> +--------------------------------------------
>> +34600000
>> +34600000 2 34600001 34600014
>> +34600001 1 34600002
>> +34600002 1 34600003
>> +34600003 1 34600004
>> +34600004 2 34600005 34600007
>> +34600005 2 34600001 34600006
>> +34600006 2 34600005 34600007
>> +34600007 2 34600008 34600011
>> +34600008 2 34600009 34600013
>> +34600009 2 34600010 34600007
>> +34600010 2 34600010 34600011
>> +34600011 1 34600012
>> +34600012 2 34600004 34600013
>> +34600013 1 34600014
>> +34600014 1 34600015
>> +34600015 0
>> +
>> +--------------------------------------------
>> +4300000
>> +4300000 1 4300001
>> +4300001 2 4300000 4300002
>> +4300002 0
>> +
>> +--------------------------------------------
>> +39200000
>> +39200000 1 39200001
>> +39200001 1 39200002
>> +39200002 1 39200003
>> +39200003 1 39200004
>> +39200004 1 39200005
>> +39200005 1 39200006
>> +39200006 1 39200007
>> +39200007 1 39200008
>> +39200008 1 39200003
>> +
>> +--------------------------------------------
>> +8900000
>> +8900000 1 8900001
>> +8900001 1 8900002
>> +8900002 2 8900001 8900003
>> +8900003 2 8900004 8900006
>> +8900004 2 8900003 8900005
>> +8900005 1 8900006
>> +8900006 2 8900002 8900007
>> +8900007 1 8900006
>> +
>> +--------------------------------------------
>> +43800000
>> +43800000 0
>> +
>> +--------------------------------------------
>> +13500000
>> +13500000 2 13500000 13500001
>> +13500001 2 13500002 13500004
>> +13500002 2 13500001 13500003
>> +13500003 2 13500016 13500004
>> +13500004 2 13500017 13500005
>> +13500005 1 13500006
>> +13500006 2 13500004 13500007
>> +13500007 1 13500008
>> +13500008 1 13500009
>> +13500009 2 13500010 13500005
>> +13500010 1 13500011
>> +13500011 2 13500002 13500012
>> +13500012 1 13500013
>> +13500013 2 13500019 13500014
>> +13500014 1 13500015
>> +13500015 1 13500016
>> +13500016 2 13500017 13500003
>> +13500017 1 13500018
>> +13500018 2 13500018 13500019
>> +13500019 2 13500020 13500022
>> +13500020 1 13500021
>> +13500021 2 13500013 13500022
>> +13500022 1 13500013
>> +
>> +--------------------------------------------
>> +48400000
>> +48400000 1 48400001
>> +48400001 2 48400002 48400004
>> +48400002 1 48400003
>> +48400003 2 48400002 48400004
>> +48400004 1 48400001
>> +
>> +--------------------------------------------
>> +18100000
>> +18100000 0
>> +
>> +--------------------------------------------
>> +46600000
>> +46600000 2 46600001 46600006
>> +46600001 1 46600002
>> +46600002 1 46600003
>> +46600003 1 46600004
>> +46600004 1 46600005
>> +46600005 1 46600006
>> +46600006 1 46600007
>> +46600007 2 46600008 46600006
>> +46600008 1 46600002
>> +
>> +--------------------------------------------
>> +9900000
>> +9900000 2 9900000 9900001
>> +9900001 1 9900002
>> +9900002 2 9900009 9900003
>> +9900003 1 9900004
>> +9900004 2 9900009 9900005
>> +9900005 2 9900003 9900006
>> +9900006 1 9900007
>> +9900007 1 9900008
>> +9900008 1 9900009
>> +9900009 2 9900010 9900004
>> +9900010 1 9900010
>> +
>> +--------------------------------------------
>> +22700000
>> +22700000 1 22700000
>> +
>> +--------------------------------------------
>> +27300000
>> +27300000 1 27300001
>> +27300001 2 27300002 27300004
>> +27300002 2 27300003 27300007
>> +27300003 2 27300003 27300004
>> +27300004 1 27300005
>> +27300005 1 27300006
>> +27300006 2 27300000 27300007
>> +27300007 2 27300008 27300004
>> +27300008 0
>> +
>> +--------------------------------------------
>> +31900000
>> +31900000 2 31900000 31900001
>> +31900001 0
>> +
>> +--------------------------------------------
>> +1600000
>> +1600000 1 1600001
>> +1600001 1 1600002
>> +1600002 1 1600003
>> +1600003 1 1600004
>> +1600004 0
>> +
>> +--------------------------------------------
>> +36500000
>> +36500000 1 36500001
>> +36500001 2 36500002 36500006
>> +36500002 1 36500003
>> +36500003 2 36500000 36500004
>> +36500004 2 36500008 36500005
>> +36500005 1 36500006
>> +36500006 2 36500012 36500007
>> +36500007 1 36500008
>> +36500008 1 36500009
>> +36500009 1 36500010
>> +36500010 1 36500011
>> +36500011 2 36500004 36500012
>> +36500012 1 36500013
>> +36500013 2 36500014 36500015
>> +36500014 1 36500015
>> +36500015 1 36500002
>> +
>> +--------------------------------------------
>> +6200000
>> +6200000 1 6200001
>> +6200001 0
>> +
>> +--------------------------------------------
>> +41100000
>> +41100000 2 41100000 41100001
>> +41100001 1 41100002
>> +41100002 1 41100003
>> +41100003 2 41100001 41100004
>> +41100004 2 41100000 41100005
>> +41100005 1 41100006
>> +41100006 0
>> +
>> +--------------------------------------------
>> +43100000
>> +43100000 2 43100000 43100001
>> +43100001 1 43100002
>> +43100002 1 43100003
>> +43100003 2 43100004 43100013
>> +43100004 2 43100005 43100022
>> +43100005 2 43100000 43100006
>> +43100006 1 43100007
>> +43100007 1 43100008
>> +43100008 1 43100009
>> +43100009 1 43100010
>> +43100010 1 43100011
>> +43100011 1 43100012
>> +43100012 2 43100013 43100021
>> +43100013 1 43100014
>> +43100014 1 43100015
>> +43100015 1 43100016
>> +43100016 1 43100017
>> +43100017 1 43100018
>> +43100018 2 43100019 43100014
>> +43100019 1 43100020
>> +43100020 1 43100021
>> +43100021 2 43100002 43100022
>> +43100022 1 43100023
>> +43100023 1 43100021
>> +
>> +--------------------------------------------
>> +10800000
>> +10800000 1 10800001
>> +10800001 2 10800000 10800002
>> +10800002 1 10800002
>> +
>> +--------------------------------------------
>> +45700000
>> +45700000 1 45700000
>> +
>> +--------------------------------------------
>> +15400000
>> +15400000 1 15400001
>> +15400001 0
>> +
>> +--------------------------------------------
>> +20000000
>> +20000000 1 20000001
>> +20000001 1 20000002
>> +20000002 2 20000000 20000003
>> +20000003 1 20000001
>> +
>> +--------------------------------------------
>> +24600000
>> +24600000 2 24600000 24600001
>> +24600001 1 24600002
>> +24600002 2 24600000 24600003
>> +24600003 2 24600000 24600004
>> +24600004 1 24600005
>> +24600005 2 24600002 24600006
>> +24600006 0
>> +
>> +--------------------------------------------
>> +29200000
>> +29200000 2 29200000 29200001
>> +29200001 0
>> +
>> +--------------------------------------------
>> +46000000
>> +46000000 1 46000001
>> +46000001 1 46000002
>> +46000002 1 46000003
>> +46000003 1 46000004
>> +46000004 1 46000005
>> +46000005 2 46000011 46000006
>> +46000006 2 46000006 46000007
>> +46000007 1 46000008
>> +46000008 2 46000009 46000010
>> +46000009 2 46000010 46000005
>> +46000010 1 46000011
>> +46000011 2 46000010 46000012
>> +46000012 2 46000013 46000014
>> +46000013 2 46000008 46000014
>> +46000014 1 46000015
>> +46000015 1 46000016
>> +46000016 1 46000017
>> +46000017 0
>> +
>> +--------------------------------------------
>> +22600000
>> +22600000 2 22600000 22600001
>> +22600001 2 22600002 22600003
>> +22600002 1 22600003
>> +22600003 2 22600009 22600004
>> +22600004 1 22600005
>> +22600005 1 22600006
>> +22600006 1 22600007
>> +22600007 2 22600008 22600006
>> +22600008 2 22600008 22600009
>> +22600009 1 22600010
>> +22600010 2 22600019 22600011
>> +22600011 2 22600011 22600012
>> +22600012 1 22600013
>> +22600013 1 22600014
>> +22600014 1 22600015
>> +22600015 2 22600016 22600018
>> +22600016 2 22600017 22600001
>> +22600017 1 22600018
>> +22600018 2 22600019 22600012
>> +22600019 0
>> +
>> +--------------------------------------------
>> +3500000
>> +3500000 1 3500001
>> +3500001 2 3500001 3500002
>> +3500002 2 3500000 3500003
>> +3500003 2 3500003 3500004
>> +3500004 2 3500016 3500005
>> +3500005 1 3500006
>> +3500006 2 3500008 3500007
>> +3500007 2 3500008 3500000
>> +3500008 1 3500009
>> +3500009 2 3500010 3500020
>> +3500010 1 3500011
>> +3500011 2 3500017 3500012
>> +3500012 1 3500013
>> +3500013 2 3500002 3500014
>> +3500014 1 3500015
>> +3500015 1 3500016
>> +3500016 1 3500017
>> +3500017 1 3500018
>> +3500018 1 3500019
>> +3500019 1 3500020
>> +3500020 1 3500021
>> +3500021 1 3500022
>> +3500022 1 3500007
>> +
>> +--------------------------------------------
>> +38400000
>> +38400000 2 38400000 38400001
>> +38400001 1 38400002
>> +38400002 1 38400003
>> +38400003 1 38400004
>> +38400004 0
>> +
>> +--------------------------------------------
>> +8100000
>> +8100000 1 8100001
>> +8100001 2 8100001 8100002
>> +8100002 2 8100002 8100003
>> +8100003 1 3100000
>> +
>> +--------------------------------------------
>> +43000000
>> +43000000 1 43000001
>> +43000001 0
>> +
>> +--------------------------------------------
>> +23900000
>> +23900000 1 23900001
>> +23900001 2 23900001 23900002
>> +23900002 2 23900001 23900003
>> +23900003 1 23900004
>> +23900004 0
>> +
>> +--------------------------------------------
>> +12700000
>> +12700000 0
>> +
>> +--------------------------------------------
>> +47600000
>> +47600000 2 47600000 47600001
>> +47600001 1 47600002
>> +47600002 1 47600003
>> +47600003 2 47600002 47600004
>> +47600004 1 47600005
>> +47600005 0
>> +
>> +--------------------------------------------
>> +17300000
>> +17300000 2 17300000 17300001
>> +17300001 1 17300002
>> +17300002 0
>> +
>> +--------------------------------------------
>> +21900000
>> +21900000 1 21900001
>> +21900001 2 21900001 21900002
>> +21900002 0
>> +
>> +--------------------------------------------
>> +42500000
>> +42500000 1 42500001
>> +42500001 1 42500000
>> +
>> +--------------------------------------------
>> +26500000
>> +26500000 2 26500001 26500004
>> +26500001 1 26500002
>> +26500002 2 26500000 26500003
>> +26500003 2 26500003 26500004
>> +26500004 0
>> +
>> +--------------------------------------------
>> +31100000
>> +31100000 2 31100001 31100005
>> +31100001 2 31100002 31100010
>> +31100002 2 31100003 31100005
>> +31100003 1 31100004
>> +31100004 1 31100005
>> +31100005 1 31100006
>> +31100006 2 31100000 31100007
>> +31100007 1 31100008
>> +31100008 1 31100009
>> +31100009 1 31100010
>> +31100010 1 31100011
>> +31100011 1 31100012
>> +31100012 1 31100013
>> +31100013 1 31100014
>> +31100014 0
>> +
>> +--------------------------------------------
>> +800000
>> +800000 1 800001
>> +800001 1 800002
>> +800002 1 800002
>> +
>> +--------------------------------------------
>> +35700000
>> +35700224 2 35700225 7100000
>> +35700225 2 35700048 35700226
>> +35700226 2 35700033 35700227
>> +35700227 2 35700228 35700151
>> +35700228 2 35700244 35700229
>> +35700229 2 35700230 42900000
>> +35700230 2 35700040 35700231
>> +35700231 2 35700232 6000000
>> +35700232 2 35700233 34900000
>> +35700233 2 35700234 8200000
>> +35700234 2 35700235 35700004
>> +35700235 2 35700236 23800000
>> +35700236 2 35700091 35700237
>> +35700237 2 35700238 31200000
>> +35700238 2 35700090 35700239
>> +35700239 2 35700240 16000000
>> +35700240 2 35700241 20400000
>> +35700241 2 35700242 42000000
>> +35700242 2 35700243 35700039
>> +35700243 2 35700244 0
>> +35700244 2 35700196 35700245
>> +35700245 2 35700246 33400000
>> +35700246 2 35700247 24200000
>> +35700247 2 35700248 35700032
>> +35700248 2 35700249 35700020
>> +35700249 2 35700250 25700000
>> +35700250 2 35700024 35700251
>> +35700251 2 35700252 47400000
>> +35700252 2 35700253 35700175
>> +35700253 2 35700171 35700254
>> +35700254 2 35700150 35700255
>> +35700255 2 35700256 35700110
>> +35700256 2 35700257 1100000
>> +35700257 2 35700258 35700098
>> +35700258 2 35700259 35700230
>> +35700259 2 35700260 49700000
>> +35700260 1 47000000
>> +35700000 2 35700001 35700054
>> +35700001 2 35700000 35700002
>> +35700002 2 35700003 35700004
>> +35700003 2 35700004 5100000
>> +35700004 2 35700005 49400000
>> +35700005 2 35700001 35700006
>> +35700006 2 35700121 35700007
>> +35700007 2 35700008 43300000
>> +35700008 2 35700009 35700197
>> +35700009 2 35700010 500000
>> +35700010 2 35700011 35700006
>> +35700011 2 35700012 42200000
>> +35700012 2 35700226 35700013
>> +35700013 2 35700010 35700014
>> +35700014 2 35700012 35700015
>> +35700015 2 35700016 800000
>> +35700016 2 35700017 11900000
>> +35700017 2 35700018 36100000
>> +35700018 2 35700040 35700019
>> +35700019 2 35700020 23300000
>> +35700020 2 35700021 41300000
>> +35700021 2 35700022 29600000
>> +35700022 2 35700023 38200000
>> +35700023 2 35700024 36400000
>> +35700024 2 35700025 35700018
>> +35700025 2 35700026 35700182
>> +35700026 2 35700027 35700020
>> +35700027 2 35700028 44000000
>> +35700028 2 35700026 35700029
>> +35700029 2 35700030 13600000
>> +35700030 2 35700031 44300000
>> +35700031 2 35700032 36600000
>> +35700032 2 35700033 35700022
>> +35700033 2 35700034 22100000
>> +35700034 2 35700035 35700004
>> +35700035 2 35700036 11800000
>> +35700036 2 35700037 17400000
>> +35700037 2 35700126 35700038
>> +35700038 2 35700228 35700039
>> +35700039 2 35700040 35700128
>> +35700040 2 35700041 35700073
>> +35700041 2 35700042 8800000
>> +35700042 2 35700043 46100000
>> +35700043 2 35700044 20700000
>> +35700044 2 35700045 11400000
>> +35700045 2 35700046 14700000
>> +35700046 2 35700003 35700047
>> +35700047 2 35700048 35700047
>> +35700048 2 35700049 35700035
>> +35700049 2 35700050 35700045
>> +35700050 2 35700051 18700000
>> +35700051 2 35700052 8300000
>> +35700052 2 35700053 14600000
>> +35700053 2 35700054 22400000
>> +35700054 2 35700190 35700055
>> +35700055 2 35700056 35700036
>> +35700056 2 35700057 6900000
>> +35700057 2 35700058 5600000
>> +35700058 2 35700059 37000000
>> +35700059 2 35700000 35700060
>> +35700060 2 35700061 35700039
>> +35700061 2 35700062 13000000
>> +35700062 2 35700063 29400000
>> +35700063 2 35700064 35700045
>> +35700064 2 35700065 19900000
>> +35700065 2 35700066 33300000
>> +35700066 2 35700019 35700067
>> +35700067 2 35700068 35700174
>> +35700068 2 35700069 2300000
>> +35700069 2 35700070 16400000
>> +35700070 2 35700200 35700071
>> +35700071 2 35700072 35700046
>> +35700072 2 35700073 35700214
>> +35700073 2 35700032 35700074
>> +35700074 2 35700075 15400000
>> +35700075 2 35700076 35700173
>> +35700076 2 35700012 35700077
>> +35700077 2 35700078 35700039
>> +35700078 2 35700082 35700079
>> +35700079 2 35700080 7000000
>> +35700080 2 35700081 10800000
>> +35700081 2 35700082 35700018
>> +35700082 2 35700083 19800000
>> +35700083 2 35700084 20000000
>> +35700084 2 35700192 35700085
>> +35700085 2 35700086 34700000
>> +35700086 2 35700218 35700087
>> +35700087 2 35700088 35700124
>> +35700088 2 35700089 35700219
>> +35700089 2 35700090 35700218
>> +35700090 2 35700009 35700091
>> +35700091 2 35700192 35700092
>> +35700092 2 35700093 38100000
>> +35700093 2 35700075 35700094
>> +35700094 2 35700095 27000000
>> +35700095 2 35700096 42600000
>> +35700096 2 35700097 33900000
>> +35700097 2 35700098 41900000
>> +35700098 2 35700099 19000000
>> +35700099 2 35700074 35700100
>> +35700100 2 35700101 47500000
>> +35700101 2 35700097 35700102
>> +35700102 2 35700103 37400000
>> +35700103 2 35700104 19600000
>> +35700104 2 35700112 35700105
>> +35700105 2 35700106 9900000
>> +35700106 2 35700107 35700062
>> +35700107 2 35700018 35700108
>> +35700108 2 35700109 33200000
>> +35700109 2 35700110 21800000
>> +35700110 2 35700090 35700111
>> +35700111 2 35700112 21400000
>> +35700112 2 35700113 35700083
>> +35700113 2 35700114 20600000
>> +35700114 2 35700115 1900000
>> +35700115 2 35700116 35700077
>> +35700116 2 35700117 35200000
>> +35700117 2 35700118 29800000
>> +35700118 2 35700119 40400000
>> +35700119 2 35700120 35700088
>> +35700120 2 35700144 35700121
>> +35700121 2 35700097 35700122
>> +35700122 2 35700123 46500000
>> +35700123 2 35700124 23200000
>> +35700124 2 35700081 35700125
>> +35700125 2 35700126 32300000
>> +35700126 2 35700127 48600000
>> +35700127 2 35700128 46600000
>> +35700128 2 35700129 35700057
>> +35700129 2 35700130 35700206
>> +35700130 2 35700178 35700131
>> +35700131 2 35700132 35700117
>> +35700132 2 35700133 12300000
>> +35700133 2 35700213 35700134
>> +35700134 2 35700113 35700135
>> +35700135 2 35700136 7600000
>> +35700136 2 35700137 28100000
>> +35700137 2 35700138 35700054
>> +35700138 2 35700139 49200000
>> +35700139 2 35700140 19500000
>> +35700140 2 35700040 35700141
>> +35700141 2 35700108 35700142
>> +35700142 2 35700183 35700143
>> +35700143 2 35700144 47900000
>> +35700144 2 35700145 35700097
>> +35700145 2 35700146 37900000
>> +35700146 2 35700147 20100000
>> +35700147 2 35700148 10200000
>> +35700148 2 35700149 16300000
>> +35700149 2 35700150 35700111
>> +35700150 2 35700151 23600000
>> +35700151 2 35700152 35700084
>> +35700152 2 35700153 35700014
>> +35700153 2 35700154 39700000
>> +35700154 2 35700155 9800000
>> +35700155 2 35700123 35700156
>> +35700156 2 35700157 35700007
>> +35700157 2 35700158 16800000
>> +35700158 2 35700009 35700159
>> +35700159 2 35700160 35700204
>> +35700160 2 35700161 32900000
>> +35700161 2 35700162 42800000
>> +35700162 2 35700041 35700163
>> +35700163 2 35700025 35700164
>> +35700164 2 35700165 22600000
>> +35700165 2 35700029 35700166
>> +35700166 2 35700001 35700167
>> +35700167 2 35700168 35700160
>> +35700168 2 35700169 44100000
>> +35700169 2 35700170 35700150
>> +35700170 2 35700171 18600000
>> +35700171 2 35700172 4800000
>> +35700172 2 35700173 17500000
>> +35700173 2 35700174 27800000
>> +35700174 2 35700175 39500000
>> +35700175 2 35700176 32600000
>> +35700176 2 35700177 35700097
>> +35700177 2 35700178 35700172
>> +35700178 2 35700179 41000000
>> +35700179 2 35700203 35700180
>> +35700180 2 35700181 35700206
>> +35700181 2 35700236 35700182
>> +35700182 2 35700089 35700183
>> +35700183 2 35700184 35700077
>> +35700184 2 35700088 35700185
>> +35700185 2 35700186 35700123
>> +35700186 2 35700187 3000000
>> +35700187 2 35700188 40200000
>> +35700188 2 35700189 35700133
>> +35700189 2 35700190 32800000
>> +35700190 2 35700191 33000000
>> +35700191 2 35700192 44800000
>> +35700192 2 35700193 4700000
>> +35700193 2 35700194 12000000
>> +35700194 2 35700195 28500000
>> +35700195 2 35700196 6500000
>> +35700196 2 35700197 40500000
>> +35700197 2 35700025 35700198
>> +35700198 2 35700239 35700199
>> +35700199 2 35700200 48800000
>> +35700200 2 35700201 2700000
>> +35700201 2 35700202 35700151
>> +35700202 2 35700203 35700037
>> +35700203 2 35700170 35700204
>> +35700204 2 35700205 17300000
>> +35700205 2 35700134 35700206
>> +35700206 2 35700008 35700207
>> +35700207 2 35700208 38500000
>> +35700208 2 35700209 35700081
>> +35700209 2 35700210 38400000
>> +35700210 2 35700211 35700164
>> +35700211 2 35700210 35700212
>> +35700212 2 35700213 10900000
>> +35700213 2 35700214 14200000
>> +35700214 2 35700215 30300000
>> +35700215 2 35700216 2500000
>> +35700216 2 35700217 35700179
>> +35700217 2 35700145 35700218
>> +35700218 2 35700219 35700139
>> +35700219 2 35700220 35700109
>> +35700220 2 35700221 30800000
>> +35700221 2 35700117 35700222
>> +35700222 2 35700223 39000000
>> +35700223 2 35700224 29500000
>> +
>> +--------------------------------------------
>> +5400000
>> +5400000 2 5400000 42700000
>> +
>> +--------------------------------------------
>> +40300000
>> +40300000 2 40300001 40300002
>> +40300001 2 40300002 40300004
>> +40300002 1 40300003
>> +40300003 1 40300004
>> +40300004 0
>> +
>> +--------------------------------------------
>> +10000000
>> +10000000 1 10000001
>> +10000001 1 10000002
>> +10000002 1 10000002
>> +
>> +--------------------------------------------
>> +44900000
>> +44900000 0
>> +
>> +--------------------------------------------
>> +39000000
>> +39000000 2 39000001 39000002
>> +39000001 1 39000002
>> +39000002 0
>> +
>> +--------------------------------------------
>> +19300000
>> +19300000 1 19300001
>> +19300001 0
>> +
>> +--------------------------------------------
>> +19200000
>> +19200000 2 19200000 19200001
>> +19200001 1 19200002
>> +19200002 1 19200003
>> +19200003 2 19200002 19200004
>> +19200004 1 19200005
>> +19200005 1 19200004
>> +
>> +--------------------------------------------
>> +23800000
>> +23800000 2 23800000 23800001
>> +23800001 0
>> +
>> +--------------------------------------------
>> +28400000
>> +28400000 1 28400001
>> +28400001 2 28400000 42600000
>> +
>> +--------------------------------------------
>> +33000000
>> +33000000 1 33000001
>> +33000001 0
>> +
>> +--------------------------------------------
>> +2700000
>> +2700000 1 2700001
>> +2700001 2 2700000 2700002
>> +2700002 2 2700000 2700003
>> +2700003 1 2700000
>> +
>> +--------------------------------------------
>> +37600000
>> +37600000 2 37600000 37600001
>> +37600001 0
>> +
>> +--------------------------------------------
>> +48300000
>> +48300000 0
>> +
>> +--------------------------------------------
>> +7300000
>> +7300000 1 7300000
>> +
>> +--------------------------------------------
>> +42200000
>> +42200000 1 42200001
>> +42200001 1 42200002
>> +42200002 2 42200001 42200003
>> +42200003 1 42200004
>> +42200004 0
>> +
>> +--------------------------------------------
>> +11900000
>> +11900000 1 11900001
>> +11900001 1 11900002
>> +11900002 2 11900001 11900003
>> +11900003 2 11900001 11900004
>> +11900004 2 11900002 11900005
>> +11900005 1 11900004
>> +
>> +--------------------------------------------
>> +46800000
>> +46800000 2 46800001 14100000
>> +46800001 2 46800002 46800062
>> +46800002 2 46800000 46800003
>> +46800003 2 46800001 46800004
>> +46800004 2 46800004 46800005
>> +46800005 2 46800006 40300000
>> +46800006 2 46800007 4500000
>> +46800007 2 46800008 45800000
>> +46800008 2 46800009 8700000
>> +46800009 2 46800010 29000000
>> +46800010 2 46800000 46800011
>> +46800011 2 46800012 29900000
>> +46800012 2 46800013 40100000
>> +46800013 2 46800014 8000000
>> +46800014 2 46800015 1400000
>> +46800015 2 46800016 11500000
>> +46800016 2 46800017 24900000
>> +46800017 2 46800018 46800044
>> +46800018 2 46800016 46800019
>> +46800019 2 46800010 46800020
>> +46800020 2 46800021 44900000
>> +46800021 2 46800160 46800022
>> +46800022 2 46800023 41200000
>> +46800023 2 46800024 46800093
>> +46800024 2 46800025 45200000
>> +46800025 2 46800026 2600000
>> +46800026 2 46800010 46800027
>> +46800027 2 46800028 7900000
>> +46800028 2 46800029 32500000
>> +46800029 2 46800026 46800030
>> +46800030 2 46800031 24100000
>> +46800031 2 46800032 43900000
>> +46800032 2 46800033 46800004
>> +46800033 2 46800034 31100000
>> +46800034 2 46800035 46800005
>> +46800035 2 46800036 27700000
>> +46800036 2 46800037 42100000
>> +46800037 2 46800038 25300000
>> +46800038 2 46800039 8500000
>> +46800039 2 46800040 26800000
>> +46800040 2 46800041 45500000
>> +46800041 2 46800042 46800015
>> +46800042 2 46800043 8600000
>> +46800043 2 46800044 46800021
>> +46800044 2 46800024 46800045
>> +46800045 2 46800147 46800046
>> +46800046 2 46800038 46800047
>> +46800047 2 46800048 46800069
>> +46800048 2 46800049 12100000
>> +46800049 2 46800050 46800045
>> +46800050 1 46800051
>> +46800051 2 46800052 48200000
>> +46800052 2 46800057 46800053
>> +46800053 2 46800034 46800054
>> +46800054 2 46800005 46800055
>> +46800055 2 46800056 46800132
>> +46800056 2 46800057 13900000
>> +46800057 2 46800058 30700000
>> +46800058 2 46800059 46800043
>> +46800059 2 46800060 25500000
>> +46800060 2 46800124 46800061
>> +46800061 2 46800034 46800062
>> +46800062 2 46800063 38700000
>> +46800063 2 46800064 38300000
>> +46800064 2 46800065 28000000
>> +46800065 2 46800066 39200000
>> +46800066 2 46800066 46800067
>> +46800067 2 46800067 46800068
>> +46800068 2 46800048 46800069
>> +46800069 2 46800012 46800070
>> +46800070 2 46800007 46800071
>> +46800071 2 46800072 44200000
>> +46800072 2 46800073 41800000
>> +46800073 2 46800074 46800071
>> +46800074 2 46800075 46800030
>> +46800075 2 46800076 7200000
>> +46800076 2 46800066 46800077
>> +46800077 2 46800078 9600000
>> +46800078 2 46800010 46800079
>> +46800079 2 46800080 46800064
>> +46800080 2 46800081 35700000
>> +46800081 2 46800082 32200000
>> +46800082 2 46800083 38600000
>> +46800083 2 46800084 7700000
>> +46800084 2 46800085 16500000
>> +46800085 2 46800059 46800086
>> +46800086 2 46800113 46800087
>> +46800087 2 46800088 12400000
>> +46800088 2 46800089 11200000
>> +46800089 2 46800090 44600000
>> +46800090 2 46800098 46800091
>> +46800091 2 46800092 1000000
>> +46800092 2 46800093 14500000
>> +46800093 2 46800075 46800094
>> +46800094 2 46800074 46800095
>> +46800095 2 46800096 46800016
>> +46800096 2 46800097 46800042
>> +46800097 2 46800098 13800000
>> +46800098 2 46800099 4200000
>> +46800099 2 46800100 9300000
>> +46800100 2 46800101 15200000
>> +46800101 2 46800102 22800000
>> +46800102 2 46800103 20900000
>> +46800103 2 46800104 46800070
>> +46800104 2 46800105 25400000
>> +46800105 2 46800040 46800106
>> +46800106 2 46800107 46300000
>> +46800107 2 46800108 39900000
>> +46800108 2 46800042 46800109
>> +46800109 2 46800110 40000000
>> +46800110 2 46800106 46800111
>> +46800111 2 46800112 39600000
>> +46800112 2 46800113 46800090
>> +46800113 2 46800114 46800086
>> +46800114 1 46800115
>> +46800115 2 46800017 46800116
>> +46800116 2 46800117 49000000
>> +46800117 2 46800118 200000
>> +46800118 2 46800050 46800119
>> +46800119 2 46800120 46800067
>> +46800120 1 46800121
>> +46800121 2 46800122 18100000
>> +46800122 2 46800123 46800070
>> +46800123 2 46800124 19300000
>> +46800124 2 46800059 46800125
>> +46800125 2 46800126 45100000
>> +46800126 2 46800005 46800127
>> +46800127 2 46800128 30400000
>> +46800128 2 46800129 46800126
>> +46800129 2 46800130 46800101
>> +46800130 2 46800131 12800000
>> +46800131 2 46800132 40600000
>> +46800132 2 46800065 46800133
>> +46800133 2 46800134 12200000
>> +46800134 2 46800127 46800135
>> +46800135 2 46800136 49600000
>> +46800136 2 46800137 46800097
>> +46800137 2 46800025 46800138
>> +46800138 2 46800139 6100000
>> +46800139 2 46800140 46800119
>> +46800140 2 46800136 46800141
>> +46800141 2 46800142 23700000
>> +46800142 2 46800143 47800000
>> +46800143 2 46800144 25000000
>> +46800144 2 46800145 4000000
>> +46800145 2 46800146 24500000
>> +46800146 2 46800147 46800067
>> +46800147 2 46800148 28600000
>> +46800148 2 46800011 46800149
>> +46800149 2 46800134 46800150
>> +46800150 2 46800137 46800151
>> +46800151 2 46800152 46800124
>> +46800152 2 46800024 46800153
>> +46800153 2 46800154 24300000
>> +46800154 2 46800155 4100000
>> +46800155 2 46800115 46800156
>> +46800156 2 46800000 46800157
>> +46800157 2 46800158 13700000
>> +46800158 2 46800159 9500000
>> +46800159 2 46800160 10300000
>> +46800160 2 46800161 4300000
>> +46800161 2 46800008 46800162
>> +46800162 2 46800163 22900000
>> +46800163 2 46800164 35500000
>> +46800164 2 46800080 46800165
>> +46800165 1 28800000
>> +
>> +--------------------------------------------
>> +16500000
>> +16500000 1 16500000
>> +
>> +--------------------------------------------
>> +21100000
>> +21100000 2 21100000 21100001
>> +21100001 1 21100002
>> +21100002 1 21100000
>> +
>> +--------------------------------------------
>> +25700000
>> +25700000 1 25700001
>> +25700001 2 25700000 25700002
>> +25700002 1 25700003
>> +25700003 0
>> +
>> +--------------------------------------------
>> +SYSTEM CALLS
>> +
>> +12800000 label_363
>> +1 label_362
>> +19200003 label_9
>> +38400004 label_78
>> +5 label_359
>> +6400007 label_147
>> +32000010 label_328
>> +4600000 label_185
>> +32000014 label_49
>> +40300003 label_14
>> +3 label_108
>> +4 label_173
>> +6400005 label_161
>> +22100000 label_294
>> +28500001 label_356
>> +22100002 label_123
>> +34900003 label_231
>> +28500004 label_205
>> +28500005 label_53
>> +21600007 label_337
>> +19200004 label_60
>> +18600000 label_348
>> +25000001 label_106
>> +37800002 label_263
>> +37800003 label_250
>> +18600006 label_259
>> +31100006 label_271
>> +15100000 label_176
>> +8700001 label_299
>> +40700002 label_327
>> +27900003 label_66
>> +3800000 label_60
>> +9500006 label_60
>> +8700012 label_172
>> +5200000 label_309
>> +11600001 label_310
>> +11600002 label_214
>> +24400004 label_44
>> +11600008 label_79
>> +28600003 label_258
>> +48900000 label_54
>> +35700079 label_117
>> +27300000 label_184
>> +27300001 label_88
>> +27300003 label_319
>> +20900004 label_300
>> +1700005 label_137
>> +9500018 label_261
>> +19000008 label_203
>> +33300000 label_238
>> +49800001 label_237
>> +43000000 label_152
>> +18900000 label_391
>> +4600003 label_59
>> +38100001 label_136
>> +12200000 label_210
>> +9300002 label_259
>> +21400000 label_250
>> +26700000 label_173
>> +19500002 label_219
>> +31400003 label_150
>> +39800000 label_95
>> +34800000 label_179
>> +42400002 label_385
>> +42400003 label_215
>> +35200001 label_318
>> +10400007 label_142
>> +16800010 label_314
>> +42400011 label_56
>> +10400012 label_395
>> +47600002 label_102
>> +10400014 label_229
>> +44400003 label_88
>> +26100000 label_253
>> +45300002 label_83
>> +6900003 label_281
>> +6900004 label_287
>> +29400032 label_158
>> +6900006 label_14
>> +19700007 label_154
>> +19700008 label_82
>> +19700010 label_211
>> +45300014 label_243
>> +25200000 label_132
>> +41800000 label_221
>> +31500000 label_307
>> +24900008 label_24
>> +22600005 label_240
>> +37900001 label_10
>> +22600010 label_396
>> +48200000 label_310
>> +36400001 label_176
>> +12900069 label_13
>> +31900000 label_240
>> +4100001 label_227
>> +19100002 label_163
>> +19100003 label_283
>> +25500005 label_36
>> +25500006 label_103
>> +25500008 label_167
>> +12900071 label_257
>> +15200000 label_118
>> +4100002 label_15
>> +9200000 label_66
>> +41200001 label_180
>> +22000002 label_133
>> +2800003 label_122
>> +47600005 label_270
>> +29400129 label_193
>> +36300001 label_207
>> +25000002 label_285
>> +18600003 label_374
>> +31300001 label_11
>> +24900003 label_251
>> +5700004 label_125
>> +31300005 label_156
>> +24900006 label_107
>> +31300007 label_146
>> +5700008 label_268
>> +24900010 label_195
>> +24900011 label_364
>> +27800000 label_13
>> +40600001 label_166
>> +8600002 label_119
>> +29400139 label_224
>> +8900002 label_87
>> +5700003 label_54
>> +47300004 label_290
>> +18500005 label_129
>> +49900000 label_69
>> +17900001 label_245
>> +30700003 label_334
>> +37100004 label_218
>> +24900007 label_303
>> +47300008 label_182
>> +39900000 label_319
>> +1600001 label_27
>> +16300000 label_333
>> +20800006 label_132
>> +24800001 label_375
>> +5600002 label_5
>> +20800015 label_394
>> +25500000 label_154
>> +26300003 label_151
>> +42000001 label_259
>> +18400004 label_248
>> +40800005 label_221
>> +4500000 label_121
>> +17300001 label_18
>> +36500003 label_350
>> +36500009 label_336
>> +36500011 label_264
>> +13600000 label_188
>> +26300004 label_65
>> +20600009 label_326
>> +45800000 label_295
>> +7400002 label_341
>> +7400003 label_113
>> +1000005 label_303
>> +1000007 label_246
>> +21600012 label_131
>> +2500003 label_398
>> +37500004 label_370
>> +42300000 label_360
>> +48700002 label_252
>> +23100004 label_331
>> +23100005 label_36
>> +23100006 label_351
>> +29500008 label_362
>> +1700001 label_43
>> +7900007 label_81
>> +38500000 label_304
>> +45200000 label_26
>> +19600001 label_47
>> +5500011 label_343
>> +38800004 label_137
>> +6800005 label_52
>> +8600001 label_114
>> +38800008 label_210
>> +6800009 label_122
>> +6800010 label_116
>> +34200003 label_83
>> +26600000 label_334
>> +31000005 label_381
>> +35300000 label_245
>> +41700002 label_286
>> +32700032 label_224
>> +19300000 label_154
>> +38200000 label_235
>> +6200001 label_213
>> +19000002 label_21
>> +12600008 label_334
>> +46600007 label_231
>> +43900001 label_357
>> +15100001 label_240
>> +28300000 label_212
>> +41100003 label_319
>> +28300008 label_44
>> +28300011 label_348
>> +28300012 label_191
>> +24800000 label_273
>> +44000001 label_225
>> +12000002 label_314
>> +12000003 label_309
>> +31200004 label_155
>> +18400005 label_208
>> +40400001 label_349
>> +5600008 label_389
>> +5600011 label_143
>> +14800003 label_339
>> +40500000 label_23
>> +27700001 label_54
>> +2100002 label_276
>> +5500004 label_323
>> +2100005 label_313
>> +2100007 label_74
>> +46200007 label_162
>> +30600001 label_83
>> +24200002 label_358
>> +49800003 label_58
>> +43400005 label_312
>> +46700001 label_16
>> +11400008 label_396
>> +5000018 label_3
>> +43500003 label_384
>> +35700196 label_324
>> +25600001 label_165
>> +46300000 label_124
>> +7900001 label_140
>> +14300002 label_331
>> +39900003 label_85
>> +13100000 label_38
>> +39900007 label_20
>> +37700005 label_380
>> +22300000 label_78
>> +26900000 label_171
>> +23600000 label_392
>> +17200001 label_153
>> +10800002 label_7
>> +30000004 label_159
>> +36400006 label_287
>> +12900161 label_128
>> +36400008 label_134
>> +19600000 label_239
>> +1500000 label_48
>> +46600005 label_198
>> +39300001 label_217
>> +32900002 label_244
>> +39300003 label_120
>> +39300010 label_95
>> +39300011 label_288
>> +38000000 label_45
>> +15000001 label_38
>> +12300000 label_68
>> +42200000 label_79
>> +29400001 label_157
>> +29400002 label_304
>> +3800003 label_278
>> +3800005 label_344
>> +27400000 label_399
>> +3800007 label_379
>> +29400008 label_99
>> +46800033 label_199
>> +20900003 label_22
>> +29400021 label_165
>> +29400024 label_139
>> +27300004 label_48
>> +36100001 label_184
>> +47200001 label_384
>> +29400029 label_135
>> +29400030 label_218
>> +46800037 label_254
>> +45100000 label_256
>> +29400033 label_24
>> +29400034 label_207
>> +38700004 label_175
>> +38700005 label_355
>> +33400002 label_154
>> +29400051 label_155
>> +5000001 label_338
>> +22400000 label_339
>> +29400065 label_118
>> +16000002 label_343
>> +16000008 label_30
>> +14200001 label_299
>> +16000011 label_80
>> +29400083 label_90
>> +29400091 label_274
>> +28000001 label_383
>> +29400096 label_108
>> +18900001 label_109
>> +44500003 label_377
>> +12500007 label_67
>> +29400104 label_308
>> +44500009 label_353
>> +44500011 label_59
>> +29400108 label_296
>> +29400109 label_301
>> +41800001 label_371
>> +29400113 label_10
>> +29400120 label_322
>> +8800000 label_194
>> +34600001 label_111
>> +28200002 label_105
>> +45300006 label_334
>> +25300001 label_387
>> +41000006 label_172
>> +29400137 label_134
>> +34600011 label_178
>> +29400140 label_199
>> +30700004 label_78
>> +29400144 label_289
>> +4700003 label_378
>> +18300000 label_390
>> +18300001 label_222
>> +5500002 label_367
>> +11900004 label_297
>> +37500006 label_86
>> +31100008 label_21
>> +31100011 label_315
>> +45600000 label_69
>> +43900018 label_206
>> +8800002 label_218
>> +2000000 label_347
>> +8400001 label_84
>> +21200002 label_252
>> +8400003 label_191
>> +40400004 label_319
>> +46800005 label_31
>> +40400007 label_42
>> +46800010 label_334
>> +46800066 label_147
>> +46800019 label_28
>> +46800026 label_386
>> +36900000 label_85
>> +49700001 label_302
>> +24100002 label_376
>> +46800035 label_272
>> +11300005 label_37
>> +11300007 label_372
>> +24100008 label_337
>> +46800042 label_12
>> +46800071 label_35
>> +46800046 label_163
>> +46800050 label_64
>> +46200009 label_215
>> +46800056 label_310
>> +43100020 label_364
>> +46800062 label_88
>> +46200000 label_267
>> +46800065 label_291
>> +7800002 label_255
>> +33400003 label_110
>> +20600004 label_40
>> +33400005 label_350
>> +46200006 label_135
>> +26900001 label_87
>> +20600008 label_330
>> +46800073 label_4
>> +46800075 label_293
>> +35700258 label_100
>> +20600014 label_264
>> +46800083 label_247
>> +46800085 label_252
>> +46800090 label_177
>> +46800092 label_290
>> +46800094 label_126
>> +46800095 label_214
>> +4300001 label_363
>> +49100003 label_361
>> +46800102 label_108
>> +10700008 label_93
>> +46800106 label_201
>> +46800107 label_233
>> +42700012 label_1
>> +17100014 label_313
>> +46800111 label_223
>> +46800119 label_115
>> +17100030 label_344
>> +17100032 label_43
>> +33200000 label_39
>> +17100034 label_226
>> +13600003 label_100
>> +7200004 label_279
>> +39200005 label_233
>> +46800135 label_161
>> +13600008 label_227
>> +17100041 label_362
>> +13600011 label_281
>> +46800140 label_230
>> +7200013 label_161
>> +46800142 label_358
>> +46800144 label_378
>> +700003 label_117
>> +7200020 label_183
>> +46800150 label_200
>> +46800151 label_238
>> +39400000 label_347
>> +35700000 label_70
>> +35700002 label_391
>> +42100003 label_283
>> +35700004 label_375
>> +35700005 label_203
>> +3700006 label_200
>> +35700010 label_245
>> +12900233 label_174
>> +32100000 label_26
>> +35700028 label_280
>> +35700029 label_167
>> +45000000 label_192
>> +6600002 label_66
>> +32200003 label_204
>> +45000004 label_17
>> +35700038 label_105
>> +49100001 label_141
>> +25800009 label_89
>> +35700051 label_50
>> +35700055 label_65
>> +35700056 label_307
>> +28700000 label_23
>> +9500002 label_152
>> +35700070 label_328
>> +9500008 label_51
>> +35700074 label_209
>> +9500015 label_165
>> +38600000 label_340
>> +46800104 label_244
>> +35700082 label_397
>> +35700085 label_370
>> +35700091 label_205
>> +35700092 label_48
>> +17100010 label_242
>> +35700096 label_188
>> +38000001 label_303
>> +38000003 label_149
>> +36200001 label_40
>> +35700104 label_178
>> +46800108 label_321
>> +35700108 label_35
>> +35700109 label_19
>> +35700110 label_363
>> +35700111 label_172
>> +35700115 label_316
>> +35700118 label_279
>> +35700119 label_331
>> +35700121 label_121
>> +35700122 label_165
>> +9900000 label_171
>> +28100000 label_222
>> +2500002 label_242
>> +8900003 label_131
>> +15300004 label_324
>> +22100001 label_270
>> +35700134 label_155
>> +35700136 label_321
>> +47300009 label_367
>> +35700139 label_177
>> +35700140 label_206
>> +35700145 label_130
>> +28200001 label_333
>> +35700149 label_263
>> +35700151 label_237
>> +5400000 label_148
>> +35700161 label_235
>> +18200003 label_29
>> +11800005 label_219
>> +35700167 label_393
>> +14800001 label_394
>> +35700169 label_168
>> +17100023 label_253
>> +16900002 label_120
>> +35700188 label_293
>> +15700001 label_113
>> +27500000 label_382
>> +21100001 label_105
>> +40300002 label_219
>> +8300003 label_237
>> +46700004 label_139
>> +46700005 label_335
>> +35700198 label_95
>> +33900007 label_265
>> +35700208 label_21
>> +23300000 label_251
>> +39700000 label_100
>> +35700217 label_152
>> +35700223 label_167
>> +36800000 label_285
>> +26400000 label_380
>> +35700226 label_226
>> +35700227 label_150
>> +49600007 label_52
>> +49600008 label_198
>> +7200003 label_25
>> +42400004 label_379
>> +35700250 label_56
>> +1300000 label_310
>> +39700001 label_150
>> +33300002 label_387
>> +11300000 label_354
>> +15900000 label_76
>> +17000000 label_186
>> +23400001 label_89
>> +49000002 label_122
>> +42600005 label_35
>> +26300002 label_55
>> +42400013 label_174
>> +45500003 label_16
>> +32700004 label_1
>> +26300000 label_260
>> +45500001 label_145
>> +39100002 label_317
>> +39100003 label_2
>> +700004 label_146
>> +700006 label_396
>> +26300008 label_288
>> +13500014 label_305
>> +32700015 label_12
>> +13500016 label_78
>> +32700017 label_312
>> +9400004 label_326
>> +32700029 label_342
>> +22800000 label_68
>> +35600001 label_153
>> +3600002 label_329
>> +45400001 label_197
>> +42000008 label_55
>> +16600003 label_352
>> +24300000 label_238
>> +28900000 label_295
>> +16600005 label_158
>> +44900000 label_170
>> +32700016 label_376
>> +32100002 label_396
>> +12900003 label_96
>> +12900004 label_304
>> +29400006 label_132
>> +32100006 label_292
>> +32100007 label_117
>> +32100009 label_50
>> +12900010 label_87
>> +29400007 label_375
>> +12900014 label_272
>> +12900024 label_37
>> +12900029 label_107
>> +12900031 label_38
>> +41400000 label_71
>> +42100000 label_368
>> +22200002 label_201
>> +12900035 label_222
>> +3000004 label_261
>> +37600000 label_332
>> +28600007 label_161
>> +7200016 label_337
>> +12900048 label_282
>> +12900049 label_190
>> +26100004 label_48
>> +12900062 label_368
>> +12900063 label_57
>> +25100000 label_169
>> +31500001 label_399
>> +5900003 label_268
>> +25100005 label_216
>> +25100007 label_371
>> +12900073 label_222
>> +5900010 label_272
>> +26100007 label_345
>> +5900013 label_135
>> +24300003 label_4
>> +12900080 label_58
>> +500008 label_70
>> +12900088 label_373
>> +12900090 label_137
>> +12900091 label_254
>> +2400000 label_143
>> +37300000 label_12
>> +40800000 label_22
>> +12900097 label_98
>> +12900098 label_341
>> +12900100 label_391
>> +15200005 label_232
>> +38800001 label_339
>> +21600008 label_269
>> +12900108 label_21
>> +10000002 label_254
>> +12900113 label_121
>> +12900124 label_162
>> +12900125 label_241
>> +12900127 label_352
>> +11700000 label_202
>> +12900129 label_92
>> +6300006 label_388
>> +41900001 label_81
>> +12900133 label_182
>> +12900135 label_382
>> +12900145 label_32
>> +12900148 label_217
>> +12800003 label_346
>> +12900152 label_141
>> +19600010 label_346
>> +40200000 label_176
>> +46600001 label_199
>> +46600002 label_154
>> +8200003 label_374
>> +12900165 label_46
>> +14600007 label_340
>> +13100002 label_15
>> +12900174 label_231
>> +32700003 label_325
>> +12900181 label_249
>> +48400001 label_245
>> +12900190 label_137
>> +12900191 label_202
>> +4700000 label_91
>> +49500001 label_394
>> +12900194 label_314
>> +23900003 label_389
>> +4700004 label_76
>> +12900200 label_323
>> +43100010 label_129
>> +43100011 label_234
>> +20000000 label_377
>> +12900211 label_19
>> +12900212 label_55
>> +13500002 label_123
>> +43100023 label_373
>> +12900216 label_364
>> +12900221 label_159
>> +20400000 label_114
>> +12900225 label_249
>> +12900227 label_298
>> +46000005 label_332
>> +15400001 label_307
>> +3400001 label_77
>> +46000009 label_39
>> +27300005 label_197
>> +12900236 label_353
>> +46000014 label_358
>> +12900240 label_284
>> +12900241 label_310
>> +47600000 label_30
>> +12900245 label_177
>> +12900246 label_320
>> +21900000 label_368
>> +12900255 label_281
>> +4100000 label_21
>> +12900257 label_354
>> +23300002 label_369
>> +36100003 label_44
>> +36100005 label_69
>> +23300006 label_120
>> +16900007 label_386
>> +12900265 label_87
>> +23300010 label_179
>> +12900271 label_354
>> +12900278 label_168
>> +26200000 label_164
>> +32600001 label_212
>> +45400002 label_312
>> +32600004 label_164
>> +12900294 label_266
>> +25000000 label_306
>> +12900296 label_159
>> +12900297 label_58
>> +12900300 label_105
>> +12900301 label_360
>> +12900303 label_346
>> +28400000 label_326
>> +32100003 label_35
>> +12900308 label_236
>> +12900310 label_250
>> +12900311 label_158
>> +12900312 label_295
>> +12900318 label_64
>> +48300000 label_366
>> +16300001 label_308
>> +16300003 label_102
>> +3500004 label_196
>> +9900005 label_382
>> +3500006 label_261
>> +16300008 label_355
>> +16300009 label_275
>> +12900333 label_311
>> +3500021 label_88
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,364 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * node.c
>> + *
>> + *  Created on: Feb 1, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +/* --------
>> + * Nodes are the basic data structure within the graph. Nodes hold 
>> information
>> + * regarding their identity (id, label, type, etc.) and information 
>> about their
>> + * edges (list of edges, number of edges).
>> + *
>> + * Node.h/.c contains the data definitions for nodes and edges as 
>> well as con-
>> + * tainers for nodes (NodeList, NodePtrVec) and edges (EdgeList)
>> + */
>> +
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include "node.h"
>> +#include "graph.h"
>> +
>> +
>> +/* -------------------------------------------
>> + * Node Method Definitions
>> + *
>> + */
>> +
>> +/* "methods" for nodes */
>> +/* Constructor */
>> +Node *Node_new(int id, int nodeCount)
>> +{
>> +    Node *node = malloc(sizeof(Node));
>> +
>> +    if ( !node )
>> +        return(NULL);
>> +
>> +    node->id = id;
>> +    node->nodeCount = nodeCount; /* index into bitfield - caller 
>> must increment! */
>> +    node->label = NULL;
>> +    node->labelIdx = -1;
>> +    node->type = exteriorNode;
>> +    node->container = NULL;
>> +    node->interiorNodes = NULL;
>> +    node->edges = NULL;
>> +
>> +    node->edgeCount = 0;
>> +    node->entranceCount = 0;
>> +
>> +    return(node);
>> +}
>> +
>> +/* Destructor */
>> +void Node_delete(Node *trash)
>> +{
>> +    /* Some basic error checking */
>> +    if ( !trash ) return;
>> +
>> +    if ( trash->interiorNodes ) /* "true" tells clearNodeList to 
>> free the mallocs */
>> +        NodeList_clear( trash->interiorNodes, true );
>> +
>> +    if ( trash->edges )
>> +        EdgeList_clear( trash->edges );
>> +
>> +    free( trash );
>> +}
>> +
>> +/* Duplicates node data, BUT NO EDGE INFORMATION */
>> +Node *Node_duplicate(Node *from, int newIndex)
>> +{
>> +    Node *copy = malloc(sizeof(Node));
>> +
>> +    if ( !copy || !from )
>> +        return(NULL);
>> +
>> +    copy->id = from->id;
>> +    copy->nodeCount = newIndex; /* index into bitfield - caller must 
>> increment! */
>> +    copy->label = from->label;
>> +    copy->labelIdx = from->labelIdx;
>> +    copy->type = from->type;
>> +    copy->container = NULL;
>> +    copy->interiorNodes = NULL;
>> +    copy->edges = NULL;
>> +
>> +    copy->edgeCount = 0;
>> +    copy->entranceCount = 0;
>> +
>> +    return(copy);
>> +}
>> +
>> +/* Identifies the Upper-level node containing inner level node */
>> +void Node_setParent(Node *this, Node *parent)
>> +{
>> +    /* Some basic error checking */
>> +    if ( !this || !parent )
>> +        return;
>> +
>> +    this->container = parent;
>> +    this->type = interiorNode;
>> +}
>> +
>> +/* Inserts interior node into parent list */
>> +void Node_addInteriorNode(Node *this, Node *interior)
>> +{
>> +    /* some basic error checking */
>> +    if ( !this || !interior )
>> +        return;
>> +
>> +    if ( this->interiorNodes == NULL )
>> +    {
>> +        this->interiorNodes = NodeList_new();
>> +        if ( this->interiorNodes == NULL )
>> +            return; /* malloc failed */
>> +        this->interiorNodes->node = interior;
>> +    }
>> +    else
>> +        NodeList_insertBack(this->interiorNodes, interior);
>> +
>> +    Node_setParent(interior, this);
>> +    return;
>> +}
>> +
>> +
>> +/* adds an edge from "this" to "node. If an allocation error occurs
>> + * this method returns false. If an edge already exists, the method
>> + * will NOT add a duplicate edge, and will return true.
>> + */
>> +bool Node_addEdgeToNode(Node *this, Node *node)
>> +{
>> +    EdgeList *end = NULL;
>> +    EdgeList *newEdge = NULL;
>> +
>> +    if ( !this || !node )
>> +        return(false);
>> +
>> +    /* Scream through the list and make sure edge doesn't already 
>> exist */
>> +    for ( end = this->edges; end != NULL; end = end->nextEdge )
>> +        if ( end->targetNode == node )
>> +            return true;
>> +
>> +    /* Otherwise, we have a new edge. Insert it at the head of the 
>> list */
>> +    newEdge = EdgeList_new();
>> +    if ( !newEdge ) /* allocation error */
>> +        return false;
>> +    newEdge->targetNode = node;
>> +    newEdge->targetNodeId = node->id;
>> +    newEdge->nextEdge = this->edges; /* First time, this is NULL, 
>> terminates our list. */
>> +    this->edges = newEdge;
>> +    ++this->edgeCount;
>> +    return(true);
>> +}
>> +
>> +
>> +/* -------------------------------------------
>> + * NodeList Method Definitions
>> + *
>> + */
>> +
>> +/* Constructor */
>> +NodeList * NodeList_new()
>> +{
>> +    NodeList *list = malloc(sizeof(NodeList));
>> +
>> +    if ( !list )
>> +        return(NULL);
>> +
>> +    list->node = NULL;
>> +    list->nextNode = NULL;
>> +
>> +    return(list);
>> +}
>> +
>> +/* Destructor - also frees the data allocated for nodes if freeMemory is
>> + * true (calls their "destructor )
>> + */
>> +void NodeList_clear(NodeList *trash, bool deleteNodes)
>> +{
>> +    /* Some basic error checking */
>> +    if ( !trash ) return;
>> +
>> +    if ( trash->nextNode )
>> +        NodeList_clear(trash->nextNode, deleteNodes);
>> +
>> +    if ( deleteNodes )
>> +    {
>> +        Node_delete(trash->node);
>> +    }
>> +    free(trash);
>> +}
>> +
>> +/* insertFront modifies the list passed in such that the first element
>> + * points to the new node. This is done by duplicating the first element
>> + * into a new element, and then modifying the true first element to 
>> point
>> + * to the node passed and and the created element (which references the
>> + * rest of the list).
>> + */
>> +bool NodeList_insertFront(NodeList *this, Node *newFront)
>> +{
>> +    /* Make a new element that holds the information that used to
>> +     * be at the front.
>> +     */
>> +    NodeList *oldFront = NodeList_new();
>> +
>> +    /* Some basic error checking */
>> +    if ( !this || !newFront || !oldFront )
>> +        return(false);
>> +
>> +    /* move the formerly front data to the new element */
>> +    oldFront->node = this->node;
>> +    oldFront->nextNode = this->nextNode; /* Now points to the 
>> remainder of the list (or NULL) */
>> +
>> +    /* And change the head element to reference the new front node. */
>> +    this->node = newFront;
>> +    this->nextNode = oldFront;
>> +
>> +    return(true);
>> +}
>> +
>> +/* Create a new node list element, have it reference the node passed in
>> + * and then put it in the back of the list. Returns true on success
>> + */
>> +bool NodeList_insertBack(NodeList *this, Node *newBack)
>> +{
>> +    NodeList *end;
>> +    NodeList *newElement;
>> +
>> +    /* Some basic error checking */
>> +    if ( !this || !newBack )
>> +        return(false);
>> +
>> +    /* If the node portion of "this" is null,
>> +     * then we're starting with an empty list.
>> +     */
>> +
>> +    if ( this->node == NULL )
>> +    {
>> +        this->node = newBack;
>> +        return(true); /* We're done! */
>> +    }
>> +
>> +    /* Otherwise, we need to find the end of the list */
>> +    for ( end = this; end->nextNode != NULL; end = end->nextNode )
>> +    { /* No-op */ }
>> +
>> +    newElement = NodeList_new();
>> +    if ( !newElement )
>> +        return(false);
>> +
>> +    newElement->node = newBack;
>> +    end->nextNode = newElement; /* new nodelist element has a null 
>> next */
>> +
>> +    return(true);
>> +}
>> +
>> +
>> +
>> +
>> +
>> +/* -------------------------------------------
>> + * Edge List Method Definitions
>> + *
>> + */
>> +
>> +/* Constructor */
>> +EdgeList *EdgeList_new()
>> +{
>> +    EdgeList *newNode = malloc( sizeof( struct EdgeListStruct ));
>> +    if ( newNode )
>> +    {
>> +        newNode->targetNodeId = -1; /* Potentially a bug. what if 
>> there's a node named -1? */
>> +        newNode->targetNode = NULL;
>> +        newNode->nextEdge = NULL;
>> +    }
>> +    return(newNode);
>> +}
>> +
>> +/* Destructor */
>> +void EdgeList_clear( EdgeList *this )
>> +{
>> +    /* Some basic error checking */
>> +    if ( !this )
>> +        return;
>> +
>> +    if ( this->nextEdge )
>> +        EdgeList_clear(this->nextEdge);
>> +
>> +    free(this);
>> +}
>> +
>> +/* Insertion Method
>> + *     It is important to realize that this inserts the edge as an 
>> Id, it does
>> + *     not find or initialize the node specified by that Id. That 
>> has to be
>> + *     done as a separate step later.
>> + */
>> +bool EdgeList_insertNodeId(EdgeList *this, int targetNodeId)
>> +{
>> +    EdgeList *end;
>> +    EdgeList *newElement;
>> +
>> +    /* some basic error checking */
>> +    if ( !this )
>> +        return(false);
>> +
>> +    /* Check to see if this is the initial insertion into the
>> +     * Edge list
>> +     */
>> +    if ( this->targetNodeId == -1 )
>> +    {
>> +        this->targetNodeId = targetNodeId;
>> +        return(true);
>> +    }
>> +
>> +    /* Otherwise we find the end of the list and make a new entry */
>> +    for ( end = this; end->nextEdge != NULL; end = end->nextEdge )
>> +    { /* No-op */ }
>> +
>> +    newElement = EdgeList_new();
>> +    if ( !newElement )
>> +        return(false);
>> +
>> +    newElement->targetNodeId = targetNodeId;
>> +    end->nextEdge = newElement; /* new edge list element has a null 
>> node and next */
>> +
>> +    return(true);
>> +}
>> +
>> +
>> +
>> +
>> +
>> +
>> +
>> +
>> +
>> +/* Search Algorithms */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,159 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * node.h
>> + *
>> + *  Created on: Feb 1, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#ifndef NODE_H_
>> +#define NODE_H_
>> +
>> +
>> +
>> +
>> +/* --------
>> + * Nodes are the basic data structure within the graph. Nodes hold 
>> information
>> + * regarding their identity (id, label, type, etc.) and information 
>> about their
>> + * edges (list of edges, number of edges).
>> + *
>> + * Node.h/.c contains the data definitions for nodes and edges as 
>> well as con-
>> + * tainers for nodes (NodeList, NodePtrVec) and edges (EdgeList)
>> + */
>> +
>> +
>> +
>> +
>> +typedef enum
>> +{
>> +    exteriorNode, /* Default unless Node_setParent is called */
>> +    interiorNode,
>> +    entranceNode  /* special interior node(s) that begin the 
>> interior graph */
>> +} NodeType;
>> +
>> +
>> +/* -------------------------------------------
>> + * Node Definitions
>> + *
>> + */
>> +
>> +
>> +
>> +typedef struct NodeStruct Node;
>> +typedef struct NodeListStruct NodeList;
>> +typedef struct EdgeListStruct EdgeList;
>> +
>> +#include "bitfield.h"
>> +#include "vectorUtils.h"
>> +#include <stdbool.h>
>> +
>> +struct NodeStruct
>> +{
>> +    int id; /* id value for the node - typically associated with an 
>> address of the basic block */
>> +    int nodeCount; /* a unique index for this node (0 .. whatever) */
>> +    char *label;
>> +    int labelIdx;
>> +    NodeType type;
>> +    Node *container; /* if this is an interior node, this points to 
>> the outer node containing this one */
>> +    NodeList *interiorNodes; /* All the nodes contained in this 
>> node's subgraph */
>> +    EdgeList *edges; /* Nodes that can be accessed from this node 
>> (includes entrance nodes) */
>> +
>> +    int edgeCount; /* edges from this node to others (DOES NOT 
>> INLCUDE INTRANCE NODES) */
>> +    int entranceCount; /* number of entrance nodes (if any) */
>> +};
>> +
>> +/* "methods" for nodes */
>> +
>> +Node *Node_new( int id, int nodeCount );    /* Constructor */
>> +void Node_delete( Node *trash ); /* Destructor */
>> +Node *Node_duplicate(Node *from, int newIndex); /* Duplicates node 
>> data, BUT NO EDGE INFORMATION */
>> +void Node_setParent( Node *this, Node *parent );  /* Identifies the 
>> Upper-level node containing inner level node */
>> +void Node_addInteriorNode( Node *this, Node *interior ); /* Inserts 
>> interior node into parent list */
>> +bool Node_addEdgeToNode(Node *this, Node *node); /* Node* based 
>> insertion method */
>> +
>> +
>> +/* -------------------------------------------
>> + * Node List Definitions
>> + *
>> + */
>> +
>> +struct NodeListStruct
>> +{
>> +    Node *node;
>> +    NodeList *nextNode;
>> +};
>> +
>> +/* "methods" for NodeLists */
>> +
>> +NodeList *NodeList_new(); /* Constructor */
>> +
>> +/* Destructor - also frees the data allocated for nodes if freeMemory is
>> + * true (calls their "destructor )
>> + */
>> +void NodeList_clear( NodeList *trash, bool deleteNodes );
>> +
>> +/* insertFront modifies the list passed in such that the first element
>> + * points to the new node. This is done by duplicating the first element
>> + * into a new element, and then modifying the true first element to 
>> point
>> + * to the node passed and and the created element (which references the
>> + * rest of the list).
>> + */
>> +bool NodeList_insertFront( NodeList *this, Node *newFront );
>> +/* Create a new node list element, have it reference the node passed in
>> + * and then put it in the back of the list. Returns true on success
>> + */
>> +bool NodeList_insertBack( NodeList *this, Node *newBack );
>> +
>> +/* -------------------------------------------
>> + * Edge List Definitions
>> + *
>> + *     Edges are processed a little differently than nodes. As soon as a
>> + *     node is identified, it is created. However, the edges may be
>> + *     identified prior to the creation of the node to which it 
>> references.
>> + *     Ergo, there's a two pass process - first identifying the edges,
>> + *     then subsequently setting the pointers to reference them.
>> + *
>> + *     Rather than making a dual structure "Edge" and "EdgeList" pair,
>> + *     the author is combining the data into a single structure.
>> + */
>> +
>> +struct EdgeListStruct
>> +{
>> +    int targetNodeId;
>> +    Node *targetNode;
>> +    EdgeList *nextEdge;
>> +};
>> +
>> +EdgeList *EdgeList_new(); /* Constructor */
>> +void EdgeList_clear(EdgeList* this); /* Destructor */
>> +bool EdgeList_insertNodeId(EdgeList *this, int targetNodeId); /* Id 
>> based insertion method */
>> +
>> +#endif /* NODE_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,678 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +
>> +/*
>> + * graph.c
>> + *
>> + *  Created on: Jan 9, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#include "parsing.h"
>> +#include "graph.h"
>> +#include "utils.h"
>> +#include "systemCallMap.h"
>> +#include "yaml.h"
>> +
>> +
>> +#include <ctype.h>
>> +
>> +
>> +/* buildEntranceList takes an array of integers, and builds a
>> + * non-resolved edge list from the array. This is a special
>> + * edge list, used only be outer nodes to identify entrance
>> + * points into their subgraph. Only the edge data is passed in,
>> + * this begins with the second entry (index 1) in the parsed
>> + * data array. Likewise the size only counts edges.
>> + *
>> + * Initially, entrance transitions were handled as a separate
>> + * list of edges. After further analysis, however, there is
>> + * no operational difference between outer edges and entrance
>> + * edges. Ergo, we are modifying this code to put the entrance
>> + * edges into the edge list and deprecating the entrance list.
>> + * The code is being left in for the time being as comments,
>> + * since there are some contextual significances to interior
>> + * nodes and entrance edges that may later be required. Otherwise
>> + * we could go to a simple flat graph.
>> + */
>> +void buildEntranceList( Node *outerNode, IntVector *nodeData )
>> +{
>> +    int i;
>> +    int entranceCount;
>> +
>> +    /* some basic error checking */
>> +    if ( !outerNode || !nodeData ) return;
>> +
>> +    entranceCount = nodeData->vector[1]; /* count is the first 
>> entry, (second of original data); */
>> +    if ( entranceCount == 0 )
>> +        return; /* Nothing to see here, folks */
>> +
>> +    if ( entranceCount != nodeData->size-2 )
>> +    {
>> +        fprintf ( stderr, "Specified entrance edge length does not 
>> match data size for node: %d\n",
>> +                outerNode->id );
>> +    }
>> +
>> +    /* Deprecated: outerNode->entranceNodes = EdgeList_new(); */
>> +    /* Deprecated: if ( outerNode->entranceNodes ) */
>> +    if ( !outerNode->edges )
>> +        outerNode->edges = EdgeList_new();
>> +    if ( outerNode->edges )
>> +        for ( i = 2; i < nodeData->size; ++i )
>> +        {
>> +            /* Deprecated EdgeList_insertBack( 
>> outerNode->entranceNodes, edgeData[i] ); */
>> +            EdgeList_insertNodeId( outerNode->edges, 
>> nodeData->vector[i] );
>> +            ++outerNode->entranceCount;
>> +        }
>> +}
>> +
>> +
>> +/* buildNodeFromData takes the integer array built by the above
>> + * method, and creates a node from it. If that node has
>> + * edge data, that is also built. The data is in an array,
>> + * the size of which is also passed in.
>> + */
>> +Node *buildNodeFromData( IntVector *nodeData )
>> +{
>> +    int i;
>> +    int edgeCount;
>> +
>> +    /* some basic error checking */
>> +    if ( nodeData == NULL || nodeData->size == 0 )
>> +        return( NULL );
>> +
>> +    Node *node = Node_new( nodeData->vector[0], -1 ); /* Calling 
>> method must set index. */
>> +    if ( !node )
>> +        return( NULL );
>> +
>> +    /* Currently, the second element in is the edge count */
>> +    edgeCount = nodeData->vector[1];
>> +    if ( edgeCount != nodeData->size-2 )
>> +    {
>> +        fprintf ( stderr, "Specified edge length does not match data 
>> size for node: %d\n",
>> +                  nodeData->vector[0] );
>> +    }
>> +
>> +    if ( edgeCount > 0 )
>> +    {
>> +        node->edges = EdgeList_new();
>> +        if ( node->edges )
>> +            for ( i = 2; i < nodeData->size; ++i )
>> +            {
>> +                EdgeList_insertNodeId ( node->edges, 
>> nodeData->vector[i] );
>> +                ++node->edgeCount;
>> +            }
>> +    }
>> +
>> +    return( node );
>> +}
>> +
>> +
>> +/* resolveNodeEdges is the second pass through the graph data
>> + * structures. The first pass defines the nodes, and puts the edge
>> + * ids in place. The second pass finds the nodes corresponding to
>> + * the edge id, and sets the edge pointer to that node. Edges for
>> + * outer nodes will only reference other outer nodes. Interior
>> + * nodes may have edges to outer nodes or other interior nodes of
>> + * their containing node. If an edge references an undefined node
>> + * or if an edge goes into the interior of another outer node,
>> + * the user will be notified.
>> + *
>> + * Note: The section that resolves entrance edges has been commented
>> + * out because entrance edges are now processed as part of the edge
>> + * list.
>> + */
>> +void resolveNodeEdges( Graph *graph, Node* sourceNode, bool outerNode )
>> +{
>> +    EdgeList *edges;
>> +    Node *node;
>> +    bool okSoFar;
>> +
>> +    for ( edges = sourceNode->edges; edges != NULL; edges = 
>> edges->nextEdge )
>> +    {
>> +        if ( outerNode )
>> +        {
>> +            /* We only check for edges to other outer nodes*/
>> +            node = Graph_findNode( graph, edges->targetNodeId, true 
>> ); /* true-> check outer and interior nodes */
>> +            if ( node )
>> +            {
>> +                okSoFar = true;
>> +                /* Since entrance edges are now part of our edge 
>> list, we have to make sure
>> +                 * the link here is appropriate.
>> +                 */
>> +                if ( node->type == entranceNode || node->type == 
>> interiorNode )
>> +                {
>> +                    if ( node->container != sourceNode )
>> +                    {
>> +                        fprintf( stderr,
>> +                                 "resolveNodeEdges: Outer node %d 
>> edge to non-contained node: %d\n",
>> +                                 sourceNode->id, edges->targetNodeId );
>> +                        fprintf(stderr, "\t%d is type: %s (%d)\n", 
>> node->id, node->type == interiorNode ? "interior" : "entrance", 
>> (int)node->type);
>> +                        okSoFar = false;
>> +                    }
>> +                }
>> +                if ( okSoFar )
>> +                    edges->targetNode = node;
>> +            }
>> +            else
>> +                fprintf( stderr,
>> +                        "resolveNodeEdges: Outer node %d has edge 
>> reference to undefined node: %d\n",
>> +                        sourceNode->id, edges->targetNodeId );
>> +        }
>> +        else
>> +        {
>> +            /* Interior node - the edge can be to an outer node... */
>> +            node = Graph_findNode( graph, edges->targetNodeId, false 
>> ); /* false-> only check outer nodes */
>> +            if ( node )
>> +                edges->targetNode = node;
>> +            else
>> +            {
>> +                /* ... or nodes interior to the container of this 
>> node */
>> +                node = Graph_findContainedNode( 
>> sourceNode->container, edges->targetNodeId );
>> +                if ( node )
>> +                    edges->targetNode = node;
>> +                else
>> +                {
>> +                    /* we have an undefined node */
>> +                    fprintf( stderr,
>> +                            "resolveNodeEdges: Interior node %d has 
>> edge reference to undefined node: %d\n",
>> +                            sourceNode->id, edges->targetNodeId );
>> +                }
>> +            }
>> +        }
>> +    }
>> +
>> +}
>> +
>> +
>> +/* pruneLine takes the \r\n off the end of the label. This is an 
>> artifact of
>> + * the windows file system, not something that was intended to be a part
>> + * of the actual label string.
>> + */
>> +static void pruneLine( char *label )
>> +{
>> +    int i = 0;
>> +
>> +    for ( ; label[i] != '\0'; ++i )
>> +    {
>> +        if ( label[i] == '\r' )
>> +        {
>> +            label[i] = '\0';
>> +            return;
>> +        }
>> +        if ( label[i] == '\n' )
>> +        {
>> +            label[i] = '\0';
>> +            return;
>> +        }
>> +    }
>> +}
>> +
>> +/* parseFile goes through the specified file to build the graph. It
>> + * returns a pointer to the graph instance created by the data. 
>> Otherwise
>> + * it returns NULL if the file is not parsable.
>> + */
>> +
>> +Graph *parseFile( char *fileName )
>> +{
>> +    FILE *inFile;
>> +    IntVector *fileData = NULL;
>> +    CharVector *fileString = NULL;
>> +    Node *newNode = NULL;
>> +    Node *outerNode = NULL;
>> +    Node *findNode = NULL;
>> +    int temp, count;
>> +    NodeList *outerNodeList = NULL;
>> +    NodeList *innerNodeList = NULL;
>> +    Graph *newGraph = NULL;
>> +    int funcCount = 50; /* used as a default initial size for the 
>> system call table */
>> +    int blockCount =  0;
>> +    bool systemCallSection = false;
>> +    int i;
>> +
>> +    /* A little error checking */
>> +    if ( !fileName )
>> +        return( NULL );
>> +
>> +#ifdef PRINT_FILE
>> +    printf ( "Parsing file %s...\n", fileName );
>> +#endif
>> +
>> +    inFile = fopen( fileName, "r" );
>> +    if ( !inFile )
>> +    {
>> +        printf( "Could not open data file: %s 
>> (parsing.c:parseFile)\n", fileName );
>> +        return( NULL );
>> +    }
>> +    /* else
>> +        printf( "Opened %s\n\n", fileName ); */
>> +
>> +    newGraph = Graph_new();
>> +    if ( !newGraph )
>> +        return( NULL );
>> +
>> +    newGraph->fileName = strdup( fileName );
>> +    fileString = CharVector_new( 1024 ); /* allocate our data 
>> parsing storage - 1024 is a semi-arbitrary power of 2 */
>> +
>> +    i = 0;
>> +
>> +    /* The first two lines define the number of Functions and basic 
>> blocks. */
>> +    CharVector_getLineFromFile( fileString, inFile );
>> +    if ( !feof( inFile ) && ( strncmp ( "Functions:", 
>> fileString->string, 10 ) == 0 ) )
>> +    {
>> +        funcCount = atoi ( fileString->string+10 );
>> +        printf ( "\t%d functions specified\n", funcCount );
>> +        YAMLWriteInt("Functions", funcCount);
>> +    }
>> +    else
>> +    {
>> +        fprintf ( stderr, "Malformed file, Function count not 
>> specified in first line\n" );
>> +        return( NULL );
>> +    }
>> +
>> +    CharVector_getLineFromFile( fileString, inFile );
>> +    if ( !feof( inFile ) && ( strncmp ( "Basic blocks:", 
>> fileString->string, 13 ) == 0 ) )
>> +    {
>> +        blockCount = atoi ( fileString->string+13 );
>> +        printf ( "\t%d basic blocks specified\n", blockCount );
>> +        YAMLWriteInt("Basic Blocks", blockCount);
>> +    }
>> +    else
>> +    {
>> +        fprintf ( stderr, "Malformed file, Function count not 
>> specified in first line\n" );
>> +        return( NULL );
>> +    }
>> +
>> +    // printf ("Done with header\n");
>> +
>> +    fileData = IntVector_new( 8 ); /* allocate our data parsing 
>> storage - 8 is a semi-arbitrary power of 2 */
>> +
>> +    /*
>> +     * The first section defines the outer nodes. Scan through it to 
>> identify the
>> +     * nodes and to do the first pass of edge definition.
>> +     */
>> +    while ( !feof( inFile ) ) /* clumsy use of feof */
>> +    {
>> +        CharVector_getLineFromFile( fileString, inFile );
>> +
>> +        if ( feof( inFile ) ) /* that read line was the last line */
>> +            break;
>> +
>> +        if ( strncmp( "----------", fileString->string, 10 ) == 0 ) 
>> /* we have a section break */
>> +            break;
>> +
>> +        count = IntVector_createFromString ( fileData, 
>> fileString->string );
>> +
>> +        if ( count > 0 )
>> +        {
>> +            // printf("processing node %d\n", fileData->vector[0] );
>> +            newNode = buildNodeFromData( fileData );
>> +            if ( newNode )
>> +            {
>> +                Graph_addOuterNode( newGraph, newNode );
>> +                newNode->nodeCount = newGraph->totalNodes;
>> +                newGraph->totalNodes += 1;
>> +            }
>> +        }
>> +        IntVector_clear( fileData );
>> +    }
>> +
>> +    //printf ("Done with outer nodes\n");
>> +
>> +    /* Parse the subsequent sections to get the inner nodes */
>> +    while ( !feof( inFile ) )
>> +    {
>> +        /* The first line will identify the outer node for which the 
>> inner nodes are defined. */
>> +        CharVector_getLineFromFile( fileString, inFile );
>> +
>> +        if ( feof( inFile ) ) /* that fgets was the last line */
>> +            break;
>> +
>> +        systemCallSection = strncmp( "SYSTEM CALLS", 
>> fileString->string, 12) == 0;
>> +        if ( systemCallSection )
>> +            break;
>> +
>> +        if ( isdigit( (int)fileString->string[0] ) )
>> +            temp = atoi( fileString->string ); /* Note: No format 
>> error check here... */
>> +        else
>> +            temp = -1; /* Man, I hope -1 is never a node id value... */
>> +        outerNode = Graph_findNode( newGraph, temp, false ); /* 
>> false -> only check outer nodes */
>> +
>> +        if ( outerNode == NULL )
>> +        {
>> +            fprintf (stderr, "Error in parseFile: Node %d undefined 
>> as an outer node\n", temp );
>> +            break; /* No error recovery  - but continue with the 
>> program */
>> +        }
>> +
>> +        /* Now, subsequent lines (up to the section break) identify 
>> interior nodes; */
>> +        while  ( !feof( inFile ) )
>> +        {
>> +            CharVector_getLineFromFile( fileString, inFile );
>> +
>> +            if ( strncmp( "----------", fileString->string, 10 ) == 
>> 0 ) /* we have a section break */
>> +                break;
>> +
>> +            count = IntVector_createFromString( fileData, 
>> fileString->string );
>> +            if ( count > 0 )
>> +            {
>> +                /*
>> +                 * special case: If the node specified is the 
>> outerNode, the edge nodes specified
>> +                 * here are the entrance nodes
>> +                 */
>> +                if ( fileData->vector[0] == outerNode->id )
>> +                    buildEntranceList( outerNode, fileData );
>> +                else
>> +                {
>> +                    newNode = buildNodeFromData( fileData );
>> +                    if ( newNode )
>> +                    {
>> +                        Node_addInteriorNode( outerNode, newNode );
>> +                        newNode->nodeCount = newGraph->totalNodes;
>> +                        newGraph->totalNodes += 1;
>> +                    }
>> +                }
>> +            }
>> +            IntVector_clear( fileData );
>> +        }
>> +    }
>> +
>> +    //printf ( "Done with interior nodes. On to System Calls\n" );
>> +
>> +    /* All the node mappings have been done, now we build a map of 
>> system calls to the
>> +     * node keys.
>> +     */
>> +    newGraph->systemCallMap = SystemCallMap_new( funcCount );
>> +    if ( newGraph->systemCallMap == NULL )
>> +    {
>> +        IntVector_delete( fileData );
>> +        return( NULL ); /* if we can't build the system call map, 
>> we're done. */
>> +    }
>> +
>> +    if ( systemCallSection )
>> +    {
>> +        while ( !feof( inFile ) )
>> +        {
>> +            CharVector_getLineFromFile( fileString, inFile );
>> +
>> +            if ( feof( inFile ) ) /* that fgets was the last line */
>> +                break;
>> +
>> +            if ( isdigit( (int)fileString->string[0] ) )
>> +                temp = atoi ( fileString->string ); /* get the key */
>> +            else
>> +                temp = -1;
>> +            if ( temp >= 0 ) /* valid key */
>> +            {
>> +                /* get the system call name. First, get past the ' ' */
>> +                for ( i = 0; fileString->string[i] != '\0' && 
>> fileString->string[i] != ' '; ++i ) {}
>> +                if ( fileString->string[i] == ' ' )
>> +                {
>> +                    ++i;
>> +                    findNode = Graph_findNode( newGraph, temp, true );
>> +                    pruneLine( fileString->string+i );
>> +                    SystemCallMap_insert( newGraph->systemCallMap, 
>> fileString->string+i, findNode );
>> +                }
>> +            }
>> +        }
>> +    } /* ....aaaand we're done parsing the input file. */
>> +
>> +    CharVector_delete(fileString);
>> +
>> +    //printf ( "Done parsing, resolve edges\n" );
>> +    /* Now that we have all the nodes, resolve all edge definitions */
>> +    for ( outerNodeList = newGraph->outerNodes;
>> +          outerNodeList != NULL;
>> +          outerNodeList = outerNodeList->nextNode )
>> +    {
>> +        resolveNodeEdges( newGraph, outerNodeList->node, true ); /* 
>> true -> outer node */
>> +        for ( innerNodeList = outerNodeList->node->interiorNodes;
>> +              innerNodeList != NULL;
>> +              innerNodeList = innerNodeList->nextNode )
>> +        {
>> +            resolveNodeEdges( newGraph, innerNodeList->node, false 
>> ); /* false -> interior node */
>> +        }
>> +    }
>> +
>> +
>> +    /* How many nodes did we count (outer + interior)?
>> +    printf ( "\tTotal nodes parsed: %d\n", newGraph->totalNodes ); */
>> +
>> +    /* Debug --* /
>> +    graphPrettyPrint( newGraph );
>> +    systemCallMapPrettyPrint( newGraph->systemCallMap );
>> +    / *-- End Debug */
>> +
>> +    printf( "\t%d total System Call Map elements\n", 
>> newGraph->systemCallMap->contentSize );
>> +    YAMLWriteInt( "System Calls", 
>> newGraph->systemCallMap->contentSize );
>> +
>> +    /* Build the search diagram */
>> +    newGraph->searchDiagram = SearchDiagram_build( 
>> newGraph->outerNodes, newGraph->totalNodes );
>> +
>> +    printf ( "\t...parsing complete.\n" );
>> +    return( newGraph );
>> +}
>> +
>> +
>> +
>> +
>> +/* parseSignature takes a space delimited string and turns it
>> + * into a "signature" - a packed array of c-string pointers with
>> + * a NULL pointer to signify completion.
>> + */
>> +char **parseSignature( char *data )
>> +{
>> +    int i = 0;
>> +    int labelCount = 0; // Used to be 1. The algorithm depends on a 
>> terminating space, so it counts based on the END of the label.
>> +    int copiedLabels = 0;
>> +    char **labels = NULL;
>> +    char *debug = NULL;
>> +
>> +    /* A little error checking */
>> +    if ( !data )
>> +        return NULL;
>> +
>> +    /* First, scream through the array counting labels */
>> +    for( i = 0; data[i] != '\0'; ++i )
>> +    {
>> +        if ( data[i] == ' ' )
>> +        {
>> +            ++labelCount;
>> +            data[i] = '\0';
>> +        }
>> +    }
>> +
>> +    /* Now, allocate the array and make copies */
>> +    labels = (char **)malloc( (labelCount+1) * sizeof(char*) );
>> +    i = 0;
>> +    if ( labels )
>> +    {
>> +        for ( copiedLabels = 0; copiedLabels < labelCount; 
>> ++copiedLabels )
>> +        {
>> +            debug = &data[i];
>> +            labels[copiedLabels] = strdup( &data[i] );
>> +            while ( data[i] != '\0' )
>> +            {
>> +                /* advance to the end of this label */
>> +                ++i;
>> +            }
>> +            ++i; /* advance beyond the \0 to the start of the next 
>> label */
>> +        }
>> +        labels[labelCount] = NULL; /* terminate the array */
>> +    }
>> +
>> +    /* Debug print out * /
>> +    printf ( "\nSignature: ");
>> +    for ( i = 0; labels[i] != NULL; ++i )
>> +    {
>> +        printf ( "%s ", labels[i] );
>> +    }
>> +    /* end Debug */
>> +
>> +    return labels;
>> +}
>> +
>> +
>> +
>> +
>> +
>> +/* parseConfigFile reads the data file names and desired search
>> + * signatures from the config file. It returns a packed array
>> + * of Graph pointers populated corresponding to the data files.
>> + * Also, it returns a packed array of pointers to signatures.
>> + * (Signatures are themselves packed arrays to C-Strings.) These
>> + * packed arrays are terminated with a NULL pointer. They
>> + * are returned in the "graphs" and "signatures" parameters
>> + * which should be references to the desired pointers. See main.c.
>> + */
>> +bool parseConfigFile( char *configFileName, Configuration *config )
>> +{
>> +    char data[1000];
>> +    FILE *configFile = NULL;
>> +    int fileNum = -1;
>> +    int sigNum = -1;
>> +    int i = 0;
>> +
>> +    configFile = fopen( configFileName, "r" );
>> +    if ( !configFile )
>> +    {
>> +        printf( "Could not open %s\n", configFileName );
>> +        return( NULL );
>> +    }
>> +    else
>> +        printf( "Opened %s\n\n", configFileName );
>> +
>> +    fgets ( data, 1000, configFile );
>> +    if ( feof( configFile ) || ( strncmp ( "Pathfinder 
>> Configuration", data, 24 ) != 0 ) )
>> +    {
>> +        printf( "Error in config file: doesn't start with 
>> \"Pathfinder Configuration\"\n" );
>> +        return false;
>> +    }
>> +
>> +    fgets ( data, 1000, configFile );
>> +    if ( feof( configFile ) || ( strncmp ( "files", data, 5 ) != 0 ) )
>> +    {
>> +        printf( "Error in config file: second line is not file 
>> count\n" );
>> +        return false;
>> +    }
>> +    fileNum = atoi( &data[6] );
>> +    if ( fileNum == 0 )
>> +    {
>> +        printf( "No files to parse, exiting.\n" );
>> +        return false;
>> +    }
>> +
>> +    fgets ( data, 1000, configFile );
>> +    if ( feof( configFile ) || ( strncmp ( "signatures", data, 10 ) 
>> != 0 ) )
>> +    {
>> +        printf( "Error in config file: third line is not signature 
>> count\n" );
>> +        return false;
>> +    }
>> +    sigNum = atoi( &data[11] );
>> +    if ( sigNum == 0 )
>> +    {
>> +        printf( "No signatures to search, exiting.\n" );
>> +        return false;
>> +    }
>> +
>> +    fgets ( data, 1000, configFile );
>> +    if ( feof( configFile ) || ( strncmp ( "search type", data, 11 ) 
>> != 0 ) )
>> +    {
>> +        printf( "Error in config file: third line is not signature 
>> count\n" );
>> +        return false;
>> +    }
>> +    if ( strncmp( &data[12], "tree", 4 ) == 0 )
>> +        config->searchOptions->searchType = treeSearch;
>> +    else
>> +        config->searchOptions->searchType = diagramSearch;
>> +
>> +    config->graphs = (Graph **)malloc( (fileNum+1) * sizeof( Graph* ) );
>> +    if ( !config->graphs )
>> +    {
>> +        printf ( "Could not allocate graph storage. Exiting\n" );
>> +        return false;
>> +    }
>> +
>> +    for ( i = 0; i < fileNum; ++i )
>> +    {
>> +        fgets ( data, 1000, configFile );
>> +        if ( feof( configFile ) || ( strncmp ( "file ", data, 5 ) != 
>> 0 ) ) /* note the ' ' */
>> +        {
>> +            printf( "Error in config file: mismatch of file count\n" );
>> +            return false;
>> +        }
>> +
>> +        /* strip the \n from the file name. */
>> +        pruneLine( &data[5] );
>> +        config->graphs[i] = parseFile( &data[5] );
>> +        if ( !config->graphs[i] )
>> +        {
>> +            /* the file did not parse */
>> +            printf( "Error parsing %s", &data[5] );
>> +            free( config->graphs );
>> +            return false;
>> +        }
>> +    }
>> +    config->graphs[fileNum] = NULL;
>> +
>> +    config->signatures = (Signature *)malloc( (sigNum+1) * sizeof( 
>> Signature ) );
>> +    if ( !config->signatures )
>> +    {
>> +        printf ( "Could not allocate signature storage. Exiting\n" );
>> +        return false;
>> +    }
>> +
>> +    for ( i = 0; i < sigNum; ++i )
>> +    {
>> +        fgets ( data, 1000, configFile );
>> +        if ( feof( configFile ) || ( strncmp ( "signature ", data, 
>> 10 ) != 0 ) ) /* note the ' ' */
>> +        {
>> +            printf( "Error in config file: mismatch of signature 
>> count\n" );
>> +            return false;
>> +        }
>> +
>> +        /* strip the \n from the file name. */
>> +        pruneLine( &data[10] );
>> +        config->signatures[i] = parseSignature( &data[10] );
>> +        if ( !config->signatures[i] )
>> +        {
>> +            /* the file did not parse */
>> +            printf( "Error parsing %s", &data[10] );
>> +            free( config->graphs ); /* Insufficient! Should call a 
>> destructor on each */
>> +            free( config->signatures );
>> +            return false;
>> +        }
>> +    }
>> +    config->signatures[sigNum] = NULL;
>> +
>> +    return true;
>> +}
>> +
>> +
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,114 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +
>> +/*
>> + * parsing.h
>> + *
>> + *  Created on: Jan 9, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +/* --------
>> + * This pair of files contains the utility data types and methods for
>> + * parsing data files into graphs. It also defines a "configuration"
>> + * for a given run of PathFinder. The configuration holds all the info
>> + * corresponding to the run - graphs, signatures, search types.
>> + */
>> +
>> +#ifndef PARSING_H_
>> +#define PARSING_H_
>> +
>> +#include "vectorUtils.h"
>> +
>> +/* Since we're parsing into graphs, we need to know what they are... */
>> +#include "graph.h"
>> +#include "configuration.h"
>> +
>> +
>> +
>> +/* buildEntranceList takes an array of integers, and builds a
>> + * non-resolved edge list from the array. This is a special
>> + * edge list, used only be outer nodes to identify entrance
>> + * points into their subgraph.
>> + */
>> +void buildEntranceList( Node *outerNode, IntVector *nodeData );
>> +
>> +
>> +/* buildNodeFromData takes the integer array built by the above
>> + * method, and creates a node from it. If that node has
>> + * edge data, that is also built. The data is in an array,
>> + * the size of which is also passed in.
>> + */
>> +Node *buildNodeFromData( IntVector *nodeData );
>> +
>> +
>> +/* resolveNodeEdges is the second pass through the graph data
>> + * structures. The first pass defines the nodes, and puts the edge
>> + * ids in place. The second pass finds the nodes corresponding to
>> + * the edge id, and sets the edge pointer to that node. Edges for
>> + * outer nodes will only reference other outer nodes. Interior
>> + * nodes may have edges to outer nodes or other interior nodes of
>> + * their containing node. If an edge references an undefined node
>> + * or if an edge goes into the interior of another outer node,
>> + * the user will be notified.
>> + */
>> +void resolveNodeEdges( Graph *graph, Node *sourceNode, bool outerNode );
>> +
>> +
>> +
>> +/* parseFile goes through the specified file to build the graph. It
>> + * returns true if everything goes as planned. Any errors will cause
>> + * false to be returned. The built graph can be accessed via
>> + * Graph_the().
>> + */
>> +
>> +Graph *parseFile( char *fileName );
>> +
>> +/* parseSignature takes a space delimited string and turns it
>> + * into a "signature" - a packed array of c-string pointers with
>> + * a NULL pointer to signify completion. As with our edge parser
>> + * the code depends on a space character to terminate the line.
>> + */
>> +char **parseSignature( char *data );
>> +
>> +/* parseConfigFile reads the data file names and desired search
>> + * signatures from the config file. It returns a packed array
>> + * of Graph pointers populated corresponding to the data files.
>> + * Also, it returns a packed array of pointers to signatures.
>> + * (Signatures are themselves packed arrays to C-Strings.) These
>> + * packed arrays are terminated with a NULL pointer. They
>> + * are returned in the "graphs" and "signatures" parameters
>> + * which should be references to the desired pointers. See main.c.
>> + */
>> +bool parseConfigFile( char *configFileName, Configuration *config );
>> +
>> +
>> +
>> +#endif /* PARSING_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,667 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> + /*
>> + * searchAlgorithms.c
>> + *
>> + *  Created on: Jun 18, 2013
>> + *      Author: jbrigdo
>> + */
>> +
>> +#include <stdbool.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <time.h>
>> +#include <math.h>
>> +
>> +#ifdef USE_OMP
>> +#include <omp.h>
>> +#endif
>> +
>> +#include "searchAlgorithms.h"
>> +#include "vectorUtils.h"
>> +#include "utils.h"
>> +#include "graphGen.h"
>> +#include "statistics.h"
>> +
>> +
>> +extern double currentTime();
>> +
>> +static Stats *globalStats = NULL;
>> +
>> +
>> +
>> +void doMultiSearches(Configuration *config)
>> +{
>> +    NodePtrVec *result;
>> +    bool success;
>> +    Graph *graph;
>> +    Signature signature;
>> +    int i;
>> +    int j;
>> +    char *debug;
>> +    double tick, tock;
>> +    int hours;
>> +    int min;
>> +    double sec;
>> +
>> +    tick = currentTime();
>> +    result = NodePtrVec_new(64); /* 64 is an arbitrary size */
>> +
>> +    for ( i = 0; config->signatures[i] != NULL; ++i )
>> +    {
>> +        signature = config->signatures[i];
>> +        /* Debug --* /
>> +        printf ("\n\nSignature (");
>> +        for ( k = 0; signature[k] != NULL; ++k )
>> +        {
>> +            debug = signature[k];
>> +            printf("%s", signature[k]);
>> +            if ( signature[k+1] != NULL )
>> +                printf(" ");
>> +            else
>> +                printf("):\n");
>> +        }
>> +        / *-- End Debug */
>> +        // printf("Signature %d:\n", i);
>> +        for ( j = 0; config->graphs[j] != NULL; ++j )
>> +        {
>> +            graph = config->graphs[j];
>> +            result->contentSize = 0; /* clear last search's result */
>> +            // printf("\t checking file %s... ", graph->fileName);
>> +            fflush(stdout);
>> +            success = findLabelPath(graph, signature, result, 
>> config->searchOptions->searchType);
>> +            if ( success )
>> +                {}// printf("Found!\n");
>> +            else
>> +                {}// printf("Not found. Bummer.\n");
>> +        }
>> +    }
>> +
>> +    tock = currentTime();
>> +    sec = tock-tick;
>> +    hours = (int)sec/3600;
>> +    sec = fmod( sec, 3600.0 );
>> +    min = (int)sec/60;
>> +    sec = fmod(sec, 60.0);
>> +    printf ("\n\nOverall Search Time: %02d:02%d:%05.2f\n", hours, 
>> min, sec);
>> +
>> +}
>> +
>> +/* findNextLabel is a recursive method that determines if a path 
>> exists between a
>> + * specific node and the label that is at the start of the label 
>> array argument. The
>> + * label array is an array of char pointers that is terminated with 
>> a NULL pointer. The
>> + * first pointer is the "current" label.
>> + *
>> + * The node's edge nodes are checked against the current label. If 
>> none of them match, then
>> + * this method recurses with each edge node and the current label.
>> + *
>> + * If an edge matches, then we are beginning a search for the next 
>> "leg" of the labels.
>> + * We recurse with that specific edge and the "next" label. That is 
>> the [1] element of
>> + * the label array. This starts the search along the next leg - at 
>> this point we have
>> + * to start a new "result" vector, because we check that vector for 
>> loops. It MAY be the
>> + * case that the next path segment passes through nodes already 
>> traversed in a previous
>> + * leg. A new "result" vector will solve that.
>> + *
>> + * If the next element in the labels list is NULL, the matching edge 
>> signifies the end of
>> + * our search! VICTORY!
>> + *
>> + * If we reach the last edge with out a match (directly or 
>> recursively) we return a false
>> + * list.
>> + */
>> +
>> +bool findNextLabel( Node *node, Signature labels, NodePtrVec 
>> *result, Bitfield *visited ) /* NodePtrVec *visited ) */
>> +{
>> +    EdgeList *edge;
>> +    bool success = false;
>> +    NodePtrVec *nextLegResult = NULL;
>> +    /* NodePtrVec *nextLegVisited = NULL; */
>> +    Bitfield *nextLegVisited = NULL;
>> +
>> +
>> +    /* A little basic error checking */
>> +    if ( !node || !labels || !result|| !visited )
>> +    {
>> +        return( false );
>> +    }
>> +
>> +    /* If this node is already in the vector, we have found a loop. 
>> return false. */
>> +
>> +    if ( Bitfield_nodeVisited( visited, node ) )
>> +        return( false );
>> +
>> +    /* put this node on the result vector to show that we've been 
>> here */
>> +    NodePtrVec_push( result, node );
>> +
>> +    /* Check this node's edges to see if there's a match */
>> +    /* Note: We have a NodePtrVec holding the set of nodes with this 
>> label. It
>> +     *       may be more optimal to see if a given edge node is in 
>> that set
>> +     *       rather than doing a bunch of inefficient strcmp calls. 
>> Another approach
>> +     *       would be to have unique hash values for each label, and 
>> thereby be
>> +     *       able to compare those. However for the initial version 
>> of this code,
>> +     *       keeping things simple and straightforward, we're doing 
>> the string
>> +     *       compare.
>> +     */
>> +
>> +    for ( edge = node->edges; edge != NULL; edge = edge->nextEdge )
>> +    {
>> +
>> +        // string based:
>> +        if ( edge->targetNode->label && strcmp( 
>> edge->targetNode->label, labels[0] ) == 0 )
>> +        // index based: if ( edge->targetNode->labelIdx == 
>> labelIdxs[0] )
>> +        {
>> +            if ( labels[1] != NULL ) /* more steps in the signature */
>> +            {
>> +                nextLegResult = NodePtrVec_new( 50 ); /* arbitrary 
>> size, malloc success checked in recursion */
>> +                nextLegVisited = Bitfield_new(visited->bitsNeeded);
>> +
>> +                success = findNextLabel( edge->targetNode, 
>> &labels[1], nextLegResult, nextLegVisited );
>> +                /* NodePtrVec_delete( nextLegVisited ); */
>> +                Bitfield_delete( nextLegVisited );
>> +                if ( success )
>> +                {
>> +                    NodePtrVec_appendVectors( result, nextLegResult, 
>> true );
>> +                    NodePtrVec_delete( nextLegResult );
>> +                    return( true );
>> +                }
>> +
>> +            }
>> +            else /* We have exhausted the signature - ultimate 
>> victory! */
>> +            {
>> +                /* Register this edge node as being the final node */
>> +                NodePtrVec_push( result, edge->targetNode );
>> +                return( true );
>> +            }
>> +        }
>> +    }
>> +
>> +
>> +    /* IF we made it here, we need to continue through the tree, 
>> seeing if any of our
>> +     * edge nodes have a connection to a labeled node.
>> +     */
>> +    for ( edge = node->edges; edge != NULL; edge = edge->nextEdge )
>> +    {
>> +        success = findNextLabel( edge->targetNode, labels, result, 
>> visited );
>> +        if ( success )
>> +            return( true ); /* this edge has a path to the ultimate 
>> signature path */
>> +    }
>> +
>> +
>> +    /* and, if we make it here, we have failed. */
>> +    NodePtrVec_pop( result ); /* take current node off the result 
>> vector */
>> +    return false;
>> +}
>> +
>> +
>> +
>> +/* A method to custom-store our results */
>> +static void logStats(NodePtrVec *result)
>> +{
>> +    if ( !result ) return;
>> +    if ( !globalStats )
>> +        globalStats = Stats_new();
>> +    Stats_logPath(globalStats, result);
>> +}
>> +
>> +static void printStats()
>> +{
>> +    int i;
>> +
>> +    if ( globalStats )
>> +    {
>> +        Stats_calculate(globalStats);
>> +
>> +        printf ( "\nThis graph has %f average nodes between 
>> labels.\nStandard deviation: %f, total paths: %d\n\n",
>> +                globalStats->averageLength, 
>> globalStats->standardDeviation, globalStats->pathLengths->size );
>> +        printf ("\tShortest Path: %d, Longest Path: %d\n", 
>> globalStats->minLength, globalStats->maxLength);
>> +        for ( i = globalStats->minLength; i <= 
>> globalStats->maxLength; ++i )
>> +        {
>> +            if ( globalStats->histogram[i] != 0 )
>> +                printf ("\tlength %d appeared %d times\n", i, 
>> globalStats->histogram[i] );
>> +        }
>> +
>> +    }
>> +}
>> +
>> +
>> +/* A method to custom-store our results */
>> +
>> +/* At some point, we will want to use the FullPath argument and pass 
>> it along to
>> + * buildGraphFromPaths. Until then, however, we're only going to 
>> build the most
>> + * minimal graph possible.
>> + */
>> +static void logResult(NodeVecVec *storage, NodePtrVec *result, 
>> SearchOptions *options)
>> +{
>> +    NodePtrVec *tips = NodePtrVec_new(2);
>> +    if ( !storage || !result || !tips ) return;
>> +
>> +    /* We log the stats here, because the storage method below may 
>> not hold
>> +     * the entire path.
>> +     */
>> +    if ( !options->multiThreaded && options->doStatistics ) /* 
>> statistics are not thread-safe yet */
>> +        logStats(result);
>> +
>> +    /* Ultimately we may want to log more than the ends... */
>> +    /* Future: if ( options->buildType == endNodesOnly ) { */
>> +    NodePtrVec_push(tips, result->vector[0]);
>> +    NodePtrVec_push(tips, result->vector[result->contentSize-1]);
>> +    if ( !NodeVecVec_insert(storage, tips) ) /* makes a copy of 
>> tips, so we need to... */
>> +    {
>> +        printf("CrashAndBURN!!!\n\n");
>> +        fflush(stdout);
>> +    }
>> +    NodePtrVec_delete(tips); /* ... free the mallocs! */
>> +}
>> +
>> +
>> +
>> +/* findAndRecordAllPaths is almost exactly like findNextLabel. It 
>> differs only in that it
>> + * 1) doesn't stop with the first discovery of the specified path 
>> and 2) records the discovered
>> + * path. To do this, it doesn't create a new result vector for
>> + */
>> +
>> +void findAndRecordAllPaths( Node *node, Signature labels, int 
>> *labelIdxs,
>> +        NodePtrVec *result, Bitfield *visited, NodeVecVec *storage,
>> +        SearchOptions *options )
>> +{
>> +    EdgeList *edge;
>> +    /* NodePtrVec *nextLegVisited = NULL; */
>> +    Bitfield *nextLegVisited = NULL;
>> +
>> +
>> +    /* A little basic error checking */
>> +    if ( !node || !labels || !labelIdxs || !result|| !visited )
>> +    {
>> +        return;
>> +    }
>> +
>> +    /* If this node is already in the vector, we have found a loop. 
>> return false. */
>> +/*
>> +    if ( NodePtrVec_findReverse( visited, node ) )
>> +        return( false );
>> +    else
>> +        NodePtrVec_push( visited, node );
>> +*/
>> +    if ( Bitfield_nodeVisited( visited, node ) )
>> +        return;
>> +
>> +    /* put this node on the result vector to show that we've been 
>> here */
>> +    NodePtrVec_push( result, node );
>> +
>> +    /* Check this node's edges to see if there's a match */
>> +    /* Note: We have a NodePtrVec holding the set of nodes with this 
>> label. It
>> +     *       may be more optimal to see if a given edge node is in 
>> that set
>> +     *       rather than doing a bunch of inefficient strcmp calls. 
>> Another approach
>> +     *       would be to have unique hash values for each label, and 
>> thereby be
>> +     *       able to compare those. However for the initial version 
>> of this code,
>> +     *       keeping things simple and straightforward, we're doing 
>> the string
>> +     *       compare.
>> +     */
>> +
>> +    for ( edge = node->edges; edge != NULL; edge = edge->nextEdge )
>> +    {
>> +
>> +        // string based:
>> +        if ( edge->targetNode->label && strcmp( 
>> edge->targetNode->label, labels[0] ) == 0 )
>> +        // index based: if ( edge->targetNode->labelIdx == 
>> labelIdxs[0] )
>> +        {
>> +            // strcmp based:
>> +            if ( labels[1] != NULL ) /* more steps in the signature */
>> +            // index based: if ( labelIdxs[1] != -1 ) /* more steps 
>> in the signature */
>> +            {
>> +                nextLegVisited = Bitfield_new(visited->bitsNeeded);
>> +                findAndRecordAllPaths(edge->targetNode, &labels[1], 
>> &labelIdxs[1], result,
>> +                        nextLegVisited, storage, options );
>> +                Bitfield_delete(nextLegVisited);
>> +            }
>> +            else /* We have exhausted the signature - ultimate 
>> victory! */
>> +            {
>> +                /* Register this edge node as being the final node */
>> +                // printf ("\tFound!\n");
>> +                NodePtrVec_push(result, edge->targetNode);
>> +                Bitfield_nodeVisited(visited, edge->targetNode);/* 
>> Mark it as visited */
>> +                logResult(storage, result, options); // <<<--- 
>> here's where I record it
>> +                NodePtrVec_pop(result);
>> +            }
>> +        }
>> +    }
>> +
>> +
>> +    /* IF we made it here, we need to continue through the tree, 
>> seeing if any of our
>> +     * edge nodes have a connection to a labeled node.
>> +     */
>> +    for ( edge = node->edges; edge != NULL; edge = edge->nextEdge )
>> +    {
>> +        findAndRecordAllPaths(edge->targetNode, labels, labelIdxs, 
>> result, visited, storage, options);
>> +    }
>> +
>> +    NodePtrVec_pop( result ); /* take current node off the result 
>> vector */
>> +    return;
>> +}
>> +
>> +
>> +
>> +/* findLabelPath takes an array of labels, determines if there are 
>> nodes associated
>> + * with the labels (each label search will return a NodePtrVec*), 
>> and determine if
>> + * paths exist passing through the set of labels. This returns the 
>> first FOUND
>> + * path, not the optimal one. We could do that in a future iteration 
>> of the code
>> + * by keeping track of all paths found, and going with the shortest.
>> + *
>> + * The labels passed in is an array of char pointers. The array is 
>> null terminated -
>> + * i.e. the last valid entry in the array is followed by a pointer 
>> with NULL in it.
>> + */
>> +bool findLabelPath( Graph *graph, Signature labels, NodePtrVec 
>> *result, SearchType searchType )
>> +{
>> +    NodePtrVec *startNodes = NULL; /* set of nodes with the first 
>> label - potential path start nodes */
>> +    int i;
>> +    bool found = false; /* stopping as soon as we can find a path to 
>> a final node */
>> +    /* NodePtrVec *visited = NodePtrVec_new( 50 ); /-* arbitrary 
>> size *-/ */
>> +    Bitfield *visited = Bitfield_new(graph->totalNodes);
>> +
>> +
>> +    /* some basic error checking */
>> +    if ( !graph || !labels || !labels[0] || !labels[1] || !result 
>>  || !visited )
>> +        return( false );
>> +
>> +    /* Un-comment to short-circuit searches for non-represented 
>> signatures. -->* /
>> +    if ( !SystemCallMap_signatureRepresented( graph->systemCallMap, 
>> labels ) )
>> +    {
>> +        //printf( "%s %s invalid signature labels for graph.\n", 
>> labels[0], labels[1] );
>> +        return( false );
>> +    }
>> +    / *<-- end of short-circuit region */
>> +
>> +    startNodes = SystemCallMap_findLabeledNodes( 
>> graph->systemCallMap, labels[0] );
>> +
>> +    if ( !startNodes )
>> +        return( false );
>> +
>> +    /* So, if we've made it this far, we have a valid start label. 
>>  Now, we need to
>> +     * iterate through the start nodes and see if they can get to 
>> the next label...
>> +     */
>> +
>> +    for ( i = 0; i < startNodes->contentSize && !found; ++i )
>> +    {
>> +        if ( searchType == diagramSearch )
>> +        {
>> +            SearchDiagram *element = SearchDiagram_findNode( 
>> graph->searchDiagram, startNodes->vector[i] );
>> +            if ( element )
>> +                found = SearchDiagram_findSignatureAlongEdges( 
>> element->node, element->edgeReferenceArray,
>> + 
>>                                                               &labels[1], 
>> result, visited );
>> +        }
>> +        else
>> +            found = findNextLabel( startNodes->vector[i], 
>> &labels[1], result, visited );
>> +        Bitfield_clear( visited );
>> +
>> +        if ( !found && result->contentSize != 0 ) /* If it's not 
>> found the result SHOULD be empty, however... */
>> +            result->contentSize = 0; /* effectively clear the result 
>> NodePtrVec */
>> +    }
>> +
>> +
>> +    /* NodePtrVec_delete( visited ); */
>> +    Bitfield_delete( visited );
>> +    return( found );
>> +}
>> +
>> +
>> +/* findAllPossibleLegs does an exhaustive search through each 
>> possible label
>> + * pairing to determine which legs are possible. This is a 
>> brute-force nxn
>> + * approach that builds a signature holding only the second label 
>> and then
>> + * searches for that signature from the nodes representing the first 
>> label.
>> + * For the time being, it simply prints out the legs that are 
>>  possible in
>> + * this graph.
>> + */
>> +int findAllPossibleLegs( Graph *graph, SearchType searchType )
>> +{
>> +    int i, j;
>> +    int found = 0;
>> +    int searches = 0;
>> +    double tick, tock;
>> +    int hours, min;
>> +    double sec;
>> +    char timeStr[50];
>> +
>> +    tick = currentTime();
>> +    fprintf ( stdout, "Immediately before parallel\n" );
>> +
>> +    //#pragma omp parallel private(i,j) shared(graph) 
>> reduction(+:found) reduction(+:searches)
>> +    //#pragma omp single
>> +    {
>> +        //#pragma omp parallel for private(i,j) default(none)
>> +        #ifdef USE_OMP
>> +        #pragma omp parallel for private(i,j) shared(graph) 
>> reduction(+:found) reduction(+:searches)
>> +        #pragma omp collapse(2)
>> +        #endif
>> +        for ( i = 0; i < graph->systemCallMap->contentSize; ++i )
>> +        {
>> +            for ( j = 0; j < graph->systemCallMap->contentSize; ++j )
>> +            {
>> +                ++searches;
>> +                char *fullSignature[3] = { NULL, NULL, NULL };
>> +                int fullIntSignature[3] = { 0, 0, -1 };
>> +                fullSignature[0] = 
>> graph->systemCallMap->vector[i]->label;
>> +                fullSignature[1] = 
>> graph->systemCallMap->vector[j]->label;
>> +                fullIntSignature[0] = i;
>> +                fullIntSignature[1] = j;
>> +                // NodePtrVec *result = NodePtrVec_new(25);
>> +
>> +                /* findLabelPath does the findNextLabel in the above 
>> loops */
>> +                //#pragma omp task shared(graph, fullSignature, found)
>> +                {
>> +                    NodePtrVec *result = NodePtrVec_new( 25 );
>> +                    if ( findLabelPath( graph, fullSignature, 
>> result, searchType ) )
>> +                    {
>> +//                        printStack(result);
>> +                        // logStats(result);
>> +                        ++ found;
>> +                    }
>> +                    else
>> +                    {
>> +//                        printf ( "\n\tPath does not exist %s --/ 
>> /-> %s. %d steps.\n", fullSignature[0],
>> +//                                 fullSignature[1], 
>> result->contentSize );
>> +                    }
>> +                    if ( result )
>> +                    {
>> +                        NodePtrVec_delete( result );
>> +                    }
>> +                }
>> +            }
>> +            //#pragma omp taskwait
>> +        }
>> +    }
>> +
>> +
>> +    tock = currentTime();
>> +
>> +
>> +    sec = tock-tick;
>> +    hours = (int)sec/3600;
>> +    sec = fmod( sec, 3600.0 );
>> +    min = (int)sec/60;
>> +    sec = fmod( sec, 60.0 );
>> +    printf ( "\n\n%d found out of %d searches. Overall Time: 
>> %d:%d:%2.3f\n",
>> +             found, searches, hours, min, sec );
>> +    timeStr[0] = '\0'; /* just in case sprintf doesn't do what we 
>> want. */
>> +    sprintf ( timeStr, "%02d:%02d:%02.3f", hours, min, sec );
>> +    YAMLWriteInt("Signatures Found", found);
>> +    YAMLWriteString("Search Time", timeStr);
>> +
>> +
>> +    //printStats();
>> +
>> +    return( found );
>> +}
>> +
>> +/*
>> + * findAndLogAllPossibleLegs has the same search algorithm as 
>> findAllPossibleLegs. However, the requirement
>> + * that all the legs be logged requires a more sophisticated means 
>> of parallelization in order to do a
>> + * reduction of the solutions when all the threads are done.
>> + */
>> +int findAndLogAllPossibleLegs(Graph *graph, SearchOptions *options)
>> +{
>> +    int i, j, k;
>> +    int found = 0;
>> +    int searches = 0;
>> +    double tick, tock;
>> +    int hours, min;
>> +    double sec;
>> +    int maxThreads = 1;
>> +    NodeVecVec **lastingResults;
>> +    Graph *optimizedGraph = NULL;
>> +    char timeStr[50];
>> +
>> +    /* A little bit of error checking */
>> +    if ( !graph )
>> +        return 0;
>> +
>> +    tick = currentTime();
>> +    fprintf(stdout, "Immediately before parallel\n" );
>> +
>> +    #ifdef USE_OMP
>> +    #pragma omp parallel private(i,j,k) 
>> shared(graph,maxThreads,lastingResults) reduction(+:found) 
>> reduction(+:searches)
>> +    #endif
>> +    {
>> +        #ifdef USE_OMP
>> +        int myThread = omp_get_thread_num();
>> +        #else
>> +        int myThread = 0;
>> +        #endif
>> +
>> +        NodeVecVec *myResults = NULL;
>> +
>> +        #ifdef USE_OMP
>> +        #pragma omp single
>> +        #endif
>> +        {
>> +            #ifdef USE_OMP
>> +            maxThreads = omp_get_num_threads();
>> +            #else
>> +            maxThreads = 1;
>> +            #endif
>> +
>> +            options->multiThreaded = maxThreads > 1;
>> +            /* debug * /printf( "%d total threads, this one is 
>> %d\n", maxThreads, myThread ); /* debug */
>> +            lastingResults = malloc((maxThreads+1) * 
>> sizeof(NodeVecVec*) );
>> +            lastingResults[maxThreads] = 0; /* Null terminated to 
>> avoid having to keep track of bitsNeeded */
>> +        }
>> +
>> +        #ifdef USE_OMP
>> +        #pragma omp critical
>> +        #endif
>> +        {
>> +            lastingResults[myThread] = NodeVecVec_new(64); /* 
>> Arbitrary - multiple of 8, eventually cache line aligned... */
>> +            myResults = lastingResults[myThread];
>> +        }
>> +
>> +        #ifdef USE_OMP
>> +        #pragma omp single
>> +        #endif
>> +        {
>> +            printf ("Immediately before nested for's\n");
>> +        }
>> +
>> +        #ifdef USE_OMP
>> +        #pragma omp for
>> +        #pragma omp collapse(2)
>> +        #endif
>> +        for ( i = 0; i < graph->systemCallMap->contentSize; ++i )
>> +        {
>> +            for ( j = 0; j < graph->systemCallMap->contentSize; ++j )
>> +            {
>> +                ++searches;
>> +                for (k = 0; k < 
>> graph->systemCallMap->vector[i]->nodes->contentSize; ++k)
>> +                {
>> +                    char *fullSignature[3] = { NULL, NULL, NULL };
>> +                    int fullIntSignature[3] = { 0, 0, -1 };
>> +                    fullSignature[0] = 
>> graph->systemCallMap->vector[i]->label;
>> +                    fullSignature[1] = 
>> graph->systemCallMap->vector[j]->label;
>> +                    fullIntSignature[0] = i;
>> +                    fullIntSignature[1] = j;
>> +                    NodePtrVec *result = NodePtrVec_new(16);
>> +                    Bitfield *visited = Bitfield_new(graph->totalNodes);
>> +                    /* debug ---> * /
>> +                    printf( "Searching for %s(%d) ~~~> %s\n", 
>> fullSignature[0],
>> + 
>>                            graph->systemCallMap->vector[i]->nodes->vector[k]->id,
>> +                            fullSignature[1]);
>> +                    /* <-- debug */
>> +                    findAndRecordAllPaths( 
>> graph->systemCallMap->vector[i]->nodes->vector[k], &fullSignature[1],
>> +                            &fullIntSignature[1], result, visited, 
>> myResults, options );
>> +                    Bitfield_delete(visited);
>> +                    if ( result )
>> +                        NodePtrVec_delete( result );
>> +                } // end of for (k)... fork? heh.
>> +            } // end of for (j)
>> +        } // end of for (i)
>> +
>> +        found = myResults->contentSize;
>> +    }
>> +
>> +    tock = currentTime();
>> +    sec = tock-tick;
>> +    hours = (int)sec/3600;
>> +    sec = fmod( sec, 3600.0 );
>> +    min = (int)sec/60;
>> +    sec = fmod( sec, 60.0 );
>> +    printf ( "\n\n%d found for %d searches. Overall Time: 
>> %d:%d:%2.3f\n",
>> +            found, searches, hours, min, sec );
>> +    timeStr[0] = '\0'; /* just in case sprintf doesn't do what we 
>> want. */
>> +    sprintf ( timeStr, "%02d:%02d:%02.3f", hours, min, sec );
>> +    YAMLWriteInt("Signatures Found", found);
>> +    YAMLWriteString("Search Time", timeStr);
>> +
>> +    /* debug --> * /
>> +    printf ("max threads still:%d\n", maxThreads);
>> +    for ( i = 0; i < maxThreads; ++i )
>> +    {
>> +        printf ( "printing out thread %d result - %d long\n", i, 
>> lastingResults[i]->contentSize );
>> +        for ( j = 0; j < lastingResults[i]->contentSize; ++j )
>> +        {
>> +            printf("\t");
>> +            printStack( lastingResults[i]->vector[j] );
>> +            printf("\n");
>> +        }
>> +    }
>> +    /* <-- debug */
>> +
>> +    /* At some point, we will want to use the FullPath argument and 
>> pass it along to
>> +     * buildGraphFromPaths. Until then, however, we're only going to 
>> build the most
>> +     * minimal graph possible.
>> +     */
>> +    if ( options->writeOutputFile && options->outputFile )
>> +    {
>> +        optimizedGraph = buildGraphFromPaths(lastingResults, 
>> options->buildType);
>> +        exportGraph(optimizedGraph, options->outputFile);
>> +    }
>> +
>> +    if ( options->doStatistics && !options->multiThreaded )
>> +        printStats();
>> +
>> +    return( found );
>> +}
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,106 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +
>> + /*
>> + * searchAlgorithms.h
>> + *
>> + *  Created on: Jun 18, 2013
>> + *      Author: Brian "Rig" Rigdon
>> + */
>> +
>> +#ifndef SEARCHALGORITHMS_H_
>> +#define SEARCHALGORITHMS_H_
>> +
>> +
>> +#include "vectorUtils.h"
>> +#include "graph.h"
>> +#include "configuration.h"
>> +
>> +
>> +/* findNextLabel is a recursive method that determines if a path 
>> exists between a
>> + * specific node and the label that is at the start of the label 
>> array argument. The
>> + * label array is an array of char pointers that is terminated with 
>> a NULL pointer. The
>> + * first pointer is the "current" label.
>> + *
>> + * The node's edge nodes are checked against the current label. If 
>> none of them match, then
>> + * this method recurses with each edge node and the current label.
>> + *
>> + * If an edge matches, then we are beginning a search for the next 
>> "leg" of the labels.
>> + * We recurse with that specific edge and the "next" label. That is 
>> the [1] element of
>> + * the label array. If that element is NULL, the matching edge 
>> signifies the end of our
>> + * search! VICTORY!
>> + *
>> + * If we reach the last edge with out a match (directly or 
>> recursively) we return a false
>> + * list.
>> + */
>> +
>> +bool findNextLabel( Node *node, char *labels[], NodePtrVec *result, 
>> Bitfield *visited ); /* NodePtrVec *visited ); */
>> +
>> +/* findAndRecordAllPaths is almost exactly like findNextLabel. It 
>> differs only in that it
>> + * 1) doesn't stop with the first discovery of the specified path 
>> and 2) records the discovered
>> + * path. To do this, it doesn't create a new result vector for
>> + */
>> +
>> +void findAndRecordAllPaths( Node *node, Signature labels, int 
>> *labelIdxs,
>> +        NodePtrVec *result, Bitfield *visited, NodeVecVec *storage,
>> +        SearchOptions *options );
>> +
>> +/*
>> + *  findLabelPath takes an array of labels, determines if there are 
>> nodes associated
>> + * with the labels (each label search will return a NodePtrVec*), 
>> and determine if
>> + * paths exist passing through the set of labels.
>> + */
>> +bool findLabelPath( Graph *graph, Signature labels, NodePtrVec 
>> *result, SearchType searchType );
>> +
>> +/*
>> + *  findAllPossibleLegs does an exhaustive search through each 
>> possible label
>> + * pairing to determine which legs are possible. This is a 
>> brute-force nxn
>> + * approach that builds a signature holding only the second label 
>> and then
>> + * searches for that signature from the nodes representing the first 
>> label.
>> + * For the time being, it simply prints out the legs that are 
>>  possible in
>> + * this graph.
>> + */
>> +int findAllPossibleLegs( Graph *graph, SearchType searchType );
>> +
>> +/*
>> + * findAndLogAllPossibleLegs is a duplicate of the above method, but it
>> + * stores the results that are found
>> + */
>> +
>> +int findAndLogAllPossibleLegs( Graph *graph, SearchOptions *options );
>> +
>> +/* Once the configuration file is parsed, a config structure is 
>> created that
>> + * specifies the graphs and the signatures to be searched against. 
>> This method
>> + * does multiple signature searches against multiple files
>> + */
>> +
>> +void doMultiSearchesQT(Configuration *config);
>> +
>> +#endif /* SEARCHALGORITHMS_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,284 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +
>> +/*
>> + * searchDiagram.c
>> + *
>> + *  Created on: Feb 1, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#include "searchDiagram.h"
>> +#include <string.h>
>> +#include <stdlib.h>
>> +#include <stdio.h>
>> +
>> +
>> +/* Scream through the diagram to get the element corresponding to 
>> this key. This
>> + * simply iterates through the entire list, there is no optimization 
>> in the search
>> + * algorithm.
>> + */
>> +SearchDiagram *SearchDiagram_findNode ( SearchDiagram *diagram, Node 
>> *node )
>> +{
>> +    int idx;
>> +
>> +    /* Do some basic error checking */
>> +    if ( !diagram )
>> +        return( NULL );
>> +
>> +    for ( idx = 0; diagram[idx].node != NULL; ++idx )
>> +    {
>> +        if ( diagram[idx].node == node ) /* We found it! */
>> +            return( &diagram[idx] );
>> +    }
>> +
>> +    /* If we made it here, we couldn't find it. */
>> +    return( NULL );
>> +}
>> +
>> +
>> +
>> +/* The meat of this process - the function that creates the search 
>> diagram.
>> + * It allocates the memory for the array of search diagram elements and
>> + * populates them with node data and edgeID arrays. Outer nodes are 
>> inserted
>> + * into the node array from the lowest addresses and inner nodes are 
>> inserted
>> + * into the search diagram from the highest. The authors did this to 
>> (hopefully)
>> + * give a little more efficiency to the searching of the diagram.
>> + */
>> +SearchDiagram *SearchDiagram_build( NodeList *nodeTree, int nodeCount )
>> +{
>> +    SearchDiagram *diagram = NULL;
>> +    NodeList *outerNodes = NULL;
>> +    Node *node = NULL;
>> +    NodeList *innerNodes = NULL;
>> +    /* Originally, we speculated that searches would stream through 
>> the outer
>> +     * nodes more than through the interior nodes. (We were wrong.) 
>> So we had
>> +     * this mechanism in place to put the outer nodes at the 
>> beginning of the
>> +     * diagram and the interior nodes at the end. Because we were 
>> wrong, this
>> +     * increases the likelihood of cache misses rather than 
>> decreasing it. Ergo
>> +     * we have replaced the outerIdx and the innerIdx calls.
>> +     *
>> +     * So... it turns out that putting the inner nodes near their 
>> containing
>> +     * node actually slows things down - but it's minor (2% - 3 
>> minutes in a
>> +     * 120 minute run.)
>> +    int index = 0;
>> +     */
>> +    int outerIdx = 0;           /* index from the bottom up for 
>> outer nodes */
>> +    int innerIdx = nodeCount-1; /* and from the top down for 
>> interior nodes */
>> +
>> +    int edgeCount;
>> +    EdgeList *edges;
>> +    SearchDiagram *element; /* for searching in our diagram */
>> +
>> +    /* Do some basic error checking */
>> +    if ( !nodeTree || nodeCount == 0 )
>> +        return NULL;
>> +
>> +    /* Allocate an array of SearchDiagram Elements (+1 for a 
>> terminus element) */
>> +    diagram = malloc ( (nodeCount+1) * sizeof(SearchDiagram) );
>> +    if ( !diagram ) /* malloc failed */
>> +        return( NULL );
>> +
>> +    diagram[nodeCount].node = NULL;
>> +    diagram[nodeCount].edgeReferenceArray = NULL;
>> +
>> +    /* Scream through the Nodes and fill in the Search Array 
>> allocate space for edges */
>> +    for ( outerNodes = nodeTree; outerNodes != NULL; outerNodes = 
>> outerNodes->nextNode )
>> +    {
>> +        node = outerNodes->node;
>> +        /* This diagram entry needs a key */
>> +        diagram[outerIdx].node = node;
>> +        /* How many edges do we need? */
>> +        edgeCount = node->edgeCount + node->entranceCount;
>> +        if ( edgeCount > 0 ) /* allocate space for edgeIdArray (+1 
>> for a terminus element) */
>> +        {
>> +            diagram[outerIdx].edgeReferenceArray = malloc ( 
>> (edgeCount+1) * sizeof(EdgeReferences) );
>> + 
>>            diagram[outerIdx].edgeReferenceArray[edgeCount].edgeTarget 
>> = NULL;
>> + 
>>            diagram[outerIdx].edgeReferenceArray[edgeCount].targetNodeEdges 
>> = NULL;
>> +        }
>> +        else
>> +            diagram[outerIdx].edgeReferenceArray = NULL;
>> +
>> +        /* What do we do if that malloc fails? */
>> +
>> +        /* increment the outer index: */
>> +        ++outerIdx;
>> +
>> +        /* Now do the same for this node's interior graph (if 
>> present) */
>> +        for ( innerNodes = node->interiorNodes; innerNodes != NULL; 
>> innerNodes = innerNodes->nextNode )
>> +        {
>> +            node = innerNodes->node;
>> +            diagram[innerIdx].node = node;
>> +            edgeCount = node->edgeCount + node->entranceCount;
>> +            if ( node->edgeCount > 0 ) /* allocate space for 
>> edgeIdArray (+1 for a terminus element) */
>> +            {
>> +                diagram[innerIdx].edgeReferenceArray = malloc ( 
>> (edgeCount+1) * sizeof(EdgeReferences) );
>> + 
>>                diagram[innerIdx].edgeReferenceArray[edgeCount].edgeTarget 
>> = NULL;
>> + 
>>                diagram[innerIdx].edgeReferenceArray[edgeCount].targetNodeEdges 
>> = NULL;
>> +            }
>> +            else
>> +                diagram[innerIdx].edgeReferenceArray = NULL;
>> +
>> +            /* Again, what do we do if that malloc fails? */
>> +
>> +            /* decrement the interior index: */
>> +            --innerIdx;
>> +        }
>> +
>> +    }
>> +
>> +
>> +    /* Check to make sure our counters line up. If they don't, we 
>> have a corrupt
>> +     * graph. That is, there is a mismatch between node definitions 
>> and edge lists.
>> +     * The innerIdx should reference the previous outerIdx location.
>> +     */
>> +    if ( outerIdx != innerIdx +1 )
>> +    {
>> +        /* Houston, we have a problem */
>> +        printf ( "Bummer. outerIdx: %d, innerIdx: %d, node count: 
>> %d\n", outerIdx, innerIdx, nodeCount );
>> +    }
>> +
>> +
>> +    /* For each node, populate its edge list - edges and entrance 
>> nodes (if there) */
>> +    outerIdx = 0;
>> +    innerIdx = nodeCount-1;
>> +    for ( outerNodes = nodeTree; outerNodes != NULL; outerNodes = 
>> outerNodes->nextNode )
>> +    {
>> +        /* iterate through this node's edges to populate the 
>> EdgeIdArray */
>> +        node = outerNodes->node;
>> +        for ( edges = node->edges, edgeCount = 0;
>> +              edges != NULL;
>> +              edges = edges->nextEdge, ++edgeCount )
>> +        {
>> +            element = SearchDiagram_findNode( diagram, 
>> edges->targetNode );
>> + 
>>            diagram[outerIdx].edgeReferenceArray[edgeCount].edgeTarget 
>> = edges->targetNode;
>> + 
>>            diagram[outerIdx].edgeReferenceArray[edgeCount].targetNodeEdges 
>> = element->edgeReferenceArray;
>> +        }
>> +        ++outerIdx;
>> +
>> +        /* And then scream through the interior nodes to take care 
>> of their edges */
>> +        for ( innerNodes = node->interiorNodes; innerNodes != NULL; 
>> innerNodes = innerNodes->nextNode )
>> +        {
>> +            node = innerNodes->node;
>> +            for ( edges = node->edges, edgeCount = 0;
>> +                  edges != NULL;
>> +                  edges = edges->nextEdge, ++edgeCount )
>> +            {
>> +                element = SearchDiagram_findNode( diagram, 
>> edges->targetNode );
>> + 
>>                diagram[innerIdx].edgeReferenceArray[edgeCount].edgeTarget 
>> = edges->targetNode;
>> + 
>>                diagram[innerIdx].edgeReferenceArray[edgeCount].targetNodeEdges 
>> = element->edgeReferenceArray;
>> +            }
>> +            --innerIdx;
>> +        }
>> +    }
>> +
>> +    return diagram;
>> +}
>> +
>> +
>> +
>> +bool SearchDiagram_findSignatureAlongEdges ( Node *node, 
>> EdgeReferences *edges,
>> +                                             char *labels[], 
>> NodePtrVec *result, Bitfield *visited )
>> +{
>> +    bool success = false;
>> +    NodePtrVec *nextLegResult = NULL;
>> +    Bitfield *nextLegVisited = NULL;
>> +    int i;
>> +
>> +    /* A little basic error checking */
>> +    if ( !node || !edges || !labels || !result|| !visited )
>> +    {
>> +        return( false );
>> +    }
>> +
>> +    /* If this node has already been visited, we have found a loop. 
>> return false. */
>> +
>> +/*
>> +    if ( NodePtrVec_findReverse( visited, node ) )
>> +        return( false );
>> +    else
>> +        NodePtrVec_push( visited, node );
>> +*/
>> +    if ( Bitfield_nodeVisited( visited, node ) )
>> +        return( false );
>> +
>> +    NodePtrVec_push( result, node );
>> +
>> +    /* Go through the edges once to see if we've found a label match */
>> +    for ( i = 0; edges[i].edgeTarget != NULL; ++i )
>> +    {
>> +        if ( edges[i].edgeTarget->label )
>> +        {
>> +            //strcmp based:
>> +            if ( strcmp( edges[i].edgeTarget->label, labels[0] ) == 
>> 0 ) /* match! */
>> +            // index based: if ( edges[i].edgeTarget->labelIdx == 
>> labelIdxs[0] )
>> +            {
>> +                if ( labels[1] == NULL ) /* end of the signature, 
>> we're DONE */
>> +                {
>> +                    NodePtrVec_push( result, edges[i].edgeTarget );
>> +                    return( true );
>> +                }
>> +                else /* RECURSE TO SEE IF THE REST OF THE SIGNATURE 
>> CAN BE FOUND!!! */
>> +                {
>> +                    nextLegResult = NodePtrVec_new( 50 ); /* 
>> arbitrary size, malloc success checked in recursion */
>> +                    nextLegVisited = Bitfield_new(visited->bitsNeeded);
>> +
>> +                    success = SearchDiagram_findSignatureAlongEdges 
>> ( edges[i].edgeTarget,
>> + 
>>                                                                      edges[i].targetNodeEdges,
>> + 
>>                                                                      &labels[1], 
>> nextLegResult, nextLegVisited );
>> +                    Bitfield_delete( nextLegVisited );
>> +                    if ( success )
>> +                    {
>> +                        NodePtrVec_appendVectors( result, 
>> nextLegResult, true );
>> +                        NodePtrVec_delete( nextLegResult );
>> +                        return( true );
>> +                    }
>> +                }
>> +            }
>> +        }
>> +    }
>> +
>> +    /* IF we made it here, we need to continue through the tree, 
>> seeing if any of our
>> +     * edge nodes have a connection to a labeled node.
>> +     */
>> +    for ( i = 0; edges[i].edgeTarget != NULL; ++i )
>> +    {
>> +        success = SearchDiagram_findSignatureAlongEdges( 
>> edges[i].edgeTarget,
>> + 
>>                                                         edges[i].targetNodeEdges,
>> +                                                         labels, 
>> result, visited );
>> +        if ( success )
>> +            return( true ); /* this edge has a path to the ultimate 
>> signature path */
>> +    }
>> +
>> +
>> +    /* and, if we make it here, we have failed. */
>> +    NodePtrVec_pop( result ); /* take current node off the result 
>> stack */
>> +    return false;
>> +}
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,93 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * searchDiagram.h
>> + *
>> + *  Created on: Feb 1, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#ifndef SEARCHDIAGRAM_H_
>> +#define SEARCHDIAGRAM_H_
>> +
>> +#include "node.h"
>> +
>> +typedef struct SearchDiagramStruct SearchDiagram;
>> +typedef struct EdgeReferencesStruct EdgeReferences;
>> +
>> +struct SearchDiagramStruct
>> +{
>> +    Node *node;  /* a reference to the node */
>> +    EdgeReferences *edgeReferenceArray; /* All the nodes reachable 
>> from here */
>> +};
>> +
>> +/* We are creating arrays of SearchDiagram - constructor/destructor 
>> would be superfluous */
>> +
>> +
>> +/* The EdgeSearchStruct holds a different representation of
>> + * the tree through which we're searching. Our search diagram
>> + * will create an array of these for each node in the graph.
>> + * Searches will go through the array, looking to match the
>> + * search criteria. If the search is unsuccessful, it will
>> + * then search the edges of the node. In this array, the  first
>> + * element is the SEARCH ELEMENT we're comparing against. In
>> + * this iteration of the code, we're using the Node pointer
>> + * as the search key. The second element is the search edges
>> + * contained by that node. The search edges are referenced
>> + * directly, no need to go back to the SearchDiagram instance
>> + * to get to the edges.
>> + */
>> +
>> +struct EdgeReferencesStruct
>> +{
>> +    Node *edgeTarget; /* The address of the node is how we're 
>> defining our search */
>> +    EdgeReferences *targetNodeEdges; /* pointer to the "to" node's 
>> edge references */
>> +};
>> +
>> +/* We are creating arrays of EdgeReferences - constructor/destructor 
>> would be superfluous */
>> +
>> +/* Scream through the diagram to get the element corresponding to 
>> this Node* */
>> +SearchDiagram *SearchDiagram_findNode ( SearchDiagram *diagram, Node 
>> *node );
>> +
>> +/* The meat of this process - the function that creates the search 
>> diagram.
>> + * It allocates the memory for the array of search diagram elements and
>> + * populates them with node data and edgeID arrays.
>> + */
>> +SearchDiagram *SearchDiagram_build ( NodeList *nodeTree, int 
>> nodeCount );
>> +
>> +
>> +/* And, our search methods. The first calls the second, which is 
>> recursive */
>> +
>> +bool SearchDiagram_findSignatureAlongEdges ( Node *node, 
>> EdgeReferences *edges,
>> +                                             char *labels[], 
>> NodePtrVec *result, Bitfield *visited );
>> +
>> +
>> +
>> +#endif /* SEARCHDIAGRAM_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,238 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * statistics.c
>> + *
>> + *  Created on: Sept 24, 2013
>> + *      Author: Brian "Rig" Rigdon
>> + */
>> +
>> +#include "statistics.h"
>> +#include <math.h>
>> +#include <limits.h>
>> +
>> +HistogramElement *HistogramElement_new(int length)
>> +{
>> +    HistogramElement *new = malloc(sizeof(HistogramElement));
>> +    if ( !new )
>> +        return NULL;
>> +    new->length = length;
>> +    new->count = 1;
>> +    new->next = NULL;
>> +    return(new);
>> +}
>> +
>> +bool HistogramElement_updateList(HistogramElement **head, int length)
>> +{
>> +    HistogramElement **prev = NULL;
>> +    HistogramElement *current = NULL;
>> +    HistogramElement *new = NULL;
>> +    bool histogramInsert = false;
>> +
>> +    prev = head;
>> +    for ( current = *head; current != NULL; current = current->next )
>> +    {
>> +        if ( current->length < length )
>> +        {
>> +            prev = &current->next;
>> +            continue; /* iterate down the histogram linked list */
>> +        }
>> +        if ( current->length == length )
>> +        {
>> +            ++current->count;
>> +            histogramInsert = true;
>> +            break;
>> +        }
>> +        if ( current->length > length )
>> +        {
>> +            /* we are logging a new length, need to allocate and 
>> insert */
>> +            new = HistogramElement_new(length);
>> +            if ( ! new )
>> +                return(false);
>> +            new->next = current;
>> +            (*prev) = new;
>> +            histogramInsert = true;
>> +            break;
>> +        }
>> +    }
>> +
>> +    if ( !histogramInsert ) /* this element belongs at the end of 
>> the chain */
>> +    {
>> +        (*prev) = HistogramElement_new(length);
>> +        if ( (*prev) == NULL )
>> +            return(false);
>> +    }
>> +
>> +    return(true);
>> +}
>> +
>> +Stats *Stats_new()
>> +{
>> +    Stats* new = malloc(sizeof(Stats));
>> +    if ( new )
>> +    {
>> +        new->pathLengths = IntVector_new(16); // Arbitrary, multiple 
>> of 8 for vectorization
>> +        new->averageLength = 0.0;
>> +        new->standardDeviation = 0.0;
>> +        new->minLength = INT_MAX;
>> +        new->maxLength = 0;
>> +        new->histogram = NULL;
>> +        if ( new->pathLengths )
>> +            return(new);
>> +        else
>> +        {
>> +            free(new);
>> +            return(NULL);
>> +        }
>> +    }
>> +    else
>> +        return(NULL);
>> +}
>> +
>> +
>> +void Stats_delete(Stats* stats)
>> +{
>> +    if ( stats )
>> +    {
>> +        if ( stats->pathLengths )
>> +            free(stats->pathLengths);
>> +        free(stats);
>> +    }
>> +}
>> +
>> +
>> +bool Stats_logPath(Stats* stats, NodePtrVec* path)
>> +{
>> +//    bool histogramInsert = false;
>> +//    HistogramElement **prev = NULL;
>> +//    HistogramElement *hist = NULL;
>> +//    HistogramElement *new = NULL;
>> +    int length;
>> +
>> +    if ( !stats || !stats->pathLengths || !path )
>> +        return(false);
>> +
>> +    length = path->contentSize;
>> +    if ( length < stats->minLength )
>> +        stats->minLength = length;
>> +    if ( length > stats->maxLength )
>> +        stats->maxLength = length;
>> +    return ( IntVector_insertEnd(stats->pathLengths, length) );
>> +}
>> +
>> +void Stats_calculate(Stats* stats)
>> +{
>> +    int i;
>> +    int length;
>> +    double sum;
>> +    double diff;
>> +
>> +    /* a little basic error checking */
>> +    if ( !stats || !stats->pathLengths || stats->pathLengths == 0 )
>> +        return;
>> +    stats->histogram = calloc((stats->maxLength+1), sizeof(int));
>> +    if ( !stats->histogram )
>> +        return;
>> +
>> +    for ( i = 0; i < stats->pathLengths->size; ++i )
>> +    {
>> +        if ( stats->pathLengths->vector[i] > 0 )
>> +        {
>> +            length = stats->pathLengths->vector[i];
>> +            sum += (double)length;
>> +            /* While we're iterating through the list, let's build 
>> our histogram... */
>> +            /* HistogramElement_updateList(&stats->histogram, 
>> length); */
>> +            stats->histogram[length] += 1;
>> +        }
>> +    }
>> +    if ( i > 0 )
>> +        stats->averageLength = sum / (double)i;
>> +
>> +    sum = 0.0;
>> +    for ( i = 0; i < stats->pathLengths->size; ++i )
>> +    {
>> +        if ( stats->pathLengths->vector[i] > 0 )
>> +        {
>> +            diff = (double)stats->pathLengths->vector[i] - 
>> stats->averageLength;
>> +            sum += diff * diff;
>> +        }
>> +    }
>> +
>> +    if ( i > 0 )
>> +        stats->standardDeviation = sqrt(sum/(double)i);
>> +}
>> +
>> +
>> +void testStats()
>> +{
>> +    int i;
>> +    Stats *test = Stats_new();
>> +    NodePtrVec bogon;
>> +
>> +    for ( i = 2; i < 10; ++i )
>> +    {
>> +        bogon.contentSize = i;
>> +        Stats_logPath(test,&bogon);
>> +    }
>> +
>> +    /* Throw in some more silly data */
>> +    bogon.contentSize = 1;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 4;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 5;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 6;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 5;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 5;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 4;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 5;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 6;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 5;
>> +    Stats_logPath(test,&bogon);
>> +    bogon.contentSize = 5;
>> +    Stats_logPath(test,&bogon);
>> +
>> +    Stats_calculate(test);
>> +    printf("avg: %f\nstd dev: %f\n", test->averageLength, 
>> test->standardDeviation);
>> +    printf("Histogram:\n");
>> +    for ( i = test->minLength; i < test->maxLength; ++i )
>> +    {
>> +        printf ("\tlength %d appeared %d times\n", i, 
>> test->histogram[i] );
>> +    }
>> +
>> +}
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,71 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +
>> +/*
>> + * statistics.h
>> + *
>> + *  Created on: Sept 24, 2013
>> + *      Author: Brian "Rig" Rigdon
>> + */
>> +
>> +#ifndef STATISTICS_H
>> +#define STATISTICS_H
>> +
>> +#include "vectorUtils.h"
>> +
>> +typedef struct HistogramElementStruct HistogramElement;
>> +struct HistogramElementStruct
>> +{
>> +    int length;
>> +    int count;
>> +    struct HistogramElementStruct *next;
>> +};
>> +
>> +HistogramElement *HistogramElement_new(int length);
>> +
>> +typedef struct StatsStruct Stats;
>> +struct StatsStruct
>> +{
>> +    IntVector *pathLengths;
>> +    int minLength;
>> +    int maxLength;
>> +    double averageLength; // does it make sense to say 2.7823 nodes 
>> long?
>> +    double standardDeviation;
>> +    int *histogram;
>> +};
>> +
>> +Stats *Stats_new();
>> +void Stats_delete(Stats* stats);
>> +bool Stats_logPath(Stats* stats, NodePtrVec* path);
>> +void Stats_calculate(Stats* stats);
>> +
>> +void testStats();
>> +
>> +#endif // STATISTICS_H
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,246 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * systemCallMap.c
>> + *
>> + *  Created on: Feb 5, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#include "systemCallMap.h"
>> +#include <string.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +
>> +/* Element constructor */
>> +SystemCallMapElement *SystemCallMapElement_new ( char *label, int 
>> initialSize )
>> +{
>> +    SystemCallMapElement *element = malloc ( sizeof( 
>> SystemCallMapElement ) );
>> +    if ( element )
>> +    {
>> +        element->label = strdup ( label );
>> +        element->index = -1; /* Set by the insertion algorithm */
>> +        if ( !element->label )
>> +        {
>> +            free( element );
>> +            return( NULL );
>> +        }
>> +        element->nodes = NodePtrVec_new( initialSize );
>> +        if ( !element->nodes )
>> +        {
>> +            free( element->label );
>> +            free( element );
>> +            return( NULL );
>> +        }
>> +    }
>> +
>> +    return( element );
>> +}
>> +
>> +/* Element destructor */
>> +void SystemCallMapElement_delete( SystemCallMapElement *trash )
>> +{
>> +    /* free the mallocs! */
>> +    if ( trash )
>> +    {
>> +        if ( trash->label )
>> +            free( trash->label );
>> +        NodePtrVec_delete ( trash->nodes );
>> +    }
>> +}
>> +
>> +
>> +
>> +
>> +
>> +/* Constructor */
>> +SystemCallMap *SystemCallMap_new ( int initialSize )
>> +{
>> +    SystemCallMap *map = NULL;
>> +    SystemCallMapElement **vector = NULL;
>> +
>> +    if ( initialSize <= 0 )
>> +        return NULL;
>> +
>> +    vector = malloc(  initialSize * sizeof( SystemCallMapElement* ) );
>> +    if ( vector )
>> +    {
>> +        map = malloc ( sizeof( SystemCallMap ) );
>> +        if ( map )
>> +        {
>> +            map->allocatedSize = initialSize;
>> +            map->contentSize = 0;
>> +            map->vector = vector;
>> +        }
>> +        else
>> +            free( vector );
>> +    }
>> +
>> +    return map;
>> +}
>> +
>> +/* destructor for an ENTIRE MAP!!! */
>> +void SystemCallMap_delete( SystemCallMap *trash )
>> +{
>> +    int i;
>> +
>> +    /* basic error checking */
>> +    if ( !trash )
>> +        return;
>> +
>> +    for ( i = 0; i < trash->contentSize; ++i )
>> +    {
>> +        SystemCallMapElement_delete( trash->vector[i] );
>> +    }
>> +}
>> +
>> +
>> +
>> +/* setter */
>> +bool SystemCallMap_insert ( SystemCallMap *map, char *label, Node 
>> *node )
>> +{
>> +    int i = 0;
>> +    SystemCallMapElement *newElement = NULL;
>> +    bool success = false;
>> +
>> +    /* Some basic error checking */
>> +    if ( !map || !label || !node )
>> +        return( false );
>> +
>> +    /* See if this label has already been implemented */
>> +    for ( i = 0; i < map->contentSize; ++i )
>> +    {
>> +        if ( strcmp( label, map->vector[i]->label ) == 0 )
>> +        {
>> +            /* found it! */
>> +            node->label = map->vector[i]->label;
>> +            node->labelIdx = i;
>> +            return( NodePtrVec_push( map->vector[i]->nodes, node ) );
>> +        }
>> +    }
>> +
>> +    /* If we make it here, we have a new label */
>> +    if ( map->contentSize == map->allocatedSize )
>> +    {
>> +        /* Full up! Need a new vector */
>> +        map->vector = realloc( map->vector, (map->allocatedSize*2 * 
>> sizeof( SystemCallMapElement * )) );
>> +        if ( map->vector )
>> +        {
>> +            map->allocatedSize *= 2;
>> +        }
>> +        else
>> +            return( false );
>> +    }
>> +
>> +    newElement = SystemCallMapElement_new( label, 8 ); /* arbitrary 
>> size of 8 */
>> +    if ( !newElement )
>> +        return( false );
>> +
>> +    success = NodePtrVec_push( newElement->nodes, node );
>> +    if ( !success )
>> +        SystemCallMapElement_delete( newElement );
>> +
>> +    node->label = newElement->label;
>> +    node->labelIdx = newElement->index = map->contentSize; /* Does 
>> newElement really need the index? */
>> +    map->vector[map->contentSize] = newElement;
>> +    map->contentSize += 1;
>> +
>> +    return( true );
>> +
>> +}
>> +
>> +
>> +
>> +/* Finds all nodes associated with a label. */
>> +NodePtrVec *SystemCallMap_findLabeledNodes( SystemCallMap 
>> *systemCalls, char *label )
>> +{
>> +    int i;
>> +
>> +    /* Debug --> * /
>> +    printf("Inside SystemCallMap_findLabeledNodes, label: %s\n", label);
>> +    / *<-- end debug */
>> +    if ( !systemCalls || !label )
>> +        return( NULL );
>> +
>> +    for( i = 0; i < systemCalls->contentSize; ++i )
>> +    {
>> +        /* Debug -->* /
>> +        printf("\t...checking against %s...\n", 
>> systemCalls->vector[i]->label);
>> +        / * <-- end debug */
>> +        if ( strcmp( label, systemCalls->vector[i]->label ) == 0 )
>> +            return( systemCalls->vector[i]->nodes );
>> +    }
>> +
>> +    /* Debug --> * /
>> +    printf("\tleaving SystemCallMap_findLabeledNodes, nothing 
>> found.\n");
>> +    / *<-- end debug */
>> +    return( NULL );
>> +}
>> +
>> +/* Returns the index of a given label */
>> +int SystemCallMap_getLabelIndex( SystemCallMap *map, char *label )
>> +{
>> +    int i;
>> +
>> +    /* See if this label has already been implemented */
>> +    for ( i = 0; i < map->contentSize; ++i )
>> +    {
>> +        if ( strcmp( label, map->vector[i]->label ) == 0 )
>> +        {
>> +            return( i );
>> +        }
>> +    }
>> +
>> +    /* If we made it here, this label is not represented */
>> +    return( -1 );
>> +}
>> +
>> +
>> +/*
>> + * Determines if all the labels in a given signature are represented
>> + * within this graph. If not, we know the search will fail. There's
>> + * gotta be a better name for this...
>> + */
>> +bool SystemCallMap_signatureRepresented( SystemCallMap *map, 
>> Signature signature )
>> +{
>> +    int i;
>> +    bool foundByLabel = true;
>> +
>> +    for ( i = 0; signature[i] != NULL && foundByLabel; ++i )
>> +    {
>> +        /* if the signature is in the map, its index will be >=0 */
>> +        if ( SystemCallMap_getLabelIndex( map, signature[i] ) < 0 )
>> +            foundByLabel = false;
>> +    }
>> +
>> +    return( foundByLabel );
>> +}
>> +
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,112 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * systemCallMap.h
>> + *
>> + *  Created on: Feb 5, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#ifndef SYSTEMCALLMAP_H_
>> +#define SYSTEMCALLMAP_H_
>> +
>> +#include <stdbool.h>
>> +#include "node.h"
>> +
>> +
>> +
>> +/* A signature is an array of character pointers. Signature arrays
>> + * are terminated with a NULL pointer so we don't have to have an
>> + * additional datum to contain the length of the array. To make
>> + * the code more readable, we are using this typedef:
>> + */
>> +typedef char **Signature; /* code must be careful to ensure NULL 
>> termination */
>> +
>> +
>> +/*
>> + * SystemCallMapStruct specifies a label and all the nodes that are 
>> associated with
>> + * that label. Currently, this is sub-optimal, managing via strcmp. 
>> If optimization
>> + * is needed, that is left as an exercise for the future. We could 
>> see the future
>> + * addition of hash values
>> + */
>> +
>> +typedef struct SystemCallMapElementStruct SystemCallMapElement;
>> +
>> +struct SystemCallMapElementStruct
>> +{
>> +    char *label;
>> +    int index;
>> +    NodePtrVec *nodes;
>> +};
>> +
>> +SystemCallMapElement *SystemCallMapElement_new ( char *label, int 
>> initialSize ); /* Element constructor */
>> +void SystemCallMapElement_delete( SystemCallMapElement *trash ); /* 
>> Element destructor */
>> +
>> +
>> +
>> +
>> +/* The call map is actually a stack (managed like the STL deque) of 
>> SystemCallMapElements.
>> + * It will insert up to its capacity, and then double its size 
>> (allocating a new space, copying
>> + * and then freeing the old) when it grows beyond its capacity.
>> + */
>> +
>> +typedef struct SystemCallMapStruct SystemCallMap;
>> +
>> +struct SystemCallMapStruct
>> +{
>> +    int contentSize;
>> +    int allocatedSize;
>> +    SystemCallMapElement **vector; /* a pointer to an array of 
>> pointers */
>> +};
>> +
>> +SystemCallMap *SystemCallMap_new( int initialSize );
>> +void SystemCallMap_delete( SystemCallMap *trash ); /* destructor for 
>> an ENTIRE MAP!!!  */
>> +
>> +/* insert checks to see if there is already an entry for the name 
>> passed in. If so,
>> + * it appends the node to that map element. If not, a new element is 
>> created, the
>> + * name is duplicated
>> + */
>> +bool SystemCallMap_insert ( SystemCallMap *map, char *label, Node 
>> *node );
>> +
>> +
>> +/* Finds a list of nodes associated with a label. */
>> +NodePtrVec *SystemCallMap_findLabeledNodes( SystemCallMap 
>> *systemCalls, char *label );
>> +
>> +/* Returns the index of a given label */
>> +int SystemCallMap_getLabelIndex( SystemCallMap *map, char *label );
>> +
>> +/*
>> + * Determines if all the labels in a given signature are represented
>> + * within this graph. If not, we know the search will fail. There's
>> + * gotta be a better name for this...
>> + */
>> +bool SystemCallMap_signatureRepresented( SystemCallMap *map, 
>> Signature signature );
>> +
>> +#endif /* SYSTEMCALLMAP_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,252 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * utils.c
>> + *
>> + *  Created on: Jan 10, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#include "utils.h"
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +
>> +void edgeListPrettyPrint( EdgeList *edges, int depth, char *header )
>> +{
>> +    int i;
>> +    for ( i = 0; i < depth; ++i )
>> +        printf( "\t" );
>> +    printf( "%s: ", header );
>> +    for ( ; edges != NULL; edges = edges->nextEdge )
>> +        printf( " %d,", edges->targetNodeId );
>> +    printf( "\n" );
>> +}
>> +
>> +
>> +void nodeListPrettyPrint( NodeList *nodes, int depth, char 
>> *separator, bool multiLine )
>> +{
>> +    int i;
>> +
>> +    if ( !nodes )
>> +        return;
>> +
>> +    if ( nodes->node )
>> +        printf( "%d", nodes->node->id );
>> +    if ( nodes->nextNode )
>> +    {
>> +        if ( multiLine )
>> +        {
>> +            printf( "\n" );
>> +            for ( i = 0; i < depth; ++i )
>> +            {
>> +                printf( "    " );
>> +            }
>> +        }
>> +        printf( "%s", separator );
>> +        nodeListPrettyPrint( nodes->nextNode, depth + 1, separator, 
>> multiLine );
>> +    }
>> +    else
>> +        printf( "\n" );
>> +}
>> +
>> +
>> +void graphPrettyPrint ( Graph *graph )
>> +{
>> +    NodeList *outerPtr;
>> +    NodeList *innerPtr;
>> +
>> +    for ( outerPtr = graph->outerNodes;
>> +            outerPtr != NULL;
>> +            outerPtr = outerPtr->nextNode )
>> +    {
>> +        printf( "Outer Node: %d, idx: %d, label: %s (%d)\n", 
>> outerPtr->node->id,
>> +                outerPtr->node->nodeCount, outerPtr->node->label ? 
>> outerPtr->node->label : "none",
>> +                outerPtr->node->labelIdx );
>> +        edgeListPrettyPrint( outerPtr->node->edges, 1, "Edges" );
>> +        /* Deprecated: edgeListPrettyPrint( 
>> outerPtr->node->entranceNodes, 1, "EntranceNodes" ); */
>> +        for ( innerPtr = outerPtr->node->interiorNodes;
>> +                innerPtr != NULL;
>> +                innerPtr = innerPtr->nextNode )
>> +        {
>> +            printf( "\tInner Node: %d\n", innerPtr->node->id );
>> +            edgeListPrettyPrint( innerPtr->node->edges, 2, "Edges" );
>> +        }
>> +    }
>> +
>> +    printf ( "\n\n" );
>> +}
>> +
>> +
>> +void systemCallMapPrettyPrint( SystemCallMap *map )
>> +{
>> +    SystemCallMapElement *element = NULL;
>> +    int i = 0;
>> +    int j = 0;
>> +
>> +    if ( !map )
>> +        return;
>> +
>> +    for ( i = 0; i < map->contentSize; ++i )
>> +    {
>> +        element = map->vector[i];
>> +        printf( "'%s'\n\t:", element->label );
>> +         for ( j = 0; element->nodes && j < 
>> element->nodes->contentSize; ++j )
>> +        {
>> +            printf( "%d", element->nodes->vector[j]->id );
>> +            if ( j < element->nodes->contentSize-1 )
>> +                printf( ", " );
>> +            else
>> +                printf( "\n\n" );
>> +        }
>> +
>> +    }
>> +
>> +    printf( "\t%d total System Call Map elements\n", map->contentSize );
>> +}
>> +
>> +bool testGraph()
>> +{
>> +    /* Build it and see if it will get made */
>> +    Graph *graph = malloc( sizeof( Graph ) );
>> +    Node *outerNode1 = Node_new( 10, 0 );
>> +    Node *outerNode2 = Node_new( 20, 1 );
>> +    Node *innerNode11 = Node_new( 11, 2 );
>> +    Node *innerNode12 = Node_new( 12, 3 );
>> +    Node *innerNode21 = Node_new( 21, 4 );
>> +    Node *innerNode22 = Node_new( 22, 5 );
>> +    Node *innerNode23 = Node_new( 23, 6 );
>> +
>> +    if ( !graph ) return( false );
>> +
>> +    Graph_addOuterNode( graph, outerNode1 );
>> +    Graph_addOuterNode( graph, outerNode2 );
>> +
>> +    Node_addInteriorNode( outerNode1, innerNode11 );
>> +    Node_addInteriorNode( outerNode1, innerNode12 );
>> +
>> +    Node_addInteriorNode( outerNode2, innerNode21 );
>> +    Node_addInteriorNode( outerNode2, innerNode22 );
>> +    Node_addInteriorNode( outerNode2, innerNode23 );
>> +
>> +
>> +    /* Ok, let's print out the graph and see if it works */
>> +    graphPrettyPrint( graph );
>> +
>> +    return( true );
>> +}
>> +
>> +void printStack ( NodePtrVec *stack )
>> +{
>> +    if ( !stack ) return;
>> +    int i;
>> +    // printf ( "stack size %d out of %d max\n", stack->contentSize, 
>> stack->allocatedSize );
>> +    for ( i = 0; i < stack->contentSize; ++i )
>> +    {
>> +        printf("%d", stack->vector[i]->id );
>> +        fflush(stdout);
>> +        if ( stack->vector[i]->label )
>> +        {
>> +            printf( "(%s)", stack->vector[i]->label );
>> +            fflush(stdout);
>> +        }
>> +        if ( i != stack->contentSize-1 )
>> +        {
>> +            printf ( " : " );
>> +            fflush(stdout);
>> +        }
>> +    }
>> +    printf( "\n" );
>> +    fflush(stdout);
>> +}
>> +
>> +void testStack()
>> +{
>> +    /* This was written when the stack was storing integers
>> +    int a, b, c, d, e;
>> +    printf ( "\n\nTesting stack operations" );
>> +    NodePtrVec *vector = Stack_new(3);
>> +    if ( !vector )
>> +    {
>> +        printf( "stack allocation failed\n" );
>> +        return;
>> +    }
>> +    Stack_push( vector, 1 );
>> +    Stack_push( vector, 2 );
>> +    printStack( vector );
>> +    Stack_push( vector, 3 );
>> +    printStack( vector );
>> +    Stack_push( vector, 4 );
>> +    printStack( vector );
>> +
>> +    printf ( "\n2 %s in the stack\n", Stack_find( vector, 2 ) ? "is" 
>> : "is not" );
>> +    printf ( "5 %s in the stack\n\n", Stack_find( vector, 5 ) ? "is" 
>> : "is not" );
>> +
>> +    printf ( "\n4 %s in the stack\n", Stack_findReverse( vector, 4 ) 
>> ? "is" : "is not" );
>> +    printf ( "45 %s in the stack\n\n", Stack_findReverse( vector, 45 
>> ) ? "is" : "is not" );
>> +
>> +    a = Stack_pop( vector );
>> +    printStack( vector );
>> +    b = Stack_pop( vector );
>> +    c = Stack_pop( vector );
>> +    d = Stack_pop( vector );
>> +    e = Stack_pop( vector );
>> +    printStack( vector );
>> +    printf ( "%d, %d, %d, %d, %d\n", a, b, c, d, e );
>> +    */
>> +}
>> +
>> +
>> +/* The below code gives compile warnings about the size difference
>> + * between pointers and ints. Since this doesn't impact execution,
>> + * I am not going to chase down a fix.
>> + */
>> +void searchDiagramPrettyPrint ( SearchDiagram *diagram )
>> +{
>> +#if 0
>> +    SearchDiagram *node;
>> +    EdgeReferences *edge;
>> +
>> +    for ( node = diagram; node != NULL && node->node != NULL; ++node )
>> +    {
>> +        printf ( "Node %x -> %d\n", (unsigned int)node, 
>> node->node->id );
>> +        if ( node->edgeReferenceArray )
>> +        {
>> +            printf ( "\t%x\n", (int)node->edgeReferenceArray );
>> +            for ( edge = node->edgeReferenceArray; edge->edgeTarget 
>> != NULL; ++edge )
>> +            {
>> +                printf ( "\t\tEdge (target %d) -> %x\n",
>> +                         edge->edgeTarget->id, 
>> (int)edge->targetNodeEdges );
>> +            }
>> +        }
>> +
>> +    }
>> +#endif
>> +}
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,53 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * utils.h
>> + *
>> + *  Created on: Jan 10, 2013
>> + *      Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
>> + */
>> +
>> +#ifndef UTILS_H_
>> +#define UTILS_H_
>> +
>> +#include "graph.h"
>> +#include "systemCallMap.h"
>> +#include "searchDiagram.h"
>> +void edgeListPrettyPrint( EdgeList *edges, int depth, char *header );
>> +void nodeListPrettyPrint( NodeList *nodes, int depth, char 
>> *separator, bool multiLine );
>> +void graphPrettyPrint( Graph *graph );
>> +void systemCallMapPrettyPrint( SystemCallMap *map );
>> +void printStack ( NodePtrVec *stack );
>> +bool testGraph();
>> +void testStack();
>> +
>> +void searchDiagramPrettyPrint ( SearchDiagram *diagram );
>> +
>> +#endif /* UTILS_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,563 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * vectorUtils.c
>> + *
>> + *  Created on: Jun 21, 2013
>> + *      Author: jbrigdo
>> + */
>> +
>> +#include "vectorUtils.h"
>> +
>> +
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <ctype.h>
>> +
>> +
>> +/* --------
>> + * IntVector Methods
>> + */
>> +
>> +/* constructor */
>> +IntVector *IntVector_new( int size )
>> +{
>> +    IntVector *new = malloc( sizeof(IntVector) );
>> +    if ( new )
>> +    {
>> +        int *vector = malloc ( size * sizeof(int) );
>> +        if ( vector )
>> +        {
>> +            new->vector = vector;
>> +            new->size = 0;
>> +            new->allocatedSize = size;
>> +            return( new );
>> +        }
>> +        else
>> +        {
>> +            free( new );
>> +            return( NULL );
>> +        }
>> +    }
>> +    else
>> +        return( NULL );
>> +}
>> +
>> +/* destructor */
>> +void IntVector_delete(IntVector *trash)
>> +{
>> +    if ( trash )
>> +    {
>> +        if ( trash->vector )
>> +            free( trash->vector );
>> +        free( trash );
>> +    }
>> +}
>> +
>> +/* inserts a new integer at the tail of the vector */
>> +bool IntVector_insertEnd(IntVector *vector, int datum)
>> +{
>> +    int current = 0;
>> +    int max = 0;
>> +
>> +    /* some basic error checking */
>> +    if ( !vector )
>> +        return( false );
>> +
>> +    current = vector->size;
>> +    max = vector->allocatedSize;
>> +
>> +    if ( current == max ) /* we're full */
>> +    {
>> +        vector->vector = realloc( vector->vector, 2*max*sizeof(int) );
>> +        if ( vector->vector )
>> +        {
>> +            vector->allocatedSize = 2*max;
>> +        }
>> +        else
>> +        {
>> +            fprintf( stderr, "\n\nIntVector_insertEnd failed realloc 
>> size = %d\n", current*2 );
>> +            return( false );
>> +        }
>> +    }
>> +
>> +    vector->vector[current] = datum;
>> +    vector->size += 1;
>> +    return( true );
>> +}
>> +
>> +/*
>> + * A utility method that takes an input string to the next number. 
>> If it currently
>> + * points to a number, we iterate past that number, past any 
>> whitespace or non-number
>> + * and point to the first digit character we find. If input 
>> currently points a non-
>> + * digit character, we find the next digit character and return a 
>> pointer to it. If
>> + * no non-digit character is found with these rules, we return null.
>> + */
>> +static char *findNextNumber(char *input)
>> +{
>> +    if ( isdigit( (int)input[0] ) )
>> +    {
>> +        /* scream through the string to find a non-digit */
>> +        ++input;
>> +        while ( isdigit( (int)input[0] ) && *input != '\0' )
>> +            ++input;
>> +        if ( input[0] == '\0' )
>> +            return( NULL );
>> +        else
>> +            /* now find the next digit */
>> +            while ( !isdigit( (int)input[0] ) && *input != '\0' )
>> +                ++input;
>> +        if ( input[0] == '\0' )
>> +            return(NULL);
>> +        else
>> +            return(input);
>> +    }
>> +    else
>> +    {
>> +        /* find the first digit character */
>> +        do {
>> +            if ( input[0] == '\0' )
>> +                return(NULL);
>> +            ++input;
>> +        } while ( !isdigit( (int)input[0] ) );
>> +        return(input);
>> +    }
>> +}
>> +
>> +/*
>> + * parse space-delimited null-terminated string into an IntVector.
>> + * Returns the number of integers collected
>> + */
>> +int IntVector_createFromString(IntVector *vector, char *inputString)
>> +{
>> +    int dataCount = 0;
>> +    int datum;
>> +
>> +    /* make sure we have valid pointers passed in*/
>> +    if ( !vector || !inputString )
>> +        return(0);
>> +
>> +    /* make sure we're pointing to a digit */
>> +    if ( !isdigit((int)inputString[0]))
>> +    {
>> +        inputString = findNextNumber(inputString);
>> +    }
>> +
>> +    /* ok, at this point, we know we're pointing at a number */
>> +    while (inputString) /* set to NULL when there are no more 
>> numbers. */
>> +    {
>> +        datum = atoi(inputString);
>> +        inputString = findNextNumber(inputString);
>> +        if ( !IntVector_insertEnd(vector, datum) )
>> +            return(0); /* realloc failure */
>> +        ++dataCount;
>> +    }
>> +
>> +    return(dataCount);
>> +}
>> +
>> +
>> +
>> +
>> +/* constructor */
>> +CharVector *CharVector_new(int size)
>> +{
>> +    CharVector *new = malloc( sizeof(CharVector) );
>> +    if ( new )
>> +    {
>> +        char *string = malloc ( size * sizeof(char) );
>> +        if ( string )
>> +        {
>> +            new->string = string;
>> +            new->size = 0;
>> +            new->allocatedSize = size;
>> +            return( new );
>> +        }
>> +        else
>> +        {
>> +            free( new );
>> +            return( NULL );
>> +        }
>> +    }
>> +    else
>> +        return( NULL );
>> +}
>> +
>> +/* destructor */
>> +void CharVector_delete( CharVector *trash )
>> +{
>> +    if ( trash )
>> +    {
>> +        if ( trash->string )
>> +            free( trash->string );
>> +        free( trash );
>> +    }
>> +}
>> +
>> +
>> +bool CharVector_insertEnd( CharVector *vector, char c )
>> +{
>> +    int size = 0;
>> +    int max = 0;
>> +
>> +    /* some basic error checking */
>> +    if ( !vector )
>> +        return( false );
>> +
>> +    size = vector->size;
>> +    max = vector->allocatedSize;
>> +
>> +    if ( size == max ) /* we're full */
>> +    {
>> +        vector->string = realloc( vector->string, 2*size*sizeof(char) );
>> +        if ( vector->string )
>> +        {
>> +            vector->allocatedSize = size*2;
>> +        }
>> +        else
>> +        {
>> +            fprintf( stderr, "\n\nIntVector_insertEnd failed realloc 
>> size = %d\n", size*2 );
>> +            return( false );
>> +        }
>> +    }
>> +
>> +    vector->string[size] = c;
>> +    vector->size += 1;
>> +    return( true );
>> +}
>> +
>> +
>> +int CharVector_getLineFromFile( CharVector *vector, FILE *input )
>> +{
>> +    bool notDoneYet = true;
>> +    char c = '\0';
>> +
>> +    /* Some basic error checking */
>> +    if ( !vector || !input )
>> +        return( -1 );
>> +
>> +    vector->size = 0; /* reset the vector prior to filling */
>> +
>> +    /* get to the next digit */
>> +    do {
>> +        c = fgetc( input );
>> +        if ( feof( input ) || c == '\n' )
>> +            notDoneYet = false;
>> +        else
>> +            if ( ! CharVector_insertEnd( vector, c ) )
>> +                return( -1 ); /* CharVector_insertEnd reached a 
>> memory limit. Fail */
>> +    } while ( notDoneYet );
>> +
>> +    /* make the data a c-string */
>> +    if ( ! CharVector_insertEnd( vector, '\0' ) )
>> +        return( -1 ); /* CharVector_insertEnd reached a memory 
>> limit. Fail */
>> +    return( vector->size );
>> +}
>> +
>> +
>> +
>> +/* -------------------------------------------
>> + * Node Pointer Vector Method Definitions
>> + *
>> + */
>> +
>> +/* create a new vector allocating specified size */
>> +NodePtrVec *NodePtrVec_new( int initialSize )
>> +{
>> +    NodePtrVec *newVector;
>> +    Node **vector; /* an array of pointers */
>> +
>> +    vector = malloc ( initialSize * sizeof(Node *) );
>> +    if ( !vector )
>> +    {
>> +        printf ( "Malloc failure in NodePtrVec creation\n" );
>> +        return( NULL );
>> +    }
>> +
>> +    newVector =  malloc ( sizeof(NodePtrVec) );
>> +    if ( !newVector )
>> +    {
>> +        free(vector);
>> +        printf ( "Malloc failure in NodePtrVec storage creation\n" );
>> +        return( NULL );
>> +    }
>> +
>> +    newVector->allocatedSize = initialSize;
>> +    newVector->contentSize = 0;
>> +    newVector->vector = vector;
>> +    return( newVector );
>> +}
>> +
>> +
>> +
>> +/* destructor */
>> +void NodePtrVec_delete( NodePtrVec *trash )
>> +{
>> +    if ( trash )
>> +    {
>> +        if ( trash->vector )
>> +            free(trash->vector);
>> +        free(trash);
>> +    }
>> +}
>> +
>> +
>> +/* creates duplicate vector (not duplicate nodes!). If exact_copy is 
>> true, the
>> + * new vector is the same size as the copied one. If false, then 
>> only enough
>> + * room to hold the copy is allocated.
>> + */
>> +NodePtrVec *NodePtrVec_copy(NodePtrVec *from, bool exact_copy)
>> +{
>> +    int i;
>> +
>> +    if ( !from )
>> +        return NULL;
>> +
>> +    NodePtrVec *to = exact_copy ? NodePtrVec_new(from->allocatedSize)
>> +                                : NodePtrVec_new(from->contentSize);
>> +    if ( !to )
>> +        return NULL;
>> +
>> +    for ( i = 0; i < from->contentSize; ++i )
>> +        to->vector[i] = from->vector[i];
>> +    to->contentSize = from->contentSize;
>> +    return to;
>> +}
>> +
>> +/* pushes the element if it can. If a memory allocation is required but
>> + * fails - false is returned
>> + */
>> +bool NodePtrVec_push( NodePtrVec *vector, Node *node )
>> +{
>> +    int current;
>> +    int max;
>> +
>> +    /* some basic error checking */
>> +    if ( !vector ) return false;
>> +
>> +    current = vector->contentSize;
>> +    max = vector->allocatedSize;
>> +
>> +    /* see if our vector is full */
>> +    if ( current == max )
>> +    {
>> +        vector->vector = realloc( vector->vector, 2*max * 
>> sizeof(Node *) );
>> +        if ( vector->vector )
>> +        {
>> +            vector->allocatedSize = 2*max;
>> +        }
>> +        else
>> +        {
>> +            printf ( "\n\nNodePtrVec_push failed malloc(%d). Node: 
>> %d", 2*max, node->id );
>> +            if ( node->label )
>> +                printf ( ", label: %s\n", node->label );
>> +            else
>> +                printf ( "\n\n" );
>> +            return false;
>> +        }
>> +    }
>> +
>> +    /* do the actual pushing */
>> +    vector->vector[current] = node;
>> +    vector->contentSize += 1;
>> +
>> +    return true;
>> +}
>> +
>> +/* returns the top item and decrements. What do we do to define 
>> empty? */
>> +Node * NodePtrVec_pop( NodePtrVec *vector )
>> +{
>> +    Node *top = NULL;
>> +
>> +    /* some basic error checking */
>> +    if ( !vector ) return NULL;
>> +
>> +    if ( vector->contentSize > 0 )
>> +    {
>> +        vector->contentSize -= 1;
>> +        top = vector->vector[vector->contentSize];
>> +    }
>> +
>> +    return top;
>> +}
>> +
>> +/* Screams through the vector from bottom to top to find the 
>> specified element. If found,
>> + * returns true.
>> + */
>> +bool NodePtrVec_find( NodePtrVec *vector, Node *node )
>> +{
>> +    int i;
>> +
>> +    /* some basic error checking */
>> +    if ( !vector ) return false;
>> +
>> +    for ( i = 0; i < vector->contentSize; ++i )
>> +        if ( vector->vector[i] == node )
>> +            return true;
>> +
>> +    return false;
>> +}
>> +
>> +/* Screams through the vector from top to bottom to find the 
>> specified element. If found,
>> + * returns true.  */
>> +bool NodePtrVec_findReverse( NodePtrVec *vector, Node *node )
>> +{
>> +    int i;
>> +
>> +    /* some basic error checking */
>> +    if ( !vector || !vector->vector || !node ) return false;
>> +
>> +    for ( i = vector->contentSize-1; i >= 0; --i )
>> +        if ( vector->vector[i] == node )
>> +            return true;
>> +
>> +    return false;
>> +}
>> +
>> +
>> +/* Appends the second vector to the first. If the "keepFirst" flag 
>> is set, the
>> + * entire second vector is appended to the first. Otherwise, the [0] 
>> element of
>> + * the second vector is skipped. This is useful when the last 
>> element of the
>> + * first vector is identical to the first element of the second 
>> vector, and
>> + * we don't want duplication. (And who, really, wants duplication? 
>> Really, who
>> + * wants duplication?)
>> + */
>> +void NodePtrVec_appendVectors ( NodePtrVec *first, NodePtrVec 
>> *second, bool keepFirst )
>> +{
>> +    int i;
>> +
>> +    /* Some basic error checking */
>> +    if ( !first || !second )
>> +        return;
>> +
>> +    if ( keepFirst )
>> +        i = 0;
>> +    else
>> +        i = 1;
>> +
>> +    for ( ; i < second->contentSize; ++i )
>> +        NodePtrVec_push( first, second->vector[i] );
>> +}
>> +
>> +
>> +
>> +/* -------------------------------------------
>> + * Node Vec Vec Method definitions
>> + *
>> + * (vector of Node Pointer Vectors )
>> + */
>> +
>> +/* create a new vector allocating specified size */
>> +NodeVecVec *NodeVecVec_new( int initialSize )
>> +{
>> +    NodeVecVec *newVector;
>> +    NodePtrVec **vector; /* an array of pointers */
>> +
>> +    vector = malloc ( initialSize * sizeof(NodePtrVec *) );
>> +    if ( !vector )
>> +    {
>> +        printf ( "Malloc failure in NodeVecVec storage creation\n" );
>> +        fflush(stdout);
>> +        return( NULL );
>> +    }
>> +
>> +    newVector =  malloc ( sizeof(NodeVecVec) );
>> +    if ( !newVector )
>> +    {
>> +        free(vector);
>> +        printf ( "Malloc failure in NodeVecVec creation\n" );
>> +        fflush(stdout);
>> +        return( NULL );
>> +    }
>> +
>> +    newVector->allocatedSize = initialSize;
>> +    newVector->contentSize = 0;
>> +    newVector->vector = vector;
>> +    return( newVector );
>> +}
>> +
>> +
>> +
>> +/* destructor */
>> +void NodeVecVec_delete( NodeVecVec *trash )
>> +{
>> +    int i;
>> +    if ( trash )
>> +    {
>> +        for ( i = 0; i < trash->contentSize; ++i )
>> +            NodePtrVec_delete(trash->vector[i]);
>> +        if ( trash->vector )
>> +            free(trash->vector);
>> +        free(trash);
>> +    }
>> +}
>> +
>> +
>> +/* pushes a copy of the element if it can. If a memory allocation is 
>> required but
>> + * fails - false is returned
>> + */
>> +bool NodeVecVec_insert( NodeVecVec *vector, NodePtrVec *path )
>> +{
>> +    int current;
>> +    int max;
>> +    NodePtrVec *copy = NodePtrVec_copy(path,false);
>> +
>> +    /* some basic error checking */
>> +    if ( !vector || !path || !copy ) return false;
>> +
>> +    current = vector->contentSize;
>> +    max = vector->allocatedSize;
>> +
>> +    /* see if our vector is full */
>> +    if ( current == max )
>> +    {
>> +        vector->vector = realloc( vector->vector, 2*max * 
>> sizeof(Node *) );
>> +        if ( vector->vector )
>> +        {
>> +            vector->allocatedSize = 2*max;
>> +        }
>> +        else
>> +        {
>> +            printf ( "\n\nNodeVecVec_push failed malloc\n" );
>> +            fflush(stdout);
>> +            return false;
>> +        }
>> +    }
>> +
>> +    /* do the actual pushing */
>> +    vector->vector[current] = copy;
>> +    vector->contentSize += 1;
>> +
>> +    return true;
>> +}
>> +
>> +
>> +
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,169 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * vectorUtils.h
>> + *
>> + *  Created on: Jun 21, 2013
>> + *      Author: J. Brian Rigdon
>> + */
>> +
>> +#ifndef VECTORUTILS_H_
>> +#define VECTORUTILS_H_
>> +
>> +#include <stdio.h>
>> +#include <stdbool.h>
>> +
>> +#include "node.h"
>> +
>> +/* The IntVector is sort of a C version of std::vector<int> */
>> +typedef struct IntVectorStruct IntVector;
>> +struct IntVectorStruct
>> +{
>> +    int size; /* number of integers actively stored */
>> +    int allocatedSize;
>> +    int *vector;
>> +};
>> +
>> +IntVector *IntVector_new(int size); /* constructor */
>> +void IntVector_delete(IntVector *trash); /* destructor */
>> +#define IntVector_clear(intVectorPtr) (intVectorPtr->size = 0)
>> +#define IntVector_size(intVectorPtr) (intVectorPtr->size)
>> +bool IntVector_insertEnd(IntVector *vector, int datum);
>> +
>> +/*
>> + * parse space-delimited null-terminated string into an IntVector.
>> + * Returns the number of integers collected
>> + */
>> +int IntVector_createFromString(IntVector *vector, char *inputString);
>> +
>> +
>> +
>> +
>> +
>> +/* The CharVector is sort of a C version of std::vector<char> */
>> +typedef struct CharVectorStruct CharVector;
>> +struct CharVectorStruct
>> +{
>> +    int size; /* number of integers actively stored */
>> +    int allocatedSize;
>> +    char *string;
>> +};
>> +
>> +CharVector *CharVector_new(int size); /* constructor */
>> +void CharVector_delete(CharVector *trash); /* destructor */
>> +bool CharVector_insertEnd(CharVector *vector, char c);
>> +int CharVector_getLineFromFile(CharVector *vector, FILE *input);
>> +
>> +
>> +
>> +
>> +
>> +
>> +/* -------------------------------------------
>> + * Node Pointer Vector Definitions
>> + *
>> + *      NodePtrVec are an alternative storage mechanism to the Node 
>> Lists.
>> + *      The Vector is single ended, with a push and a pop. It maintains
>> + *      a count of contained Node pointers, the maximum allocated 
>> size for
>> + *      the storage and a pointer to the array of Node pointers. 
>> When the
>> + *      contained size reaches the maximum, another piece of memory, we
>> + *      realloc for twice the size. This is patterned after STL vectors
>> + */
>> +
>> +
>> +
>> +/* A simple, sized vector class. The vector is initially created 
>> with a specified size
>> + * even though it holds nothing. Each push increments a counter 
>> (pops decrement) until
>> + * it reaches its initial size. The next push will be slow, because 
>> the vector needs
>> + * to grow. At that point, we realloc with DOUBLE the size of the 
>> original vector. If
>> + * successful, the last datagram is inserted in the end of the vector.
>> + */
>> +
>> +typedef struct NodePtrVecStruct NodePtrVec;
>> +
>> +struct NodePtrVecStruct
>> +{
>> +    int contentSize;    // the number of elements currently in the 
>> vector
>> +    int allocatedSize;  // the amount (in sizeof int) currently 
>> allocated for this vector
>> +    Node **vector;       // a pointer to the actual data (array of 
>> node pointers).
>> +};
>> +
>> +
>> +NodePtrVec *NodePtrVec_new(int initialSize); /* create a new vector 
>> allocating specified size */
>> +void NodePtrVec_delete(NodePtrVec *trash); /* destructor */
>> +NodePtrVec *NodePtrVec_copy(NodePtrVec *from, bool exact_copy); /* 
>> creates duplicate vector (not duplicate nodes!) */
>> +
>> +/* pushes the element if it can. If a memory allocation is required but
>> + * fails - false is returned
>> + */
>> +bool NodePtrVec_push(NodePtrVec *vector, Node *node);
>> +Node * NodePtrVec_pop(NodePtrVec *vector); /* returns the top item 
>> and decrements. If empty, we return -1 */
>> +
>> +/* Screams through the vector from bottom to top to find the 
>> specified element. If found,
>> + * returns true.
>> + */
>> +bool NodePtrVec_find(NodePtrVec *vector, Node *node);
>> +
>> +/* Screams through the vector from top to bottom to find the 
>> specified element. If found,
>> + * returns true.
>> + */
>> +bool NodePtrVec_findReverse(NodePtrVec *vector, Node *node);
>> +
>> +/* Appends the second vector to the first. If the "keepFirst" flag 
>> is set, the
>> + * entire second vector is appended to the first. Otherwise, the [0] 
>> element of
>> + * the second vector is skipped. This is useful when the last 
>> element of the
>> + * first vector is identical to the first element of the second 
>> vector, and
>> + * we don't want duplication. (And who, really, wants duplication? 
>> Really, who
>> + * wants duplication?)
>> + */
>> +void NodePtrVec_appendVectors(NodePtrVec *first, NodePtrVec *second, 
>> bool keepFirst);
>> +
>> +
>> +/* -------------------------------------------
>> + * And a vector of Node Pointer Vectors
>> + *
>> + * Results from the searches are presented as NodePtrVectors. To 
>> store a bunch of these
>> + * we are defining a vector of these vectors.
>> + */
>> +
>> +typedef struct NodeVecVecStruct NodeVecVec;
>> +
>> +struct NodeVecVecStruct
>> +{
>> +    int contentSize;
>> +    int allocatedSize;
>> +    NodePtrVec **vector;
>> +};
>> +
>> +NodeVecVec *NodeVecVec_new(int initialSize); /* constructor */
>> +void NodeVecVec_delete(NodeVecVec* trash); /* destructor */
>> +bool NodeVecVec_insert(NodeVecVec* vector, NodePtrVec* path); /* 
>> puts a copy of "path" at the end of the vector */
>> +
>> +#endif /* VECTORUTILS_H_ */
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,133 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * yaml.h
>> + *
>> + *  Created on: Jun 21, 2013
>> + *      Author: J. Brian Rigdon
>> + */
>> +
>> +#include <stdio.h>
>> +#include <time.h>
>> +#include <stdlib.h>
>> +#include "yaml.h"
>> +static FILE *output = NULL;
>> +
>> +/* This file doesn't yet do a true key/element pair clustering the 
>> way YAML is
>> + * intended to do. It is currently a minimalistic approach to output 
>> the most
>> + * important data from the run.
>> + */
>> +
>> +/* In case configuration info isn't passed in... */
>> +#ifndef CXXFLAGS
>> +#define CXXFLAGS "unknown"
>> +#endif
>> +#ifndef CXXVERSION
>> +#define CXXVERSION "unknown"
>> +#endif
>> +
>> +
>> +
>> +
>> +void YAMLOpen()
>> +{
>> +    time_t rawTime;
>> +    struct tm *timeinfo = NULL;
>> +    char *fileName = calloc(200, sizeof(char));
>> +    char *timeStr = calloc(200, sizeof(char));
>> +
>> +
>> +    time(&rawTime);
>> +    timeinfo = localtime(&rawTime);
>> +
>> +    if ( output != NULL || fileName==NULL || timeStr==NULL || 
>> timeinfo == NULL )
>> +        return;
>> +
>> +    sprintf(fileName, "PathFinder_%d-%d-%d_%d-%d-%d.yaml", 
>> timeinfo->tm_year+1900, timeinfo->tm_mon+1,
>> +        timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, 
>> timeinfo->tm_sec);
>> +    sprintf(timeStr, "%d/%d/%d, %d:%d:%d", timeinfo->tm_year+1900, 
>> timeinfo->tm_mon+1,
>> +        timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, 
>> timeinfo->tm_sec);
>> +    printf("\nWriting YAML: %s\n\n", fileName);
>> +
>> +    /* static data - no need to free(timeinfo); */
>> +
>> +    output = fopen(fileName, "w");
>> +    if ( output != NULL )
>> +    {
>> +        YAMLWriteString("Mini-Application Name", "PathFinder");
>> +        YAMLWriteString("Mini-Application Version", "1.0.0");
>> +        YAMLWriteString("Run Date/Time", timeStr);
>> +        YAMLWriteString("Compiler Version", CXXVERSION);
>> +        YAMLWriteString("Compiler Flags", CXXFLAGS);
>> +
>> +#ifdef MPI
>> +        YAMLWriteString("MPI", "Yes");
>> +#else
>> +        YAMLWriteString("MPI", "No");
>> +#endif
>> +#ifdef OPENMP
>> +        YAMLWriteString("OpenMP", "Yes");
>> +        YAMLWriteString("Open MP Threads", getenv("OMP_NUM_THREADS"));
>> +#else
>> +        YAMLWriteString("OpenMP", "No");
>> +#endif
>> +
>> +    }
>> +}
>> +
>> +void YAMLClose()
>> +{
>> +    if ( output!=NULL )
>> +        fclose(output);
>> +}
>> +
>> +void YAMLWriteString(char *tag, char *data)
>> +{
>> +    if ( output!=NULL )
>> +        fprintf(output, "%s: %s\n", tag, data);
>> +}
>> +
>> +void YAMLWriteInt(char *tag, int data)
>> +{
>> +    if ( output!=NULL )
>> +        fprintf(output, "%s: %i\n", tag, data);
>> +}
>> +
>> +void YAMLWriteDouble(char *tag, double data)
>> +{
>> +    if ( output!=NULL )
>> +        fprintf(output, "%s: %lf\n", tag, data);
>> +}
>> +
>> +void YAMLWriteFloat(char *tag, float data)
>> +{
>> +    if ( output!=NULL )
>> +        fprintf(output, "%s: %f\n", tag, data);
>> +}
>> \ No newline at end of file
>>
>> Added: 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h?rev=311413&view=auto
>> ==============================================================================
>> --- 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h 
>> (added)
>> +++ 
>> test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h 
>> Mon Aug 21 17:38:53 2017
>> @@ -0,0 +1,47 @@
>> +/*************************************************************************
>> + *
>> + *        PathFinder: finding a series of labeled nodes within a
>> + *                two-layer directed, cyclic graph.
>> + *               Copyright (2013) Sandia Corporation
>> + *
>> + * Copyright (2013) Sandia Corporation. Under the terms of Contract
>> + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
>> + * retains certain rights in this software.
>> + *
>> + * This file is part of PathFinder.
>> + *
>> + * PathFinder is free software: you can redistribute it and/or modify
>> + * it under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation, either version 3 of the
>> + * License, or (at your option) any later version.
>> + *
>> + * PathFinder is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with PathFinder.  If not, see <http://www.gnu.org/licenses/>.
>> + *
>> + * Questions? Contact J. Brian Rigdon (jbrigdo at sandia.gov 
>> <mailto:jbrigdo at sandia.gov>)
>> + *
>> + */
>> +
>> +/*
>> + * yaml.h
>> + *
>> + *  Created on: Jun 21, 2013
>> + *      Author: J. Brian Rigdon
>> + */
>> +
>> + #ifndef YAML_H
>> + #define YAML_H
>> +
>> + void YAMLOpen();
>> + void YAMLClose();
>> + void YAMLWriteString(char *tag, char *data);
>> + void YAMLWriteInt(char *tag, int data);
>> + void YAMLWriteDouble(char *tag, double data);
>> + void YAMLWriteFloat(char *tag, float data);
>> +
>> + #endif /* YAML_H */
>> \ No newline at end of file
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170822/71ef5f81/attachment-0001.html>


More information about the llvm-commits mailing list