Apache Weex
Copyright 2017 The Apache Software Foundation

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

This product contains software semver(http://semver.org/) developed
by Tom Preston-Werner , licensed under the Creative Commons - CC BY 3.0 License.

This product contains software core-js(https://github.com/zloirock/core-js) developed
by Denis Pushkarev , licensed under the MIT License.

This product contains software vuejs(https://github.com/vuejs/vue) developed
by Yuxi Evan You , licensed under the MIT License.

This product contains software scroll-to (https://github.com/component/scroll-to) developed
by TooTallNate , licensed under the MIT License.

This product contains software inline-style-prefixer
(https://github.com/rofrischmann/inline-style-prefixer) developed by
rofrischmann , licensed under the MIT License.
