Apache Wayang (incubating)
Copyright 2021 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

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

This product includes software developed at
The Apache Spark (https://spark.apache.org/).

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

This product includes software developed at
The Apache Flink (https://flink.apache.org/).

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

This product includes software developed at
The Apache Giraph (https://giraph.apache.org/).

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

This product includes software developed at
The Apache Hadoop (https://hadoop.apache.org/).

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

This product includes software developed at
The GraphChi-java (https://github.com/GraphChi/graphchi-java).

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