diff --git a/.gitmodules b/.gitmodules
index 213b00ee2..b12a9c3ff 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -7,3 +7,27 @@
[submodule "TMessagesProj/jni/boringssl"]
path = TMessagesProj/jni/boringssl
url = https://github.com/google/boringssl
+
+[submodule "ss-rust/src/main/rust/shadowsocks-rust"]
+ path = ss-rust/src/main/rust/shadowsocks-rust
+ url = https://github.com/shadowsocks/shadowsocks-rust.git
+
+[submodule "shadowsocksr-libev"]
+ path = ssr-libev/src/main/jni/shadowsocks-libev
+ url = https://github.com/shadowsocksRb/shadowsocksr-libev.git
+[submodule "ssr-libev/src/main/jni/libancillary"]
+ path = ssr-libev/src/main/jni/libancillary
+ url = https://github.com/shadowsocks/libancillary.git
+[submodule "ssr-libev/src/main/jni/mbedtls"]
+ path = ssr-libev/src/main/jni/mbedtls
+ url = https://github.com/ARMmbed/mbedtls
+[submodule "ssr-libev/src/main/jni/pcre"]
+ path = ssr-libev/src/main/jni/pcre
+ url = https://android.googlesource.com/platform/external/pcre
+[submodule "ssr-libev/src/main/jni/libsodium"]
+ path = ssr-libev/src/main/jni/libsodium
+ url = https://github.com/jedisct1/libsodium.git
+ branch = stable
+[submodule "ssr-libev/src/main/jni/re2"]
+ path = ssr-libev/src/main/jni/re2
+ url = https://github.com/google/re2.git
\ No newline at end of file
diff --git a/relaybaton/.gitignore b/relaybaton/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/relaybaton/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/relaybaton/build.gradle b/relaybaton/build.gradle
new file mode 100644
index 000000000..ad3f426b0
--- /dev/null
+++ b/relaybaton/build.gradle
@@ -0,0 +1,16 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ compileSdkVersion 29
+ buildToolsVersion "29.0.3"
+ ndkVersion "21.1.6352462"
+
+ defaultConfig {
+ minSdkVersion 16
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+ }
+}
\ No newline at end of file
diff --git a/relaybaton/src/main/AndroidManifest.xml b/relaybaton/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..ed92616fc
--- /dev/null
+++ b/relaybaton/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 867a4183d..498a68eb0 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,4 @@
include ':TMessagesProj'
+include ':ss-rust'
+include ':ssr-libev'
+//include ':relaybaton'
\ No newline at end of file
diff --git a/ss-rust/.gitignore b/ss-rust/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/ss-rust/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/ss-rust/build.gradle.kts b/ss-rust/build.gradle.kts
new file mode 100644
index 000000000..dd6670534
--- /dev/null
+++ b/ss-rust/build.gradle.kts
@@ -0,0 +1,51 @@
+import com.android.build.gradle.internal.tasks.factory.dependsOn
+
+plugins {
+ id("com.android.library")
+ id("org.mozilla.rust-android-gradle.rust-android")
+}
+
+android {
+
+ ndkVersion = rootProject.extra.get("ndkVersion").toString()
+
+ compileSdkVersion(29)
+ defaultConfig {
+ minSdkVersion(21)
+ targetSdkVersion(28)
+ }
+
+}
+
+cargo {
+ module = "src/main/rust/shadowsocks-rust"
+ libname = "ss-local"
+ targets = listOf("arm", "arm64", "x86", "x86_64")
+ profile = findProperty("CARGO_PROFILE")?.toString() ?: "release"
+ extraCargoBuildArguments = listOf("--bin", "sslocal")
+ featureSpec.noDefaultBut(arrayOf(
+ "sodium",
+ "rc4",
+ "aes-cfb",
+ "aes-ctr",
+ "camellia-cfb",
+ "openssl-vendored"))
+ exec = { spec, toolchain ->
+ spec.environment("RUST_ANDROID_GRADLE_LINKER_WRAPPER_PY", "$projectDir/$module/../linker-wrapper.py")
+ spec.environment("RUST_ANDROID_GRADLE_TARGET", "target/${toolchain.target}/$profile/lib$libname.so")
+ }
+}
+
+tasks.whenTaskAdded {
+ when (name) {
+ "mergeDebugJniLibFolders", "mergeReleaseJniLibFolders" -> dependsOn("cargoBuild")
+ }
+}
+
+tasks.register("cargoClean") {
+ executable("cargo") // cargo.cargoCommand
+ args("clean")
+ workingDir("$projectDir/${cargo.module}")
+}
+
+tasks.clean.dependsOn("cargoClean")
\ No newline at end of file
diff --git a/ss-rust/src/main/AndroidManifest.xml b/ss-rust/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..b3695aad8
--- /dev/null
+++ b/ss-rust/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/ss-rust/src/main/rust/linker-wrapper.py b/ss-rust/src/main/rust/linker-wrapper.py
new file mode 100644
index 000000000..80dc1888b
--- /dev/null
+++ b/ss-rust/src/main/rust/linker-wrapper.py
@@ -0,0 +1,18 @@
+from __future__ import absolute_import, print_function, unicode_literals
+
+import os
+import pipes
+import shutil
+import subprocess
+import sys
+
+args = [os.environ['RUST_ANDROID_GRADLE_CC'], os.environ['RUST_ANDROID_GRADLE_CC_LINK_ARG']] + sys.argv[1:]
+
+# This only appears when the subprocess call fails, but it's helpful then.
+printable_cmd = ' '.join(pipes.quote(arg) for arg in args)
+print(printable_cmd)
+
+code = subprocess.call(args)
+if code == 0:
+ shutil.copyfile(sys.argv[sys.argv.index('-o') + 1], os.environ['RUST_ANDROID_GRADLE_TARGET'])
+sys.exit(code)
diff --git a/ss-rust/src/main/rust/shadowsocks-rust b/ss-rust/src/main/rust/shadowsocks-rust
new file mode 160000
index 000000000..ce1e58641
--- /dev/null
+++ b/ss-rust/src/main/rust/shadowsocks-rust
@@ -0,0 +1 @@
+Subproject commit ce1e58641d502ec128806efa898ebf2716461132
diff --git a/ssr-libev/.gitignore b/ssr-libev/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/ssr-libev/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/ssr-libev/build.gradle b/ssr-libev/build.gradle
new file mode 100644
index 000000000..0e7bc9961
--- /dev/null
+++ b/ssr-libev/build.gradle
@@ -0,0 +1,32 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ compileSdkVersion 29
+ buildToolsVersion "29.0.3"
+ ndkVersion rootProject.ext.ndkVersion
+
+ defaultConfig {
+ minSdkVersion 16
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+
+ externalNativeBuild {
+ ndkBuild {
+
+ abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
+ arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk", "APP_PLATFORM:=android-21", "--jobs=8"
+
+ }
+ }
+ }
+
+ externalNativeBuild {
+ ndkBuild {
+ path 'src/main/jni/Android.mk'
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/ssr-libev/src/main/AndroidManifest.xml b/ssr-libev/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..8462535df
--- /dev/null
+++ b/ssr-libev/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/ssr-libev/src/main/jni/Android.mk b/ssr-libev/src/main/jni/Android.mk
new file mode 100644
index 000000000..73160ff32
--- /dev/null
+++ b/ssr-libev/src/main/jni/Android.mk
@@ -0,0 +1,293 @@
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+LOCAL_PATH := $(call my-dir)
+ROOT_PATH := $(LOCAL_PATH)
+
+BUILD_SHARED_EXECUTABLE := $(LOCAL_PATH)/build-shared-executable.mk
+
+########################################################
+## libsodium
+########################################################
+
+include $(CLEAR_VARS)
+
+SODIUM_SOURCE := \
+ crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c \
+ crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c \
+ crypto_aead/xchacha20poly1305/sodium/aead_xchacha20poly1305.c \
+ crypto_core/ed25519/ref10/ed25519_ref10.c \
+ crypto_core/hchacha20/core_hchacha20.c \
+ crypto_core/salsa/ref/core_salsa_ref.c \
+ crypto_generichash/blake2b/ref/blake2b-compress-ref.c \
+ crypto_generichash/blake2b/ref/blake2b-ref.c \
+ crypto_generichash/blake2b/ref/generichash_blake2b.c \
+ crypto_onetimeauth/poly1305/onetimeauth_poly1305.c \
+ crypto_onetimeauth/poly1305/donna/poly1305_donna.c \
+ crypto_pwhash/crypto_pwhash.c \
+ crypto_pwhash/argon2/argon2-core.c \
+ crypto_pwhash/argon2/argon2.c \
+ crypto_pwhash/argon2/argon2-encoding.c \
+ crypto_pwhash/argon2/argon2-fill-block-ref.c \
+ crypto_pwhash/argon2/blake2b-long.c \
+ crypto_pwhash/argon2/pwhash_argon2i.c \
+ crypto_scalarmult/curve25519/scalarmult_curve25519.c \
+ crypto_scalarmult/curve25519/ref10/x25519_ref10.c \
+ crypto_stream/chacha20/stream_chacha20.c \
+ crypto_stream/chacha20/ref/chacha20_ref.c \
+ crypto_stream/salsa20/stream_salsa20.c \
+ crypto_stream/salsa20/ref/salsa20_ref.c \
+ crypto_verify/sodium/verify.c \
+ randombytes/randombytes.c \
+ randombytes/sysrandom/randombytes_sysrandom.c \
+ sodium/core.c \
+ sodium/runtime.c \
+ sodium/utils.c \
+ sodium/version.c
+
+LOCAL_MODULE := sodium
+LOCAL_CFLAGS += -I$(LOCAL_PATH)/libsodium/src/libsodium/include \
+ -I$(LOCAL_PATH)/include \
+ -I$(LOCAL_PATH)/include/sodium \
+ -I$(LOCAL_PATH)/libsodium/src/libsodium/include/sodium \
+ -DPACKAGE_NAME=\"libsodium\" -DPACKAGE_TARNAME=\"libsodium\" \
+ -DPACKAGE_VERSION=\"1.0.15\" -DPACKAGE_STRING=\"libsodium-1.0.15\" \
+ -DPACKAGE_BUGREPORT=\"https://github.com/jedisct1/libsodium/issues\" \
+ -DPACKAGE_URL=\"https://github.com/jedisct1/libsodium\" \
+ -DPACKAGE=\"libsodium\" -DVERSION=\"1.0.15\" \
+ -DHAVE_PTHREAD=1 \
+ -DSTDC_HEADERS=1 \
+ -DHAVE_SYS_TYPES_H=1 \
+ -DHAVE_SYS_STAT_H=1 \
+ -DHAVE_STDLIB_H=1 \
+ -DHAVE_STRING_H=1 \
+ -DHAVE_MEMORY_H=1 \
+ -DHAVE_STRINGS_H=1 \
+ -DHAVE_INTTYPES_H=1 \
+ -DHAVE_STDINT_H=1 \
+ -DHAVE_UNISTD_H=1 \
+ -D__EXTENSIONS__=1 \
+ -D_ALL_SOURCE=1 \
+ -D_GNU_SOURCE=1 \
+ -D_POSIX_PTHREAD_SEMANTICS=1 \
+ -D_TANDEM_SOURCE=1 \
+ -DHAVE_DLFCN_H=1 \
+ -DLT_OBJDIR=\".libs/\" \
+ -DHAVE_SYS_MMAN_H=1 \
+ -DNATIVE_LITTLE_ENDIAN=1 \
+ -DASM_HIDE_SYMBOL=.hidden \
+ -DHAVE_WEAK_SYMBOLS=1 \
+ -DHAVE_ATOMIC_OPS=1 \
+ -DHAVE_ARC4RANDOM=1 \
+ -DHAVE_ARC4RANDOM_BUF=1 \
+ -DHAVE_MMAP=1 \
+ -DHAVE_MLOCK=1 \
+ -DHAVE_MADVISE=1 \
+ -DHAVE_MPROTECT=1 \
+ -DHAVE_NANOSLEEP=1 \
+ -DHAVE_POSIX_MEMALIGN=1 \
+ -DHAVE_GETPID=1 \
+ -DCONFIGURED=1
+
+LOCAL_SRC_FILES := $(addprefix libsodium/src/libsodium/,$(SODIUM_SOURCE))
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################################################
+## libancillary
+########################################################
+
+include $(CLEAR_VARS)
+
+ANCILLARY_SOURCE := fd_recv.c fd_send.c
+
+LOCAL_MODULE := libancillary
+LOCAL_CFLAGS += -I$(LOCAL_PATH)/libancillary
+
+LOCAL_SRC_FILES := $(addprefix libancillary/, $(ANCILLARY_SOURCE))
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################################################
+## libipset
+########################################################
+
+include $(CLEAR_VARS)
+
+bdd_src = bdd/assignments.c bdd/basics.c bdd/bdd-iterator.c bdd/expanded.c \
+ bdd/reachable.c bdd/read.c bdd/write.c
+map_src = map/allocation.c map/inspection.c map/ipv4_map.c map/ipv6_map.c \
+ map/storage.c
+set_src = set/allocation.c set/inspection.c set/ipv4_set.c set/ipv6_set.c \
+ set/iterator.c set/storage.c
+
+IPSET_SOURCE := general.c $(bdd_src) $(map_src) $(set_src)
+
+LOCAL_MODULE := libipset
+LOCAL_CFLAGS += -I$(LOCAL_PATH)/shadowsocks-libev/libipset/include \
+ -I$(LOCAL_PATH)/shadowsocks-libev/libcork/include
+
+LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/libipset/,$(IPSET_SOURCE))
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################################################
+## libcork
+########################################################
+
+include $(CLEAR_VARS)
+
+cli_src := cli/commands.c
+core_src := core/allocator.c core/error.c core/gc.c \
+ core/hash.c core/ip-address.c core/mempool.c \
+ core/timestamp.c core/u128.c
+ds_src := ds/array.c ds/bitset.c ds/buffer.c ds/dllist.c \
+ ds/file-stream.c ds/hash-table.c ds/managed-buffer.c \
+ ds/ring-buffer.c ds/slice.c
+posix_src := posix/directory-walker.c posix/env.c posix/exec.c \
+ posix/files.c posix/process.c posix/subprocess.c
+pthreads_src := pthreads/thread.c
+
+CORK_SOURCE := $(cli_src) $(core_src) $(ds_src) $(posix_src) $(pthreads_src)
+
+LOCAL_MODULE := libcork
+LOCAL_CFLAGS += -I$(LOCAL_PATH)/shadowsocks-libev/libcork/include \
+ -DCORK_API=CORK_LOCAL
+
+LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/libcork/,$(CORK_SOURCE))
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################################################
+## libudns
+########################################################
+
+include $(CLEAR_VARS)
+
+UDNS_SOURCES := udns_dn.c udns_dntosp.c udns_parse.c udns_resolver.c udns_init.c \
+ udns_misc.c udns_XtoX.c \
+ udns_rr_a.c udns_rr_ptr.c udns_rr_mx.c udns_rr_txt.c udns_bl.c \
+ udns_rr_srv.c udns_rr_naptr.c udns_codes.c udns_jran.c
+
+LOCAL_MODULE := libudns
+LOCAL_CFLAGS += -I$(LOCAL_PATH)/shadowsocks-libev/libudns \
+ -DHAVE_DECL_INET_NTOP
+
+LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/libudns/,$(UDNS_SOURCES))
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################################################
+## libev
+########################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libev
+LOCAL_CFLAGS += -I$(LOCAL_PATH)/include/libev
+LOCAL_SRC_FILES := \
+ shadowsocks-libev/libev/ev.c \
+ shadowsocks-libev/libev/event.c
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################################################
+## shadowsocks-libev local
+########################################################
+
+include $(CLEAR_VARS)
+
+SHADOWSOCKS_SOURCES := local.c cache.c udprelay.c encrypt.c \
+ utils.c netutils.c json.c jconf.c acl.c http.c tls.c rule.c \
+ android.c
+
+LOCAL_MODULE := ssr-local
+LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
+LOCAL_CFLAGS := -Wall -fno-strict-aliasing -DMODULE_LOCAL \
+ -DUSE_CRYPTO_MBEDTLS -DANDROID -DHAVE_CONFIG_H \
+ -DCONNECT_IN_PROGRESS=EINPROGRESS \
+ -I$(LOCAL_PATH)/include/shadowsocks-libev \
+ -I$(LOCAL_PATH)/include \
+ -I$(LOCAL_PATH)/libancillary \
+ -I$(LOCAL_PATH)/mbedtls/include \
+ -I$(LOCAL_PATH)/pcre \
+ -I$(LOCAL_PATH)/shadowsocks-libev/libudns \
+ -I$(LOCAL_PATH)/shadowsocks-libev/libcork/include \
+ -I$(LOCAL_PATH)/libsodium/src/libsodium/include \
+ -I$(LOCAL_PATH)/libsodium/src/libsodium/include/sodium \
+ -I$(LOCAL_PATH)/shadowsocks-libev/libipset/include \
+ -I$(LOCAL_PATH)/shadowsocks-libev/libev \
+ -I$(LOCAL_PATH)/shadowsocks-libev/src
+
+LOCAL_STATIC_LIBRARIES := libev libmbedtls libipset libcork libudns \
+ libsodium libancillary libpcre
+
+LOCAL_LDLIBS := -llog
+
+include $(BUILD_SHARED_EXECUTABLE)
+
+########################################################
+## mbed TLS
+########################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := mbedtls
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/mbedtls/include
+
+MBEDTLS_SOURCES := $(wildcard $(LOCAL_PATH)/mbedtls/library/*.c)
+
+LOCAL_SRC_FILES := $(MBEDTLS_SOURCES:$(LOCAL_PATH)/%=%)
+
+include $(BUILD_STATIC_LIBRARY)
+
+########################################################
+## pcre
+########################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := pcre
+
+LOCAL_CFLAGS += -DHAVE_CONFIG_H
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/pcre/dist $(LOCAL_PATH)/pcre
+
+libpcre_src_files := \
+ dist/pcre_byte_order.c \
+ dist/pcre_compile.c \
+ dist/pcre_config.c \
+ dist/pcre_dfa_exec.c \
+ dist/pcre_exec.c \
+ dist/pcre_fullinfo.c \
+ dist/pcre_get.c \
+ dist/pcre_globals.c \
+ dist/pcre_jit_compile.c \
+ dist/pcre_maketables.c \
+ dist/pcre_newline.c \
+ dist/pcre_ord2utf8.c \
+ dist/pcre_refcount.c \
+ dist/pcre_string_utils.c \
+ dist/pcre_study.c \
+ dist/pcre_tables.c \
+ dist/pcre_ucd.c \
+ dist/pcre_valid_utf8.c \
+ dist/pcre_version.c \
+ dist/pcre_xclass.c
+
+LOCAL_SRC_FILES := $(addprefix pcre/, $(libpcre_src_files)) $(LOCAL_PATH)/patch/pcre/pcre_chartables.c
+
+include $(BUILD_STATIC_LIBRARY)
\ No newline at end of file
diff --git a/ssr-libev/src/main/jni/Application.mk b/ssr-libev/src/main/jni/Application.mk
new file mode 100644
index 000000000..4cbaeb0d9
--- /dev/null
+++ b/ssr-libev/src/main/jni/Application.mk
@@ -0,0 +1,4 @@
+APP_CFLAGS := -fdata-sections -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden
+APP_LDFLAGS := -Wl,--hash-style=both -Wl,-exclude-libs,ALL -Wl,--gc-sections
+APP_THIN_ARCHIVE := true
+APP_STL := c++_static
\ No newline at end of file
diff --git a/ssr-libev/src/main/jni/build-shared-executable.mk b/ssr-libev/src/main/jni/build-shared-executable.mk
new file mode 100644
index 000000000..05239df18
--- /dev/null
+++ b/ssr-libev/src/main/jni/build-shared-executable.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# this file is included from Android.mk files to build a target-specific
+# executable program
+#
+# Modified by @Mygod, based on:
+# https://android.googlesource.com/platform/ndk/+/a355a4e/build/core/build-shared-library.mk
+# https://android.googlesource.com/platform/ndk/+/a355a4e/build/core/build-executable.mk
+LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE
+LOCAL_MAKEFILE := $(local-makefile)
+$(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))
+$(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
+$(call check-LOCAL_MODULE_FILENAME)
+# we are building target objects
+my := TARGET_
+$(call handle-module-filename,lib,$(TARGET_SONAME_EXTENSION))
+$(call handle-module-built)
+LOCAL_MODULE_CLASS := EXECUTABLE
+include $(BUILD_SYSTEM)/build-module.mk
diff --git a/ssr-libev/src/main/jni/include/libev/config.h b/ssr-libev/src/main/jni/include/libev/config.h
new file mode 100644
index 000000000..b7cd0b520
--- /dev/null
+++ b/ssr-libev/src/main/jni/include/libev/config.h
@@ -0,0 +1,129 @@
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 to use the syscall interface for clock_gettime */
+#define HAVE_CLOCK_SYSCALL 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the `epoll_ctl' function. */
+#define HAVE_EPOLL_CTL 1
+
+/* Define to 1 if you have the `eventfd' function. */
+#define HAVE_EVENTFD 1
+
+/* Define to 1 if the floor function is available */
+#define HAVE_FLOOR 1
+
+/* Define to 1 if you have the `inotify_init' function. */
+#define HAVE_INOTIFY_INIT 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `kqueue' function. */
+/* #undef HAVE_KQUEUE */
+
+/* Define to 1 if you have the `rt' library (-lrt). */
+/* #undef HAVE_LIBRT */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `nanosleep' function. */
+#define HAVE_NANOSLEEP 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_POLL_H 1
+
+/* Define to 1 if you have the `port_create' function. */
+/* #undef HAVE_PORT_CREATE */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PORT_H */
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `signalfd' function. */
+#define HAVE_SIGNALFD 0
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_EPOLL_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_EVENTFD_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_EVENT_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_INOTIFY_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_SIGNALFD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#define LT_OBJDIR ".libs/"
+
+/* Name of package */
+#define PACKAGE "libev"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Version number of package */
+#define VERSION "4.11"
+
+#define DNDEBUG 1
+#define HAVE_CONFIG_H 1
diff --git a/ssr-libev/src/main/jni/include/shadowsocks-libev/config.h b/ssr-libev/src/main/jni/include/shadowsocks-libev/config.h
new file mode 100644
index 000000000..59451b968
--- /dev/null
+++ b/ssr-libev/src/main/jni/include/shadowsocks-libev/config.h
@@ -0,0 +1,425 @@
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* errno for incomplete non-blocking connect(2) */
+#define CONNECT_IN_PROGRESS EINPROGRESS
+
+/* Override libev default fd conversion macro. */
+/* #undef EV_FD_TO_WIN32_HANDLE */
+
+/* Override libev default fd close macro. */
+/* #undef EV_WIN32_CLOSE_FD */
+
+/* Override libev default handle conversion macro. */
+/* #undef EV_WIN32_HANDLE_TO_FD */
+
+/* Reset max file descriptor size. */
+/* #undef FD_SETSIZE */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the `CCCryptorCreateWithMode' function. */
+/* #undef HAVE_CCCRYPTORCREATEWITHMODE */
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 to use the syscall interface for clock_gettime */
+/* #undef HAVE_CLOCK_SYSCALL */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_COMMONCRYPTO_COMMONCRYPTO_H */
+
+/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you
+ don't. */
+#define HAVE_DECL_INET_NTOP 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the `epoll_ctl' function. */
+/* #undef HAVE_EPOLL_CTL */
+
+/* Define to 1 if you have the `eventfd' function. */
+/* #undef HAVE_EVENTFD */
+
+/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */
+/* #undef HAVE_EVP_ENCRYPTINIT_EX */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if the floor function is available */
+#define HAVE_FLOOR 1
+
+/* Define to 1 if you have the `fork' function. */
+#define HAVE_FORK 1
+
+/* Define to 1 if you have the `getpwnam_r' function. */
+#define HAVE_GETPWNAM_R 1
+
+/* Define to 1 if you have the `inet_ntop' function. */
+/* #undef HAVE_INET_NTOP */
+
+/* Define to 1 if you have the `inotify_init' function. */
+/* #undef HAVE_INOTIFY_INIT */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Enable IPv6 support in libudns */
+#define HAVE_IPv6 1
+
+/* Define to 1 if you have the `kqueue' function. */
+#define HAVE_KQUEUE 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_LANGINFO_H 1
+
+/* Define to 1 if you have the `rt' library (-lrt). */
+/* #undef HAVE_LIBRT */
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+/* #undef HAVE_LIBSOCKET */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LINUX_IF_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LINUX_NETFILTER_IPV4_H */
+
+/* Define to 1 if you have the header
+ file. */
+/* #undef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_LOCALE_H 1
+
+/* Define to 1 if you have the `malloc' function. */
+#define HAVE_MALLOC 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `memset' function. */
+#define HAVE_MEMSET 1
+
+/* Define to 1 if you have the `nanosleep' function. */
+#define HAVE_NANOSLEEP 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_NETDB_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_NET_IF_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_ENGINE_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_ERR_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_EVP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_PEM_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_RAND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_RSA_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_SHA_H */
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_POLL_H 1
+
+/* Define to 1 if you have the `port_create' function. */
+/* #undef HAVE_PORT_CREATE */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PORT_H */
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#define HAVE_PTHREAD_PRIO_INHERIT 1
+
+/* Define to 1 if you have the `RAND_pseudo_bytes' function. */
+/* #undef HAVE_RAND_PSEUDO_BYTES */
+
+/* Define to 1 if you have the 'select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `setresuid' function. */
+/* #undef HAVE_SETRESUID */
+
+/* Define to 1 if you have the `setreuid' function. */
+#define HAVE_SETREUID 1
+
+/* Define to 1 if you have the `setrlimit' function. */
+#define HAVE_SETRLIMIT 1
+
+/* Define to 1 if you have the `signalfd' function. */
+/* #undef HAVE_SIGNALFD */
+
+/* Define to 1 if you have the `socket' function. */
+#define HAVE_SOCKET 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_EPOLL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_EVENTFD_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_EVENT_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_INOTIFY_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_SIGNALFD_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have that is POSIX.1 compatible. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vfork' function. */
+#define HAVE_VFORK 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VFORK_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WINSOCK2_H */
+
+/* Define to 1 if `fork' works. */
+#define HAVE_WORKING_FORK 1
+
+/* Define to 1 if `vfork' works. */
+#define HAVE_WORKING_VFORK 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WS2TCPIP_H */
+
+/* have zlib compression support */
+/* #undef HAVE_ZLIB */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ZLIB_H */
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#define LT_OBJDIR ".libs/"
+
+/* Define to 1 if assertions should be disabled. */
+/* #undef NDEBUG */
+
+/* Name of package */
+#define PACKAGE "shadowsocks-libev"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "max.c.lv@gmail.com"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "shadowsocks-libev"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "shadowsocks-libev 2.4.8"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "shadowsocks-libev"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.4.8"
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* Define to the type of arg 1 for `select'. */
+#define SELECT_TYPE_ARG1 int
+
+/* Define to the type of args 2, 3 and 4 for `select'. */
+#define SELECT_TYPE_ARG234 (fd_set *)
+
+/* Define to the type of arg 5 for `select'. */
+#define SELECT_TYPE_ARG5 (struct timeval *)
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both and . */
+#define TIME_WITH_SYS_TIME 1
+
+/* If the compiler supports a TLS storage class define it to that here */
+#define TLS __thread
+
+/* Use Apple CommonCrypto library */
+/* #undef USE_CRYPTO_APPLECC */
+
+/* Use mbed TLS library */
+#define USE_CRYPTO_MBEDTLS 1
+
+/* Use OpenSSL library */
+/* #undef USE_CRYPTO_OPENSSL */
+
+/* Use PolarSSL library */
+/* #undef USE_CRYPTO_POLARSSL */
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+
+
+/* Version number of package */
+#define VERSION "2.4.8"
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+/* # undef WORDS_BIGENDIAN */
+# endif
+#endif
+
+/* Define to 1 if on MINIX. */
+/* #undef _MINIX */
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define for Solaris 2.5.1 so the uint8_t typedef from ,
+ , or is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+/* #undef _UINT8_T */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to `int' if does not define. */
+/* #undef pid_t */
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported directly. */
+#define restrict __restrict
+/* Work around a bug in Sun C++: it does not support _Restrict or
+ __restrict__, even though the corresponding Sun C compiler ends up with
+ "#define restrict _Restrict" or "#define restrict __restrict__" in the
+ previous line. Perhaps some future version of Sun C++ will work with
+ restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+# define _Restrict
+# define __restrict__
+#endif
+
+/* Define to `unsigned int' if does not define. */
+/* #undef size_t */
+
+/* Define to `int' if does not define. */
+/* #undef ssize_t */
+
+/* Define to the type of an unsigned integer type of width exactly 16 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef uint16_t */
+
+/* Define to the type of an unsigned integer type of width exactly 8 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef uint8_t */
+
+/* Define as `fork' if `vfork' does not work. */
+/* #undef vfork */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PCRE_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PCRE_PCRE_H */
diff --git a/ssr-libev/src/main/jni/include/sodium/version.h b/ssr-libev/src/main/jni/include/sodium/version.h
new file mode 100644
index 000000000..b95c40b52
--- /dev/null
+++ b/ssr-libev/src/main/jni/include/sodium/version.h
@@ -0,0 +1,29 @@
+
+#ifndef sodium_version_H
+#define sodium_version_H
+
+#include "export.h"
+
+#define SODIUM_VERSION_STRING "1.0.7"
+
+#define SODIUM_LIBRARY_VERSION_MAJOR 9
+#define SODIUM_LIBRARY_VERSION_MINOR 0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SODIUM_EXPORT
+const char *sodium_version_string(void);
+
+SODIUM_EXPORT
+int sodium_library_version_major(void);
+
+SODIUM_EXPORT
+int sodium_library_version_minor(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ssr-libev/src/main/jni/libancillary b/ssr-libev/src/main/jni/libancillary
new file mode 160000
index 000000000..311e5d14f
--- /dev/null
+++ b/ssr-libev/src/main/jni/libancillary
@@ -0,0 +1 @@
+Subproject commit 311e5d14f593f16c785bc6605220517eb1f21f6b
diff --git a/ssr-libev/src/main/jni/libsodium b/ssr-libev/src/main/jni/libsodium
new file mode 160000
index 000000000..3b689a6ab
--- /dev/null
+++ b/ssr-libev/src/main/jni/libsodium
@@ -0,0 +1 @@
+Subproject commit 3b689a6ab443cb7b467c2cb6c8434d97fd807168
diff --git a/ssr-libev/src/main/jni/mbedtls b/ssr-libev/src/main/jni/mbedtls
new file mode 160000
index 000000000..d414c32a1
--- /dev/null
+++ b/ssr-libev/src/main/jni/mbedtls
@@ -0,0 +1 @@
+Subproject commit d414c32a160a45725430d99b3c11904760ac8b9c
diff --git a/ssr-libev/src/main/jni/patch/pcre/pcre_chartables.c b/ssr-libev/src/main/jni/patch/pcre/pcre_chartables.c
new file mode 100644
index 000000000..1e20ec29d
--- /dev/null
+++ b/ssr-libev/src/main/jni/patch/pcre/pcre_chartables.c
@@ -0,0 +1,198 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* This file contains character tables that are used when no external tables
+are passed to PCRE by the application that calls it. The tables are used only
+for characters whose code values are less than 256.
+
+This is a default version of the tables that assumes ASCII encoding. A program
+called dftables (which is distributed with PCRE) can be used to build
+alternative versions of this file. This is necessary if you are running in an
+EBCDIC environment, or if you want to default to a different encoding, for
+example ISO-8859-1. When dftables is run, it creates these tables in the
+current locale. If PCRE is configured with --enable-rebuild-chartables, this
+happens automatically.
+
+The following #includes are present because without them gcc 4.x may remove the
+array definition from the final binary if PCRE is built into a static library
+and dead code stripping is activated. This leads to link errors. Pulling in the
+header ensures that the array gets flagged as "someone outside this compilation
+unit might reference this" and so it will always be supplied to the linker. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre_internal.h"
+
+const pcre_uint8 PRIV(default_tables)[] = {
+
+/* This table is a lower casing table. */
+
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 97, 98, 99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,
+ 120,121,122, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,
+ 120,121,122,123,124,125,126,127,
+ 128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,
+ 168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,
+ 208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,
+ 248,249,250,251,252,253,254,255,
+
+/* This table is a case flipping table. */
+
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 97, 98, 99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,
+ 120,121,122, 91, 92, 93, 94, 95,
+ 96, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90,123,124,125,126,127,
+ 128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,
+ 168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,
+ 208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,
+ 248,249,250,251,252,253,254,255,
+
+/* This table contains bit maps for various character classes. Each map is 32
+bytes long and the bits run from the least significant end of each byte. The
+classes that have their own maps are: space, xdigit, digit, upper, lower, word,
+graph, print, punct, and cntrl. Other classes are built from combinations. */
+
+ 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+ 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+ 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,
+ 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+/* This table identifies various classes of character by individual bits:
+ 0x01 white space character
+ 0x02 letter
+ 0x04 decimal digit
+ 0x08 hexadecimal digit
+ 0x10 alphanumeric or '_'
+ 0x80 regular expression metacharacter or binary zero
+*/
+
+ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */
+ 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+ 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */
+ 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */
+ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */
+ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */
+ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */
+ 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */
+ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */
+ 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
+
+/* End of pcre_chartables.c */
diff --git a/ssr-libev/src/main/jni/pcre b/ssr-libev/src/main/jni/pcre
new file mode 160000
index 000000000..222bbf4b3
--- /dev/null
+++ b/ssr-libev/src/main/jni/pcre
@@ -0,0 +1 @@
+Subproject commit 222bbf4b3fb8e13c21686803e47e31aa3e4ad130
diff --git a/ssr-libev/src/main/jni/re2 b/ssr-libev/src/main/jni/re2
new file mode 160000
index 000000000..ca93436e5
--- /dev/null
+++ b/ssr-libev/src/main/jni/re2
@@ -0,0 +1 @@
+Subproject commit ca93436e5b1be02f9f4bfca79b8202c400161994
diff --git a/ssr-libev/src/main/jni/shadowsocks-libev b/ssr-libev/src/main/jni/shadowsocks-libev
new file mode 160000
index 000000000..70921a02a
--- /dev/null
+++ b/ssr-libev/src/main/jni/shadowsocks-libev
@@ -0,0 +1 @@
+Subproject commit 70921a02a860b0ca2df4069a609951bc4182c245