Apache Weex
Copyright 2018 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 weex-rax-framework(https://github.com/alibaba/rax) developed
by yuanyan  , licensed under the BSD-3-Clause License.

This product contains software weex-vue-framework(https://github.com/vuejs/vue) developed
by fkysly  , licensed under the MIT License.

This product contains software weex-vue-render(https://github.com/weexteam/weex-vue-render) developed
by MrRaindrop  , licensed under the Apache 2.0 License.

This product contains software weex-styler(https://github.com/weexteam/weex-styler) developed
by songsiqi  , 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 fastjson(https://github.com/alibaba/fastjson) developed
by alibaba inc.  , licensed under the Apache 2.0 License.

This product contains software dexposed(https://github.com/alibaba/dexposed) developed
by alibaba inc.  , licensed under the Apache 2.0 License.

This product contains software js_engine(https://github.com/alibaba/weex_js_engine/) developed
by alibaba inc.  , licensed under the Apache 2.0 License.

This product contains software bindingX(https://github.com/alibaba/bindingx) developed
by alibaba inc.  , licensed under the Apache 2.0 License.

This product contains software loopj(https://github.com/loopj/android-async-http) developed
by loopj , licensed under the Apache 2.0 License.

This product contains software fresco(https://github.com/facebook/fresco) developed
by facebook , licensed under the BSD-3-Clause License.

This product contains software animated-gif(https://github.com/facebook/fresco) developed
by facebook , licensed under the BSD-3-Clause License.

This product contains software SocketRocket(https://github.com/facebook/SocketRocket) developed
by facebook , licensed under the BSD-3-Clause License.

This product contains software zxing(https://github.com/zxing/zxing) developed
by zxing , licensed under the Apache 2.0 License.

This product contains software okhttp(https://github.com/square/okhttp) developed
by square , licensed under the Apache 2.0 License.

This product contains software okio(https://github.com/square/okio) developed
by square , licensed under the Apache 2.0 License.

This product contains software scalpel(https://github.com/JakeWharton/scalpel) developed
by Jake Wharton , licensed under the Apache 2.0 License.

This product contains software espresso-idling-resource(https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/) developed
by google , licensed under the Apache 2.0 License.

This product contains software AOSP(https://source.android.com/) developed
by The Android Open Source Project , licensed under the Apache 2.0 License.

This product contains software SDWebImage(https://github.com/rs/SDWebImage) developed
by Olivier Poitrey  , licensed under the MIT License.

This product contains software Guava(https://github.com/google/guava) developed
by google  , licensed under the Apache License.

This product contains shelljs Guava(https://github.com/shelljs/shelljs) developed
by shelljs  , licensed under BSD 3-clause "New" or "Revised" License.

This product contains software fpconv(https://github.com/night-shift/fpconv) developed
by night-shift  , licensed under the MIT License.

This product contains software rapidjson(https://github.com/Tencent/rapidjson) developed
by tencent  , licensed under the MIT License.

This product contains software flexbox-layout(https://github.com/google/flexbox-layout) developed
by google  , licensed under the Apache License.

This product contains software IPC(https://source.android.com/) developed
by google  , licensed under the Apache License.

This product contains software JNI(https://chromium.googlesource.com/) developed
by google, licensed under the BSD-style License.

This product contains software modp(http://modp.com/release/base64) developed
by modp, licensed under the BSD-style License.

This product contains software jni_generator(https://chromium.googlesource.com/) developed
by google, licensed under the BSD-style License.
