repack: move sbin to /system ramdisk and update repacking
for android-10

This will support updating the ramdisk to a different
compression format and co-exist with magisk.

We are also cleaning up and removing non android-10
api makefile actions.

We are also moving twrp repacking to its own class. We
check the new ramdisk format and if it's different
we have magisk compress using the new ramdisk format.

Change-Id: I770030aae7797e75817178b2f0fccd9f39dc23af
diff --git a/Android.mk b/Android.mk
index a750252..1659e83 100755
--- a/Android.mk
+++ b/Android.mk
@@ -36,11 +36,6 @@
 
 ifeq ($(PROJECT_PATH_AGREES),true)
 
-ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
-# Make recovery domain permissive for TWRP
-    BOARD_SEPOLICY_UNION += twrp.te
-endif
-
 ifeq ($(CM_PLATFORM_SDK_VERSION),)
     CM_PLATFORM_SDK_VERSION := 0
 endif
@@ -79,26 +74,25 @@
     openrecoveryscript.cpp \
     tarWrite.c \
     twrpAdbBuFifo.cpp \
-    twrpApex.cpp
+    twrpApex.cpp \
+    twrpRepacker.cpp
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-    LOCAL_STATIC_LIBRARIES += libavb
-    LOCAL_SHARED_LIBRARIES += libfs_mgr libinit
-    ifeq ($(TW_INCLUDE_CRYPTO),true)
-        LOCAL_CFLAGS += -DUSE_FSCRYPT -Wno-macro-redefined
-        LOCAL_C_INCLUDES += bootable/recovery/crypto/fscrypt \
-            bootable/recovery/crypto
-    endif
-    LOCAL_C_INCLUDES += \
-        system/core/fs_mgr/libfs_avb/include/ \
-        system/core/fs_mgr/include_fstab/ \
-        system/core/fs_mgr/include/ \
-        system/core/fs_mgr/libdm/include/ \
-        system/core/fs_mgr/liblp/include/ \
-        system/gsid/include/ \
-        system/core/init/ \
-        system/extras/ext4_utils/include
+LOCAL_STATIC_LIBRARIES += libavb
+LOCAL_SHARED_LIBRARIES += libfs_mgr libinit
+ifeq ($(TW_INCLUDE_CRYPTO),true)
+    LOCAL_CFLAGS += -DUSE_FSCRYPT -Wno-macro-redefined
+    LOCAL_C_INCLUDES += bootable/recovery/crypto/fscrypt \
+        bootable/recovery/crypto
 endif
+LOCAL_C_INCLUDES += \
+    system/core/fs_mgr/libfs_avb/include/ \
+    system/core/fs_mgr/include_fstab/ \
+    system/core/fs_mgr/include/ \
+    system/core/fs_mgr/libdm/include/ \
+    system/core/fs_mgr/liblp/include/ \
+    system/gsid/include/ \
+    system/core/init/ \
+    system/extras/ext4_utils/include
 
 ifneq ($(TARGET_RECOVERY_REBOOT_SRC),)
   LOCAL_SRC_FILES += $(TARGET_RECOVERY_REBOOT_SRC)
@@ -113,71 +107,30 @@
 LOCAL_CLANG := true
 
 LOCAL_C_INCLUDES += \
+    bionic \
     system/vold \
     system/extras \
     system/core/adb \
     system/core/libsparse \
     external/zlib \
     system/core/libpixelflinger/include \
+    system/core/libziparchive/include \
     external/freetype/include \
+    external/boringssl/include \
+    external/libcxx/include \
+    external/libselinux/include \
     $(LOCAL_PATH)/bootloader_message_twrp/include \
     $(LOCAL_PATH)/recovery_ui/include \
     $(LOCAL_PATH)/otautil/include \
-    $(LOCAL_PATH)/install/include
-
-LOCAL_C_INCLUDES += bionic
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
-    LOCAL_C_INCLUDES += external/stlport/stlport external/openssl/include
-    LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22
-else
-    ifeq ($shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-        LOCAL_C_INCLUDES += $(LOCAL_PATH)/fuse_sideload28/
-    else
-        LOCAL_C_FLAGS += -DUSE_OLD_LOAD_KEYS
-        LOCAL_C_INCLUDES += $(LOCAL_PATH)/fuse_sideload/include \
-                            $(LOCAL_PATH)/install/include
-    endif
-    LOCAL_C_INCLUDES += external/boringssl/include external/libcxx/include
-endif
+    $(LOCAL_PATH)/install/include \
+    $(LOCAL_PATH)/fuse_sideload/include \
+    $(LOCAL_PATH)/install/include \
+    $(LOCAL_PATH)/verifier28/
 
 LOCAL_STATIC_LIBRARIES += libguitwrp
 LOCAL_SHARED_LIBRARIES += libz libc libcutils libstdc++ libtar libblkid libminuitwrp libminadbd libmtdutils libtwadbbu libbootloader_message_twrp
-LOCAL_SHARED_LIBRARIES += libcrecovery libtwadbbu libtwrpdigest libc++ libaosprecovery
-
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
-    LOCAL_SHARED_LIBRARIES += libstlport
-    LOCAL_CFLAGS += -DTW_NO_SHA2_LIBRARY
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
-    LOCAL_SHARED_LIBRARIES += libmincrypttwrp
-    LOCAL_C_INCLUDES += $(LOCAL_PATH)/libmincrypt/includes
-    LOCAL_CFLAGS += -DUSE_OLD_VERIFIER
-else
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 29; echo $$?),0)
-        LOCAL_C_INCLUDES += $(LOCAL_PATH)/verifier28/
-        LOCAL_CFLAGS += -DUSE_28_VERIFIER
-    else
-        LOCAL_C_INCLUDES += $(LOCAL_PATH)/install/include
-    endif
-    LOCAL_SHARED_LIBRARIES += libcrypto
-endif
-
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 23; echo $$?),0)
-    LOCAL_SHARED_LIBRARIES += libbase
-endif
-
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-        LOCAL_SHARED_LIBRARIES += libziparchive
-        LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include system/core/libziparchive/include
-    else
-        LOCAL_SHARED_LIBRARIES += libziparchive
-        LOCAL_C_INCLUDES += system/core/libziparchive/include
-    endif
-else
-    LOCAL_SHARED_LIBRARIES += libminzip
-    LOCAL_CFLAGS += -DUSE_MINZIP
-endif
+LOCAL_SHARED_LIBRARIES += libcrecovery libtwadbbu libtwrpdigest libc++ libaosprecovery libinit libcrypto libbase libziparchive libselinux
+LOCAL_CFLAGS += -DUSE_28_VERIFIER
 
 ifneq ($(wildcard system/core/libsparse/Android.mk),)
 LOCAL_SHARED_LIBRARIES += libsparse
@@ -190,23 +143,6 @@
     TW_EXCLUDE_MTP := true
 endif
 
-ifeq ($(TARGET_USERIMAGES_USE_EXT4), true)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 28; echo $$?),0)
-        LOCAL_CFLAGS += -DUSE_EXT4
-    endif
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 28; echo $$?),0)
-        LOCAL_C_INCLUDES += system/extras/ext4_utils \
-            system/extras/ext4_utils/include \
-	    $(commands_TWRP_local_path)/crypto/ext4crypt
-        LOCAL_SHARED_LIBRARIES += libext4_utils
-        ifneq ($(wildcard external/lz4/Android.mk),)
-            #LOCAL_STATIC_LIBRARIES += liblz4
-        endif
-    endif
-endif
-LOCAL_C_INCLUDES += external/libselinux/include
-LOCAL_SHARED_LIBRARIES += libselinux
-
 ifeq ($(AB_OTA_UPDATER),true)
     LOCAL_CFLAGS += -DAB_OTA_UPDATER=1
     LOCAL_SHARED_LIBRARIES += libhardware android.hardware.boot@1.0
@@ -221,7 +157,7 @@
     LOCAL_CFLAGS += -DTW_NO_BIND_SYSTEM
 endif
 
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 
 ifeq ($(TARGET_RECOVERY_TWRP_LIB),)
     LOCAL_SRC_FILES += BasePartition.cpp
@@ -237,7 +173,6 @@
 endif
 LOCAL_CFLAGS += -DTW_GIT_REVISION='"$(tw_git_revision)"'
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
 ifeq ($(TW_FORCE_USE_BUSYBOX), true)
     TW_USE_TOOLBOX := false
 else
@@ -246,12 +181,6 @@
 ifeq ($(TW_EXCLUDE_MTP),)
     LOCAL_SHARED_LIBRARIES += libtwrpmtp-ffs
 endif
-else
-ifeq ($(TW_EXCLUDE_MTP),)
-    LOCAL_CFLAGS += -DTW_HAS_LEGACY_MTP
-    LOCAL_SHARED_LIBRARIES += libtwrpmtp-legacy
-endif
-endif
 
 #TWRP Build Flags
 ifeq ($(TW_EXCLUDE_MTP),)
@@ -351,23 +280,14 @@
     LOCAL_CFLAGS += -DTW_INCLUDE_CRYPTO
     LOCAL_SHARED_LIBRARIES += libcryptfsfde libgpt_twrp
     LOCAL_C_INCLUDES += external/boringssl/src/include
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0)
-        TW_INCLUDE_CRYPTO_FBE := true
-        LOCAL_CFLAGS += -DTW_INCLUDE_FBE
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-            LOCAL_SHARED_LIBRARIES += libtwrpfscrypt
-        else
-            LOCAL_SHARED_LIBRARIES += libe4crypt
-        endif
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-            LOCAL_CFLAGS += -DTW_INCLUDE_FBE_METADATA_DECRYPT
-        endif
-    endif
+    TW_INCLUDE_CRYPTO_FBE := true
+    LOCAL_CFLAGS += -DTW_INCLUDE_FBE
+    LOCAL_SHARED_LIBRARIES += libtwrpfscrypt android.frameworks.stats@1.0 android.hardware.authsecret@1.0 \
+        android.hardware.oemlock@1.0
+    LOCAL_CFLAGS += -DTW_INCLUDE_FBE_METADATA_DECRYPT
     ifneq ($(TW_CRYPTO_USE_SYSTEM_VOLD),)
     ifneq ($(TW_CRYPTO_USE_SYSTEM_VOLD),false)
-		ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0)
-			TW_INCLUDE_LIBRESETPROP := true
-		endif
+		TW_INCLUDE_LIBRESETPROP := true
         LOCAL_CFLAGS += -DTW_CRYPTO_USE_SYSTEM_VOLD
         LOCAL_STATIC_LIBRARIES += libvolddecrypt
     endif
@@ -422,9 +342,7 @@
 ifneq ($(TARGET_RECOVERY_INITRC),)
     TW_EXCLUDE_DEFAULT_USB_INIT := true
 endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
-    LOCAL_CFLAGS += -DTW_USE_NEW_MINADBD
-endif
+LOCAL_CFLAGS += -DTW_USE_NEW_MINADBD
 ifneq ($(TW_DEFAULT_LANGUAGE),)
     LOCAL_CFLAGS += -DTW_DEFAULT_LANGUAGE=$(TW_DEFAULT_LANGUAGE)
 else
@@ -438,17 +356,14 @@
     LOCAL_CFLAGS += -DTW_OVERRIDE_SYSTEM_PROPS=$(TW_OVERRIDE_SYSTEM_PROPS)
 endif
 ifneq ($(TW_INCLUDE_LIBRESETPROP),)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
-        $(warning libresetprop is not available for android < 7)
-    else
-        LOCAL_SHARED_LIBRARIES += libresetprop
-        LOCAL_C_INCLUDES += external/magisk-prebuilt/include
-        LOCAL_CFLAGS += -DTW_INCLUDE_LIBRESETPROP
-    endif
+    LOCAL_SHARED_LIBRARIES += libresetprop
+    LOCAL_C_INCLUDES += external/magisk-prebuilt/include
+    LOCAL_CFLAGS += -DTW_INCLUDE_LIBRESETPROP
 endif
 
 TWRP_REQUIRED_MODULES += \
-    relink \
+    relink_libraries \
+    relink_binaries \
     twrp_ramdisk \
     dump_image \
     erase_image \
@@ -467,30 +382,23 @@
     init.recovery.service.rc \
     init.recovery.ldconfig.rc \
     awk \
+    toybox \
+    toolbox \
+    mkshrc_twrp
 
 ifneq ($(TW_INCLUDE_CRYPTO),)
 TWRP_REQUIRED_MODULES += \
     plat_service_contexts \
     plat_hwservice_contexts \
     vendor_hwservice_contexts \
-    vndservice_contexts \
     hwservicemanager \
     servicemanager \
     vndservicemanager \
     vold_prepare_subdirs \
+    task_recovery_profiles.json \
     fscryptpolicyget
 endif
 
-ifneq ($(TARGET_ARCH), arm64)
-    ifneq ($(TARGET_ARCH), x86_64)
-        LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker
-    else
-        LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
-    endif
-else
-    LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
-endif
-
 ifneq ($(wildcard external/zip/Android.mk),)
     TWRP_REQUIRED_MODULES += zip
 endif
@@ -505,11 +413,7 @@
     endif
 endif
 ifeq ($(BOARD_HAS_NO_REAL_SDCARD),)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
-        TWRP_REQUIRED_MODULES += sgdisk
-    else
-        TWRP_REQUIRED_MODULES += sgdisk_static
-    endif
+    TWRP_REQUIRED_MODULES += sgdisk
 endif
 ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true)
     TWRP_REQUIRED_MODULES += openaes openaes_license
@@ -535,7 +439,7 @@
     TWRP_REQUIRED_MODULES += init.recovery.usb.rc
 endif
 ifeq ($(TWRP_INCLUDE_LOGCAT), true)
-    TWRP_REQUIRED_MODULES += logcat
+    TWRP_REQUIRED_MODULES += logcat event-log-tags
     ifeq ($(TARGET_USES_LOGD), true)
         TWRP_REQUIRED_MODULES += logd libsysutils libnl init.recovery.logd.rc
     endif
@@ -547,66 +451,25 @@
 LOCAL_CFLAGS += -DTWRES=\"$(TWRES_PATH)\"
 LOCAL_CFLAGS += -DTWHTCD_PATH=\"$(TWHTCD_PATH)\"
 ifeq ($(TW_INCLUDE_NTFS_3G),true)
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
     TWRP_REQUIRED_MODULES += \
         mount.ntfs \
         fsck.ntfs \
         mkfs.ntfs
-else
-    TWRP_REQUIRED_MODULES += \
-        ntfs-3g \
-        ntfsfix \
-        mkntfs
-endif
 endif
 ifeq ($(TARGET_USERIMAGES_USE_F2FS), true)
-ifeq ($(shell test $(CM_PLATFORM_SDK_VERSION) -ge 3; echo $$?),0)
-    TWRP_REQUIRED_MODULES += \
-        fsck.f2fs \
-        mkfs.f2fs
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
     TWRP_REQUIRED_MODULES += sload.f2fs \
         libfs_mgr \
         fs_mgr \
         libinit
 endif
+
+TWRP_REQUIRED_MODULES += file_contexts_text
+
+ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),)
+    TWRP_REQUIRED_MODULES += recovery-persist recovery-refresh
 endif
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0)
-    TWRP_REQUIRED_MODULES += ld.config.txt
-    ifeq ($(BOARD_VNDK_RUNTIME_DISABLE),true)
-        LOCAL_POST_INSTALL_CMD += \
-	    sed 's/\(namespace.default.search.paths\)\s\{1,\}=/namespace.default.search.paths  = \/sbin\n\1 +=/' \
-                $(TARGET_OUT_ETC)/ld.config.vndk_lite.txt > $(TARGET_RECOVERY_ROOT_OUT)/sbin/ld.config.txt;
-    else
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-            LOCAL_POST_INSTALL_CMD += \
-            sed 's/\(namespace.default.search.paths\)\s\{1,\}=/namespace.default.search.paths  = \/sbin\n\1 +=/' \
-                    $(TARGET_RECOVERY_ROOT_OUT)/system/etc/ld.config.txt > $(TARGET_RECOVERY_ROOT_OUT)/sbin/ld.config.txt
-        else
-            LOCAL_POST_INSTALL_CMD += \
-            sed 's/\(namespace.default.search.paths\)\s\{1,\}=/namespace.default.search.paths  = \/sbin\n\1 +=/' \
-                    $(TARGET_OUT_ETC)/ld.config.txt > $(TARGET_RECOVERY_ROOT_OUT)/sbin/ld.config.txt;
-        endif
-    endif
-endif
-
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 25; echo $$?),0)
-    TWRP_REQUIRED_MODULES += file_contexts_text
-endif
-
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0)
-    ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),)
-        TWRP_REQUIRED_MODULES += recovery-persist recovery-refresh
-    endif
-endif
-
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-    LOCAL_REQUIRED_MODULES += $(TWRP_REQUIRED_MODULES)
-else
-    LOCAL_ADDITIONAL_DEPENDENCIES += $(TWRP_REQUIRED_MODULES)
-endif
+LOCAL_REQUIRED_MODULES += $(TWRP_REQUIRED_MODULES)
 
 include $(BUILD_EXECUTABLE)
 
@@ -615,11 +478,8 @@
 
 LOCAL_MODULE := file_contexts_text
 LOCAL_MODULE_TAGS := optional
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-    LOCAL_REQUIRED_MODULES := file_contexts.bin
-else
-    LOCAL_ADDITIONAL_DEPENDENCIES := file_contexts.bin
-endif
+LOCAL_REQUIRED_MODULES := file_contexts.bin
+
 LOCAL_POST_INSTALL_CMD := \
     $(hide) cp -f $(PRODUCT_OUT)/obj/ETC/file_contexts.bin_intermediates/file_contexts.concat.tmp $(TARGET_RECOVERY_ROOT_OUT)/file_contexts
 
@@ -627,69 +487,31 @@
 
 # recovery-persist (system partition dynamic executable run after /data mounts)
 # ===============================
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0)
-    include $(CLEAR_VARS)
-    LOCAL_SRC_FILES := \
-        recovery-persist.cpp 
-    LOCAL_MODULE := recovery-persist
-    LOCAL_SHARED_LIBRARIES := liblog libbase libmetricslogger
-    LOCAL_STATIC_LIBRARIES := libotautil
-    LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-        LOCAL_C_INCLUDES += system/core/libmetricslogger/include \
-            system/core/libstats/include
-    endif
-    LOCAL_CFLAGS := -Werror
-    LOCAL_INIT_RC := recovery-persist.rc
-    include $(BUILD_EXECUTABLE)
-endif
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := \
+    recovery-persist.cpp 
+LOCAL_MODULE := recovery-persist
+LOCAL_SHARED_LIBRARIES := liblog libbase libmetricslogger
+LOCAL_STATIC_LIBRARIES := libotautil
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include
+LOCAL_C_INCLUDES += system/core/libmetricslogger/include \
+    system/core/libstats/include
+LOCAL_CFLAGS := -Werror
+LOCAL_INIT_RC := recovery-persist.rc
+include $(BUILD_EXECUTABLE)
 
 # recovery-refresh (system partition dynamic executable run at init)
 # ===============================
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0)
-    include $(CLEAR_VARS)
-    LOCAL_SRC_FILES := \
-        recovery-refresh.cpp 
-    LOCAL_MODULE := recovery-refresh
-    LOCAL_SHARED_LIBRARIES := liblog libbase
-    LOCAL_STATIC_LIBRARIES := libotautil
-    LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include
-    LOCAL_CFLAGS := -Werror
-    LOCAL_INIT_RC := recovery-refresh.rc
-    include $(BUILD_EXECUTABLE)
-endif
-
-# shared libfusesideload
-# ===============================
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-    include $(CLEAR_VARS)
-    LOCAL_CLANG := true
-    LOCAL_CFLAGS := -Wall -Werror -Wno-unused-parameter
-    LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE
-
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE := libfusesideload
-    LOCAL_SHARED_LIBRARIES := libcutils libc
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
-        LOCAL_C_INCLUDES := $(LOCAL_PATH)/libmincrypt/includes
-        LOCAL_SHARED_LIBRARIES += libmincrypttwrp
-        LOCAL_CFLAGS += -DUSE_MINCRYPT
-    else
-        LOCAL_SHARED_LIBRARIES += libcrypto libbase
-    endif
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
-        LOCAL_SRC_FILES := fuse_sideload22.cpp
-        LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22
-    else
-        # ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-        LOCAL_SRC_FILES := fuse_sideload28/fuse_sideload.cpp
-        # else
-            # LOCAL_SRC_FILES := fuse_sideload/fuse_sideload.cpp \
-                fuse_sideload/fuse_provider.cpp
-        # endif
-    endif
-    include $(BUILD_SHARED_LIBRARY)
-endif
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := \
+    recovery-refresh.cpp
+LOCAL_MODULE := recovery-refresh
+LOCAL_SHARED_LIBRARIES := liblog libbase
+LOCAL_STATIC_LIBRARIES := libotautil
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include
+LOCAL_CFLAGS := -Werror
+LOCAL_INIT_RC := recovery-refresh.rc
+include $(BUILD_EXECUTABLE)
 
 # libmounts (static library)
 # ===============================
@@ -733,75 +555,30 @@
 
 LOCAL_MODULE := libaosprecovery
 LOCAL_MODULE_TAGS := optional
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-    LOCAL_SRC_FILES := install28/adb_install.cpp legacy_property_service.cpp set_metadata.cpp tw_atomic.cpp \
-        installcommand.cpp zipwrap.cpp
-else
-    LOCAL_SRC_FILES := install/adb_install.cpp install/asn1_decoder.cpp install/fuse_sdcard_install.cpp\
-        install/install.cpp install/installcommand.cpp install/legacy_property_service.cpp \
-        install/package.cpp install/verifier.cpp install/wipe_data.cpp install/tw_atomic.cpp \
-        install/set_metadata.cpp verifier28/verifier.cpp install/zipwrap.cpp install/ZipUtil.cpp
-endif
+
+LOCAL_SRC_FILES := install/adb_install.cpp install/asn1_decoder.cpp install/fuse_sdcard_install.cpp\
+    install/install.cpp install/installcommand.cpp install/legacy_property_service.cpp \
+    install/package.cpp install/verifier.cpp install/wipe_data.cpp install/tw_atomic.cpp \
+    install/set_metadata.cpp verifier28/verifier.cpp install/zipwrap.cpp install/ZipUtil.cpp
 LOCAL_SHARED_LIBRARIES += libbase libbootloader_message libcrypto libext4_utils \
     libfs_mgr libfusesideload libhidl-gen-utils libhidlbase \
     liblog libselinux libtinyxml2 libutils libz libziparchive libcutils
 LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
-    LOCAL_SHARED_LIBRARIES += libstdc++ libstlport
-    LOCAL_C_INCLUDES += bionic external/stlport/stlport
-    LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22
-else
-    LOCAL_SHARED_LIBRARIES += libc++
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
-    LOCAL_SHARED_LIBRARIES += libmincrypttwrp
-    LOCAL_C_INCLUDES += $(LOCAL_PATH)/libmincrypt/includes
-    LOCAL_SRC_FILES += verifier24/verifier.cpp verifier24/asn1_decoder.cpp
-    LOCAL_CFLAGS += -DUSE_OLD_VERIFIER
-else
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 24; echo $$?),0)
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 28; echo $$?),0)
-            LOCAL_CFLAGS := -std=gnu++2a
-            LOCAL_C_INCLUDES += $(commands_TWRP_local_path)/install/include \
-                                $(commands_TWRP_local_path)/recovery_ui/include \
-                                $(commands_TWRP_local_path)/otautil/include \
-                                $(commands_TWRP_local_path)/minadbd \
-                                $(commands_TWRP_local_path)/minzip \
-                                system/libvintf/include
-            LOCAL_STATIC_LIBRARIES += libotautil libvintf_recovery libvintf 
-        else
-            LOCAL_C_INCLUDES += $(commands_TWRP_local_path)/install28/
-            LOCAL_CFLAGS += -DUSE_28_INSTALL
-        endif
-        LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)
-    else
-        LOCAL_SHARED_LIBRARIES += libcrypto libbase
-        LOCAL_SRC_FILES += verifier28/verifier.cpp verifier28/asn1_decoder.cpp
-        LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include $(LOCAL_PATH)/verifier28 \
-            system/libvintf/include
-        LOCAL_CFLAGS += -DUSE_28_VERIFIER
-    endif
-endif
+LOCAL_SHARED_LIBRARIES += libc++
+LOCAL_CFLAGS := -std=gnu++2a
+LOCAL_C_INCLUDES += $(commands_TWRP_local_path)/install/include \
+                    $(commands_TWRP_local_path)/recovery_ui/include \
+                    $(commands_TWRP_local_path)/otautil/include \
+                    $(commands_TWRP_local_path)/minadbd \
+                    $(commands_TWRP_local_path)/minzip \
+                    system/libvintf/include
+LOCAL_STATIC_LIBRARIES += libotautil libvintf_recovery libvintf libhidl-gen-utils
+LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)
 
 ifeq ($(AB_OTA_UPDATER),true)
     LOCAL_CFLAGS += -DAB_OTA_UPDATER=1
 endif
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-        # LOCAL_SRC_FILES += otautil/ZipUtil.cpp otautil/SysUtil.cpp otautil/DirUtil.cpp
-        LOCAL_SHARED_LIBRARIES += libziparchive libext4_utils libcrypto libcrypto_utils libfs_mgr
-        LOCAL_STATIC_LIBRARIES += libvintf_recovery liblogwrap libavb libvintf libtinyxml2 libz
-        LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
-            # Android 9.0's libvintf also needs this library
-            LOCAL_STATIC_LIBRARIES += libhidl-gen-utils
-        endif
-    endif
-else
-    LOCAL_CFLAGS += -DUSE_MINZIP
-endif
-
 include $(BUILD_SHARED_LIBRARY)
 
 # libverifier (static library)
@@ -831,34 +608,16 @@
     $(commands_TWRP_local_path)/updater/Android.mk \
     $(commands_TWRP_local_path)/bootloader_message_twrp/Android.mk
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 25; echo $$?),0)
-include $(commands_TWRP_local_path)/bootloader_message/Android.mk
-endif
-
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-    include $(commands_TWRP_local_path)/mtp/ffs/Android.mk
-else
-    include $(commands_TWRP_local_path)/mtp/legacy/Android.mk
-endif
+include $(commands_TWRP_local_path)/mtp/ffs/Android.mk
 
 ifeq ($(wildcard system/core/uncrypt/Android.mk),)
     #include $(commands_TWRP_local_path)/uncrypt/Android.mk
 endif
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 26; echo $$?),0)
-        TARGET_GLOBAL_CFLAGS += -DTW_USE_MINUI_WITH_DATA
-        CLANG_TARGET_GLOBAL_CFLAGS += -DTW_USE_MINUI_WITH_DATA
-    endif
-    include $(commands_TWRP_local_path)/minadbd/Android.mk \
-        $(commands_TWRP_local_path)/minui/Android.mk
-else
-    TARGET_GLOBAL_CFLAGS += -DTW_USE_MINUI_21
-    include $(commands_TWRP_local_path)/minadbd21/Android.mk \
-        $(commands_TWRP_local_path)/minui21/Android.mk
-endif
+include $(commands_TWRP_local_path)/minadbd/Android.mk \
+    $(commands_TWRP_local_path)/minui/Android.mk
 
-    # $(commands_TWRP_local_path)/otautil/Android.mk \
+# $(commands_TWRP_local_path)/otautil/Android.mk \
 
 #includes for TWRP
 include $(commands_TWRP_local_path)/injecttwrp/Android.mk \
@@ -885,10 +644,6 @@
     $(commands_TWRP_local_path)/twrpDigest/Android.mk \
     $(commands_TWRP_local_path)/attr/Android.mk
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
-    include $(commands_TWRP_local_path)/libmincrypt/Android.mk
-endif
-
 ifneq ($(TW_OZIP_DECRYPT_KEY),)
     TWRP_REQUIRED_MODULES += ozip_decrypt
     include $(commands_TWRP_local_path)/ozip_decrypt/Android.mk
@@ -898,11 +653,7 @@
     include $(commands_TWRP_local_path)/crypto/fde/Android.mk
     include $(commands_TWRP_local_path)/crypto/scrypt/Android.mk
     ifeq ($(TW_INCLUDE_CRYPTO_FBE), true)
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-            include $(commands_TWRP_local_path)/crypto/fscrypt/Android.mk
-        else
-            include $(commands_TWRP_local_path)/crypto/ext4crypt/Android.mk
-        endif
+        include $(commands_TWRP_local_path)/crypto/fscrypt/Android.mk
     endif
     ifneq ($(TW_CRYPTO_USE_SYSTEM_VOLD),)
     ifneq ($(TW_CRYPTO_USE_SYSTEM_VOLD),false)
diff --git a/adbbu/Android.mk b/adbbu/Android.mk
old mode 100644
new mode 100755
index e271938..23a58f3
--- a/adbbu/Android.mk
+++ b/adbbu/Android.mk
@@ -43,6 +43,6 @@
 LOCAL_MODULE_STEM := bu
 LOCAL_MODULE_TAGS:= optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 include $(BUILD_EXECUTABLE)
 
diff --git a/attr/Android.mk b/attr/Android.mk
old mode 100644
new mode 100755
index ab1d892..121ae02
--- a/attr/Android.mk
+++ b/attr/Android.mk
@@ -6,17 +6,17 @@
 LOCAL_MODULE := listxattr
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_PACK_MODULE_RELOCATIONS := false
 
 ifneq ($(TARGET_ARCH), arm64)
     ifneq ($(TARGET_ARCH), x86_64)
-        LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker
+        LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker
     else
-        LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
+        LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker64
     endif
 else
-    LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
+    LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker64
 endif
 
 include $(BUILD_EXECUTABLE)
diff --git a/bmlutils/bmlutils.c b/bmlutils/bmlutils.c
old mode 100644
new mode 100755
index b5da078..382c0a5
--- a/bmlutils/bmlutils.c
+++ b/bmlutils/bmlutils.c
@@ -180,14 +180,14 @@
     // dump 10KB of zeros to partition before format due to fat.format bug
     char cmd[PATH_MAX];
 
-    sprintf(cmd, "/sbin/dd if=/dev/zero of=%s bs=4096 count=10", device);
+    sprintf(cmd, "/system/bin/dd if=/dev/zero of=%s bs=4096 count=10", device);
     if(__system(cmd)) {
         printf("failure while zeroing rfs partition.\n");
         return -1;
     }
 
     // Run fat.format
-    sprintf(cmd, "/sbin/fat.format -F %s -S 4096 -s %s %s", fatsize, sectorsize, device);
+    sprintf(cmd, "/system/bin/fat.format -F %s -S 4096 -s %s %s", fatsize, sectorsize, device);
     if(__system(cmd)) {
         printf("failure while running fat.format\n");
         return -1;
diff --git a/crypto/ext4crypt/Android.mk b/crypto/ext4crypt/Android.mk
index 955bd3b..8b1372b 100755
--- a/crypto/ext4crypt/Android.mk
+++ b/crypto/ext4crypt/Android.mk
@@ -75,10 +75,9 @@
 LOCAL_MODULE := twrpfbe
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_SRC_FILES := main.cpp
 LOCAL_SHARED_LIBRARIES := libe4crypt
-#LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
 
 include $(BUILD_EXECUTABLE)
 
@@ -86,10 +85,10 @@
 LOCAL_MODULE := e4policyget
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_SRC_FILES := e4policyget.cpp
 LOCAL_SHARED_LIBRARIES := libe4crypt
-LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
+LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker64
 
 include $(BUILD_EXECUTABLE)
 
@@ -97,7 +96,7 @@
 LOCAL_MODULE := keystore_auth
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_SRC_FILES := keystore_auth.cpp
 LOCAL_SHARED_LIBRARIES := libc libkeystore_binder libutils libbinder liblog
 ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
@@ -105,7 +104,7 @@
     LOCAL_CFLAGS += -DUSE_SECURITY_NAMESPACE
     LOCAL_SHARED_LIBRARIES += libkeystore_aidl
 endif
-LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
+LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker64
 
 include $(BUILD_EXECUTABLE)
 
diff --git a/crypto/ext4crypt/Decrypt.cpp b/crypto/ext4crypt/Decrypt.cpp
index dcd390f..85d14ea 100755
--- a/crypto/ext4crypt/Decrypt.cpp
+++ b/crypto/ext4crypt/Decrypt.cpp
@@ -659,7 +659,7 @@
 			if (auth_wait_count == 0 || access("/auth_error", F_OK) == 0) {
 				printf("error during keymaster_auth service\n");
 				/* If you are getting this error, make sure that you have the keymaster_auth service defined in your init scripts, preferrably in init.recovery.{ro.hardware}.rc
-				 * service keystore_auth /sbin/keystore_auth
+				 * service keystore_auth /system/bin/keystore_auth
 				 *     disabled
 				 *     oneshot
 				 *     user system
@@ -804,7 +804,7 @@
 			if (auth_wait_count == 0 || access("/auth_error", F_OK) == 0) {
 				printf("error during keymaster_auth service\n");
 				/* If you are getting this error, make sure that you have the keymaster_auth service defined in your init scripts, preferrably in init.recovery.{ro.hardware}.rc
-				 * service keystore_auth /sbin/keystore_auth
+				 * service keystore_auth /system/bin/keystore_auth
 				 *     disabled
 				 *     oneshot
 				 *     user system
diff --git a/crypto/fde/Android.mk b/crypto/fde/Android.mk
index 4fd8b0b..f78697f 100755
--- a/crypto/fde/Android.mk
+++ b/crypto/fde/Android.mk
@@ -65,7 +65,7 @@
 LOCAL_MODULE := twrpdec
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_SRC_FILES := main.cpp cryptfs.cpp
 LOCAL_SHARED_LIBRARIES := libcrypto libhardware libcutils libc libstdc++
 LOCAL_C_INCLUDES := external/openssl/include $(commands_recovery_local_path)/crypto/scrypt/lib/crypto
diff --git a/crypto/fscrypt/Android.mk b/crypto/fscrypt/Android.mk
index 8000d5e..0fa36c8 100755
--- a/crypto/fscrypt/Android.mk
+++ b/crypto/fscrypt/Android.mk
@@ -49,7 +49,7 @@
 LOCAL_MODULE := twrpfbe
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := main.cpp
 LOCAL_SHARED_LIBRARIES := libtwrpfscrypt
 
@@ -59,10 +59,9 @@
 LOCAL_MODULE := fscryptpolicyget
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := fscryptpolicyget.cpp
 LOCAL_SHARED_LIBRARIES := libtwrpfscrypt
-LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
 
 include $(BUILD_EXECUTABLE)
 
@@ -70,12 +69,11 @@
 LOCAL_MODULE := keystore_auth
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := keystore_auth.cpp
 LOCAL_SHARED_LIBRARIES := libc libkeystore_binder libutils libbinder liblog
 LOCAL_CFLAGS += -DUSE_SECURITY_NAMESPACE
 LOCAL_SHARED_LIBRARIES += libkeystore_aidl
-LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
 
 include $(BUILD_EXECUTABLE)
 
diff --git a/crypto/fscrypt/Decrypt.cpp b/crypto/fscrypt/Decrypt.cpp
index b1a43c9..bd3d067 100755
--- a/crypto/fscrypt/Decrypt.cpp
+++ b/crypto/fscrypt/Decrypt.cpp
@@ -629,7 +629,7 @@
 			if (auth_wait_count == 0 || access("/auth_error", F_OK) == 0) {
 				printf("error during keymaster_auth service\n");
 				/* If you are getting this error, make sure that you have the keymaster_auth service defined in your init scripts, preferrably in init.recovery.{ro.hardware}.rc
-				 * service keystore_auth /sbin/keystore_auth
+				 * service keystore_auth /system/bin/keystore_auth
 				 *     disabled
 				 *     oneshot
 				 *     user system
diff --git a/crypto/fscrypt/FsCrypt.cpp b/crypto/fscrypt/FsCrypt.cpp
index 397f131..5d68fce 100755
--- a/crypto/fscrypt/FsCrypt.cpp
+++ b/crypto/fscrypt/FsCrypt.cpp
@@ -89,7 +89,7 @@
 
 const std::string user_key_dir = std::string() + DATA_MNT_POINT + "/misc/vold/user_keys";
 const std::string user_key_temp = user_key_dir + "/temp";
-const std::string prepare_subdirs_path = "/sbin/vold_prepare_subdirs";
+const std::string prepare_subdirs_path = "/system/bin/vold_prepare_subdirs";
 
 const std::string systemwide_volume_key_dir =
     std::string() + DATA_MNT_POINT + "/misc/vold/volume_keys";
diff --git a/crypto/vold_decrypt/Android.mk b/crypto/vold_decrypt/Android.mk
old mode 100644
new mode 100755
index 25d6ab0..a36abf4
--- a/crypto/vold_decrypt/Android.mk
+++ b/crypto/vold_decrypt/Android.mk
@@ -128,7 +128,7 @@
             LOCAL_SRC_FILES := vdc_pie.cpp
             LOCAL_MODULE_TAGS := optional
             LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-            LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+            LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
             LOCAL_CLANG := true
             LOCAL_TIDY := true
             LOCAL_TIDY_FLAGS := -warnings-as-errors=clang-analyzer-security*,cert-*
@@ -141,12 +141,12 @@
             endif
             ifneq ($(TARGET_ARCH), arm64)
                 ifneq ($(TARGET_ARCH), x86_64)
-                    LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker
+                    LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker
                 else
-                    LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
+                    LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker64
                 endif
             else
-                LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
+                LOCAL_LDFLAGS += -Wl,-dynamic-linker,/system/bin/linker64
             endif
 
             include $(BUILD_EXECUTABLE)
diff --git a/crypto/vold_decrypt/vold_decrypt.cpp b/crypto/vold_decrypt/vold_decrypt.cpp
index 078cd5f..4a76405 100755
--- a/crypto/vold_decrypt/vold_decrypt.cpp
+++ b/crypto/vold_decrypt/vold_decrypt.cpp
@@ -81,7 +81,7 @@
 #ifdef TW_CRYPTO_SYSTEM_VOLD_DEBUG
 
 #ifndef VD_STRACE_BIN
-#define VD_STRACE_BIN "/sbin/strace"
+#define VD_STRACE_BIN "/system/bin/strace"
 #endif
 
 bool has_strace = false;
@@ -399,7 +399,7 @@
 	LOGINFO("%d file(s) symlinked.\n", (int)FirmwareFiles.size());
 }
 
-// Android 8.0 fs_mgr checks for "/sbin/recovery", in which case it will
+// Android 8.0 fs_mgr checks for "/system/bin/recovery", in which case it will
 // use /etc/recovery.fstab -> symlink it temporarily. Reference:
 // https://android.googlesource.com/platform/system/core/+/android-8.0.0_r17/fs_mgr/fs_mgr_fstab.cpp#693
 bool Symlink_Recovery_Fstab(void) {
@@ -716,8 +716,8 @@
 
 					if (Service_Exists(services[j].Service_Name))
 						services[j].TWRP_Service_Name = services[j].Service_Name;
-					else if (Service_Exists("sbin" + services[j].Service_Name))
-						services[j].TWRP_Service_Name = "sbin" + services[j].Service_Name;
+					else if (Service_Exists("system/bin" + services[j].Service_Name))
+						services[j].TWRP_Service_Name = "system/bin" + services[j].Service_Name;
 					else
 						services[j].TWRP_Service_Name.clear();
 
@@ -995,7 +995,7 @@
 	}
 
 	// getpwtype and checkpw commands are removed from Pie vdc, using modified vdc_pie
-	const char *cmd[] = { "/sbin/vdc_pie", "cryptfs" };
+	const char *cmd[] = { "/system/bin/vdc_pie", "cryptfs" };
 	if (sdkver < 28)
 		cmd[0] = "/system/bin/vdc";
 	const char *env[] = { "LD_LIBRARY_PATH=/system/lib64:/system/lib", NULL };
diff --git a/data.cpp b/data.cpp
index b5b7c9e..a13fbe7 100755
--- a/data.cpp
+++ b/data.cpp
@@ -917,7 +917,7 @@
 
 	mData.SetValue("tw_enable_adb_backup", "0");
 
-	if (TWFunc::Path_Exists("/sbin/magiskboot"))
+	if (TWFunc::Path_Exists("/system/bin/magiskboot"))
 		mConst.SetValue("tw_has_repack_tools", "1");
 	else
 		mConst.SetValue("tw_has_repack_tools", "0");
diff --git a/dosfstools/Android.mk b/dosfstools/Android.mk
old mode 100644
new mode 100755
index 7b6d623..d4b85a0
--- a/dosfstools/Android.mk
+++ b/dosfstools/Android.mk
@@ -19,7 +19,7 @@
 LOCAL_MODULE = fsck.fat
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 include $(BUILD_EXECUTABLE)
 
 include $(CLEAR_VARS)
@@ -40,7 +40,7 @@
 LOCAL_MODULE = fatlabel
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 include $(BUILD_EXECUTABLE)
 
 include $(CLEAR_VARS)
@@ -52,7 +52,7 @@
 LOCAL_MODULE = mkfs.fat
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 include $(BUILD_EXECUTABLE)
 
 endif
diff --git a/etc/Android.mk b/etc/Android.mk
old mode 100644
new mode 100755
index 5f66906..cb31a68
--- a/etc/Android.mk
+++ b/etc/Android.mk
@@ -31,54 +31,32 @@
 
 endif
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 22; echo $$?),0)
-    include $(CLEAR_VARS)
-    LOCAL_MODULE := init.recovery.service.rc
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-    LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
+include $(CLEAR_VARS)
+LOCAL_MODULE := init.recovery.service.rc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
 
-    LOCAL_SRC_FILES := init.recovery.service22.rc
-    include $(BUILD_PREBUILT)
-else
-    include $(CLEAR_VARS)
-    LOCAL_MODULE := init.recovery.service.rc
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-    LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
+LOCAL_SRC_FILES := init.recovery.service22.rc
+include $(BUILD_PREBUILT)
 
-    LOCAL_SRC_FILES := init.recovery.service21.rc
-    include $(BUILD_PREBUILT)
-endif
+include $(CLEAR_VARS)
+LOCAL_MODULE := init.recovery.hlthchrg.rc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0)
-    include $(CLEAR_VARS)
-    LOCAL_MODULE := init.recovery.hlthchrg.rc
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-    LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
+LOCAL_SRC_FILES := init.recovery.hlthchrg26.rc
+include $(BUILD_PREBUILT)
 
-    LOCAL_SRC_FILES := init.recovery.hlthchrg26.rc
-    include $(BUILD_PREBUILT)
+include $(CLEAR_VARS)
+LOCAL_MODULE := init.recovery.ldconfig.rc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
 
-    include $(CLEAR_VARS)
-    LOCAL_MODULE := init.recovery.ldconfig.rc
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-    LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
-
-    LOCAL_SRC_FILES := init.recovery.ldconfig.rc
-    include $(BUILD_PREBUILT)
-else
-    include $(CLEAR_VARS)
-    LOCAL_MODULE := init.recovery.hlthchrg.rc
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-    LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
-
-    LOCAL_SRC_FILES := init.recovery.hlthchrg25.rc
-    include $(BUILD_PREBUILT)
-endif
+LOCAL_SRC_FILES := init.recovery.ldconfig.rc
+include $(BUILD_PREBUILT)
 
 ifeq ($(TWRP_INCLUDE_LOGCAT), true)
     ifeq ($(TARGET_USES_LOGD), true)
diff --git a/etc/init.rc b/etc/init.rc
index 73b88d2..81a1974 100644
--- a/etc/init.rc
+++ b/etc/init.rc
@@ -17,7 +17,7 @@
 
 on init
     export PATH /sbin:/system/bin
-    export LD_LIBRARY_PATH /sbin
+    export LD_LIBRARY_PATH /system/lib64
 
     export ANDROID_ROOT /system
     export ANDROID_DATA /data
@@ -103,11 +103,11 @@
 on property:sys.powerctl=*
    powerctl ${sys.powerctl}
 
-service ueventd /sbin/ueventd
+service ueventd /system/bin/ueventd
     critical
     seclabel u:r:ueventd:s0
 
-service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
+service adbd /system/bin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
     disabled
     socket adbd stream 660 system system
     seclabel u:r:adbd:s0
@@ -118,7 +118,7 @@
     #start adbd
     setprop service.adb.root 1
 
-service fastbootd /sbin/fastbootd
+service fastbootd /system/bin/fastbootd
     disabled
     group system
     seclabel u:r:fastbootd:s0
diff --git a/etc/init.recovery.hlthchrg25.rc b/etc/init.recovery.hlthchrg25.rc
old mode 100644
new mode 100755
index 62b2489..99a8baa
--- a/etc/init.recovery.hlthchrg25.rc
+++ b/etc/init.recovery.hlthchrg25.rc
@@ -1,5 +1,5 @@
 # healthd for pre Android 8.0
 
-service healthd /sbin/healthd -r
+service healthd /system/bin/healthd -r
     critical
     seclabel u:r:healthd:s0
diff --git a/etc/init.recovery.ldconfig.rc b/etc/init.recovery.ldconfig.rc
index ad9c296..c99f802 100755
--- a/etc/init.recovery.ldconfig.rc
+++ b/etc/init.recovery.ldconfig.rc
@@ -1,2 +1,2 @@
 on fs
-    export LD_CONFIG_FILE /sbin/ld.config.txt
+    export LD_CONFIG_FILE /system/etc/ld.config.txt
diff --git a/etc/init.recovery.logd.rc b/etc/init.recovery.logd.rc
index 364fd82..42537c7 100644
--- a/etc/init.recovery.logd.rc
+++ b/etc/init.recovery.logd.rc
@@ -1,4 +1,4 @@
-service logd /sbin/logd
+service logd /system/bin/logd
     class core
     socket logdr seqpacket 0666 root root
     socket logdw dgram+passcred 0222 root root
diff --git a/etc/init.recovery.service21.rc b/etc/init.recovery.service21.rc
deleted file mode 100644
index 892b226..0000000
--- a/etc/init.recovery.service21.rc
+++ /dev/null
@@ -1,4 +0,0 @@
-on boot
-
-# For starting recovery on 4.4 and older
-service recovery /sbin/recovery
diff --git a/etc/init.recovery.service22.rc b/etc/init.recovery.service22.rc
index 438bb3b..d9f661d 100755
--- a/etc/init.recovery.service22.rc
+++ b/etc/init.recovery.service22.rc
@@ -1,7 +1,7 @@
 on boot
 
 # For starting recovery on 5.0 and newer
-service recovery /sbin/recovery
+service recovery /system/bin/recovery
     seclabel u:r:recovery:s0
 
 on early-init
diff --git a/etc/init28.rc b/etc/init28.rc
deleted file mode 100755
index 0b2a4ef..0000000
--- a/etc/init28.rc
+++ /dev/null
@@ -1,225 +0,0 @@
-import /init.recovery.logd.rc
-import /init.recovery.ldconfig.rc
-import /init.recovery.mksh.rc
-import /init.recovery.usb.rc
-import /init.recovery.service.rc
-import /init.recovery.vold_decrypt.rc
-import /init.recovery.${ro.hardware}.rc
-
-on early-init
-    # Apply strict SELinux checking of PROT_EXEC on mmap/mprotect calls.
-    write /sys/fs/selinux/checkreqprot 0
-
-    # Set the security context for the init process.
-    # This should occur before anything else (e.g. ueventd) is started.
-    setcon u:r:init:s0
-
-    # Set the security context of /postinstall if present.
-    restorecon /postinstall
-
-    start ueventd
-
-service set_permissive /sbin/permissive.sh
-    oneshot
-    seclabel u:r:recovery:s0
-
-on init
-    export PATH /sbin:/system/bin
-    export LD_LIBRARY_PATH /sbin
-
-    export ANDROID_ROOT /system
-    export ANDROID_DATA /data
-    export EXTERNAL_STORAGE /sdcard
-
-    symlink /proc/self/fd/0 /dev/stdin
-    symlink /proc/self/fd/1 /dev/stdout
-    symlink /proc/self/fd/2 /dev/stderr
-
-    symlink /system/bin /bin
-    symlink /system/etc /etc
-
-    mount cgroup none /acct cpuacct
-    mkdir /acct/uid
-
-    mkdir /system
-    mkdir /data
-    mkdir /cache
-    mkdir /sideload
-    mkdir /mnt/system
-    mount tmpfs tmpfs /tmp
-
-    chown root shell /tmp
-    chmod 0775 /tmp
-
-    write /proc/sys/kernel/panic_on_oops 1
-    write /proc/sys/vm/max_map_count 1000000
-
-on fs
-    mount pstore pstore /sys/fs/pstore
-    mkdir /dev/usb-ffs 0770 shell shell
-    mkdir /dev/usb-ffs/adb 0770 shell shell
-    mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000
-
-on boot
-    ifup lo
-    hostname localhost
-    domainname localdomain
-
-    class_start default
-
-# Load properties, pre-Android 6.0
-on load_all_props_action
-    load_all_props
-
-# Load properties, Android 6.0+
-on load_system_props_action
-    load_system_props
-
-# Load properties, Android 6.0+, vendor init lives here
-on load_persist_props_action
-    load_persist_props
-
-on firmware_mounts_complete
-    rm /dev/.booting
-
-# Mount filesystems and start core system services.
-on late-init
-    trigger early-fs
-    trigger fs
-    trigger post-fs
-    trigger post-fs-data
-
-    # Load properties, pre-Android 6.0
-    trigger load_all_props_action
-
-    # Load properties from /system/ + /factory after fs mount. Place
-    # this in another action so that the load will be scheduled after the prior
-    # issued fs triggers have completed.
-    trigger load_system_props_action
-
-    # Load properties, Android 6.0+, vendor init lives here
-    trigger load_persist_props_action
-
-    # Remove a file to wake up anything waiting for firmware
-    trigger firmware_mounts_complete
-
-    trigger early-boot
-    trigger boot
-
-on property:sys.powerctl=*
-   powerctl ${sys.powerctl}
-
-service ueventd /sbin/ueventd
-    critical
-    seclabel u:r:ueventd:s0
-
-service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
-    disabled
-    socket adbd stream 660 system system
-    seclabel u:r:adbd:s0
-
-# Always start adbd on userdebug and eng builds
-on property:ro.debuggable=1
-    #write /sys/class/android_usb/android0/enable 1
-    #start adbd
-    setprop service.adb.root 1
-
-service fastbootd /sbin/fastbootd
-    disabled
-    group system
-    seclabel u:r:fastbootd:s0
-
-# Restart adbd so it can run as root
-on property:service.adb.root=1
-    restart adbd
-
-# Always start adbd on userdebug and eng builds
-on fs && property:ro.debuggable=1
-    setprop sys.usb.config adb
-
-on fs && property:sys.usb.configfs=1
-    mount configfs none /config
-    mkdir /config/usb_gadget/g1 0770 shell shell
-    write /config/usb_gadget/g1/idVendor 0x18D1
-    mkdir /config/usb_gadget/g1/strings/0x409 0770
-    write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
-    write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
-    write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}
-    mkdir /config/usb_gadget/g1/functions/ffs.adb
-    mkdir /config/usb_gadget/g1/functions/ffs.fastboot
-    mkdir /config/usb_gadget/g1/configs/b.1 0777 shell shell
-    mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell
-
-on fs && property:sys.usb.configfs=0
-    write /sys/class/android_usb/android0/f_ffs/aliases adb,fastboot
-    write /sys/class/android_usb/android0/idVendor 18D1
-    write /sys/class/android_usb/android0/iManufacturer ${ro.product.manufacturer}
-    write /sys/class/android_usb/android0/iProduct ${ro.product.model}
-    write /sys/class/android_usb/android0/iSerial ${ro.serialno}
-
-on fs
-    mkdir /dev/usb-ffs 0775 shell shell
-    mkdir /dev/usb-ffs/adb 0770 shell shell
-    mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000
-    mkdir /dev/usb-ffs/fastboot 0770 system system
-    mount functionfs fastboot /dev/usb-ffs/fastboot rmode=0770,fmode=0660,uid=1000,gid=1000
-
-on property:sys.usb.config=adb
-    start adbd
-
-on property:sys.usb.config=fastboot
-    start fastbootd
-
-on property:sys.usb.config=none && property:sys.usb.configfs=0
-    stop adbd
-    stop fastboot
-    write /sys/class/android_usb/android0/enable 0
-    setprop sys.usb.state ${sys.usb.config}
-
-on property:sys.usb.config=adb && property:sys.usb.configfs=0
-    write /sys/class/android_usb/android0/idProduct D001
-    write /sys/class/android_usb/android0/functions adb
-    write /sys/class/android_usb/android0/enable 1
-    setprop sys.usb.state ${sys.usb.config}
-
-on property:sys.usb.config=sideload && property:sys.usb.configfs=0
-    write /sys/class/android_usb/android0/idProduct D001
-    write /sys/class/android_usb/android0/functions adb
-    write /sys/class/android_usb/android0/enable 1
-    setprop sys.usb.state ${sys.usb.config}
-
-on property:sys.usb.config=fastboot && property:sys.usb.configfs=0
-    write /sys/class/android_usb/android0/idProduct 4EE0
-    write /sys/class/android_usb/android0/functions fastboot
-    write /sys/class/android_usb/android0/enable 1
-    setprop sys.usb.state ${sys.usb.config}
-
-# Configfs triggers
-on property:sys.usb.config=none && property:sys.usb.configfs=1
-    write /config/usb_gadget/g1/UDC "none"
-    stop adbd
-    stop fastbootd
-    setprop sys.usb.ffs.ready 0
-    rm /config/usb_gadget/g1/configs/b.1/f1
-    setprop sys.usb.state ${sys.usb.config}
-
-on property:sys.usb.config=sideload && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1
-    write /config/usb_gadget/g1/idProduct 0xD001
-    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb"
-    symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1
-    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
-    setprop sys.usb.state ${sys.usb.config}
-
-on property:sys.usb.config=adb && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1
-    write /config/usb_gadget/g1/idProduct 0xD001
-    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb"
-    symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1
-    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
-    setprop sys.usb.state ${sys.usb.config}
-
-on property:sys.usb.config=fastboot && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1
-    write /config/usb_gadget/g1/idProduct 0x4EE0
-    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "fastboot"
-    symlink /config/usb_gadget/g1/functions/ffs.fastboot /config/usb_gadget/g1/configs/b.1/f1
-    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
-    setprop sys.usb.state ${sys.usb.config}
diff --git a/exfat/fsck/Android.mk b/exfat/fsck/Android.mk
old mode 100644
new mode 100755
index 64ebc0f..085dda4
--- a/exfat/fsck/Android.mk
+++ b/exfat/fsck/Android.mk
@@ -5,7 +5,7 @@
 LOCAL_MODULE_STEM := fsck.exfat
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
 LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_CFLAGS = -D_FILE_OFFSET_BITS=64 -Wno-sign-compare
 LOCAL_SRC_FILES =  main.c
 LOCAL_C_INCLUDES += $(LOCAL_PATH) \
diff --git a/exfat/fuse/Android.mk b/exfat/fuse/Android.mk
old mode 100644
new mode 100755
index 57f35be..b0cca7d
--- a/exfat/fuse/Android.mk
+++ b/exfat/fuse/Android.mk
@@ -4,7 +4,7 @@
 LOCAL_MODULE := exfat-fuse
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
 LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_CFLAGS = -D_FILE_OFFSET_BITS=64 -Wno-sign-compare -Wno-unused-parameter
 LOCAL_SRC_FILES = main.c 
 LOCAL_C_INCLUDES += $(LOCAL_PATH) \
diff --git a/exfat/mkfs/Android.mk b/exfat/mkfs/Android.mk
old mode 100644
new mode 100755
index 9f3e7cb..e1158f2
--- a/exfat/mkfs/Android.mk
+++ b/exfat/mkfs/Android.mk
@@ -4,7 +4,7 @@
 LOCAL_MODULE := mkexfatfs
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
 LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_CFLAGS = -D_FILE_OFFSET_BITS=64 -Wno-sign-compare
 LOCAL_SRC_FILES = cbm.c fat.c main.c mkexfat.c rootdir.c uct.c uctc.c vbr.c
 LOCAL_C_INCLUDES += $(LOCAL_PATH) \
diff --git a/flashutils/Android.mk b/flashutils/Android.mk
old mode 100644
new mode 100755
index 1c5872e..0a04509
--- a/flashutils/Android.mk
+++ b/flashutils/Android.mk
@@ -99,7 +99,7 @@
 LOCAL_MODULE := flash_image
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := flash_image.c
 LOCAL_SHARED_LIBRARIES := libmtdutils libflashutils libmmcutils libbmlutils libcutils libc
 include $(BUILD_EXECUTABLE)
@@ -108,7 +108,7 @@
 LOCAL_MODULE := dump_image
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := dump_image.c
 LOCAL_SHARED_LIBRARIES := libmtdutils libflashutils libmmcutils libbmlutils libcutils libc
 include $(BUILD_EXECUTABLE)
@@ -117,7 +117,7 @@
 LOCAL_MODULE := erase_image
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := erase_image.c
 LOCAL_SHARED_LIBRARIES := libmtdutils libflashutils libmmcutils libbmlutils libcutils libc
 include $(BUILD_EXECUTABLE)
diff --git a/fuse_sideload22.cpp b/fuse_sideload22.cpp
deleted file mode 100644
index f57d479..0000000
--- a/fuse_sideload22.cpp
+++ /dev/null
@@ -1,544 +0,0 @@
-/*
- * Copyright (C) 2014 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 module creates a special filesystem containing two files.
-//
-// "/sideload/package.zip" appears to be a normal file, but reading
-// from it causes data to be fetched from the adb host.  We can use
-// this to sideload packages over an adb connection without having to
-// store the entire package in RAM on the device.
-//
-// Because we may not trust the adb host, this filesystem maintains
-// the following invariant: each read of a given position returns the
-// same data as the first read at that position.  That is, once a
-// section of the file is read, future reads of that section return
-// the same data.  (Otherwise, a malicious adb host process could
-// return one set of bits when the package is read for signature
-// verification, and then different bits for when the package is
-// accessed by the installer.)  If the adb host returns something
-// different than it did on the first read, the reader of the file
-// will see their read fail with EINVAL.
-//
-// The other file, "/sideload/exit", is used to control the subprocess
-// that creates this filesystem.  Calling stat() on the exit file
-// causes the filesystem to be unmounted and the adb process on the
-// device shut down.
-//
-// Note that only the minimal set of file operations needed for these
-// two files is implemented.  In particular, you can't opendir() or
-// readdir() on the "/sideload" directory; ls on it won't work.
-
-#include <ctype.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include "fuse.h"
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/inotify.h>
-#include <sys/mount.h>
-#include <sys/param.h>
-#include <sys/resource.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <sys/time.h>
-#include <sys/uio.h>
-#include <unistd.h>
-
-#ifdef USE_MINCRYPT
-#include "mincrypt/sha256.h"
-#define  SHA256_DIGEST_LENGTH SHA256_DIGEST_SIZE
-#else
-#include <openssl/sha.h>
-#endif
-
-#include "fuse_sideload.h"
-
-#define PACKAGE_FILE_ID   (FUSE_ROOT_ID+1)
-#define EXIT_FLAG_ID      (FUSE_ROOT_ID+2)
-
-#define NO_STATUS         1
-#define NO_STATUS_EXIT    2
-
-#ifndef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
-struct fuse_data {
-    int ffd;   // file descriptor for the fuse socket
-
-    struct provider_vtab* vtab;
-    void* cookie;
-
-    uint64_t file_size;     // bytes
-
-    uint32_t block_size;    // block size that the adb host is using to send the file to us
-    uint32_t file_blocks;   // file size in block_size blocks
-
-    uid_t uid;
-    gid_t gid;
-
-    uint32_t curr_block;    // cache the block most recently read from the host
-    uint8_t* block_data;
-
-    uint8_t* extra_block;   // another block of storage for reads that
-                            // span two blocks
-
-    uint8_t* hashes;        // SHA-256 hash of each block (all zeros
-                            // if block hasn't been read yet)
-};
-
-static void fuse_reply(struct fuse_data* fd, __u64 unique, const void *data, size_t len)
-{
-    struct fuse_out_header hdr;
-    struct iovec vec[2];
-    int res;
-
-    hdr.len = len + sizeof(hdr);
-    hdr.error = 0;
-    hdr.unique = unique;
-
-    vec[0].iov_base = &hdr;
-    vec[0].iov_len = sizeof(hdr);
-    vec[1].iov_base = /* const_cast */(void*)(data);
-    vec[1].iov_len = len;
-
-    res = writev(fd->ffd, vec, 2);
-    if (res < 0) {
-        printf("*** REPLY FAILED *** %s\n", strerror(errno));
-    }
-}
-
-static int handle_init(void* data, struct fuse_data* fd, const struct fuse_in_header* hdr) {
-    const struct fuse_init_in* req = reinterpret_cast<const struct fuse_init_in*>(data);
-    struct fuse_init_out out;
-    size_t fuse_struct_size;
-
-
-    /* Kernel 2.6.16 is the first stable kernel with struct fuse_init_out
-     * defined (fuse version 7.6). The structure is the same from 7.6 through
-     * 7.22. Beginning with 7.23, the structure increased in size and added
-     * new parameters.
-     */
-    if (req->major != FUSE_KERNEL_VERSION || req->minor < 6) {
-        printf("Fuse kernel version mismatch: Kernel version %d.%d, Expected at least %d.6",
-               req->major, req->minor, FUSE_KERNEL_VERSION);
-        return -1;
-    }
-
-    out.minor = MIN(req->minor, FUSE_KERNEL_MINOR_VERSION);
-    fuse_struct_size = sizeof(out);
-#if defined(FUSE_COMPAT_22_INIT_OUT_SIZE)
-    /* FUSE_KERNEL_VERSION >= 23. */
-
-    /* If the kernel only works on minor revs older than or equal to 22,
-     * then use the older structure size since this code only uses the 7.22
-     * version of the structure. */
-    if (req->minor <= 22) {
-        fuse_struct_size = FUSE_COMPAT_22_INIT_OUT_SIZE;
-    }
-#endif
-
-    out.major = FUSE_KERNEL_VERSION;
-    out.max_readahead = req->max_readahead;
-    out.flags = 0;
-    out.max_background = 32;
-    out.congestion_threshold = 32;
-    out.max_write = 4096;
-    fuse_reply(fd, hdr->unique, &out, fuse_struct_size);
-
-    return NO_STATUS;
-}
-
-static void fill_attr(struct fuse_attr* attr, struct fuse_data* fd,
-                      uint64_t nodeid, uint64_t size, uint32_t mode) {
-    memset(attr, 0, sizeof(*attr));
-    attr->nlink = 1;
-    attr->uid = fd->uid;
-    attr->gid = fd->gid;
-    attr->blksize = 4096;
-
-    attr->ino = nodeid;
-    attr->size = size;
-    attr->blocks = (size == 0) ? 0 : (((size-1) / attr->blksize) + 1);
-    attr->mode = mode;
-}
-
-static int handle_getattr(void* /* data */, struct fuse_data* fd, const struct fuse_in_header* hdr) {
-    struct fuse_attr_out out;
-    memset(&out, 0, sizeof(out));
-    out.attr_valid = 10;
-
-    if (hdr->nodeid == FUSE_ROOT_ID) {
-        fill_attr(&(out.attr), fd, hdr->nodeid, 4096, S_IFDIR | 0555);
-    } else if (hdr->nodeid == PACKAGE_FILE_ID) {
-        fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444);
-    } else if (hdr->nodeid == EXIT_FLAG_ID) {
-        fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0);
-    } else {
-        return -ENOENT;
-    }
-
-    fuse_reply(fd, hdr->unique, &out, sizeof(out));
-    return (hdr->nodeid == EXIT_FLAG_ID) ? NO_STATUS_EXIT : NO_STATUS;
-}
-
-static int handle_lookup(void* data, struct fuse_data* fd,
-                         const struct fuse_in_header* hdr) {
-    struct fuse_entry_out out;
-    memset(&out, 0, sizeof(out));
-    out.entry_valid = 10;
-    out.attr_valid = 10;
-
-    if (strncmp(FUSE_SIDELOAD_HOST_FILENAME, reinterpret_cast<const char*>(data),
-                sizeof(FUSE_SIDELOAD_HOST_FILENAME)) == 0) {
-        out.nodeid = PACKAGE_FILE_ID;
-        out.generation = PACKAGE_FILE_ID;
-        fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444);
-    } else if (strncmp(FUSE_SIDELOAD_HOST_EXIT_FLAG, reinterpret_cast<const char*>(data),
-                       sizeof(FUSE_SIDELOAD_HOST_EXIT_FLAG)) == 0) {
-        out.nodeid = EXIT_FLAG_ID;
-        out.generation = EXIT_FLAG_ID;
-        fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0);
-    } else {
-        return -ENOENT;
-    }
-
-    fuse_reply(fd, hdr->unique, &out, sizeof(out));
-    return (out.nodeid == EXIT_FLAG_ID) ? NO_STATUS_EXIT : NO_STATUS;
-}
-
-static int handle_open(void* /* data */, struct fuse_data* fd, const struct fuse_in_header* hdr) {
-    if (hdr->nodeid == EXIT_FLAG_ID) return -EPERM;
-    if (hdr->nodeid != PACKAGE_FILE_ID) return -ENOENT;
-
-    struct fuse_open_out out;
-    memset(&out, 0, sizeof(out));
-    out.fh = 10;  // an arbitrary number; we always use the same handle
-    fuse_reply(fd, hdr->unique, &out, sizeof(out));
-    return NO_STATUS;
-}
-
-static int handle_flush(void* data, struct fuse_data* fd, const struct fuse_in_header* hdr) {
-    return 0;
-}
-
-static int handle_release(void* data, struct fuse_data* fd, const struct fuse_in_header* hdr) {
-    return 0;
-}
-
-// Fetch a block from the host into fd->curr_block and fd->block_data.
-// Returns 0 on successful fetch, negative otherwise.
-static int fetch_block(struct fuse_data* fd, uint32_t block) {
-    if (block == fd->curr_block) {
-        return 0;
-    }
-
-    if (block >= fd->file_blocks) {
-        memset(fd->block_data, 0, fd->block_size);
-        fd->curr_block = block;
-        return 0;
-    }
-
-    size_t fetch_size = fd->block_size;
-    if (block * fd->block_size + fetch_size > fd->file_size) {
-        // If we're reading the last (partial) block of the file,
-        // expect a shorter response from the host, and pad the rest
-        // of the block with zeroes.
-        fetch_size = fd->file_size - (block * fd->block_size);
-        memset(fd->block_data + fetch_size, 0, fd->block_size - fetch_size);
-    }
-
-    int result = fd->vtab->read_block(fd->cookie, block, fd->block_data, fetch_size);
-    if (result < 0) return result;
-
-    fd->curr_block = block;
-
-    // Verify the hash of the block we just got from the host.
-    //
-    // - If the hash of the just-received data matches the stored hash
-    //   for the block, accept it.
-    // - If the stored hash is all zeroes, store the new hash and
-    //   accept the block (this is the first time we've read this
-    //   block).
-    // - Otherwise, return -EINVAL for the read.
-
-    uint8_t hash[SHA256_DIGEST_LENGTH];
-#ifdef USE_MINCRYPT
-    SHA256_hash(fd->block_data, fd->block_size, hash);
-#else
-    SHA256(fd->block_data, fd->block_size, hash);
-#endif
-    uint8_t* blockhash = fd->hashes + block * SHA256_DIGEST_LENGTH;
-    if (memcmp(hash, blockhash, SHA256_DIGEST_LENGTH) == 0) {
-        return 0;
-    }
-
-    int i;
-    for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
-        if (blockhash[i] != 0) {
-            fd->curr_block = -1;
-            return -EIO;
-        }
-    }
-
-    memcpy(blockhash, hash, SHA256_DIGEST_LENGTH);
-    return 0;
-}
-
-static int handle_read(void* data, struct fuse_data* fd, const struct fuse_in_header* hdr) {
-    const struct fuse_read_in* req = reinterpret_cast<const struct fuse_read_in*>(data);
-    struct fuse_out_header outhdr;
-    struct iovec vec[3];
-    int vec_used;
-    int result;
-
-    if (hdr->nodeid != PACKAGE_FILE_ID) return -ENOENT;
-
-    uint64_t offset = req->offset;
-    uint32_t size = req->size;
-
-    // The docs on the fuse kernel interface are vague about what to
-    // do when a read request extends past the end of the file.  We
-    // can return a short read -- the return structure does include a
-    // length field -- but in testing that caused the program using
-    // the file to segfault.  (I speculate that this is due to the
-    // reading program accessing it via mmap; maybe mmap dislikes when
-    // you return something short of a whole page?)  To fix this we
-    // zero-pad reads that extend past the end of the file so we're
-    // always returning exactly as many bytes as were requested.
-    // (Users of the mapped file have to know its real length anyway.)
-
-    outhdr.len = sizeof(outhdr) + size;
-    outhdr.error = 0;
-    outhdr.unique = hdr->unique;
-    vec[0].iov_base = &outhdr;
-    vec[0].iov_len = sizeof(outhdr);
-
-    uint32_t block = offset / fd->block_size;
-    result = fetch_block(fd, block);
-    if (result != 0) return result;
-
-    // Two cases:
-    //
-    //   - the read request is entirely within this block.  In this
-    //     case we can reply immediately.
-    //
-    //   - the read request goes over into the next block.  Note that
-    //     since we mount the filesystem with max_read=block_size, a
-    //     read can never span more than two blocks.  In this case we
-    //     copy the block to extra_block and issue a fetch for the
-    //     following block.
-
-    uint32_t block_offset = offset - (block * fd->block_size);
-
-    if (size + block_offset <= fd->block_size) {
-        // First case: the read fits entirely in the first block.
-
-        vec[1].iov_base = fd->block_data + block_offset;
-        vec[1].iov_len = size;
-        vec_used = 2;
-    } else {
-        // Second case: the read spills over into the next block.
-
-        memcpy(fd->extra_block, fd->block_data + block_offset,
-               fd->block_size - block_offset);
-        vec[1].iov_base = fd->extra_block;
-        vec[1].iov_len = fd->block_size - block_offset;
-
-        result = fetch_block(fd, block+1);
-        if (result != 0) return result;
-        vec[2].iov_base = fd->block_data;
-        vec[2].iov_len = size - vec[1].iov_len;
-        vec_used = 3;
-    }
-
-    if (writev(fd->ffd, vec, vec_used) < 0) {
-        printf("*** READ REPLY FAILED: %s ***\n", strerror(errno));
-    }
-    return NO_STATUS;
-}
-
-int run_fuse_sideload(struct provider_vtab* vtab, void* cookie,
-                      uint64_t file_size, uint32_t block_size)
-{
-    int result;
-
-    // If something's already mounted on our mountpoint, try to remove
-    // it.  (Mostly in case of a previous abnormal exit.)
-    umount2(FUSE_SIDELOAD_HOST_MOUNTPOINT, MNT_FORCE);
-
-    if (block_size < 1024) {
-        fprintf(stderr, "block size (%u) is too small\n", block_size);
-        return -1;
-    }
-    if (block_size > (1<<22)) {   // 4 MiB
-        fprintf(stderr, "block size (%u) is too large\n", block_size);
-        return -1;
-    }
-
-    struct fuse_data fd;
-    memset(&fd, 0, sizeof(fd));
-    fd.vtab = vtab;
-    fd.cookie = cookie;
-    fd.file_size = file_size;
-    fd.block_size = block_size;
-    fd.file_blocks = (file_size == 0) ? 0 : (((file_size-1) / block_size) + 1);
-
-    if (fd.file_blocks > (1<<18)) {
-        fprintf(stderr, "file has too many blocks (%u)\n", fd.file_blocks);
-        result = -1;
-        goto done;
-    }
-
-    fd.hashes = (uint8_t*)calloc(fd.file_blocks, SHA256_DIGEST_LENGTH);
-    if (fd.hashes == NULL) {
-        fprintf(stderr, "failed to allocate %d bites for hashes\n",
-                fd.file_blocks * SHA256_DIGEST_LENGTH);
-        result = -1;
-        goto done;
-    }
-
-    fd.uid = getuid();
-    fd.gid = getgid();
-
-    fd.curr_block = -1;
-    fd.block_data = (uint8_t*)malloc(block_size);
-    if (fd.block_data == NULL) {
-        fprintf(stderr, "failed to allocate %d bites for block_data\n", block_size);
-        result = -1;
-        goto done;
-    }
-    fd.extra_block = (uint8_t*)malloc(block_size);
-    if (fd.extra_block == NULL) {
-        fprintf(stderr, "failed to allocate %d bites for extra_block\n", block_size);
-        result = -1;
-        goto done;
-    }
-
-    fd.ffd = open("/dev/fuse", O_RDWR);
-    if (fd.ffd < 0) {
-        perror("open /dev/fuse");
-        result = -1;
-        goto done;
-    }
-
-    char opts[256];
-    snprintf(opts, sizeof(opts),
-             ("fd=%d,user_id=%d,group_id=%d,max_read=%u,"
-              "allow_other,rootmode=040000"),
-             fd.ffd, fd.uid, fd.gid, block_size);
-
-    result = mount("/dev/fuse", FUSE_SIDELOAD_HOST_MOUNTPOINT,
-                   "fuse", MS_NOSUID | MS_NODEV | MS_RDONLY | MS_NOEXEC, opts);
-    if (result < 0) {
-        perror("mount");
-        goto done;
-    }
-    uint8_t request_buffer[sizeof(struct fuse_in_header) + PATH_MAX*8];
-    for (;;) {
-        ssize_t len = TEMP_FAILURE_RETRY(read(fd.ffd, request_buffer, sizeof(request_buffer)));
-        if (len == -1) {
-            perror("read request");
-            if (errno == ENODEV) {
-                result = -1;
-                break;
-            }
-            continue;
-        }
-
-        if ((size_t)len < sizeof(struct fuse_in_header)) {
-            fprintf(stderr, "request too short: len=%zu\n", (size_t)len);
-            continue;
-        }
-
-        struct fuse_in_header* hdr = (struct fuse_in_header*) request_buffer;
-        void* data = request_buffer + sizeof(struct fuse_in_header);
-
-        result = -ENOSYS;
-
-        switch (hdr->opcode) {
-             case FUSE_INIT:
-                result = handle_init(data, &fd, hdr);
-                break;
-
-             case FUSE_LOOKUP:
-                result = handle_lookup(data, &fd, hdr);
-                break;
-
-            case FUSE_GETATTR:
-                result = handle_getattr(data, &fd, hdr);
-                break;
-
-            case FUSE_OPEN:
-                result = handle_open(data, &fd, hdr);
-                break;
-
-            case FUSE_READ:
-                result = handle_read(data, &fd, hdr);
-                break;
-
-            case FUSE_FLUSH:
-                result = handle_flush(data, &fd, hdr);
-                break;
-
-            case FUSE_RELEASE:
-                result = handle_release(data, &fd, hdr);
-                break;
-
-            default:
-                fprintf(stderr, "unknown fuse request opcode %d\n", hdr->opcode);
-                break;
-        }
-
-        if (result == NO_STATUS_EXIT) {
-            result = 0;
-            break;
-        }
-
-        if (result != NO_STATUS) {
-            struct fuse_out_header outhdr;
-            outhdr.len = sizeof(outhdr);
-            outhdr.error = result;
-            outhdr.unique = hdr->unique;
-            TEMP_FAILURE_RETRY(write(fd.ffd, &outhdr, sizeof(outhdr)));
-        }
-    }
-
-  done:
-    fd.vtab->close(fd.cookie);
-
-    result = umount2(FUSE_SIDELOAD_HOST_MOUNTPOINT, MNT_DETACH);
-    if (result < 0) {
-        printf("fuse_sideload umount failed: %s\n", strerror(errno));
-    }
-
-    if (fd.ffd) close(fd.ffd);
-    free(fd.hashes);
-    free(fd.block_data);
-    free(fd.extra_block);
-
-    return result;
-}
-
-extern "C" int run_old_fuse_sideload(struct provider_vtab* vtab, void* cookie,
-                      uint64_t file_size, uint32_t block_size)
-{
-    return run_fuse_sideload(vtab, cookie, file_size, block_size);
-}
diff --git a/fuse_sideload22.h b/fuse_sideload22.h
deleted file mode 100644
index 98254d4..0000000
--- a/fuse_sideload22.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-#ifndef __FUSE_SIDELOAD22_H
-#define __FUSE_SIDELOAD22_H
-
-// define the filenames created by the sideload FUSE filesystem
-#define FUSE_SIDELOAD_HOST_MOUNTPOINT "/sideload"
-#define FUSE_SIDELOAD_HOST_FILENAME "package.zip"
-#define FUSE_SIDELOAD_HOST_PATHNAME (FUSE_SIDELOAD_HOST_MOUNTPOINT "/" FUSE_SIDELOAD_HOST_FILENAME)
-#define FUSE_SIDELOAD_HOST_EXIT_FLAG "exit"
-#define FUSE_SIDELOAD_HOST_EXIT_PATHNAME (FUSE_SIDELOAD_HOST_MOUNTPOINT "/" FUSE_SIDELOAD_HOST_EXIT_FLAG)
-
-struct provider_vtab {
-    // read a block
-    int (*read_block)(void* cookie, uint32_t block, uint8_t* buffer, uint32_t fetch_size);
-
-    // close down
-    void (*close)(void* cookie);
-};
-
-int run_fuse_sideload(struct provider_vtab* vtab, void* cookie,
-                      uint64_t file_size, uint32_t block_size);
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-int run_old_fuse_sideload(struct provider_vtab* vtab, void* cookie,
-                      uint64_t file_size, uint32_t block_size);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/fuse_sideload28/fuse_sideload.cpp b/fuse_sideload28/fuse_sideload.cpp
deleted file mode 100644
index 45c79f9..0000000
--- a/fuse_sideload28/fuse_sideload.cpp
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- * Copyright (C) 2014 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 module creates a special filesystem containing two files.
-//
-// "/sideload/package.zip" appears to be a normal file, but reading
-// from it causes data to be fetched from the adb host.  We can use
-// this to sideload packages over an adb connection without having to
-// store the entire package in RAM on the device.
-//
-// Because we may not trust the adb host, this filesystem maintains
-// the following invariant: each read of a given position returns the
-// same data as the first read at that position.  That is, once a
-// section of the file is read, future reads of that section return
-// the same data.  (Otherwise, a malicious adb host process could
-// return one set of bits when the package is read for signature
-// verification, and then different bits for when the package is
-// accessed by the installer.)  If the adb host returns something
-// different than it did on the first read, the reader of the file
-// will see their read fail with EINVAL.
-//
-// The other file, "/sideload/exit", is used to control the subprocess
-// that creates this filesystem.  Calling stat() on the exit file
-// causes the filesystem to be unmounted and the adb process on the
-// device shut down.
-//
-// Note that only the minimal set of file operations needed for these
-// two files is implemented.  In particular, you can't opendir() or
-// readdir() on the "/sideload" directory; ls on it won't work.
-
-#include "fuse_sideload.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include "fuse.h"
-#include <pthread.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/mount.h>
-#include <sys/param.h>  // MIN
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <unistd.h>
-
-#ifdef USE_MINCRYPT
-#include "mincrypt/sha256.h"
-#define  SHA256_DIGEST_LENGTH SHA256_DIGEST_SIZE
-#else
-#include <openssl/sha.h>
-#endif
-
-#include <array>
-#include <string>
-#include <vector>
-
-//#include <android-base/stringprintf.h>
-//#include <android-base/unique_fd.h>
-
-static constexpr uint64_t PACKAGE_FILE_ID = FUSE_ROOT_ID + 1;
-static constexpr uint64_t EXIT_FLAG_ID = FUSE_ROOT_ID + 2;
-
-static constexpr int NO_STATUS = 1;
-static constexpr int NO_STATUS_EXIT = 2;
-
-using SHA256Digest = std::array<uint8_t, SHA256_DIGEST_LENGTH>;
-
-#ifndef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
-struct fuse_data {
-  int ffd;  // file descriptor for the fuse socket
-
-  provider_vtab vtab;
-
-  uint64_t file_size;  // bytes
-
-  uint32_t block_size;   // block size that the adb host is using to send the file to us
-  uint32_t file_blocks;  // file size in block_size blocks
-
-  uid_t uid;
-  gid_t gid;
-
-  uint32_t curr_block;  // cache the block most recently read from the host
-  uint8_t* block_data;
-
-  uint8_t* extra_block;  // another block of storage for reads that span two blocks
-
-  uint8_t* hashes;        // SHA-256 hash of each block (all zeros
-                          // if block hasn't been read yet)
-};
-
-static void fuse_reply(const fuse_data* fd, uint64_t unique, const void* data, size_t len) {
-  fuse_out_header hdr;
-  hdr.len = len + sizeof(hdr);
-  hdr.error = 0;
-  hdr.unique = unique;
-
-  struct iovec vec[2];
-  vec[0].iov_base = &hdr;
-  vec[0].iov_len = sizeof(hdr);
-  vec[1].iov_base = const_cast<void*>(data);
-  vec[1].iov_len = len;
-
-  int res = writev(fd->ffd, vec, 2);
-  if (res == -1) {
-    printf("*** REPLY FAILED *** %s\n", strerror(errno));
-  }
-}
-
-static int handle_init(void* data, fuse_data* fd, const fuse_in_header* hdr) {
-  const fuse_init_in* req = static_cast<const fuse_init_in*>(data);
-
-  // Kernel 2.6.16 is the first stable kernel with struct fuse_init_out defined (fuse version 7.6).
-  // The structure is the same from 7.6 through 7.22. Beginning with 7.23, the structure increased
-  // in size and added new parameters.
-  if (req->major != FUSE_KERNEL_VERSION || req->minor < 6) {
-    printf("Fuse kernel version mismatch: Kernel version %d.%d, Expected at least %d.6", req->major,
-           req->minor, FUSE_KERNEL_VERSION);
-    return -1;
-  }
-
-  fuse_init_out out;
-  out.minor = MIN(req->minor, FUSE_KERNEL_MINOR_VERSION);
-  size_t fuse_struct_size = sizeof(out);
-#if defined(FUSE_COMPAT_22_INIT_OUT_SIZE)
-  /* FUSE_KERNEL_VERSION >= 23. */
-
-  // If the kernel only works on minor revs older than or equal to 22, then use the older structure
-  // size since this code only uses the 7.22 version of the structure.
-  if (req->minor <= 22) {
-    fuse_struct_size = FUSE_COMPAT_22_INIT_OUT_SIZE;
-  }
-#endif
-
-  out.major = FUSE_KERNEL_VERSION;
-  out.max_readahead = req->max_readahead;
-  out.flags = 0;
-  out.max_background = 32;
-  out.congestion_threshold = 32;
-  out.max_write = 4096;
-  fuse_reply(fd, hdr->unique, &out, fuse_struct_size);
-
-  return NO_STATUS;
-}
-
-static void fill_attr(fuse_attr* attr, const fuse_data* fd, uint64_t nodeid, uint64_t size,
-                      uint32_t mode) {
-  memset(attr, 0, sizeof(*attr));
-  attr->nlink = 1;
-  attr->uid = fd->uid;
-  attr->gid = fd->gid;
-  attr->blksize = 4096;
-
-  attr->ino = nodeid;
-  attr->size = size;
-  attr->blocks = (size == 0) ? 0 : (((size - 1) / attr->blksize) + 1);
-  attr->mode = mode;
-}
-
-static int handle_getattr(void* /* data */, const fuse_data* fd, const fuse_in_header* hdr) {
-  struct fuse_attr_out out;
-  memset(&out, 0, sizeof(out));
-  out.attr_valid = 10;
-
-  if (hdr->nodeid == FUSE_ROOT_ID) {
-    fill_attr(&(out.attr), fd, hdr->nodeid, 4096, S_IFDIR | 0555);
-  } else if (hdr->nodeid == PACKAGE_FILE_ID) {
-    fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444);
-  } else if (hdr->nodeid == EXIT_FLAG_ID) {
-    fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0);
-  } else {
-    return -ENOENT;
-  }
-
-  fuse_reply(fd, hdr->unique, &out, sizeof(out));
-  return (hdr->nodeid == EXIT_FLAG_ID) ? NO_STATUS_EXIT : NO_STATUS;
-}
-
-static int handle_lookup(void* data, const fuse_data* fd, const fuse_in_header* hdr) {
-  if (data == nullptr) return -ENOENT;
-
-  struct fuse_entry_out out;
-  memset(&out, 0, sizeof(out));
-  out.entry_valid = 10;
-  out.attr_valid = 10;
-
-  std::string filename(static_cast<const char*>(data));
-  if (filename == FUSE_SIDELOAD_HOST_FILENAME) {
-    out.nodeid = PACKAGE_FILE_ID;
-    out.generation = PACKAGE_FILE_ID;
-    fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444);
-  } else if (filename == FUSE_SIDELOAD_HOST_EXIT_FLAG) {
-    out.nodeid = EXIT_FLAG_ID;
-    out.generation = EXIT_FLAG_ID;
-    fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0);
-  } else {
-    return -ENOENT;
-  }
-
-  fuse_reply(fd, hdr->unique, &out, sizeof(out));
-  return (out.nodeid == EXIT_FLAG_ID) ? NO_STATUS_EXIT : NO_STATUS;
-}
-
-static int handle_open(void* /* data */, const fuse_data* fd, const fuse_in_header* hdr) {
-  if (hdr->nodeid == EXIT_FLAG_ID) return -EPERM;
-  if (hdr->nodeid != PACKAGE_FILE_ID) return -ENOENT;
-
-  struct fuse_open_out out;
-  memset(&out, 0, sizeof(out));
-  out.fh = 10;  // an arbitrary number; we always use the same handle
-  fuse_reply(fd, hdr->unique, &out, sizeof(out));
-  return NO_STATUS;
-}
-
-static int handle_flush(void* /* data */, fuse_data* /* fd */, const fuse_in_header* /* hdr */) {
-  return 0;
-}
-
-static int handle_release(void* /* data */, fuse_data* /* fd */, const fuse_in_header* /* hdr */) {
-  return 0;
-}
-
-// Fetch a block from the host into fd->curr_block and fd->block_data.
-// Returns 0 on successful fetch, negative otherwise.
-static int fetch_block(fuse_data* fd, uint32_t block) {
-  if (block == fd->curr_block) {
-    return 0;
-  }
-
-  if (block >= fd->file_blocks) {
-    memset(fd->block_data, 0, fd->block_size);
-    fd->curr_block = block;
-    return 0;
-  }
-
-  size_t fetch_size = fd->block_size;
-  if (block * fd->block_size + fetch_size > fd->file_size) {
-    // If we're reading the last (partial) block of the file, expect a shorter response from the
-    // host, and pad the rest of the block with zeroes.
-    fetch_size = fd->file_size - (block * fd->block_size);
-    memset(fd->block_data + fetch_size, 0, fd->block_size - fetch_size);
-  }
-
-  int result = fd->vtab.read_block(block, fd->block_data, fetch_size);
-  if (result < 0) return result;
-
-  fd->curr_block = block;
-
-  // Verify the hash of the block we just got from the host.
-  //
-  // - If the hash of the just-received data matches the stored hash for the block, accept it.
-  // - If the stored hash is all zeroes, store the new hash and accept the block (this is the first
-  //   time we've read this block).
-  // - Otherwise, return -EINVAL for the read.
-
-  uint8_t hash[SHA256_DIGEST_LENGTH];
-#ifdef USE_MINCRYPT
-  SHA256_hash(fd->block_data, fd->block_size, hash);
-#else
-  SHA256(fd->block_data, fd->block_size, hash);
-#endif
-  uint8_t* blockhash = fd->hashes + block * SHA256_DIGEST_LENGTH;
-  if (memcmp(hash, blockhash, SHA256_DIGEST_LENGTH) == 0) {
-    return 0;
-  }
-
-  int i;
-  for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
-    if (blockhash[i] != 0) {
-      fd->curr_block = -1;
-      return -EIO;
-    }
-  }
-
-  memcpy(blockhash, hash, SHA256_DIGEST_LENGTH);
-  return 0;
-}
-
-static int handle_read(void* data, fuse_data* fd, const fuse_in_header* hdr) {
-  if (hdr->nodeid != PACKAGE_FILE_ID) return -ENOENT;
-
-  const fuse_read_in* req = static_cast<const fuse_read_in*>(data);
-  uint64_t offset = req->offset;
-  uint32_t size = req->size;
-
-  // The docs on the fuse kernel interface are vague about what to do when a read request extends
-  // past the end of the file. We can return a short read -- the return structure does include a
-  // length field -- but in testing that caused the program using the file to segfault. (I
-  // speculate that this is due to the reading program accessing it via mmap; maybe mmap dislikes
-  // when you return something short of a whole page?) To fix this we zero-pad reads that extend
-  // past the end of the file so we're always returning exactly as many bytes as were requested.
-  // (Users of the mapped file have to know its real length anyway.)
-
-  fuse_out_header outhdr;
-  outhdr.len = sizeof(outhdr) + size;
-  outhdr.error = 0;
-  outhdr.unique = hdr->unique;
-
-  struct iovec vec[3];
-  vec[0].iov_base = &outhdr;
-  vec[0].iov_len = sizeof(outhdr);
-
-  uint32_t block = offset / fd->block_size;
-  int result = fetch_block(fd, block);
-  if (result != 0) return result;
-
-  // Two cases:
-  //
-  //   - the read request is entirely within this block. In this case we can reply immediately.
-  //
-  //   - the read request goes over into the next block. Note that since we mount the filesystem
-  //     with max_read=block_size, a read can never span more than two blocks. In this case we copy
-  //     the block to extra_block and issue a fetch for the following block.
-
-  uint32_t block_offset = offset - (block * fd->block_size);
-
-  int vec_used;
-  if (size + block_offset <= fd->block_size) {
-    // First case: the read fits entirely in the first block.
-
-    vec[1].iov_base = fd->block_data + block_offset;
-    vec[1].iov_len = size;
-    vec_used = 2;
-  } else {
-    // Second case: the read spills over into the next block.
-
-    memcpy(fd->extra_block, fd->block_data + block_offset, fd->block_size - block_offset);
-    vec[1].iov_base = fd->extra_block;
-    vec[1].iov_len = fd->block_size - block_offset;
-
-    result = fetch_block(fd, block + 1);
-    if (result != 0) return result;
-    vec[2].iov_base = fd->block_data;
-    vec[2].iov_len = size - vec[1].iov_len;
-    vec_used = 3;
-  }
-
-  if (writev(fd->ffd, vec, vec_used) == -1) {
-    printf("*** READ REPLY FAILED: %s ***\n", strerror(errno));
-  }
-  return NO_STATUS;
-}
-
-int run_fuse_sideload(const provider_vtab& vtab, uint64_t file_size, uint32_t block_size,
-                      const char* mount_point) {
-  // If something's already mounted on our mountpoint, try to remove it. (Mostly in case of a
-  // previous abnormal exit.)
-  umount2(mount_point, MNT_FORCE);
-
-  // fs/fuse/inode.c in kernel code uses the greater of 4096 and the passed-in max_read.
-  if (block_size < 4096) {
-    fprintf(stderr, "block size (%u) is too small\n", block_size);
-    return -1;
-  }
-  if (block_size > (1 << 22)) {  // 4 MiB
-    fprintf(stderr, "block size (%u) is too large\n", block_size);
-    return -1;
-  }
-
-  fuse_data fd;
-  memset(&fd, 0, sizeof(fd));
-  fd.vtab = vtab;
-  fd.file_size = file_size;
-  fd.block_size = block_size;
-  fd.file_blocks = (file_size == 0) ? 0 : (((file_size - 1) / block_size) + 1);
-
-  int result;
-  if (fd.file_blocks > (1 << 18)) {
-    fprintf(stderr, "file has too many blocks (%u)\n", fd.file_blocks);
-    result = -1;
-    goto done;
-  }
-
-  fd.hashes = (uint8_t*)calloc(fd.file_blocks, SHA256_DIGEST_LENGTH);
-  if (fd.hashes == NULL) {
-    fprintf(stderr, "failed to allocate %d bites for hashes\n",
-            fd.file_blocks * SHA256_DIGEST_LENGTH);
-    result = -1;
-    goto done;
-  }
-
-  fd.uid = getuid();
-  fd.gid = getgid();
-
-  fd.curr_block = -1;
-  fd.block_data = static_cast<uint8_t*>(malloc(block_size));
-  if (fd.block_data == nullptr) {
-    fprintf(stderr, "failed to allocate %d bites for block_data\n", block_size);
-    result = -1;
-    goto done;
-  }
-  fd.extra_block = static_cast<uint8_t*>(malloc(block_size));
-  if (fd.extra_block == nullptr) {
-    fprintf(stderr, "failed to allocate %d bites for extra_block\n", block_size);
-    result = -1;
-    goto done;
-  }
-
-  fd.ffd = open("/dev/fuse", O_RDWR);
-  if (!fd.ffd) {
-    perror("open /dev/fuse");
-    result = -1;
-    goto done;
-  }
-
-  {
-  char opts[256];
-  snprintf(opts, sizeof(opts),
-          ("fd=%d,user_id=%d,group_id=%d,max_read=%u,"
-           "allow_other,rootmode=040000"),
-           fd.ffd, fd.uid, fd.gid, block_size);
-
-  result = mount("/dev/fuse", FUSE_SIDELOAD_HOST_MOUNTPOINT, "fuse",
-                 MS_NOSUID | MS_NODEV | MS_RDONLY | MS_NOEXEC, opts);
-  if (result < 0) {
-      perror("mount");
-      goto done;
-    }
-  }
-
-  uint8_t request_buffer[sizeof(fuse_in_header) + PATH_MAX * 8];
-  for (;;) {
-    ssize_t len = TEMP_FAILURE_RETRY(read(fd.ffd, request_buffer, sizeof(request_buffer)));
-    if (len == -1) {
-      perror("read request");
-      if (errno == ENODEV) {
-        result = -1;
-        break;
-      }
-      continue;
-    }
-
-    if (static_cast<size_t>(len) < sizeof(fuse_in_header)) {
-      fprintf(stderr, "request too short: len=%zd\n", len);
-      continue;
-    }
-
-    fuse_in_header* hdr = reinterpret_cast<fuse_in_header*>(request_buffer);
-    void* data = request_buffer + sizeof(fuse_in_header);
-
-    result = -ENOSYS;
-
-    switch (hdr->opcode) {
-      case FUSE_INIT:
-        result = handle_init(data, &fd, hdr);
-        break;
-
-      case FUSE_LOOKUP:
-        result = handle_lookup(data, &fd, hdr);
-        break;
-
-      case FUSE_GETATTR:
-        result = handle_getattr(data, &fd, hdr);
-        break;
-
-      case FUSE_OPEN:
-        result = handle_open(data, &fd, hdr);
-        break;
-
-      case FUSE_READ:
-        result = handle_read(data, &fd, hdr);
-        break;
-
-      case FUSE_FLUSH:
-        result = handle_flush(data, &fd, hdr);
-        break;
-
-      case FUSE_RELEASE:
-        result = handle_release(data, &fd, hdr);
-        break;
-
-      default:
-        fprintf(stderr, "unknown fuse request opcode %d\n", hdr->opcode);
-        break;
-    }
-
-    if (result == NO_STATUS_EXIT) {
-      result = 0;
-      break;
-    }
-
-    if (result != NO_STATUS) {
-      fuse_out_header outhdr;
-      outhdr.len = sizeof(outhdr);
-      outhdr.error = result;
-      outhdr.unique = hdr->unique;
-      TEMP_FAILURE_RETRY(write(fd.ffd, &outhdr, sizeof(outhdr)));
-    }
-  }
-
-done:
-  fd.vtab.close();
-
-  if (umount2(mount_point, MNT_DETACH) == -1) {
-    fprintf(stderr, "fuse_sideload umount failed: %s\n", strerror(errno));
-  }
-
-  free(fd.block_data);
-  free(fd.extra_block);
-
-  return result;
-}
-
-extern "C" int run_old_fuse_sideload(const struct provider_vtab& vtab, void* cookie __unused,
-                      uint64_t file_size, uint32_t block_size)
-{
-    return run_fuse_sideload(vtab, file_size, block_size, FUSE_SIDELOAD_HOST_MOUNTPOINT);
-}
diff --git a/fuse_sideload28/fuse_sideload.h b/fuse_sideload28/fuse_sideload.h
deleted file mode 100644
index 1ea1eb8..0000000
--- a/fuse_sideload28/fuse_sideload.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-#ifndef __FUSE_SIDELOAD_H
-#define __FUSE_SIDELOAD_H
-
-#ifdef USE_FUSE_SIDELOAD22
-#include "fuse_sideload22.h"
-#else
-
-#include <functional>
-
-// Define the filenames created by the sideload FUSE filesystem.
-static constexpr const char* FUSE_SIDELOAD_HOST_MOUNTPOINT = "/sideload";
-static constexpr const char* FUSE_SIDELOAD_HOST_FILENAME = "package.zip";
-static constexpr const char* FUSE_SIDELOAD_HOST_PATHNAME = "/sideload/package.zip";
-static constexpr const char* FUSE_SIDELOAD_HOST_EXIT_FLAG = "exit";
-static constexpr const char* FUSE_SIDELOAD_HOST_EXIT_PATHNAME = "/sideload/exit";
-
-struct provider_vtab {
-  // read a block
-  std::function<int(uint32_t block, uint8_t* buffer, uint32_t fetch_size)> read_block;
-
-  // close down
-  std::function<void(void)> close;
-};
-
-int run_fuse_sideload(const provider_vtab& vtab, uint64_t file_size, uint32_t block_size,
-                      const char* mount_point = FUSE_SIDELOAD_HOST_MOUNTPOINT);
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-int run_old_fuse_sideload(const struct provider_vtab& vtab, void* cookie,
-                      uint64_t file_size, uint32_t block_size);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-#endif
diff --git a/gui/action.cpp b/gui/action.cpp
index 12ea91d..5e842d5 100755
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -38,6 +38,7 @@
 #include <sstream>
 #include "../partitions.hpp"
 #include "../twrp-functions.hpp"
+#include "../twrpRepacker.hpp"
 #include "../openrecoveryscript.hpp"
 
 #include "install/adb_install.h"
@@ -396,12 +397,12 @@
 
 		// Now, check if we need to ensure TWRP remains installed...
 		struct stat st;
-		if (stat("/sbin/installTwrp", &st) == 0)
+		if (stat("/system/bin/installTwrp", &st) == 0)
 		{
 			DataManager::SetValue("tw_operation", "Configuring TWRP");
 			DataManager::SetValue("tw_partition", "");
 			gui_msg("config_twrp=Configuring TWRP...");
-			if (TWFunc::Exec_Cmd("/sbin/installTwrp reinstall") < 0)
+			if (TWFunc::Exec_Cmd("/system/bin/installTwrp reinstall") < 0)
 			{
 				gui_msg("config_twrp_err=Unable to configure TWRP with this kernel.");
 			}
@@ -921,19 +922,19 @@
 					DataManager::SetValue("tw_partition_can_resize", 1);
 				else
 					DataManager::SetValue("tw_partition_can_resize", 0);
-				if (TWFunc::Path_Exists("/sbin/mkfs.fat"))
+				if (TWFunc::Path_Exists("/system/bin/mkfs.fat"))
 					DataManager::SetValue("tw_partition_vfat", 1);
 				else
 					DataManager::SetValue("tw_partition_vfat", 0);
-				if (TWFunc::Path_Exists("/sbin/mkexfatfs"))
+				if (TWFunc::Path_Exists("/system/bin/mkexfatfs"))
 					DataManager::SetValue("tw_partition_exfat", 1);
 				else
 					DataManager::SetValue("tw_partition_exfat", 0);
-				if (TWFunc::Path_Exists("/sbin/mkfs.f2fs"))
+				if (TWFunc::Path_Exists("/system/bin/mkfs.f2fs"))
 					DataManager::SetValue("tw_partition_f2fs", 1);
 				else
 					DataManager::SetValue("tw_partition_f2fs", 0);
-				if (TWFunc::Path_Exists("/sbin/mke2fs"))
+				if (TWFunc::Path_Exists("/system/bin/mke2fs"))
 					DataManager::SetValue("tw_partition_ext", 1);
 				else
 					DataManager::SetValue("tw_partition_ext", 0);
@@ -1031,7 +1032,7 @@
 
 int GUIAction::ozip_decrypt(string zip_path)
 {
-	if (!TWFunc::Path_Exists("/sbin/ozip_decrypt")) {
+	if (!TWFunc::Path_Exists("/system/bin/ozip_decrypt")) {
             return 1;
         }
     gui_msg("ozip_decrypt_decryption=Starting Ozip Decryption...");
@@ -2025,7 +2026,7 @@
 					goto exit;
 				}
 				install_path += "/base.apk";
-				if (TWFunc::copy_file("/sbin/me.twrp.twrpapp.apk", install_path, 0644)) {
+				if (TWFunc::copy_file("/system/bin/me.twrp.twrpapp.apk", install_path, 0644)) {
 					LOGERR("Error copying apk file\n");
 					goto exit;
 				}
@@ -2058,7 +2059,7 @@
 							goto exit;
 						}
 						install_path += "/me.twrp.twrpapp.apk";
-						if (TWFunc::copy_file("/sbin/me.twrp.twrpapp.apk", install_path, 0644)) {
+						if (TWFunc::copy_file("/system/bin/me.twrp.twrpapp.apk", install_path, 0644)) {
 							LOGERR("Error copying apk file\n");
 							goto exit;
 						}
@@ -2069,7 +2070,7 @@
 
 						// System apps require their permissions to be pre-set via an XML file in /etc/permissions
 						string permission_path = base_path + "/etc/permissions/privapp-permissions-twrpapp.xml";
-						if (TWFunc::copy_file("/sbin/privapp-permissions-twrpapp.xml", permission_path, 0644)) {
+						if (TWFunc::copy_file("/system/bin/privapp-permissions-twrpapp.xml", permission_path, 0644)) {
 							LOGERR("Error copying permission file\n");
 							goto exit;
 						}
@@ -2155,6 +2156,8 @@
 int GUIAction::repackimage(std::string arg __unused)
 {
 	int op_status = 1;
+	twrpRepacker repacker;
+
 	operation_start("Repack Image");
 	if (!simulate)
 	{
@@ -2167,7 +2170,7 @@
 			Repack_Options.Type = REPLACE_KERNEL;
 		else
 			Repack_Options.Type = REPLACE_RAMDISK;
-		if (!PartitionManager.Repack_Images(path, Repack_Options))
+		if (!repacker.Repack_Image_And_Flash(path, Repack_Options))
 			goto exit;
 	} else
 		simulate_progress_bar();
@@ -2180,10 +2183,12 @@
 int GUIAction::fixabrecoverybootloop(std::string arg __unused)
 {
 	int op_status = 1;
+	twrpRepacker repacker;
+
 	operation_start("Repack Image");
 	if (!simulate)
 	{
-		if (!TWFunc::Path_Exists("/sbin/magiskboot")) {
+		if (!TWFunc::Path_Exists("/system/bin/magiskboot")) {
 			LOGERR("Image repacking tool not present in this TWRP build!");
 			goto exit;
 		}
@@ -2195,11 +2200,11 @@
 			gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1}.")("/boot"));
 			goto exit;
 		}
-		if (!PartitionManager.Prepare_Repack(part, REPACK_ORIG_DIR, DataManager::GetIntValue("tw_repack_backup_first") != 0, gui_lookup("repack", "Repack")))
+		if (!repacker.Backup_Image_For_Repack(part, REPACK_ORIG_DIR, DataManager::GetIntValue("tw_repack_backup_first") != 0, gui_lookup("repack", "Repack")))
 			goto exit;
 		DataManager::SetProgress(.25);
 		gui_msg("fixing_recovery_loop_patch=Patching kernel...");
-		std::string command = "cd " REPACK_ORIG_DIR " && /sbin/magiskboot hexpatch kernel 77616E745F696E697472616D667300 736B69705F696E697472616D667300";
+		std::string command = "cd " REPACK_ORIG_DIR " && /system/bin/magiskboot hexpatch kernel 77616E745F696E697472616D667300 736B69705F696E697472616D667300";
 		if (TWFunc::Exec_Cmd(command) != 0) {
 			gui_msg(Msg(msg::kError, "fix_recovery_loop_patch_error=Error patching kernel."));
 			goto exit;
@@ -2215,7 +2220,7 @@
 		}
 		DataManager::SetProgress(.5);
 		gui_msg(Msg("repacking_image=Repacking {1}...")(part->Display_Name));
-		command = "cd " REPACK_ORIG_DIR " && /sbin/magiskboot repack " REPACK_ORIG_DIR "boot.img";
+		command = "cd " REPACK_ORIG_DIR " && /system/bin/magiskboot repack " REPACK_ORIG_DIR "boot.img";
 		if (TWFunc::Exec_Cmd(command) != 0) {
 			gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
 			goto exit;
diff --git a/gui/blanktimer.cpp b/gui/blanktimer.cpp
old mode 100644
new mode 100755
index 63cd05c..a9573ad
--- a/gui/blanktimer.cpp
+++ b/gui/blanktimer.cpp
@@ -66,7 +66,7 @@
 	if (sleepTimer && diff.tv_sec > sleepTimer && state < kOff) {
 		state = kOff;
 		TWFunc::Set_Brightness("0");
-		TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
+		TWFunc::check_and_run_script("/system/bin/postscreenblank.sh", "blank");
 		PageManager::ChangeOverlay("lock");
 	}
 #ifndef TW_NO_SCREEN_BLANK
@@ -100,7 +100,7 @@
 			gr_fb_blank(false);
 #endif
 			// TODO: this is asymmetric with postscreenblank.sh - shouldn't it be under the next case label?
-			TWFunc::check_and_run_script("/sbin/postscreenunblank.sh", "unblank");
+			TWFunc::check_and_run_script("/system/bin/postscreenunblank.sh", "unblank");
 			// No break here, we want to keep going
 		case kOff:
 			gui_forceRender();
@@ -129,7 +129,7 @@
 		orig_brightness = getBrightness();
 		state = kOff;
 		TWFunc::Set_Brightness("0");
-		TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
+		TWFunc::check_and_run_script("/system/bin/postscreenblank.sh", "blank");
 	}
 #ifndef TW_NO_SCREEN_BLANK
 	if (state == kOff) {
diff --git a/gui/terminal.cpp b/gui/terminal.cpp
index e12df5c..288a6c3 100755
--- a/gui/terminal.cpp
+++ b/gui/terminal.cpp
@@ -116,7 +116,7 @@
 		// (Mandatory for programs like the shell to make them manage correctly their outputs)
 		ioctl(0, TIOCSCTTY, 1);
 
-		execl("/sbin/sh", "sh", NULL);
+		execl("/system/bin/sh", "sh", NULL);
 		_exit(127);
 	}
 
diff --git a/htcdumlock/Android.mk b/htcdumlock/Android.mk
old mode 100644
new mode 100755
index 27b3c34..ffc1601
--- a/htcdumlock/Android.mk
+++ b/htcdumlock/Android.mk
@@ -8,6 +8,6 @@
 	LOCAL_MODULE:=htcdumlock
 	LOCAL_MODULE_TAGS:= optional
 	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 	include $(BUILD_EXECUTABLE)
 endif
diff --git a/injecttwrp/Android.mk b/injecttwrp/Android.mk
old mode 100644
new mode 100755
index d7f7936..51040f5
--- a/injecttwrp/Android.mk
+++ b/injecttwrp/Android.mk
@@ -8,6 +8,6 @@
 	LOCAL_MODULE:=injecttwrp
 	LOCAL_MODULE_TAGS:= optional
 	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 	include $(BUILD_EXECUTABLE)
 endif
diff --git a/install/adb_install.cpp b/install/adb_install.cpp
index 44a58a0..0db4a27 100755
--- a/install/adb_install.cpp
+++ b/install/adb_install.cpp
@@ -291,7 +291,7 @@
   if (child == 0) {
     recovery_socket.reset();
     std::vector<std::string> minadbd_commands = {
-      "/sbin/recovery",
+      "/system/bin/recovery",
       "recovery",
       "--adbd",
       install_file,
diff --git a/install/installcommand.cpp b/install/installcommand.cpp
index 5e28472..ee93484 100755
--- a/install/installcommand.cpp
+++ b/install/installcommand.cpp
@@ -211,7 +211,7 @@
     }
     long payload_offset = zip->GetEntryOffset(AB_OTA_PAYLOAD);
     *cmd = {
-        "/sbin/update_engine_sideload",
+        "/system/bin/update_engine_sideload",
         android::base::StringPrintf("--payload=file://%s", path),
         android::base::StringPrintf("--offset=%ld", payload_offset),
         "--headers=" + std::string(payload_properties.begin(),
diff --git a/install28/adb_install.cpp b/install28/adb_install.cpp
deleted file mode 100755
index 5b57641..0000000
--- a/install28/adb_install.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "cutils/properties.h"
-
-#include "common.h"
-#ifdef USE_OLD_VERIFIER
-#include "verifier24/verifier.h"
-#include "ui.h"
-#elif USE_28_VERIFIER
-#include "verifier28/verifier.h"
-#include "verifier28/adb_install.h"
-#include "verifier28/ui.h"
-#include "verifier28/fuse_sideload.h"
-#else
-#include "install/install.h"
-#endif
-
-static void set_usb_driver(bool enabled) {
-  char configfs[PROPERTY_VALUE_MAX];
-  property_get("sys.usb.configfs", configfs, "false");
-  if (strcmp(configfs, "false") == 0 || strcmp(configfs, "0") == 0)
-    return;
-
-  int fd = open("/sys/class/android_usb/android0/enable", O_WRONLY);
-  if (fd < 0) {
-/*  These error messages show when built in older Android branches (e.g. Gingerbread)
-    It's not a critical error so we're disabling the error messages.
-    ui->Print("failed to open driver control: %s\n", strerror(errno));
-*/
-    printf("failed to open driver control: %s\n", strerror(errno));
-    return;
-  }
-
-  if (TEMP_FAILURE_RETRY(write(fd, enabled ? "1" : "0", 1)) == -1) {
-/*
-    ui->Print("failed to set driver control: %s\n", strerror(errno));
-*/
-    printf("failed to set driver control: %s\n", strerror(errno));
-  }
-  if (close(fd) < 0) {
-/*
-    ui->Print("failed to close driver control: %s\n", strerror(errno));
-*/
-    printf("failed to close driver control: %s\n", strerror(errno));
-  }
-}
-
-// On Android 8.0 for some reason init can't seem to completely stop adbd
-// so we have to kill it too if it doesn't die on its own.
-static void kill_adbd() {
-  DIR* dir = opendir("/proc");
-  if (dir) {
-    struct dirent* de = 0;
-
-    while ((de = readdir(dir)) != 0) {
-      if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
-        continue;
-
-      int pid = -1;
-      int ret = sscanf(de->d_name, "%d", &pid);
-
-      if (ret == 1) {
-        char cmdpath[PATH_MAX];
-        sprintf(cmdpath, "/proc/%d/cmdline", pid);
-
-        FILE* file = fopen(cmdpath, "r");
-        size_t task_size = PATH_MAX;
-        char task[PATH_MAX];
-        char* p = task;
-        if (getline(&p, &task_size, file) > 0) {
-          if (strstr(task, "adbd") != 0) {
-            printf("adbd pid %d found, sending kill.\n", pid);
-            kill(pid, SIGINT);
-            usleep(5000);
-            kill(pid, SIGKILL);
-          }
-        }
-        fclose(file);
-      }
-    }
-    closedir(dir);
-  }
-}
-
-static void stop_adbd() {
-  printf("Stopping adbd...\n");
-  property_set("ctl.stop", "adbd");
-  usleep(5000);
-  kill_adbd();
-  set_usb_driver(false);
-}
-
-static bool is_ro_debuggable() {
-  char value[PROPERTY_VALUE_MAX+1];
-  return (property_get("ro.debuggable", value, NULL) == 1 && value[0] == '1');
-}
-
-static void maybe_restart_adbd() {
-  if (is_ro_debuggable()) {
-    printf("Restarting adbd...\n");
-    set_usb_driver(true);
-    property_set("ctl.start", "adbd");
-  }
-}
-
-// How long (in seconds) we wait for the host to start sending us a
-// package, before timing out.
-#define ADB_INSTALL_TIMEOUT 300
-
-int
-apply_from_adb(const char* install_file, pid_t* child_pid) {
-
-  stop_adbd();
-  set_usb_driver(true);
-/*
-int apply_from_adb(RecoveryUI* ui, bool* wipe_cache, const char* install_file) {
-  modified_flash = true;
-
-  stop_adbd(ui);
-  set_usb_driver(ui, true);
-
-  ui->Print("\n\nNow send the package you want to apply\n"
-            "to the device with \"adb sideload <filename>\"...\n");
-*/
-  pid_t child;
-  if ((child = fork()) == 0) {
-    execl("/sbin/recovery", "recovery", "--adbd", install_file, NULL);
-    _exit(-1);
-  }
-
-  *child_pid = child;
-  // caller can now kill the child thread from another thread
-
-  // FUSE_SIDELOAD_HOST_PATHNAME will start to exist once the host
-  // connects and starts serving a package.  Poll for its
-  // appearance.  (Note that inotify doesn't work with FUSE.)
-  int result = INSTALL_ERROR;
-  int status;
-  bool waited = false;
-  struct stat st;
-  for (int i = 0; i < ADB_INSTALL_TIMEOUT; ++i) {
-    if (waitpid(child, &status, WNOHANG) != 0) {
-      result = -1;
-      waited = true;
-      break;
-    }
-
-    if (stat(FUSE_SIDELOAD_HOST_PATHNAME, &st) != 0) {
-      if (errno == ENOENT && i < ADB_INSTALL_TIMEOUT-1) {
-        sleep(1);
-        continue;
-      } else {
-        printf("\nTimed out waiting for package: %s\n\n", strerror(errno));
-        result = -1;
-        kill(child, SIGKILL);
-        break;
-      }
-    }
-    // Install is handled elsewhere in TWRP
-    //install_package(FUSE_SIDELOAD_HOST_PATHNAME, wipe_cache, install_file, false);
-    return 0;
-  }
-
-  // if we got here, something failed
-  *child_pid = 0;
-
-  if (!waited) {
-    // Calling stat() on this magic filename signals the minadbd
-    // subprocess to shut down.
-    stat(FUSE_SIDELOAD_HOST_EXIT_PATHNAME, &st);
-
-    // TODO(dougz): there should be a way to cancel waiting for a
-    // package (by pushing some button combo on the device).  For now
-    // you just have to 'adb sideload' a file that's not a valid
-    // package, like "/dev/null".
-    waitpid(child, &status, 0);
-  }
-
-  if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-    if (WEXITSTATUS(status) == 3) {
-      printf("\nYou need adb 1.0.32 or newer to sideload\nto this device.\n\n");
-      result = -2;
-    } else if (!WIFSIGNALED(status)) {
-      printf("adbd status %d\n", WEXITSTATUS(status));
-    }
-  }
-
-  set_usb_driver(false);
-  maybe_restart_adbd();
-
-  return result;
-}
diff --git a/install28/adb_install.h b/install28/adb_install.h
deleted file mode 100644
index 97dc83d..0000000
--- a/install28/adb_install.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef _ADB_INSTALL_H
-#define _ADB_INSTALL_H
-
-#include <sys/types.h>
-
-//class RecoveryUI;
-
-//static void set_usb_driver(bool enabled);
-//static void maybe_restart_adbd();
-int apply_from_adb(const char* install_file, pid_t* child_pid);
-
-#endif
diff --git a/libblkid/Android.mk b/libblkid/Android.mk
old mode 100644
new mode 100755
index 38a192f..6bdbe35
--- a/libblkid/Android.mk
+++ b/libblkid/Android.mk
@@ -4,7 +4,7 @@
 
 LOCAL_MODULE := libutil-linux
 LOCAL_MODULE_TAGS := optional
-#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_CFLAGS := -D_FILE_OFFSET_BITS=64 -DHAVE_LOFF_T -DHAVE_ERR_H -DHAVE_MEMPCPY -DHAVE_FSYNC
 LOCAL_CFLAGS += -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter -Wno-format -Wno-pointer-arith
 LOCAL_SRC_FILES = 	lib/at.c \
@@ -43,7 +43,7 @@
 
 LOCAL_MODULE := libuuid
 LOCAL_MODULE_TAGS := optional
-#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_CFLAGS := -D_FILE_OFFSET_BITS=64 -DHAVE_LOFF_T -DHAVE_ERR_H -DHAVE_MEMPCPY -DHAVE_FSYNC -DHAVE_SYS_FILE_H
 LOCAL_CFLAGS += -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter -Wno-format -Wno-pointer-arith
 LOCAL_SRC_FILES =	libuuid/src/clear.c \
@@ -70,7 +70,7 @@
 
 LOCAL_MODULE := libfdisk
 LOCAL_MODULE_TAGS := optional
-#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_CFLAGS := -D_FILE_OFFSET_BITS=64 -DHAVE_LOFF_T -DHAVE_ERR_H -DHAVE_MEMPCPY -DHAVE_FSYNC
 LOCAL_CFLAGS += -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter -Wno-format -Wno-pointer-arith
 LOCAL_SRC_FILES = 	libfdisk/src/alignment.c \
@@ -103,7 +103,7 @@
 
 LOCAL_MODULE := libblkid
 LOCAL_MODULE_TAGS := optional
-#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 LOCAL_CFLAGS := -D_FILE_OFFSET_BITS=64 -DHAVE_LOFF_T -DHAVE_ERR_H -DHAVE_MEMPCPY -DHAVE_FSYNC
 LOCAL_CFLAGS += -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter -Wno-format -Wno-pointer-arith
 LOCAL_SRC_FILES = 	src/cache.c \
diff --git a/libcrecovery/defines.h b/libcrecovery/defines.h
old mode 100644
new mode 100755
index d94ad2d..9b1f287
--- a/libcrecovery/defines.h
+++ b/libcrecovery/defines.h
@@ -1,2 +1,2 @@
 #undef _PATH_BSHELL
-#define _PATH_BSHELL "/sbin/sh"
+#define _PATH_BSHELL "/system/bin/sh"
diff --git a/minui21/Android.mk b/minui21/Android.mk
deleted file mode 100644
index 6191448..0000000
--- a/minui21/Android.mk
+++ /dev/null
@@ -1,143 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := graphics_overlay.c events.c resources.c
-ifneq ($(BOARD_CUSTOM_GRAPHICS),)
-  LOCAL_SRC_FILES += $(BOARD_CUSTOM_GRAPHICS)
-else
-  LOCAL_SRC_FILES += graphics.c
-endif
-
-LOCAL_C_INCLUDES +=\
-    external/libpng \
-    external/zlib \
-    system/core/include/pixelflinger
-
-ifeq ($(TW_TARGET_USES_QCOM_BSP), true)
-  LOCAL_CFLAGS += -DMSM_BSP
-  ifeq ($(TARGET_PREBUILT_KERNEL),)
-    LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
-    LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
-  else
-    ifeq ($(TARGET_CUSTOM_KERNEL_HEADERS),)
-      LOCAL_C_INCLUDES += $(commands_recovery_local_path)/minui/include
-    else
-      LOCAL_C_INCLUDES += $(TARGET_CUSTOM_KERNEL_HEADERS)
-    endif
-  endif
-else
-  LOCAL_C_INCLUDES += $(commands_recovery_local_path)/minui/include
-endif
-
-ifeq ($(TW_NEW_ION_HEAP), true)
-  LOCAL_CFLAGS += -DNEW_ION_HEAP
-endif
-
-LOCAL_STATIC_LIBRARY := libpng
-LOCAL_WHOLE_STATIC_LIBRARIES := libpixelflinger_static
-LOCAL_MODULE := libminui
-
-# This used to compare against values in double-quotes (which are just
-# ordinary characters in this context).  Strip double-quotes from the
-# value so that either will work.
-
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBA_8888)
-  LOCAL_CFLAGS += -DRECOVERY_RGBA
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBX_8888)
-  LOCAL_CFLAGS += -DRECOVERY_RGBX
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),BGRA_8888)
-  LOCAL_CFLAGS += -DRECOVERY_BGRA
-endif
-
-ifneq ($(TARGET_RECOVERY_OVERSCAN_PERCENT),)
-  LOCAL_CFLAGS += -DOVERSCAN_PERCENT=$(TARGET_RECOVERY_OVERSCAN_PERCENT)
-else
-  LOCAL_CFLAGS += -DOVERSCAN_PERCENT=0
-endif
-
-ifneq ($(TW_BRIGHTNESS_PATH),)
-  LOCAL_CFLAGS += -DTW_BRIGHTNESS_PATH=\"$(TW_BRIGHTNESS_PATH)\"
-endif
-ifneq ($(TW_MAX_BRIGHTNESS),)
-  LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=$(TW_MAX_BRIGHTNESS)
-else
-  LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=255
-endif
-ifneq ($(TW_NO_SCREEN_BLANK),)
-  LOCAL_CFLAGS += -DTW_NO_SCREEN_BLANK
-endif
-ifneq ($(BOARD_USE_CUSTOM_RECOVERY_FONT),)
-  LOCAL_CFLAGS += -DBOARD_USE_CUSTOM_RECOVERY_FONT=$(BOARD_USE_CUSTOM_RECOVERY_FONT)
-endif
-include $(BUILD_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := graphics_overlay.c events.c resources.c
-ifneq ($(BOARD_CUSTOM_GRAPHICS),)
-  LOCAL_SRC_FILES += $(BOARD_CUSTOM_GRAPHICS)
-else
-  LOCAL_SRC_FILES += graphics.c
-endif
-
-ifeq ($(TW_TARGET_USES_QCOM_BSP), true)
-  LOCAL_CFLAGS += -DMSM_BSP
-  ifeq ($(TARGET_PREBUILT_KERNEL),)
-    LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
-    LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
-  else
-    ifeq ($(TARGET_CUSTOM_KERNEL_HEADERS),)
-      LOCAL_C_INCLUDES += $(commands_recovery_local_path)/minui/include
-    else
-      LOCAL_C_INCLUDES += $(TARGET_CUSTOM_KERNEL_HEADERS)
-    endif
-  endif
-else
-  LOCAL_C_INCLUDES += $(commands_recovery_local_path)/minui/include
-endif
-
-LOCAL_C_INCLUDES +=\
-    external/libpng\
-    external/zlib
-
-LOCAL_MODULE := libminui
-
-LOCAL_ARM_MODE:= arm
-LOCAL_SHARED_LIBRARIES := libpng libpixelflinger
-# This used to compare against values in double-quotes (which are just
-# ordinary characters in this context).  Strip double-quotes from the
-# value so that either will work.
-
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBX_8888)
-  LOCAL_CFLAGS += -DRECOVERY_RGBX
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),BGRA_8888)
-  LOCAL_CFLAGS += -DRECOVERY_BGRA
-endif
-
-ifneq ($(TARGET_RECOVERY_OVERSCAN_PERCENT),)
-  LOCAL_CFLAGS += -DOVERSCAN_PERCENT=$(TARGET_RECOVERY_OVERSCAN_PERCENT)
-else
-  LOCAL_CFLAGS += -DOVERSCAN_PERCENT=0
-endif
-
-ifneq ($(TW_BRIGHTNESS_PATH),)
-  LOCAL_CFLAGS += -DTW_BRIGHTNESS_PATH=\"$(TW_BRIGHTNESS_PATH)\"
-endif
-ifneq ($(TW_MAX_BRIGHTNESS),)
-  LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=$(TW_MAX_BRIGHTNESS)
-else
-  LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=255
-endif
-ifneq ($(TW_NO_SCREEN_BLANK),)
-  LOCAL_CFLAGS += -DTW_NO_SCREEN_BLANK
-endif
-ifneq ($(BOARD_USE_CUSTOM_RECOVERY_FONT),)
-  LOCAL_CFLAGS += -DBOARD_USE_CUSTOM_RECOVERY_FONT=$(BOARD_USE_CUSTOM_RECOVERY_FONT)
-endif
-
-LOCAL_CFLAGS += -DFASTMMI_FEATURE
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/minui21/events.c b/minui21/events.c
deleted file mode 100644
index b8cf15a..0000000
--- a/minui21/events.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <sys/epoll.h>
-
-#include <linux/input.h>
-
-#include "minui.h"
-
-#define MAX_DEVICES 16
-#define MAX_MISC_FDS 16
-
-#define BITS_PER_LONG (sizeof(unsigned long) * 8)
-#define BITS_TO_LONGS(x) (((x) + BITS_PER_LONG - 1) / BITS_PER_LONG)
-
-#define test_bit(bit, array) \
-    ((array)[(bit)/BITS_PER_LONG] & (1 << ((bit) % BITS_PER_LONG)))
-
-struct fd_info {
-    int fd;
-    ev_callback cb;
-    void *data;
-};
-
-static int epollfd;
-static struct epoll_event polledevents[MAX_DEVICES + MAX_MISC_FDS];
-static int npolledevents;
-
-static struct fd_info ev_fdinfo[MAX_DEVICES + MAX_MISC_FDS];
-
-static unsigned ev_count = 0;
-static unsigned ev_dev_count = 0;
-static unsigned ev_misc_count = 0;
-
-int ev_init(ev_callback input_cb, void *data)
-{
-    DIR *dir;
-    struct dirent *de;
-    int fd;
-    struct epoll_event ev;
-    bool epollctlfail = false;
-
-    epollfd = epoll_create(MAX_DEVICES + MAX_MISC_FDS);
-    if (epollfd == -1)
-        return -1;
-
-    dir = opendir("/dev/input");
-    if(dir != 0) {
-        while((de = readdir(dir))) {
-            unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)];
-
-//            fprintf(stderr,"/dev/input/%s\n", de->d_name);
-            if(strncmp(de->d_name,"event",5)) continue;
-            fd = openat(dirfd(dir), de->d_name, O_RDONLY);
-            if(fd < 0) continue;
-
-            /* read the evbits of the input device */
-            if (ioctl(fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits) < 0) {
-                close(fd);
-                continue;
-            }
-
-            /* TODO: add ability to specify event masks. For now, just assume
-             * that only EV_KEY and EV_REL event types are ever needed. */
-            if (!test_bit(EV_KEY, ev_bits) && !test_bit(EV_REL, ev_bits)) {
-                close(fd);
-                continue;
-            }
-
-#ifdef EPOLLWAKEUP
-            ev.events = EPOLLIN | EPOLLWAKEUP;
-#else
-            ev.events = EPOLLIN;
-#endif
-            ev.data.ptr = (void *)&ev_fdinfo[ev_count];
-            if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev)) {
-                close(fd);
-                epollctlfail = true;
-                continue;
-            }
-
-            ev_fdinfo[ev_count].fd = fd;
-            ev_fdinfo[ev_count].cb = input_cb;
-            ev_fdinfo[ev_count].data = data;
-            ev_count++;
-            ev_dev_count++;
-            if(ev_dev_count == MAX_DEVICES) break;
-        }
-    }
-
-    if (epollctlfail && !ev_count) {
-        close(epollfd);
-        epollfd = -1;
-        return -1;
-    }
-
-    return 0;
-}
-
-int ev_add_fd(int fd, ev_callback cb, void *data)
-{
-    struct epoll_event ev;
-    int ret;
-
-    if (ev_misc_count == MAX_MISC_FDS || cb == NULL)
-        return -1;
-
-#ifdef EPOLLWAKEUP
-    ev.events = EPOLLIN | EPOLLWAKEUP;
-#else
-    ev.events = EPOLLIN;
-#endif
-    ev.data.ptr = (void *)&ev_fdinfo[ev_count];
-    ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev);
-    if (!ret) {
-        ev_fdinfo[ev_count].fd = fd;
-        ev_fdinfo[ev_count].cb = cb;
-        ev_fdinfo[ev_count].data = data;
-        ev_count++;
-        ev_misc_count++;
-    }
-
-    return ret;
-}
-
-int ev_get_epollfd(void)
-{
-    return epollfd;
-}
-
-void ev_exit(void)
-{
-    while (ev_count > 0) {
-        close(ev_fdinfo[--ev_count].fd);
-    }
-    ev_misc_count = 0;
-    ev_dev_count = 0;
-    close(epollfd);
-}
-
-int ev_wait(int timeout)
-{
-    npolledevents = epoll_wait(epollfd, polledevents, ev_count, timeout);
-    if (npolledevents <= 0)
-        return -1;
-    return 0;
-}
-
-void ev_dispatch(void)
-{
-    int n;
-    int ret;
-
-    for (n = 0; n < npolledevents; n++) {
-        struct fd_info *fdi = polledevents[n].data.ptr;
-        ev_callback cb = fdi->cb;
-        if (cb)
-            cb(fdi->fd, polledevents[n].events, fdi->data);
-    }
-}
-
-int ev_get_input(int fd, uint32_t epevents, struct input_event *ev)
-{
-    int r;
-
-    if (epevents & EPOLLIN) {
-        r = read(fd, ev, sizeof(*ev));
-        if (r == sizeof(*ev))
-            return 0;
-    }
-    return -1;
-}
-
-int ev_sync_key_state(ev_set_key_callback set_key_cb, void *data)
-{
-    unsigned long key_bits[BITS_TO_LONGS(KEY_MAX)];
-    unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)];
-    unsigned i;
-    int ret;
-
-    for (i = 0; i < ev_dev_count; i++) {
-        int code;
-
-        memset(key_bits, 0, sizeof(key_bits));
-        memset(ev_bits, 0, sizeof(ev_bits));
-
-        ret = ioctl(ev_fdinfo[i].fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits);
-        if (ret < 0 || !test_bit(EV_KEY, ev_bits))
-            continue;
-
-        ret = ioctl(ev_fdinfo[i].fd, EVIOCGKEY(sizeof(key_bits)), key_bits);
-        if (ret < 0)
-            continue;
-
-        for (code = 0; code <= KEY_MAX; code++) {
-            if (test_bit(code, key_bits))
-                set_key_cb(code, 1, data);
-        }
-    }
-
-    return 0;
-}
diff --git a/minui21/font_10x18.h b/minui21/font_10x18.h
deleted file mode 100644
index 7f96465..0000000
--- a/minui21/font_10x18.h
+++ /dev/null
@@ -1,214 +0,0 @@
-struct {
-  unsigned width;
-  unsigned height;
-  unsigned cwidth;
-  unsigned cheight;
-  unsigned char rundata[];
-} font = {
-  .width = 960,
-  .height = 18,
-  .cwidth = 10,
-  .cheight = 18,
-  .rundata = {
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x55,0x82,0x06,0x82,0x02,0x82,0x10,0x82,
-0x11,0x83,0x08,0x82,0x0a,0x82,0x04,0x82,0x46,0x82,0x08,0x82,0x07,0x84,0x06,
-0x84,0x0a,0x81,0x03,0x88,0x04,0x84,0x04,0x88,0x04,0x84,0x06,0x84,0x1e,0x81,
-0x0e,0x81,0x0a,0x84,0x06,0x84,0x07,0x82,0x05,0x85,0x07,0x84,0x04,0x86,0x04,
-0x88,0x02,0x88,0x04,0x84,0x04,0x82,0x04,0x82,0x02,0x88,0x05,0x86,0x01,0x82,
-0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x04,0x84,0x04,
-0x86,0x06,0x84,0x04,0x86,0x06,0x84,0x04,0x88,0x02,0x82,0x04,0x82,0x02,0x82,
-0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,
-0x88,0x03,0x86,0x0e,0x86,0x06,0x82,0x11,0x82,0x10,0x82,0x18,0x82,0x0f,0x84,
-0x0d,0x82,0x1c,0x82,0x09,0x84,0x7f,0x16,0x84,0x05,0x82,0x05,0x84,0x07,0x83,
-0x02,0x82,0x19,0x82,0x06,0x82,0x02,0x82,0x06,0x82,0x01,0x82,0x03,0x86,0x04,
-0x83,0x02,0x82,0x03,0x82,0x01,0x82,0x07,0x82,0x09,0x82,0x06,0x82,0x3e,0x82,
-0x04,0x84,0x06,0x83,0x06,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x03,
-0x82,0x09,0x82,0x02,0x82,0x09,0x82,0x03,0x82,0x02,0x82,0x04,0x82,0x02,0x82,
-0x1c,0x82,0x0e,0x82,0x08,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x05,0x84,0x04,
-0x82,0x02,0x82,0x05,0x82,0x02,0x82,0x03,0x82,0x03,0x82,0x03,0x82,0x08,0x82,
-0x09,0x82,0x02,0x82,0x03,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x04,
-0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x83,0x03,0x82,0x03,0x82,0x02,0x82,
-0x03,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x02,
-0x82,0x06,0x82,0x05,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,
-0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x08,0x82,0x03,0x82,0x08,0x82,0x0c,
-0x82,0x05,0x84,0x11,0x82,0x0f,0x82,0x18,0x82,0x0e,0x82,0x02,0x82,0x0c,0x82,
-0x1c,0x82,0x0b,0x82,0x7f,0x15,0x82,0x08,0x82,0x08,0x82,0x05,0x82,0x01,0x82,
-0x01,0x82,0x19,0x82,0x06,0x82,0x02,0x82,0x06,0x82,0x01,0x82,0x02,0x82,0x01,
-0x82,0x01,0x82,0x02,0x82,0x01,0x82,0x01,0x82,0x03,0x82,0x01,0x82,0x07,0x82,
-0x08,0x82,0x08,0x82,0x3d,0x82,0x03,0x82,0x02,0x82,0x04,0x84,0x05,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x06,0x83,0x03,0x82,0x08,0x82,0x04,0x81,0x09,0x82,
-0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x1a,0x82,0x10,0x82,0x06,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x03,0x82,0x03,0x82,0x03,0x82,
-0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x08,0x82,0x04,0x82,0x02,
-0x82,0x04,0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x03,0x82,0x03,0x82,0x08,0x83,
-0x02,0x83,0x02,0x83,0x03,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,0x82,0x05,0x82,
-0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x04,
-0x82,0x02,0x82,0x09,0x82,0x03,0x82,0x08,0x82,0x0c,0x82,0x04,0x82,0x02,0x82,
-0x11,0x82,0x0e,0x82,0x18,0x82,0x0e,0x82,0x02,0x82,0x0c,0x82,0x0b,0x82,0x0b,
-0x82,0x02,0x82,0x0b,0x82,0x4d,0x82,0x45,0x82,0x08,0x82,0x08,0x82,0x05,0x82,
-0x02,0x83,0x1a,0x82,0x07,0x81,0x02,0x81,0x07,0x82,0x01,0x82,0x02,0x82,0x01,
-0x82,0x05,0x82,0x01,0x84,0x04,0x82,0x01,0x82,0x07,0x82,0x08,0x82,0x08,0x82,
-0x06,0x82,0x02,0x82,0x06,0x82,0x28,0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x01,
-0x82,0x05,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,0x84,0x03,0x82,0x08,0x82,
-0x0d,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x19,0x82,0x12,0x82,0x05,
-0x82,0x04,0x82,0x02,0x82,0x02,0x84,0x03,0x82,0x02,0x82,0x03,0x82,0x03,0x82,
-0x03,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x08,0x82,0x08,0x82,0x04,
-0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x03,0x82,0x03,0x82,0x08,0x83,0x02,0x83,
-0x02,0x84,0x02,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x0b,0x82,0x05,0x82,0x04,0x82,0x02,0x82,
-0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x08,
-0x82,0x04,0x82,0x09,0x82,0x0b,0x82,0x03,0x82,0x04,0x82,0x20,0x82,0x18,0x82,
-0x0e,0x82,0x10,0x82,0x0b,0x82,0x0b,0x82,0x02,0x82,0x0b,0x82,0x4d,0x82,0x45,
-0x82,0x08,0x82,0x08,0x82,0x26,0x82,0x10,0x88,0x01,0x82,0x01,0x82,0x06,0x83,
-0x01,0x82,0x04,0x84,0x08,0x81,0x08,0x82,0x0a,0x82,0x05,0x82,0x02,0x82,0x06,
-0x82,0x28,0x82,0x03,0x82,0x04,0x82,0x05,0x82,0x0b,0x82,0x08,0x82,0x04,0x82,
-0x01,0x82,0x03,0x82,0x08,0x82,0x0d,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x04,
-0x82,0x18,0x82,0x06,0x88,0x06,0x82,0x04,0x82,0x04,0x82,0x02,0x82,0x01,0x85,
-0x02,0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x03,0x82,0x08,0x82,0x04,0x82,0x02,
-0x82,0x08,0x82,0x08,0x82,0x08,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,0x03,0x82,
-0x02,0x82,0x04,0x82,0x08,0x88,0x02,0x84,0x02,0x82,0x02,0x82,0x04,0x82,0x02,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x0b,0x82,
-0x05,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x03,0x82,0x04,0x82,0x04,0x84,0x06,
-0x84,0x08,0x82,0x05,0x82,0x09,0x82,0x0b,0x82,0x2b,0x82,0x18,0x82,0x0e,0x82,
-0x10,0x82,0x1c,0x82,0x0b,0x82,0x4d,0x82,0x45,0x82,0x08,0x82,0x08,0x82,0x26,
-0x82,0x11,0x82,0x01,0x82,0x03,0x82,0x01,0x82,0x09,0x82,0x06,0x82,0x12,0x82,
-0x0a,0x82,0x06,0x84,0x07,0x82,0x27,0x82,0x04,0x82,0x04,0x82,0x05,0x82,0x0b,
-0x82,0x07,0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x01,0x83,0x04,0x82,0x01,0x83,
-0x08,0x82,0x05,0x82,0x02,0x82,0x03,0x82,0x04,0x82,0x05,0x83,0x07,0x83,0x05,
-0x82,0x16,0x82,0x08,0x82,0x03,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,
-0x02,0x82,0x02,0x82,0x04,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x08,
-0x82,0x08,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x02,0x82,0x04,0x82,
-0x08,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,
-0x0a,0x82,0x05,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x03,0x82,0x01,0x82,0x01,
-0x82,0x04,0x84,0x06,0x84,0x08,0x82,0x05,0x82,0x0a,0x82,0x0a,0x82,0x23,0x85,
-0x03,0x82,0x01,0x83,0x06,0x85,0x05,0x83,0x01,0x82,0x04,0x84,0x04,0x86,0x05,
-0x85,0x01,0x81,0x02,0x82,0x01,0x83,0x05,0x84,0x09,0x84,0x02,0x82,0x03,0x82,
-0x06,0x82,0x05,0x81,0x01,0x82,0x01,0x82,0x03,0x82,0x01,0x83,0x06,0x84,0x04,
-0x82,0x01,0x83,0x06,0x83,0x01,0x82,0x02,0x82,0x01,0x84,0x04,0x86,0x03,0x86,
-0x04,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x03,0x87,0x05,0x82,0x08,0x82,0x08,0x82,0x26,0x82,
-0x11,0x82,0x01,0x82,0x04,0x86,0x07,0x82,0x05,0x83,0x12,0x82,0x0a,0x82,0x04,
-0x88,0x02,0x88,0x0c,0x88,0x10,0x82,0x04,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,
-0x06,0x83,0x04,0x82,0x03,0x82,0x03,0x83,0x02,0x82,0x03,0x83,0x02,0x82,0x07,
-0x82,0x06,0x84,0x05,0x82,0x02,0x83,0x05,0x83,0x07,0x83,0x04,0x82,0x18,0x82,
-0x06,0x82,0x04,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x86,0x04,
-0x82,0x08,0x82,0x04,0x82,0x02,0x86,0x04,0x86,0x04,0x82,0x02,0x84,0x02,0x88,
-0x05,0x82,0x0a,0x82,0x03,0x85,0x05,0x82,0x08,0x82,0x01,0x82,0x01,0x82,0x02,
-0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x03,0x82,
-0x04,0x82,0x02,0x82,0x03,0x82,0x05,0x84,0x07,0x82,0x05,0x82,0x04,0x82,0x03,
-0x82,0x02,0x82,0x03,0x82,0x01,0x82,0x01,0x82,0x05,0x82,0x08,0x82,0x08,0x82,
-0x06,0x82,0x0a,0x82,0x0a,0x82,0x22,0x82,0x03,0x82,0x02,0x83,0x02,0x82,0x04,
-0x82,0x03,0x82,0x03,0x82,0x02,0x83,0x03,0x82,0x02,0x82,0x05,0x82,0x06,0x82,
-0x03,0x83,0x02,0x83,0x02,0x82,0x06,0x82,0x0b,0x82,0x02,0x82,0x02,0x82,0x07,
-0x82,0x05,0x88,0x02,0x83,0x02,0x82,0x04,0x82,0x02,0x82,0x03,0x83,0x02,0x82,
-0x04,0x82,0x02,0x83,0x03,0x83,0x02,0x82,0x02,0x82,0x04,0x82,0x04,0x82,0x06,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x02,0x82,
-0x03,0x82,0x04,0x82,0x08,0x82,0x02,0x84,0x09,0x82,0x09,0x84,0x23,0x82,0x11,
-0x82,0x01,0x82,0x06,0x82,0x01,0x82,0x05,0x82,0x05,0x82,0x01,0x82,0x11,0x82,
-0x0a,0x82,0x06,0x84,0x07,0x82,0x26,0x82,0x05,0x82,0x04,0x82,0x05,0x82,0x08,
-0x83,0x09,0x82,0x03,0x82,0x03,0x82,0x09,0x82,0x02,0x82,0x04,0x82,0x05,0x82,
-0x06,0x82,0x02,0x82,0x05,0x83,0x01,0x82,0x17,0x82,0x16,0x82,0x06,0x82,0x05,
-0x82,0x01,0x82,0x01,0x82,0x02,0x88,0x02,0x82,0x03,0x82,0x03,0x82,0x08,0x82,
-0x04,0x82,0x02,0x82,0x08,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,
-0x82,0x0a,0x82,0x03,0x82,0x02,0x82,0x04,0x82,0x08,0x82,0x01,0x82,0x01,0x82,
-0x02,0x82,0x02,0x84,0x02,0x82,0x04,0x82,0x02,0x86,0x04,0x82,0x04,0x82,0x02,
-0x86,0x09,0x82,0x06,0x82,0x05,0x82,0x04,0x82,0x04,0x84,0x04,0x82,0x01,0x82,
-0x01,0x82,0x04,0x84,0x07,0x82,0x07,0x82,0x07,0x82,0x0b,0x82,0x09,0x82,0x27,
-0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,
-0x04,0x82,0x06,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x05,0x82,0x0b,0x82,0x02,
-0x82,0x01,0x82,0x08,0x82,0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,
-0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x07,
-0x82,0x0a,0x82,0x06,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x03,0x82,0x04,0x82,
-0x04,0x84,0x04,0x82,0x04,0x82,0x07,0x82,0x06,0x82,0x08,0x82,0x08,0x82,0x26,
-0x82,0x0f,0x88,0x05,0x82,0x01,0x82,0x05,0x82,0x05,0x82,0x02,0x82,0x01,0x82,
-0x0d,0x82,0x0a,0x82,0x05,0x82,0x02,0x82,0x06,0x82,0x26,0x82,0x05,0x82,0x04,
-0x82,0x05,0x82,0x07,0x82,0x0c,0x82,0x02,0x88,0x08,0x82,0x02,0x82,0x04,0x82,
-0x05,0x82,0x05,0x82,0x04,0x82,0x08,0x82,0x18,0x82,0x14,0x82,0x07,0x82,0x05,
-0x82,0x01,0x84,0x03,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,
-0x04,0x82,0x02,0x82,0x08,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,
-0x82,0x0a,0x82,0x03,0x82,0x02,0x82,0x04,0x82,0x08,0x82,0x01,0x82,0x01,0x82,
-0x02,0x82,0x02,0x84,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,
-0x82,0x02,0x82,0x0a,0x82,0x05,0x82,0x05,0x82,0x04,0x82,0x04,0x84,0x04,0x82,
-0x01,0x82,0x01,0x82,0x04,0x84,0x07,0x82,0x07,0x82,0x07,0x82,0x0b,0x82,0x09,
-0x82,0x22,0x87,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x88,
-0x04,0x82,0x06,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x05,0x82,0x0b,0x82,0x02,
-0x84,0x09,0x82,0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x82,
-0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x08,0x86,0x05,
-0x82,0x06,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x03,0x82,0x01,0x82,0x01,0x82,
-0x05,0x82,0x05,0x82,0x04,0x82,0x06,0x82,0x07,0x82,0x08,0x82,0x08,0x82,0x26,
-0x82,0x10,0x82,0x01,0x82,0x07,0x82,0x01,0x82,0x04,0x82,0x01,0x83,0x02,0x82,
-0x03,0x83,0x0f,0x82,0x08,0x82,0x06,0x82,0x02,0x82,0x06,0x82,0x25,0x82,0x07,
-0x82,0x02,0x82,0x06,0x82,0x06,0x82,0x07,0x82,0x04,0x82,0x07,0x82,0x09,0x82,
-0x02,0x82,0x04,0x82,0x04,0x82,0x06,0x82,0x04,0x82,0x08,0x82,0x19,0x82,0x05,
-0x88,0x05,0x82,0x08,0x82,0x05,0x82,0x02,0x82,0x04,0x82,0x04,0x82,0x02,0x82,
-0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x08,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x05,0x82,0x05,0x82,0x03,0x82,0x03,0x82,0x03,0x82,
-0x03,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x03,0x83,0x02,0x82,0x04,0x82,0x02,
-0x82,0x08,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x03,0x82,0x09,0x82,0x05,0x82,
-0x05,0x82,0x04,0x82,0x04,0x84,0x04,0x83,0x02,0x83,0x03,0x82,0x02,0x82,0x06,
-0x82,0x06,0x82,0x08,0x82,0x0c,0x82,0x08,0x82,0x21,0x82,0x04,0x82,0x02,0x82,
-0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x0a,0x82,0x06,0x82,0x03,
-0x82,0x03,0x82,0x04,0x82,0x05,0x82,0x0b,0x82,0x02,0x85,0x08,0x82,0x05,0x82,
-0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x0d,0x82,0x04,0x82,0x06,0x82,0x04,0x82,
-0x04,0x84,0x04,0x82,0x01,0x82,0x01,0x82,0x05,0x82,0x05,0x82,0x04,0x82,0x05,
-0x82,0x08,0x82,0x08,0x82,0x08,0x82,0x38,0x82,0x01,0x82,0x04,0x82,0x01,0x82,
-0x01,0x82,0x04,0x84,0x01,0x82,0x01,0x82,0x03,0x82,0x10,0x82,0x08,0x82,0x30,
-0x83,0x06,0x82,0x07,0x82,0x02,0x82,0x06,0x82,0x05,0x82,0x08,0x82,0x04,0x82,
-0x07,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x04,0x82,0x06,0x82,0x04,
-0x82,0x03,0x81,0x04,0x82,0x1a,0x82,0x10,0x82,0x10,0x82,0x08,0x82,0x04,0x82,
-0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x08,
-0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,0x82,0x05,0x82,0x03,0x82,
-0x03,0x82,0x03,0x82,0x03,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x03,0x83,0x02,
-0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x02,0x84,0x02,0x82,0x03,0x82,0x03,0x82,
-0x04,0x82,0x05,0x82,0x05,0x82,0x04,0x82,0x05,0x82,0x05,0x83,0x02,0x83,0x03,
-0x82,0x02,0x82,0x06,0x82,0x05,0x82,0x09,0x82,0x0c,0x82,0x08,0x82,0x21,0x82,
-0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x0a,
-0x82,0x07,0x85,0x04,0x82,0x04,0x82,0x05,0x82,0x0b,0x82,0x02,0x82,0x02,0x82,
-0x07,0x82,0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,
-0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x0d,0x82,0x04,0x82,
-0x06,0x82,0x04,0x82,0x04,0x84,0x04,0x82,0x01,0x82,0x01,0x82,0x04,0x84,0x04,
-0x82,0x04,0x82,0x04,0x82,0x09,0x82,0x08,0x82,0x08,0x82,0x26,0x82,0x10,0x82,
-0x01,0x82,0x05,0x86,0x04,0x82,0x01,0x82,0x01,0x82,0x01,0x83,0x01,0x84,0x10,
-0x82,0x06,0x82,0x1d,0x83,0x11,0x83,0x05,0x82,0x09,0x84,0x07,0x82,0x05,0x82,
-0x09,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,
-0x82,0x08,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x06,0x83,0x07,0x83,0x09,0x82,
-0x0e,0x82,0x0a,0x82,0x06,0x82,0x03,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x03,
-0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x03,0x82,0x03,0x82,0x08,0x82,0x09,0x82,
-0x02,0x83,0x02,0x82,0x04,0x82,0x05,0x82,0x06,0x82,0x01,0x82,0x04,0x82,0x04,
-0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x02,0x82,
-0x03,0x82,0x09,0x82,0x02,0x82,0x03,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x06,
-0x82,0x06,0x82,0x02,0x82,0x06,0x82,0x05,0x82,0x04,0x82,0x02,0x82,0x04,0x82,
-0x05,0x82,0x05,0x82,0x09,0x82,0x0d,0x82,0x07,0x82,0x21,0x82,0x04,0x82,0x02,
-0x83,0x02,0x82,0x04,0x82,0x03,0x82,0x03,0x82,0x02,0x83,0x03,0x82,0x03,0x82,
-0x04,0x82,0x06,0x82,0x08,0x82,0x04,0x82,0x05,0x82,0x0b,0x82,0x02,0x82,0x03,
-0x82,0x06,0x82,0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x03,0x82,
-0x02,0x82,0x03,0x83,0x02,0x82,0x04,0x82,0x02,0x83,0x03,0x82,0x07,0x82,0x04,
-0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x02,0x83,0x05,0x82,0x05,0x88,0x03,0x82,
-0x02,0x82,0x04,0x82,0x02,0x83,0x03,0x82,0x0a,0x82,0x08,0x82,0x08,0x82,0x26,
-0x82,0x1c,0x82,0x06,0x82,0x02,0x83,0x03,0x84,0x02,0x82,0x10,0x82,0x04,0x82,
-0x1e,0x83,0x11,0x83,0x05,0x82,0x0a,0x82,0x05,0x88,0x02,0x88,0x04,0x84,0x09,
-0x82,0x05,0x84,0x06,0x84,0x05,0x82,0x09,0x84,0x06,0x84,0x07,0x83,0x07,0x83,
-0x0a,0x81,0x0e,0x81,0x0b,0x82,0x07,0x85,0x03,0x82,0x04,0x82,0x02,0x86,0x06,
-0x84,0x04,0x86,0x04,0x88,0x02,0x82,0x0a,0x84,0x01,0x81,0x02,0x82,0x04,0x82,
-0x02,0x88,0x04,0x83,0x05,0x82,0x04,0x82,0x02,0x88,0x02,0x82,0x04,0x82,0x02,
-0x82,0x04,0x82,0x04,0x84,0x04,0x82,0x0a,0x85,0x03,0x82,0x04,0x82,0x04,0x84,
-0x07,0x82,0x07,0x84,0x07,0x82,0x05,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,
-0x82,0x05,0x88,0x03,0x86,0x09,0x82,0x03,0x86,0x22,0x85,0x01,0x81,0x02,0x82,
-0x01,0x83,0x06,0x85,0x05,0x83,0x01,0x82,0x04,0x85,0x05,0x82,0x07,0x86,0x03,
-0x82,0x04,0x82,0x02,0x88,0x08,0x82,0x02,0x82,0x04,0x82,0x02,0x88,0x02,0x82,
-0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x04,0x84,0x04,0x82,0x01,0x83,0x06,
-0x83,0x01,0x82,0x03,0x82,0x08,0x86,0x06,0x84,0x05,0x83,0x01,0x82,0x05,0x82,
-0x06,0x82,0x02,0x82,0x03,0x82,0x04,0x82,0x04,0x83,0x01,0x82,0x03,0x87,0x06,
-0x84,0x05,0x82,0x05,0x84,0x7f,0x15,0x83,0x7f,0x14,0x83,0x7f,0x5e,0x82,0x7f,
-0x05,0x89,0x47,0x82,0x04,0x82,0x17,0x82,0x03,0x82,0x34,0x82,0x0e,0x82,0x4e,
-0x82,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x0a,0x82,0x04,0x82,0x17,0x82,0x03,0x82,
-0x34,0x82,0x0e,0x82,0x48,0x82,0x04,0x82,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x0a,
-0x82,0x04,0x82,0x17,0x82,0x03,0x82,0x34,0x82,0x0e,0x82,0x49,0x82,0x02,0x82,
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x0c,0x86,0x19,0x85,0x35,0x82,0x0e,0x82,0x4a,
-0x84,0x3f,
-0x00,
-  }
-};
diff --git a/minui21/font_7x16.h b/minui21/font_7x16.h
deleted file mode 100644
index 0f72b53..0000000
--- a/minui21/font_7x16.h
+++ /dev/null
@@ -1,15 +0,0 @@
-struct {
-  unsigned width;
-  unsigned height;
-  unsigned cwidth;
-  unsigned cheight;
-  unsigned char rundata[];
-} font = {
-  .width = 668,
-  .height = 16,
-  .cwidth = 7,
-  .cheight = 16,
-  .rundata = {
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7e,0x82,0x03,0x82,0x7f,0x7f,0x5f,0x82,0x0b,0x82,0x14,0x81,0x0b,0x81,0x11,0x81,0x0c,0x82,0x09,0x81,0x08,0x81,0x07,0x81,0x03,0x81,0x06,0x83,0x68,0x83,0x04,0x81,0x04,0x83,0x17,0x81,0x05,0x81,0x01,0x81,0x0c,0x81,0x04,0x82,0x07,0x83,0x04,0x81,0x07,0x81,0x05,0x81,0x06,0x81,0x25,0x81,0x02,0x84,0x02,0x83,0x05,0x84,0x03,0x84,0x05,0x82,0x02,0x85,0x04,0x83,0x02,0x86,0x02,0x84,0x03,0x84,0x27,0x83,0x0b,0x82,0x03,0x85,0x04,0x83,0x02,0x84,0x03,0x86,0x01,0x86,0x03,0x83,0x02,0x81,0x04,0x81,0x01,0x85,0x04,0x83,0x02,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x82,0x03,0x81,0x02,0x84,0x02,0x85,0x03,0x84,0x02,0x85,0x03,0x84,0x01,0x87,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x82,0x05,0x81,0x01,0x81,0x04,0x82,0x05,0x81,0x01,0x86,0x03,0x81,0x04,0x81,0x08,0x81,0x05,0x82,0x0e,0x81,0x0a,0x81,0x11,0x81,0x0b,0x81,0x0b,0x81,0x14,0x81,0x08,0x81,0x37,0x81,0x30,0x81,0x06,0x81,0x06,0x81,0x17,0x81,0x05,0x81,0x01,0x81,0x05,0x81,0x01,0x81,0x03,0x83,0x02,0x81,0x02,0x81,0x05,0x81,0x07,0x81,0x07,0x81,0x05,0x81,0x04,0x81,0x01,0x81,0x01,0x81,0x22,0x81,0x03,0x81,0x02,0x81,0x04,0x81,0x04,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x04,0x82,0x02,0x81,0x07,0x81,0x03,0x81,0x05,0x82,0x01,0x81,0x04,0x81,0x01,0x82,0x02,0x81,0x26,0x81,0x03,0x81,0x03,0x83,0x04,0x82,0x03,0x81,0x04,0x81,0x02,0x81,0x03,0x81,0x01,0x81,0x03,0x81,0x02,0x81,0x06,0x81,0x07,0x81,0x03,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x08,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x06,0x82,0x02,0x82,0x01,0x82,0x03,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x04,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x01,0x81,0x04,0x82,0x02,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x03,0x81,0x06,0x82,0x03,0x81,0x05,0x81,0x07,0x81,0x04,0x81,0x02,0x81,0x18,0x81,0x11,0x81,0x0b,0x81,0x0b,0x81,0x14,0x81,0x08,0x81,0x37,0x81,0x30,0x81,0x06,0x81,0x06,0x81,0x17,0x81,0x05,0x81,0x01,0x81,0x04,0x81,0x02,0x81,0x02,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x02,0x81,0x05,0x81,0x07,0x81,0x06,0x81,0x07,0x81,0x04,0x83,0x05,0x81,0x1d,0x81,0x02,0x81,0x04,0x81,0x03,0x81,0x09,0x81,0x06,0x81,0x03,0x81,0x01,0x81,0x02,0x81,0x06,0x81,0x0a,0x81,0x02,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x14,0x81,0x08,0x81,0x0b,0x81,0x02,0x81,0x02,0x82,0x03,0x82,0x03,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x06,0x81,0x06,0x81,0x04,0x81,0x03,0x81,0x08,0x81,0x02,0x81,0x02,0x81,0x03,0x81,0x06,0x82,0x02,0x82,0x01,0x81,0x01,0x81,0x02,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x08,0x81,0x04,0x81,0x04,0x81,0x02,0x81,0x02,0x81,0x01,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x03,0x81,0x01,0x81,0x07,0x81,0x04,0x81,0x05,0x81,0x07,0x81,0x03,0x81,0x04,0x81,0x11,0x83,0x03,0x84,0x04,0x83,0x04,0x84,0x03,0x83,0x03,0x85,0x03,0x84,0x02,0x81,0x01,0x82,0x03,0x83,0x05,0x83,0x03,0x81,0x03,0x81,0x04,0x81,0x04,0x85,0x02,0x81,0x01,0x82,0x04,0x83,0x03,0x84,0x04,0x84,0x03,0x84,0x03,0x83,0x03,0x85,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x01,0x81,0x05,0x81,0x01,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x85,0x04,0x81,0x06,0x81,0x06,0x81,0x17,0x81,0x0b,0x86,0x01,0x81,0x01,0x81,0x04,0x82,0x02,0x81,0x03,0x82,0x0d,0x81,0x07,0x81,0x04,0x83,0x05,0x81,0x1c,0x81,0x03,0x81,0x04,0x81,0x03,0x81,0x09,0x81,0x06,0x81,0x02,0x82,0x01,0x81,0x02,0x85,0x02,0x81,0x01,0x83,0x06,0x81,0x02,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x06,0x81,0x06,0x83,0x0a,0x83,0x06,0x82,0x02,0x81,0x04,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x06,0x81,0x06,0x81,0x04,0x81,0x03,0x81,0x08,0x81,0x02,0x81,0x01,0x81,0x04,0x81,0x06,0x81,0x01,0x82,0x01,0x81,0x01,0x81,0x01,0x81,0x02,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x01,0x82,0x07,0x81,0x04,0x81,0x04,0x81,0x02,0x81,0x02,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x03,0x82,0x04,0x81,0x01,0x81,0x06,0x81,0x05,0x81,0x06,0x81,0x06,0x81,0x19,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x82,0x05,0x81,0x03,0x81,0x02,0x82,0x02,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x02,0x82,0x02,0x81,0x04,0x81,0x07,0x81,0x03,0x81,0x02,0x81,0x05,0x81,0x04,0x81,0x01,0x81,0x01,0x81,0x02,0x82,0x02,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x03,0x82,0x02,0x81,0x01,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x01,0x81,0x05,0x81,0x02,0x81,0x01,0x81,0x03,0x81,0x03,0x81,0x06,0x81,0x04,0x81,0x06,0x81,0x06,0x81,0x17,0x81,0x0c,0x81,0x01,0x81,0x03,0x83,0x06,0x82,0x04,0x82,0x0d,0x81,0x07,0x81,0x03,0x81,0x01,0x81,0x01,0x81,0x04,0x81,0x1c,0x81,0x03,0x81,0x02,0x81,0x01,0x81,0x03,0x81,0x08,0x81,0x04,0x83,0x03,0x81,0x02,0x81,0x06,0x82,0x01,0x82,0x02,0x82,0x04,0x81,0x04,0x84,0x02,0x81,0x03,0x82,0x03,0x81,0x06,0x81,0x04,0x82,0x05,0x86,0x05,0x82,0x03,0x82,0x03,0x81,0x02,0x83,0x02,0x81,0x02,0x81,0x02,0x85,0x02,0x81,0x06,0x81,0x04,0x81,0x01,0x86,0x01,0x86,0x01,0x81,0x03,0x82,0x01,0x86,0x03,0x81,0x08,0x81,0x02,0x83,0x04,0x81,0x06,0x81,0x01,0x82,0x01,0x81,0x01,0x81,0x01,0x82,0x01,0x81,0x01,0x81,0x04,0x81,0x01,0x85,0x02,0x81,0x04,0x81,0x01,0x85,0x03,0x84,0x04,0x81,0x04,0x81,0x04,0x81,0x02,0x81,0x02,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x03,0x82,0x05,0x81,0x06,0x82,0x05,0x81,0x06,0x81,0x06,0x81,0x1d,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x06,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x04,0x81,0x07,0x81,0x03,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x01,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x03,0x81,0x05,0x81,0x08,0x81,0x04,0x81,0x03,0x81,0x03,0x81,0x01,0x81,0x03,0x81,0x01,0x81,0x01,0x81,0x03,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x03,0x82,0x07,0x81,0x07,0x82,0x02,0x83,0x10,0x81,0x0c,0x81,0x01,0x81,0x05,0x83,0x02,0x82,0x01,0x82,0x02,0x81,0x02,0x81,0x01,0x81,0x0a,0x81,0x07,0x81,0x05,0x81,0x03,0x87,0x09,0x83,0x0c,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x07,0x81,0x08,0x81,0x01,0x81,0x03,0x81,0x07,0x81,0x01,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x04,0x81,0x02,0x83,0x01,0x81,0x0f,0x82,0x10,0x82,0x03,0x81,0x04,0x81,0x01,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x02,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x08,0x81,0x02,0x81,0x02,0x81,0x03,0x81,0x06,0x81,0x01,0x82,0x01,0x81,0x01,0x81,0x02,0x81,0x01,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x03,0x81,0x07,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x02,0x81,0x02,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x03,0x82,0x05,0x81,0x06,0x81,0x06,0x81,0x07,0x81,0x05,0x81,0x1a,0x84,0x02,0x81,0x03,0x81,0x02,0x81,0x06,0x81,0x03,0x81,0x02,0x85,0x04,0x81,0x04,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x04,0x81,0x07,0x81,0x03,0x82,0x07,0x81,0x04,0x81,0x01,0x81,0x01,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x03,0x81,0x06,0x83,0x05,0x81,0x04,0x81,0x03,0x81,0x03,0x81,0x01,0x81,0x03,0x81,0x01,0x81,0x01,0x81,0x04,0x81,0x05,0x81,0x01,0x81,0x05,0x81,0x06,0x81,0x06,0x81,0x06,0x81,0x07,0x83,0x18,0x86,0x04,0x81,0x01,0x81,0x04,0x81,0x02,0x81,0x01,0x81,0x02,0x83,0x0a,0x81,0x07,0x81,0x0c,0x81,0x1b,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x06,0x81,0x09,0x81,0x01,0x86,0x06,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x06,0x81,0x11,0x83,0x02,0x86,0x02,0x83,0x0a,0x81,0x01,0x81,0x02,0x81,0x02,0x84,0x02,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x08,0x81,0x02,0x81,0x02,0x82,0x02,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x02,0x81,0x01,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x06,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x03,0x82,0x03,0x82,0x01,0x82,0x03,0x81,0x02,0x81,0x04,0x81,0x05,0x81,0x07,0x81,0x07,0x81,0x05,0x81,0x19,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x06,0x81,0x03,0x81,0x02,0x81,0x08,0x81,0x04,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x04,0x81,0x07,0x81,0x03,0x81,0x01,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x01,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x03,0x81,0x09,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x03,0x81,0x01,0x81,0x03,0x82,0x01,0x82,0x03,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x07,0x81,0x06,0x81,0x06,0x81,0x17,0x81,0x0b,0x81,0x02,0x81,0x03,0x81,0x01,0x81,0x01,0x81,0x04,0x81,0x02,0x81,0x01,0x82,0x02,0x81,0x0c,0x81,0x05,0x81,0x0d,0x81,0x06,0x81,0x0d,0x81,0x05,0x81,0x06,0x81,0x02,0x81,0x04,0x81,0x05,0x81,0x05,0x81,0x04,0x81,0x05,0x81,0x02,0x81,0x03,0x82,0x02,0x81,0x02,0x82,0x03,0x81,0x04,0x81,0x04,0x81,0x01,0x81,0x03,0x81,0x04,0x81,0x06,0x81,0x09,0x81,0x08,0x81,0x08,0x81,0x04,0x81,0x02,0x83,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x02,0x81,0x03,0x81,0x01,0x81,0x03,0x81,0x02,0x81,0x06,0x81,0x07,0x81,0x03,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x04,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x06,0x81,0x04,0x81,0x01,0x81,0x03,0x82,0x02,0x81,0x02,0x81,0x02,0x81,0x07,0x81,0x02,0x82,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x03,0x82,0x03,0x81,0x03,0x81,0x03,0x81,0x02,0x81,0x04,0x81,0x04,0x82,0x07,0x81,0x08,0x81,0x04,0x81,0x19,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x82,0x05,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x04,0x81,0x07,0x81,0x03,0x81,0x02,0x81,0x05,0x81,0x04,0x81,0x01,0x81,0x01,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x03,0x81,0x05,0x81,0x03,0x81,0x04,0x81,0x04,0x81,0x03,0x81,0x04,0x81,0x05,0x81,0x01,0x81,0x04,0x81,0x01,0x81,0x04,0x82,0x04,0x81,0x08,0x81,0x06,0x81,0x06,0x81,0x17,0x81,0x0b,0x81,0x01,0x81,0x05,0x83,0x06,0x82,0x03,0x83,0x01,0x81,0x0b,0x81,0x05,0x81,0x0d,0x81,0x06,0x81,0x0d,0x81,0x05,0x81,0x06,0x84,0x02,0x85,0x02,0x86,0x02,0x84,0x06,0x81,0x03,0x84,0x03,0x84,0x03,0x81,0x06,0x84,0x03,0x83,0x05,0x81,0x06,0x81,0x1b,0x81,0x04,0x82,0x05,0x81,0x04,0x81,0x01,0x85,0x04,0x83,0x02,0x84,0x03,0x86,0x01,0x81,0x08,0x83,0x02,0x81,0x04,0x81,0x01,0x85,0x03,0x83,0x03,0x81,0x04,0x81,0x01,0x86,0x01,0x81,0x04,0x81,0x01,0x81,0x03,0x82,0x02,0x84,0x02,0x81,0x07,0x84,0x02,0x81,0x05,0x81,0x01,0x84,0x04,0x81,0x05,0x84,0x04,0x82,0x03,0x81,0x03,0x81,0x02,0x81,0x04,0x81,0x03,0x81,0x04,0x86,0x03,0x81,0x08,0x81,0x04,0x81,0x1a,0x84,0x02,0x84,0x04,0x83,0x04,0x84,0x03,0x83,0x05,0x81,0x05,0x84,0x02,0x81,0x03,0x81,0x02,0x85,0x05,0x81,0x03,0x81,0x03,0x81,0x05,0x82,0x02,0x81,0x01,0x81,0x01,0x81,0x02,0x81,0x03,0x81,0x03,0x83,0x03,0x84,0x04,0x84,0x03,0x81,0x06,0x83,0x05,0x83,0x03,0x84,0x04,0x81,0x05,0x81,0x01,0x81,0x03,0x81,0x03,0x81,0x04,0x81,0x04,0x85,0x04,0x81,0x06,0x81,0x06,0x81,0x2c,0x81,0x1c,0x82,0x03,0x82,0x13,0x81,0x13,0x81,0x54,0x81,0x22,0x81,0x79,0x81,0x43,0x82,0x08,0x81,0x02,0x82,0x47,0x81,0x13,0x81,0x26,0x81,0x0a,0x81,0x35,0x81,0x0d,0x83,0x04,0x81,0x04,0x83,0x2c,0x81,0x7f,0x44,0x83,0x76,0x81,0x7f,0x17,0x81,0x02,0x81,0x13,0x81,0x26,0x81,0x0a,0x81,0x34,0x81,0x15,0x81,0x7f,0x7f,0x7f,0x50,0x87,0x34,0x82,0x12,0x82,0x27,0x81,0x0a,0x81,0x33,0x82,0x7f,0x7f,0x7f,0x7f,0x7f,0x4b,0x00,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x00,0x49,0x44,0x41,0x54,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x50,0x4c,0x54,0x45,0x00,0x00,0x00,0x00,0x62,0x4b,0x47,0x44,0x00,0x00,0x00,0x00,0x63,0x48,0x52,0x4d,0x00,0x00,0x00,0x00,0x67,0x41,0x4d,0x41,0x00,0x00,0x00,0x00,0x68,0x49,0x53,0x54,0x00,0x00,0x00,0x00,0x69,0x43,0x43,0x50,0x00,0x00,0x00,0x00,0x69,0x54,0x58,0x74,0x00,0x00,0x00,0x00,0x6f,0x46,0x46,0x73,0x00,0x00,0x00,0x00,0x70,0x43,0x41,0x4c,0x00,0x00,0x00,0x00,0x73,0x43,0x41,0x4c,0x00,0x00,0x00,0x00,0x70,0x48,0x59,0x73,0x00,0x00,0x00,0x00,0x73,0x42,0x49,0x54,0x00,0x00,0x00,0x00,0x73,0x50,0x4c,0x54,0x00,0x00,0x00,0x00,0x73,0x52,0x47,0x42,0x00,0x00,0x00,0x00,0x74,0x45,0x58,0x74,0x00,0x00,0x00,0x00,0x74,0x49,0x4d,0x45,0x00,0x00,0x00,0x00,0x74,0x52,0x4e,0x53,0x00,0x00,0x00,0x00,0x7a,0x54,0x58,0x74,0x00,
-  }
-};
diff --git a/minui21/graphics.c b/minui21/graphics.c
deleted file mode 100644
index 580af29..0000000
--- a/minui21/graphics.c
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <stdbool.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-
-#include <linux/fb.h>
-#include <linux/kd.h>
-
-#include <pixelflinger/pixelflinger.h>
-
-#ifdef BOARD_USE_CUSTOM_RECOVERY_FONT
-#include BOARD_USE_CUSTOM_RECOVERY_FONT
-#else
-#include "font_10x18.h"
-#endif
-
-#include "minui.h"
-
-#if defined(RECOVERY_BGRA)
-#define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888
-#define PIXEL_SIZE   4
-#elif defined(RECOVERY_RGBA)
-#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGBA_8888
-#define PIXEL_SIZE   4
-#elif defined(RECOVERY_RGBX)
-#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGBX_8888
-#define PIXEL_SIZE   4
-#else
-#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGB_565
-#define PIXEL_SIZE   2
-#endif
-
-#define NUM_BUFFERS 2
-
-typedef struct {
-    GGLSurface* texture;
-    unsigned cwidth;
-    unsigned cheight;
-} GRFont;
-
-static GRFont *gr_font = 0;
-static GGLContext *gr_context = 0;
-static GGLSurface gr_font_texture;
-static GGLSurface gr_framebuffer[NUM_BUFFERS];
-static GGLSurface gr_mem_surface;
-static unsigned gr_active_fb = 0;
-static unsigned double_buffering = 0;
-static int overscan_percent = OVERSCAN_PERCENT;
-static int overscan_offset_x = 0;
-static int overscan_offset_y = 0;
-
-static int gr_fb_fd = -1;
-static int gr_vt_fd = -1;
-
-static struct fb_var_screeninfo vi;
-static struct fb_fix_screeninfo fi;
-
-static bool has_overlay = false;
-
-bool target_has_overlay(char *version);
-int free_ion_mem(void);
-int alloc_ion_mem(unsigned int size);
-int allocate_overlay(int fd, GGLSurface gr_fb[]);
-int free_overlay(int fd);
-int overlay_display_frame(int fd, GGLubyte* data, size_t size);
-
-static int get_framebuffer(GGLSurface *fb)
-{
-    int fd;
-    void *bits;
-
-    fd = open("/dev/graphics/fb0", O_RDWR);
-    if (fd < 0) {
-        perror("cannot open fb0");
-        return -1;
-    }
-
-    if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) {
-        perror("failed to get fb0 info");
-        close(fd);
-        return -1;
-    }
-
-    vi.bits_per_pixel = PIXEL_SIZE * 8;
-    if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) {
-      vi.red.offset     = 8;
-      vi.red.length     = 8;
-      vi.green.offset   = 16;
-      vi.green.length   = 8;
-      vi.blue.offset    = 24;
-      vi.blue.length    = 8;
-      vi.transp.offset  = 0;
-      vi.transp.length  = 8;
-    } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBA_8888) {
-      vi.red.offset     = 0;
-      vi.red.length     = 8;
-      vi.green.offset   = 8;
-      vi.green.length   = 8;
-      vi.blue.offset    = 16;
-      vi.blue.length    = 8;
-      vi.transp.offset  = 24;
-      vi.transp.length  = 8;
-    } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) {
-      vi.red.offset     = 24;
-      vi.red.length     = 8;
-      vi.green.offset   = 16;
-      vi.green.length   = 8;
-      vi.blue.offset    = 8;
-      vi.blue.length    = 8;
-      vi.transp.offset  = 0;
-      vi.transp.length  = 8;
-    } else { /* RGB565*/
-      vi.red.offset     = 11;
-      vi.red.length     = 5;
-      vi.green.offset   = 5;
-      vi.green.length   = 6;
-      vi.blue.offset    = 0;
-      vi.blue.length    = 5;
-      vi.transp.offset  = 0;
-      vi.transp.length  = 0;
-    }
-    if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
-        perror("failed to put fb0 info");
-        close(fd);
-        return -1;
-    }
-
-    if (ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) {
-        perror("failed to get fb0 info");
-        close(fd);
-        return -1;
-    }
-
-    has_overlay = target_has_overlay(fi.id);
-
-    if (!has_overlay) {
-        bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-        if (bits == MAP_FAILED) {
-            perror("failed to mmap framebuffer");
-            close(fd);
-            return -1;
-        }
-    }
-
-    overscan_offset_x = vi.xres * overscan_percent / 100;
-    overscan_offset_y = vi.yres * overscan_percent / 100;
-
-    fb->version = sizeof(*fb);
-    fb->width = vi.xres;
-    fb->height = vi.yres;
-    fb->stride = fi.line_length/PIXEL_SIZE;
-    fb->format = PIXEL_FORMAT;
-    if (!has_overlay) {
-        fb->data = bits;
-        memset(fb->data, 0, vi.yres * fi.line_length);
-    }
-
-    fb++;
-
-    /* check if we can use double buffering */
-    if (vi.yres * fi.line_length * 2 > fi.smem_len)
-        return fd;
-
-    double_buffering = 1;
-
-    fb->version = sizeof(*fb);
-    fb->width = vi.xres;
-    fb->height = vi.yres;
-    fb->stride = fi.line_length/PIXEL_SIZE;
-    fb->format = PIXEL_FORMAT;
-    if (!has_overlay) {
-        fb->data = (void*) (((unsigned long) bits) + vi.yres * fi.line_length);
-        memset(fb->data, 0, vi.yres * fi.line_length);
-    }
-
-    return fd;
-}
-
-static void get_memory_surface(GGLSurface* ms) {
-  ms->version = sizeof(*ms);
-  ms->width = vi.xres;
-  ms->height = vi.yres;
-  ms->stride = fi.line_length/PIXEL_SIZE;
-  ms->data = malloc(fi.line_length * vi.yres);
-  ms->format = PIXEL_FORMAT;
-}
-
-static void set_active_framebuffer(unsigned n)
-{
-    if (n > 1 || !double_buffering) return;
-    vi.yres_virtual = vi.yres * NUM_BUFFERS;
-    vi.yoffset = n * vi.yres;
-    vi.bits_per_pixel = PIXEL_SIZE * 8;
-    if (ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
-        perror("active fb swap failed");
-    }
-}
-
-void gr_flip(void)
-{
-    if (-EINVAL == overlay_display_frame(gr_fb_fd, gr_mem_surface.data,
-                                         (fi.line_length * vi.yres))) {
-        GGLContext *gl = gr_context;
-
-        /* swap front and back buffers */
-        if (double_buffering)
-            gr_active_fb = (gr_active_fb + 1) & 1;
-
-        /* copy data from the in-memory surface to the buffer we're about
-         * to make active. */
-        memcpy(gr_framebuffer[gr_active_fb].data, gr_mem_surface.data,
-               fi.line_length * vi.yres);
-
-        /* inform the display driver */
-        set_active_framebuffer(gr_active_fb);
-    }
-}
-
-void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
-{
-    GGLContext *gl = gr_context;
-    GGLint color[4];
-    color[0] = ((r << 8) | r) + 1;
-    color[1] = ((g << 8) | g) + 1;
-    color[2] = ((b << 8) | b) + 1;
-    color[3] = ((a << 8) | a) + 1;
-    gl->color4xv(gl, color);
-}
-
-int gr_measure(const char *s)
-{
-    return gr_font->cwidth * strlen(s);
-}
-
-void gr_font_size(int *x, int *y)
-{
-    *x = gr_font->cwidth;
-    *y = gr_font->cheight;
-}
-
-int gr_text(int x, int y, const char *s, ...)
-{
-    return gr_text_impl(x, y, s, 0);
-}
-
-int gr_text_impl(int x, int y, const char *s, int bold)
-{
-    GGLContext *gl = gr_context;
-    GRFont *font = gr_font;
-    unsigned off;
-
-    if (!font->texture) return x;
-
-    bold = bold && (font->texture->height != font->cheight);
-
-    x += overscan_offset_x;
-    y += overscan_offset_y;
-
-    gl->bindTexture(gl, font->texture);
-    gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);
-    gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
-    gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
-    gl->enable(gl, GGL_TEXTURE_2D);
-
-    while((off = *s++)) {
-        off -= 32;
-        if (off < 96) {
-            gl->texCoord2i(gl, (off * font->cwidth) - x,
-                           (bold ? font->cheight : 0) - y);
-            gl->recti(gl, x, y, x + font->cwidth, y + font->cheight);
-        }
-        x += font->cwidth;
-    }
-
-    return x;
-}
-
-void gr_texticon(int x, int y, gr_surface icon) {
-    if (gr_context == NULL || icon == NULL) {
-        return;
-    }
-    GGLContext* gl = gr_context;
-
-    x += overscan_offset_x;
-    y += overscan_offset_y;
-
-    gl->bindTexture(gl, (GGLSurface*) icon);
-    gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);
-    gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
-    gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
-    gl->enable(gl, GGL_TEXTURE_2D);
-
-    int w = gr_get_width(icon);
-    int h = gr_get_height(icon);
-
-    gl->texCoord2i(gl, -x, -y);
-    gl->recti(gl, x, y, x+gr_get_width(icon), y+gr_get_height(icon));
-}
-
-void gr_fill(int x1, int y1, int x2, int y2)
-{
-    x1 += overscan_offset_x;
-    y1 += overscan_offset_y;
-
-    x2 += overscan_offset_x;
-    y2 += overscan_offset_y;
-
-    GGLContext *gl = gr_context;
-    gl->disable(gl, GGL_TEXTURE_2D);
-    gl->recti(gl, x1, y1, x2, y2);
-}
-
-void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy) {
-    if (gr_context == NULL || source == NULL) {
-        return;
-    }
-    GGLContext *gl = gr_context;
-
-    dx += overscan_offset_x;
-    dy += overscan_offset_y;
-
-    gl->bindTexture(gl, (GGLSurface*) source);
-    gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);
-    gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
-    gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
-    gl->enable(gl, GGL_TEXTURE_2D);
-    gl->texCoord2i(gl, sx - dx, sy - dy);
-    gl->recti(gl, dx, dy, dx + w, dy + h);
-}
-
-unsigned int gr_get_width(gr_surface surface) {
-    if (surface == NULL) {
-        return 0;
-    }
-    return ((GGLSurface*) surface)->width;
-}
-
-unsigned int gr_get_height(gr_surface surface) {
-    if (surface == NULL) {
-        return 0;
-    }
-    return ((GGLSurface*) surface)->height;
-}
-
-static void gr_init_font(void)
-{
-    gr_font = calloc(sizeof(*gr_font), 1);
-
-    int res = res_create_surface("font", (void**)&(gr_font->texture));
-    if (res == 0) {
-        // The font image should be a 96x2 array of character images.  The
-        // columns are the printable ASCII characters 0x20 - 0x7f.  The
-        // top row is regular text; the bottom row is bold.
-        gr_font->cwidth = gr_font->texture->width / 96;
-        gr_font->cheight = gr_font->texture->height / 2;
-    } else {
-        printf("failed to read font: res=%d\n", res);
-
-        // fall back to the compiled-in font.
-        gr_font->texture = malloc(sizeof(*gr_font->texture));
-        gr_font->texture->width = font.width;
-        gr_font->texture->height = font.height;
-        gr_font->texture->stride = font.width;
-
-        unsigned char* bits = malloc(font.width * font.height);
-        gr_font->texture->data = (void*) bits;
-
-        unsigned char data;
-        unsigned char* in = font.rundata;
-        while((data = *in++)) {
-            memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f);
-            bits += (data & 0x7f);
-        }
-
-        gr_font->cwidth = font.cwidth;
-        gr_font->cheight = font.cheight;
-    }
-
-    // interpret the grayscale as alpha
-    gr_font->texture->format = GGL_PIXEL_FORMAT_A_8;
-}
-
-int gr_init(void)
-{
-    gglInit(&gr_context);
-    GGLContext *gl = gr_context;
-
-    gr_init_font();
-    gr_vt_fd = open("/dev/tty0", O_RDWR | O_SYNC);
-    if (gr_vt_fd < 0) {
-        // This is non-fatal; post-Cupcake kernels don't have tty0.
-        perror("can't open /dev/tty0");
-    } else if (ioctl(gr_vt_fd, KDSETMODE, (void*) KD_GRAPHICS)) {
-        // However, if we do open tty0, we expect the ioctl to work.
-        perror("failed KDSETMODE to KD_GRAPHICS on tty0");
-        gr_exit();
-        return -1;
-    }
-
-    gr_fb_fd = get_framebuffer(gr_framebuffer);
-    if (gr_fb_fd < 0) {
-        gr_exit();
-        return -1;
-    }
-
-    get_memory_surface(&gr_mem_surface);
-
-    fprintf(stderr, "framebuffer: fd %d (%d x %d)\n",
-            gr_fb_fd, gr_framebuffer[0].width, gr_framebuffer[0].height);
-
-    /* start with 0 as front (displayed) and 1 as back (drawing) */
-    gr_active_fb = 0;
-    if (!has_overlay)
-        set_active_framebuffer(0);
-    gl->colorBuffer(gl, &gr_mem_surface);
-
-    gl->activeTexture(gl, 0);
-    gl->enable(gl, GGL_BLEND);
-    gl->blendFunc(gl, GGL_SRC_ALPHA, GGL_ONE_MINUS_SRC_ALPHA);
-
-    gr_fb_blank(true);
-    gr_fb_blank(false);
-
-    if (!alloc_ion_mem(fi.line_length * vi.yres))
-        allocate_overlay(gr_fb_fd, gr_framebuffer);
-
-    return 0;
-}
-
-void gr_exit(void)
-{
-    free_overlay(gr_fb_fd);
-    free_ion_mem();
-
-    close(gr_fb_fd);
-    gr_fb_fd = -1;
-
-    free(gr_mem_surface.data);
-
-    ioctl(gr_vt_fd, KDSETMODE, (void*) KD_TEXT);
-    close(gr_vt_fd);
-    gr_vt_fd = -1;
-}
-
-int gr_fb_width(void)
-{
-    return gr_framebuffer[0].width - 2*overscan_offset_x;
-}
-
-int gr_fb_height(void)
-{
-    return gr_framebuffer[0].height - 2*overscan_offset_y;
-}
-
-gr_pixel *gr_fb_data(void)
-{
-    return (unsigned short *) gr_mem_surface.data;
-}
-
-void gr_fb_blank(bool blank)
-{
-#if defined(TW_NO_SCREEN_BLANK) && defined(TW_BRIGHTNESS_PATH) && defined(TW_MAX_BRIGHTNESS)
-    int fd;
-    char brightness[4];
-    snprintf(brightness, 4, "%03d", TW_MAX_BRIGHTNESS/2);
-
-    fd = open(TW_BRIGHTNESS_PATH, O_RDWR);
-    if (fd < 0) {
-        perror("cannot open LCD backlight");
-        return;
-    }
-    write(fd, blank ? "000" : brightness, 3);
-    close(fd);
-#else
-    int ret;
-    if (blank)
-        free_overlay(gr_fb_fd);
-
-    ret = ioctl(gr_fb_fd, FBIOBLANK, blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK);
-    if (ret < 0)
-        perror("ioctl(): blank");
-
-    if (!blank)
-        allocate_overlay(gr_fb_fd, gr_framebuffer);
-#endif
-}
-
-void gr_get_memory_surface(gr_surface surface)
-{
-    get_memory_surface( (GGLSurface*) surface);
-}
-
-// These are new graphics functions from 5.0 that were not available in
-// 4.4 that are required by charger and healthd
-void gr_clear()
-{
-	return;
-}
-
diff --git a/minui21/graphics_overlay.c b/minui21/graphics_overlay.c
deleted file mode 100644
index c42e9c1..0000000
--- a/minui21/graphics_overlay.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (c) 2013, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <stdbool.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-
-#include <linux/fb.h>
-#include <linux/kd.h>
-
-#ifdef MSM_BSP
-#include <linux/msm_mdp.h>
-#include <linux/msm_ion.h>
-#endif
-
-#include <pixelflinger/pixelflinger.h>
-
-#include "minui.h"
-
-#define MDP_V4_0 400
-
-#ifdef MSM_BSP
-#define ALIGN(x, align) (((x) + ((align)-1)) & ~((align)-1))
-
-typedef struct {
-    unsigned char *mem_buf;
-    int size;
-    int ion_fd;
-    int mem_fd;
-    struct ion_handle_data handle_data;
-} memInfo;
-
-static int overlay_id = MSMFB_NEW_REQUEST;
-static memInfo mem_info;
-
-static int map_mdp_pixel_format()
-{
-    int format = MDP_RGB_565;
-#if defined(RECOVERY_BGRA)
-    format = MDP_BGRA_8888;
-#elif defined(RECOVERY_RGBA)
-    format = MDP_RGBA_8888;
-#elif defined(RECOVERY_RGBX)
-    format = MDP_RGBA_8888;
-#endif
-    return format;
-}
-
-static bool overlay_supported = false;
-
-bool target_has_overlay(char *version)
-{
-    int ret;
-    int mdp_version;
-
-    if (strlen(version) >= 8) {
-        if(!strncmp(version, "msmfb", strlen("msmfb"))) {
-            char str_ver[4];
-            memcpy(str_ver, version + strlen("msmfb"), 3);
-            str_ver[3] = '\0';
-            mdp_version = atoi(str_ver);
-            if (mdp_version >= MDP_V4_0) {
-                overlay_supported = true;
-            }
-        } else if (!strncmp(version, "mdssfb", strlen("mdssfb"))) {
-            overlay_supported = true;
-        }
-    }
-
-    return overlay_supported;
-}
-
-int free_ion_mem(void) {
-    if (!overlay_supported)
-        return -EINVAL;
-
-    int ret = 0;
-
-    if (mem_info.mem_buf)
-        munmap(mem_info.mem_buf, mem_info.size);
-
-    if (mem_info.ion_fd >= 0) {
-        ret = ioctl(mem_info.ion_fd, ION_IOC_FREE, &mem_info.handle_data);
-        if (ret < 0)
-            perror("free_mem failed ");
-    }
-
-    if (mem_info.mem_fd >= 0)
-        close(mem_info.mem_fd);
-    if (mem_info.ion_fd >= 0)
-        close(mem_info.ion_fd);
-
-    memset(&mem_info, 0, sizeof(mem_info));
-    mem_info.mem_fd = -1;
-    mem_info.ion_fd = -1;
-    return 0;
-}
-
-int alloc_ion_mem(unsigned int size)
-{
-    if (!overlay_supported)
-        return -EINVAL;
-    int result;
-    struct ion_fd_data fd_data;
-    struct ion_allocation_data ionAllocData;
-
-    mem_info.ion_fd = open("/dev/ion", O_RDWR|O_DSYNC);
-    if (mem_info.ion_fd < 0) {
-        perror("ERROR: Can't open ion ");
-        return -errno;
-    }
-
-    ionAllocData.flags = 0;
-    ionAllocData.len = size;
-    ionAllocData.align = sysconf(_SC_PAGESIZE);
-#ifdef NEW_ION_HEAP
-    ionAllocData.heap_id_mask =
-#else
-    ionAllocData.heap_mask =
-#endif
-            ION_HEAP(ION_IOMMU_HEAP_ID) |
-            ION_HEAP(ION_SYSTEM_CONTIG_HEAP_ID);
-
-    result = ioctl(mem_info.ion_fd, ION_IOC_ALLOC,  &ionAllocData);
-    if(result){
-        perror("ION_IOC_ALLOC Failed ");
-        close(mem_info.ion_fd);
-        return result;
-    }
-
-    fd_data.handle = ionAllocData.handle;
-    mem_info.handle_data.handle = ionAllocData.handle;
-    result = ioctl(mem_info.ion_fd, ION_IOC_MAP, &fd_data);
-    if (result) {
-        perror("ION_IOC_MAP Failed ");
-        free_ion_mem();
-        return result;
-    }
-    mem_info.mem_buf = (unsigned char *)mmap(NULL, size, PROT_READ |
-                PROT_WRITE, MAP_SHARED, fd_data.fd, 0);
-    mem_info.mem_fd = fd_data.fd;
-
-    if (!mem_info.mem_buf) {
-        perror("ERROR: mem_buf MAP_FAILED ");
-        free_ion_mem();
-        return -ENOMEM;
-    }
-
-    return 0;
-}
-
-int allocate_overlay(int fd, GGLSurface gr_fb[])
-{
-    if (!overlay_supported)
-        return -EINVAL;
-
-    struct mdp_overlay overlay;
-    int ret = 0;
-
-    memset(&overlay, 0 , sizeof (struct mdp_overlay));
-
-    /* Fill Overlay Data */
-
-    overlay.src.width  = ALIGN(gr_fb[0].width, 32);
-    overlay.src.height = gr_fb[0].height;
-    overlay.src.format = map_mdp_pixel_format();
-    overlay.src_rect.w = gr_fb[0].width;
-    overlay.src_rect.h = gr_fb[0].height;
-    overlay.dst_rect.w = gr_fb[0].width;
-    overlay.dst_rect.h = gr_fb[0].height;
-    overlay.alpha = 0xFF;
-    overlay.transp_mask = MDP_TRANSP_NOP;
-    overlay.id = MSMFB_NEW_REQUEST;
-    ret = ioctl(fd, MSMFB_OVERLAY_SET, &overlay);
-    if (ret < 0) {
-        perror("Overlay Set Failed");
-        return ret;
-    }
-
-    overlay_id = overlay.id;
-    return 0;
-}
-
-int free_overlay(int fd)
-{
-    if (!overlay_supported)
-        return -EINVAL;
-
-    int ret = 0;
-    struct mdp_display_commit ext_commit;
-
-    if (overlay_id != MSMFB_NEW_REQUEST) {
-        ret = ioctl(fd, MSMFB_OVERLAY_UNSET, &overlay_id);
-        if (ret) {
-            perror("Overlay Unset Failed");
-            overlay_id = MSMFB_NEW_REQUEST;
-            return ret;
-        }
-
-        memset(&ext_commit, 0, sizeof(struct mdp_display_commit));
-        ext_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY;
-        ext_commit.wait_for_finish = 1;
-        ret = ioctl(fd, MSMFB_DISPLAY_COMMIT, &ext_commit);
-        if (ret < 0) {
-            perror("ERROR: Clear MSMFB_DISPLAY_COMMIT failed!");
-            overlay_id = MSMFB_NEW_REQUEST;
-            return ret;
-        }
-
-        overlay_id = MSMFB_NEW_REQUEST;
-    }
-    return 0;
-}
-
-int overlay_display_frame(int fd, GGLubyte* data, size_t size)
-{
-    if (!overlay_supported)
-        return -EINVAL;
-    int ret = 0;
-    struct msmfb_overlay_data ovdata;
-    struct mdp_display_commit ext_commit;
-
-    if (overlay_id == MSMFB_NEW_REQUEST) {
-        perror("display_frame failed, no overlay\n");
-        return 0;
-    }
-
-    memcpy(mem_info.mem_buf, data, size);
-
-    memset(&ovdata, 0, sizeof(struct msmfb_overlay_data));
-
-    ovdata.id = overlay_id;
-    ovdata.data.flags = 0;
-    ovdata.data.offset = 0;
-    ovdata.data.memory_id = mem_info.mem_fd;
-    ret = ioctl(fd, MSMFB_OVERLAY_PLAY, &ovdata);
-    if (ret < 0) {
-        perror("overlay_display_frame failed, overlay play Failed\n");
-        return 0;
-    }
-
-    memset(&ext_commit, 0, sizeof(struct mdp_display_commit));
-    ext_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY;
-    ext_commit.wait_for_finish = 1;
-    ret = ioctl(fd, MSMFB_DISPLAY_COMMIT, &ext_commit);
-    if (ret < 0) {
-        perror("overlay_display_frame failed, overlay commit Failed\n!");
-        return 0;
-    }
-
-    return 0;
-}
-
-#else
-
-bool target_has_overlay(char *version) {
-    return false;
-}
-
-int free_ion_mem(void) {
-    return -EINVAL;
-}
-
-int alloc_ion_mem(unsigned int size)
-{
-    return -EINVAL;
-}
-
-int allocate_overlay(int fd, GGLSurface gr_fb[])
-{
-    return -EINVAL;
-}
-
-int free_overlay(int fd)
-{
-    return -EINVAL;
-}
-
-int overlay_display_frame(int fd, GGLubyte* data, size_t size)
-{
-    return -EINVAL;
-}
-
-#endif //#ifdef MSM_BSP
diff --git a/minui21/include/linux/msm_ion.h b/minui21/include/linux/msm_ion.h
deleted file mode 100644
index 121a5a7..0000000
--- a/minui21/include/linux/msm_ion.h
+++ /dev/null
@@ -1,157 +0,0 @@
-#ifndef _LINUX_MSM_ION_H
-#define _LINUX_MSM_ION_H
-
-#include <linux/ion.h>
-
-/*enum msm_ion_heap_types {
-	ION_HEAP_TYPE_MSM_START = ION_HEAP_TYPE_CUSTOM + 1,
-	ION_HEAP_TYPE_IOMMU = ION_HEAP_TYPE_MSM_START,
-	ION_HEAP_TYPE_DMA,
-	ION_HEAP_TYPE_CP,
-	ION_HEAP_TYPE_SECURE_DMA,
-	ION_HEAP_TYPE_REMOVED,
-};*/
-
-/**
- * These are the only ids that should be used for Ion heap ids.
- * The ids listed are the order in which allocation will be attempted
- * if specified. Don't swap the order of heap ids unless you know what
- * you are doing!
- * Id's are spaced by purpose to allow new Id's to be inserted in-between (for
- * possible fallbacks)
- */
-
-enum ion_heap_ids {
-	INVALID_HEAP_ID = -1,
-	ION_CP_MM_HEAP_ID = 8,
-	ION_CP_MFC_HEAP_ID = 12,
-	ION_CP_WB_HEAP_ID = 16, /* 8660 only */
-	ION_CAMERA_HEAP_ID = 20, /* 8660 only */
-	ION_SYSTEM_CONTIG_HEAP_ID = 21,
-	ION_ADSP_HEAP_ID = 22,
-	ION_PIL1_HEAP_ID = 23, /* Currently used for other PIL images */
-	ION_SF_HEAP_ID = 24,
-	ION_IOMMU_HEAP_ID = 25,
-	ION_PIL2_HEAP_ID = 26, /* Currently used for modem firmware images */
-	ION_QSECOM_HEAP_ID = 27,
-	ION_AUDIO_HEAP_ID = 28,
-
-	ION_MM_FIRMWARE_HEAP_ID = 29,
-	ION_SYSTEM_HEAP_ID = 30,
-
-	ION_HEAP_ID_RESERVED = 31 /** Bit reserved for ION_FLAG_SECURE flag */
-};
-
-/*enum ion_fixed_position {
-	NOT_FIXED,
-	FIXED_LOW,
-	FIXED_MIDDLE,
-	FIXED_HIGH,
-};*/
-
-/*enum cp_mem_usage {
-	VIDEO_BITSTREAM = 0x1,
-	VIDEO_PIXEL = 0x2,
-	VIDEO_NONPIXEL = 0x3,
-	MAX_USAGE = 0x4,
-	UNKNOWN = 0x7FFFFFFF,
-};*/
-
-#define ION_HEAP_CP_MASK		(1 << ION_HEAP_TYPE_CP)
-#define ION_HEAP_TYPE_DMA_MASK         (1 << ION_HEAP_TYPE_DMA)
-
-/**
- * Flag to use when allocating to indicate that a heap is secure.
- */
-#define ION_FLAG_SECURE (1 << ION_HEAP_ID_RESERVED)
-
-/**
- * Flag for clients to force contiguous memort allocation
- *
- * Use of this flag is carefully monitored!
- */
-#define ION_FLAG_FORCE_CONTIGUOUS (1 << 30)
-
-/*
- * Used in conjunction with heap which pool memory to force an allocation
- * to come from the page allocator directly instead of from the pool allocation
- */
-#define ION_FLAG_POOL_FORCE_ALLOC (1 << 16)
-
-/**
-* Deprecated! Please use the corresponding ION_FLAG_*
-*/
-#define ION_SECURE ION_FLAG_SECURE
-#define ION_FORCE_CONTIGUOUS ION_FLAG_FORCE_CONTIGUOUS
-
-/**
- * Macro should be used with ion_heap_ids defined above.
- */
-#define ION_HEAP(bit) (1 << (bit))
-
-#define ION_ADSP_HEAP_NAME	"adsp"
-#define ION_VMALLOC_HEAP_NAME	"vmalloc"
-#define ION_KMALLOC_HEAP_NAME	"kmalloc"
-#define ION_AUDIO_HEAP_NAME	"audio"
-#define ION_SF_HEAP_NAME	"sf"
-#define ION_MM_HEAP_NAME	"mm"
-#define ION_CAMERA_HEAP_NAME	"camera_preview"
-#define ION_IOMMU_HEAP_NAME	"iommu"
-#define ION_MFC_HEAP_NAME	"mfc"
-#define ION_WB_HEAP_NAME	"wb"
-#define ION_MM_FIRMWARE_HEAP_NAME	"mm_fw"
-#define ION_PIL1_HEAP_NAME  "pil_1"
-#define ION_PIL2_HEAP_NAME  "pil_2"
-#define ION_QSECOM_HEAP_NAME	"qsecom"
-
-#define ION_SET_CACHED(__cache)		(__cache | ION_FLAG_CACHED)
-#define ION_SET_UNCACHED(__cache)	(__cache & ~ION_FLAG_CACHED)
-
-#define ION_IS_CACHED(__flags)	((__flags) & ION_FLAG_CACHED)
-
-
-/* struct ion_flush_data - data passed to ion for flushing caches
- *
- * @handle:	handle with data to flush
- * @fd:		fd to flush
- * @vaddr:	userspace virtual address mapped with mmap
- * @offset:	offset into the handle to flush
- * @length:	length of handle to flush
- *
- * Performs cache operations on the handle. If p is the start address
- * of the handle, p + offset through p + offset + length will have
- * the cache operations performed
- */
-struct ion_flush_data {
-	struct ion_handle *handle;
-	int fd;
-	void *vaddr;
-	unsigned int offset;
-	unsigned int length;
-};
-
-#define ION_IOC_MSM_MAGIC 'M'
-
-/**
- * DOC: ION_IOC_CLEAN_CACHES - clean the caches
- *
- * Clean the caches of the handle specified.
- */
-#define ION_IOC_CLEAN_CACHES	_IOWR(ION_IOC_MSM_MAGIC, 0, \
-						struct ion_flush_data)
-/**
- * DOC: ION_IOC_INV_CACHES - invalidate the caches
- *
- * Invalidate the caches of the handle specified.
- */
-#define ION_IOC_INV_CACHES	_IOWR(ION_IOC_MSM_MAGIC, 1, \
-						struct ion_flush_data)
-/**
- * DOC: ION_IOC_CLEAN_INV_CACHES - clean and invalidate the caches
- *
- * Clean and invalidate the caches of the handle specified.
- */
-#define ION_IOC_CLEAN_INV_CACHES	_IOWR(ION_IOC_MSM_MAGIC, 2, \
-						struct ion_flush_data)
-
-#endif
diff --git a/minui21/include/linux/msm_mdp.h b/minui21/include/linux/msm_mdp.h
deleted file mode 100644
index abdcd29..0000000
--- a/minui21/include/linux/msm_mdp.h
+++ /dev/null
@@ -1,992 +0,0 @@
-/* include/linux/msm_mdp.h
- *
- * Copyright (C) 2007 Google Incorporated
- * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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.
- */
-#ifndef _MSM_MDP_H_
-#define _MSM_MDP_H_
-
-#include <linux/types.h>
-#include <linux/fb.h>
-
-#define MSMFB_IOCTL_MAGIC 'm'
-#define MSMFB_GRP_DISP          _IOW(MSMFB_IOCTL_MAGIC, 1, unsigned int)
-#define MSMFB_BLIT              _IOW(MSMFB_IOCTL_MAGIC, 2, unsigned int)
-#define MSMFB_SUSPEND_SW_REFRESHER _IOW(MSMFB_IOCTL_MAGIC, 128, unsigned int)
-#define MSMFB_RESUME_SW_REFRESHER _IOW(MSMFB_IOCTL_MAGIC, 129, unsigned int)
-#define MSMFB_CURSOR _IOW(MSMFB_IOCTL_MAGIC, 130, struct fb_cursor)
-#define MSMFB_SET_LUT _IOW(MSMFB_IOCTL_MAGIC, 131, struct fb_cmap)
-#define MSMFB_HISTOGRAM _IOWR(MSMFB_IOCTL_MAGIC, 132, struct mdp_histogram_data)
-/* new ioctls's for set/get ccs matrix */
-#define MSMFB_GET_CCS_MATRIX  _IOWR(MSMFB_IOCTL_MAGIC, 133, struct mdp_ccs)
-#define MSMFB_SET_CCS_MATRIX  _IOW(MSMFB_IOCTL_MAGIC, 134, struct mdp_ccs)
-#define MSMFB_OVERLAY_SET       _IOWR(MSMFB_IOCTL_MAGIC, 135, \
-						struct mdp_overlay)
-#define MSMFB_OVERLAY_UNSET     _IOW(MSMFB_IOCTL_MAGIC, 136, unsigned int)
-
-#define MSMFB_OVERLAY_PLAY      _IOW(MSMFB_IOCTL_MAGIC, 137, \
-						struct msmfb_overlay_data)
-#define MSMFB_OVERLAY_QUEUE	MSMFB_OVERLAY_PLAY
-
-#define MSMFB_GET_PAGE_PROTECTION _IOR(MSMFB_IOCTL_MAGIC, 138, \
-					struct mdp_page_protection)
-#define MSMFB_SET_PAGE_PROTECTION _IOW(MSMFB_IOCTL_MAGIC, 139, \
-					struct mdp_page_protection)
-#define MSMFB_OVERLAY_GET      _IOR(MSMFB_IOCTL_MAGIC, 140, \
-						struct mdp_overlay)
-#define MSMFB_OVERLAY_PLAY_ENABLE     _IOW(MSMFB_IOCTL_MAGIC, 141, unsigned int)
-#define MSMFB_OVERLAY_BLT       _IOWR(MSMFB_IOCTL_MAGIC, 142, \
-						struct msmfb_overlay_blt)
-#define MSMFB_OVERLAY_BLT_OFFSET     _IOW(MSMFB_IOCTL_MAGIC, 143, unsigned int)
-#define MSMFB_HISTOGRAM_START	_IOR(MSMFB_IOCTL_MAGIC, 144, \
-						struct mdp_histogram_start_req)
-#define MSMFB_HISTOGRAM_STOP	_IOR(MSMFB_IOCTL_MAGIC, 145, unsigned int)
-#define MSMFB_NOTIFY_UPDATE	_IOWR(MSMFB_IOCTL_MAGIC, 146, unsigned int)
-
-#define MSMFB_OVERLAY_3D       _IOWR(MSMFB_IOCTL_MAGIC, 147, \
-						struct msmfb_overlay_3d)
-
-#define MSMFB_MIXER_INFO       _IOWR(MSMFB_IOCTL_MAGIC, 148, \
-						struct msmfb_mixer_info_req)
-#define MSMFB_OVERLAY_PLAY_WAIT _IOWR(MSMFB_IOCTL_MAGIC, 149, \
-						struct msmfb_overlay_data)
-#define MSMFB_WRITEBACK_INIT _IO(MSMFB_IOCTL_MAGIC, 150)
-#define MSMFB_WRITEBACK_START _IO(MSMFB_IOCTL_MAGIC, 151)
-#define MSMFB_WRITEBACK_STOP _IO(MSMFB_IOCTL_MAGIC, 152)
-#define MSMFB_WRITEBACK_QUEUE_BUFFER _IOW(MSMFB_IOCTL_MAGIC, 153, \
-						struct msmfb_data)
-#define MSMFB_WRITEBACK_DEQUEUE_BUFFER _IOW(MSMFB_IOCTL_MAGIC, 154, \
-						struct msmfb_data)
-#define MSMFB_WRITEBACK_TERMINATE _IO(MSMFB_IOCTL_MAGIC, 155)
-#define MSMFB_MDP_PP _IOWR(MSMFB_IOCTL_MAGIC, 156, struct msmfb_mdp_pp)
-#define MSMFB_OVERLAY_VSYNC_CTRL _IOW(MSMFB_IOCTL_MAGIC, 160, unsigned int)
-#define MSMFB_VSYNC_CTRL  _IOW(MSMFB_IOCTL_MAGIC, 161, unsigned int)
-#define MSMFB_BUFFER_SYNC  _IOW(MSMFB_IOCTL_MAGIC, 162, struct mdp_buf_sync)
-#define MSMFB_OVERLAY_COMMIT      _IO(MSMFB_IOCTL_MAGIC, 163)
-#define MSMFB_DISPLAY_COMMIT      _IOW(MSMFB_IOCTL_MAGIC, 164, \
-						struct mdp_display_commit)
-#define MSMFB_METADATA_SET  _IOW(MSMFB_IOCTL_MAGIC, 165, struct msmfb_metadata)
-#define MSMFB_METADATA_GET  _IOW(MSMFB_IOCTL_MAGIC, 166, struct msmfb_metadata)
-#define MSMFB_WRITEBACK_SET_MIRRORING_HINT _IOW(MSMFB_IOCTL_MAGIC, 167, \
-						unsigned int)
-#define MSMFB_ASYNC_BLIT              _IOW(MSMFB_IOCTL_MAGIC, 168, unsigned int)
-
-#define FB_TYPE_3D_PANEL 0x10101010
-#define MDP_IMGTYPE2_START 0x10000
-#define MSMFB_DRIVER_VERSION	0xF9E8D701
-
-enum {
-	NOTIFY_UPDATE_START,
-	NOTIFY_UPDATE_STOP,
-	NOTIFY_UPDATE_POWER_OFF,
-};
-
-enum {
-	NOTIFY_TYPE_NO_UPDATE,
-	NOTIFY_TYPE_SUSPEND,
-	NOTIFY_TYPE_UPDATE,
-};
-
-enum {
-	MDP_RGB_565,      /* RGB 565 planer */
-	MDP_XRGB_8888,    /* RGB 888 padded */
-	MDP_Y_CBCR_H2V2,  /* Y and CbCr, pseudo planer w/ Cb is in MSB */
-	MDP_Y_CBCR_H2V2_ADRENO,
-	MDP_ARGB_8888,    /* ARGB 888 */
-	MDP_RGB_888,      /* RGB 888 planer */
-	MDP_Y_CRCB_H2V2,  /* Y and CrCb, pseudo planer w/ Cr is in MSB */
-	MDP_YCRYCB_H2V1,  /* YCrYCb interleave */
-	MDP_CBYCRY_H2V1,  /* CbYCrY interleave */
-	MDP_Y_CRCB_H2V1,  /* Y and CrCb, pseduo planer w/ Cr is in MSB */
-	MDP_Y_CBCR_H2V1,   /* Y and CrCb, pseduo planer w/ Cr is in MSB */
-	MDP_Y_CRCB_H1V2,
-	MDP_Y_CBCR_H1V2,
-	MDP_RGBA_8888,    /* ARGB 888 */
-	MDP_BGRA_8888,	  /* ABGR 888 */
-	MDP_RGBX_8888,	  /* RGBX 888 */
-	MDP_Y_CRCB_H2V2_TILE,  /* Y and CrCb, pseudo planer tile */
-	MDP_Y_CBCR_H2V2_TILE,  /* Y and CbCr, pseudo planer tile */
-	MDP_Y_CR_CB_H2V2,  /* Y, Cr and Cb, planar */
-	MDP_Y_CR_CB_GH2V2,  /* Y, Cr and Cb, planar aligned to Android YV12 */
-	MDP_Y_CB_CR_H2V2,  /* Y, Cb and Cr, planar */
-	MDP_Y_CRCB_H1V1,  /* Y and CrCb, pseduo planer w/ Cr is in MSB */
-	MDP_Y_CBCR_H1V1,  /* Y and CbCr, pseduo planer w/ Cb is in MSB */
-	MDP_YCRCB_H1V1,   /* YCrCb interleave */
-	MDP_YCBCR_H1V1,   /* YCbCr interleave */
-	MDP_BGR_565,      /* BGR 565 planer */
-	MDP_BGR_888,      /* BGR 888 */
-	MDP_Y_CBCR_H2V2_VENUS,
-	MDP_BGRX_8888,   /* BGRX 8888 */
-	MDP_RGBA_8888_TILE,	/* RGBA 8888 in tile format */
-	MDP_ARGB_8888_TILE,	/* ARGB 8888 in tile format */
-	MDP_ABGR_8888_TILE,	/* ABGR 8888 in tile format */
-	MDP_BGRA_8888_TILE,	/* BGRA 8888 in tile format */
-	MDP_RGBX_8888_TILE,	/* RGBX 8888 in tile format */
-	MDP_XRGB_8888_TILE,	/* XRGB 8888 in tile format */
-	MDP_XBGR_8888_TILE,	/* XBGR 8888 in tile format */
-	MDP_BGRX_8888_TILE,	/* BGRX 8888 in tile format */
-	MDP_YCBYCR_H2V1,  /* YCbYCr interleave */
-	MDP_IMGTYPE_LIMIT,
-	MDP_RGB_BORDERFILL,	/* border fill pipe */
-	MDP_FB_FORMAT = MDP_IMGTYPE2_START,    /* framebuffer format */
-	MDP_IMGTYPE_LIMIT2 /* Non valid image type after this enum */
-};
-
-enum {
-	PMEM_IMG,
-	FB_IMG,
-};
-
-enum {
-	HSIC_HUE = 0,
-	HSIC_SAT,
-	HSIC_INT,
-	HSIC_CON,
-	NUM_HSIC_PARAM,
-};
-
-#define MDSS_MDP_ROT_ONLY		0x80
-#define MDSS_MDP_RIGHT_MIXER		0x100
-#define MDSS_MDP_DUAL_PIPE		0x200
-
-/* mdp_blit_req flag values */
-#define MDP_ROT_NOP 0
-#define MDP_FLIP_LR 0x1
-#define MDP_FLIP_UD 0x2
-#define MDP_ROT_90 0x4
-#define MDP_ROT_180 (MDP_FLIP_UD|MDP_FLIP_LR)
-#define MDP_ROT_270 (MDP_ROT_90|MDP_FLIP_UD|MDP_FLIP_LR)
-#define MDP_DITHER 0x8
-#define MDP_BLUR 0x10
-#define MDP_BLEND_FG_PREMULT 0x20000
-#define MDP_IS_FG 0x40000
-#define MDP_SOLID_FILL 0x0000100
-#define MDP_DEINTERLACE 0x80000000
-#define MDP_SHARPENING  0x40000000
-#define MDP_NO_DMA_BARRIER_START	0x20000000
-#define MDP_NO_DMA_BARRIER_END		0x10000000
-#define MDP_NO_BLIT			0x08000000
-#define MDP_BLIT_WITH_DMA_BARRIERS	0x000
-#define MDP_BLIT_WITH_NO_DMA_BARRIERS    \
-	(MDP_NO_DMA_BARRIER_START | MDP_NO_DMA_BARRIER_END)
-#define MDP_BLIT_SRC_GEM                0x04000000
-#define MDP_BLIT_DST_GEM                0x02000000
-#define MDP_BLIT_NON_CACHED		0x01000000
-#define MDP_OV_PIPE_SHARE		0x00800000
-#define MDP_DEINTERLACE_ODD		0x00400000
-#define MDP_OV_PLAY_NOWAIT		0x00200000
-#define MDP_SOURCE_ROTATED_90		0x00100000
-#define MDP_OVERLAY_PP_CFG_EN		0x00080000
-#define MDP_BACKEND_COMPOSITION		0x00040000
-#define MDP_BORDERFILL_SUPPORTED	0x00010000
-#define MDP_SECURE_OVERLAY_SESSION      0x00008000
-#define MDP_SECURE_DISPLAY_OVERLAY_SESSION	0x00002000
-#define MDP_OV_PIPE_FORCE_DMA		0x00004000
-#define MDP_MEMORY_ID_TYPE_FB		0x00001000
-#define MDP_BWC_EN			0x00000400
-#define MDP_DECIMATION_EN		0x00000800
-#define MDP_TRANSP_NOP 0xffffffff
-#define MDP_ALPHA_NOP 0xff
-
-#define MDP_FB_PAGE_PROTECTION_NONCACHED         (0)
-#define MDP_FB_PAGE_PROTECTION_WRITECOMBINE      (1)
-#define MDP_FB_PAGE_PROTECTION_WRITETHROUGHCACHE (2)
-#define MDP_FB_PAGE_PROTECTION_WRITEBACKCACHE    (3)
-#define MDP_FB_PAGE_PROTECTION_WRITEBACKWACACHE  (4)
-/* Sentinel: Don't use! */
-#define MDP_FB_PAGE_PROTECTION_INVALID           (5)
-/* Count of the number of MDP_FB_PAGE_PROTECTION_... values. */
-#define MDP_NUM_FB_PAGE_PROTECTION_VALUES        (5)
-
-struct mdp_rect {
-	uint32_t x;
-	uint32_t y;
-	uint32_t w;
-	uint32_t h;
-};
-
-struct mdp_img {
-	uint32_t width;
-	uint32_t height;
-	uint32_t format;
-	uint32_t offset;
-	int memory_id;		/* the file descriptor */
-	uint32_t priv;
-};
-
-/*
- * {3x3} + {3} ccs matrix
- */
-
-#define MDP_CCS_RGB2YUV 	0
-#define MDP_CCS_YUV2RGB 	1
-
-#define MDP_CCS_SIZE	9
-#define MDP_BV_SIZE	3
-
-struct mdp_ccs {
-	int direction;			/* MDP_CCS_RGB2YUV or YUV2RGB */
-	uint16_t ccs[MDP_CCS_SIZE];	/* 3x3 color coefficients */
-	uint16_t bv[MDP_BV_SIZE];	/* 1x3 bias vector */
-};
-
-struct mdp_csc {
-	int id;
-	uint32_t csc_mv[9];
-	uint32_t csc_pre_bv[3];
-	uint32_t csc_post_bv[3];
-	uint32_t csc_pre_lv[6];
-	uint32_t csc_post_lv[6];
-};
-
-/* The version of the mdp_blit_req structure so that
- * user applications can selectively decide which functionality
- * to include
- */
-
-#define MDP_BLIT_REQ_VERSION 2
-
-struct color {
-	uint32_t r;
-	uint32_t g;
-	uint32_t b;
-	uint32_t alpha;
-};
-
-struct mdp_blit_req {
-	struct mdp_img src;
-	struct mdp_img dst;
-	struct mdp_rect src_rect;
-	struct mdp_rect dst_rect;
-	struct color const_color;
-	uint32_t alpha;
-	uint32_t transp_mask;
-	uint32_t flags;
-	int sharpening_strength;  /* -127 <--> 127, default 64 */
-};
-
-struct mdp_blit_req_list {
-	uint32_t count;
-	struct mdp_blit_req req[];
-};
-
-#define MSMFB_DATA_VERSION 2
-
-struct msmfb_data {
-	uint32_t offset;
-	int memory_id;
-	int id;
-	uint32_t flags;
-	uint32_t priv;
-	uint32_t iova;
-};
-
-#define MSMFB_NEW_REQUEST -1
-
-struct msmfb_overlay_data {
-	uint32_t id;
-	struct msmfb_data data;
-	uint32_t version_key;
-	struct msmfb_data plane1_data;
-	struct msmfb_data plane2_data;
-	struct msmfb_data dst_data;
-};
-
-struct msmfb_img {
-	uint32_t width;
-	uint32_t height;
-	uint32_t format;
-};
-
-#define MSMFB_WRITEBACK_DEQUEUE_BLOCKING 0x1
-struct msmfb_writeback_data {
-	struct msmfb_data buf_info;
-	struct msmfb_img img;
-};
-
-#define MDP_PP_OPS_ENABLE 0x1
-#define MDP_PP_OPS_READ 0x2
-#define MDP_PP_OPS_WRITE 0x4
-#define MDP_PP_OPS_DISABLE 0x8
-#define MDP_PP_IGC_FLAG_ROM0	0x10
-#define MDP_PP_IGC_FLAG_ROM1	0x20
-
-#define MDSS_PP_DSPP_CFG	0x000
-#define MDSS_PP_SSPP_CFG	0x100
-#define MDSS_PP_LM_CFG	0x200
-#define MDSS_PP_WB_CFG	0x300
-
-#define MDSS_PP_ARG_MASK	0x3C00
-#define MDSS_PP_ARG_NUM		4
-#define MDSS_PP_ARG_SHIFT	10
-#define MDSS_PP_LOCATION_MASK	0x0300
-#define MDSS_PP_LOGICAL_MASK	0x00FF
-
-#define MDSS_PP_ADD_ARG(var, arg) ((var) | (0x1 << (MDSS_PP_ARG_SHIFT + (arg))))
-#define PP_ARG(x, var) ((var) & (0x1 << (MDSS_PP_ARG_SHIFT + (x))))
-#define PP_LOCAT(var) ((var) & MDSS_PP_LOCATION_MASK)
-#define PP_BLOCK(var) ((var) & MDSS_PP_LOGICAL_MASK)
-
-
-struct mdp_qseed_cfg {
-	uint32_t table_num;
-	uint32_t ops;
-	uint32_t len;
-	uint32_t *data;
-};
-
-struct mdp_sharp_cfg {
-	uint32_t flags;
-	uint32_t strength;
-	uint32_t edge_thr;
-	uint32_t smooth_thr;
-	uint32_t noise_thr;
-};
-
-struct mdp_qseed_cfg_data {
-	uint32_t block;
-	struct mdp_qseed_cfg qseed_data;
-};
-
-#define MDP_OVERLAY_PP_CSC_CFG         0x1
-#define MDP_OVERLAY_PP_QSEED_CFG       0x2
-#define MDP_OVERLAY_PP_PA_CFG          0x4
-#define MDP_OVERLAY_PP_IGC_CFG         0x8
-#define MDP_OVERLAY_PP_SHARP_CFG       0x10
-#define MDP_OVERLAY_PP_HIST_CFG        0x20
-#define MDP_OVERLAY_PP_HIST_LUT_CFG    0x40
-
-#define MDP_CSC_FLAG_ENABLE	0x1
-#define MDP_CSC_FLAG_YUV_IN	0x2
-#define MDP_CSC_FLAG_YUV_OUT	0x4
-
-struct mdp_csc_cfg {
-	/* flags for enable CSC, toggling RGB,YUV input/output */
-	uint32_t flags;
-	uint32_t csc_mv[9];
-	uint32_t csc_pre_bv[3];
-	uint32_t csc_post_bv[3];
-	uint32_t csc_pre_lv[6];
-	uint32_t csc_post_lv[6];
-};
-
-struct mdp_csc_cfg_data {
-	uint32_t block;
-	struct mdp_csc_cfg csc_data;
-};
-
-struct mdp_pa_cfg {
-	uint32_t flags;
-	uint32_t hue_adj;
-	uint32_t sat_adj;
-	uint32_t val_adj;
-	uint32_t cont_adj;
-};
-
-struct mdp_igc_lut_data {
-	uint32_t block;
-	uint32_t len, ops;
-	uint32_t *c0_c1_data;
-	uint32_t *c2_data;
-};
-
-struct mdp_histogram_cfg {
-	uint32_t ops;
-	uint32_t block;
-	uint8_t frame_cnt;
-	uint8_t bit_mask;
-	uint16_t num_bins;
-};
-
-struct mdp_hist_lut_data {
-	uint32_t block;
-	uint32_t ops;
-	uint32_t len;
-	uint32_t *data;
-};
-
-struct mdp_overlay_pp_params {
-	uint32_t config_ops;
-	struct mdp_csc_cfg csc_cfg;
-	struct mdp_qseed_cfg qseed_cfg[2];
-	struct mdp_pa_cfg pa_cfg;
-	struct mdp_igc_lut_data igc_cfg;
-	struct mdp_sharp_cfg sharp_cfg;
-	struct mdp_histogram_cfg hist_cfg;
-	struct mdp_hist_lut_data hist_lut_cfg;
-};
-
-/**
- * enum mdss_mdp_blend_op - Different blend operations set by userspace
- *
- * @BLEND_OP_NOT_DEFINED:    No blend operation defined for the layer.
- * @BLEND_OP_OPAQUE:         Apply a constant blend operation. The layer
- *                           would appear opaque in case fg plane alpha is
- *                           0xff.
- * @BLEND_OP_PREMULTIPLIED:  Apply source over blend rule. Layer already has
- *                           alpha pre-multiplication done. If fg plane alpha
- *                           is less than 0xff, apply modulation as well. This
- *                           operation is intended on layers having alpha
- *                           channel.
- * @BLEND_OP_COVERAGE:       Apply source over blend rule. Layer is not alpha
- *                           pre-multiplied. Apply pre-multiplication. If fg
- *                           plane alpha is less than 0xff, apply modulation as
- *                           well.
- * @BLEND_OP_MAX:            Used to track maximum blend operation possible by
- *                           mdp.
- */
-enum mdss_mdp_blend_op {
-	BLEND_OP_NOT_DEFINED = 0,
-	BLEND_OP_OPAQUE,
-	BLEND_OP_PREMULTIPLIED,
-	BLEND_OP_COVERAGE,
-	BLEND_OP_MAX,
-};
-
-#define MAX_PLANES	4
-struct mdp_scale_data {
-	uint8_t enable_pxl_ext;
-
-	int init_phase_x[MAX_PLANES];
-	int phase_step_x[MAX_PLANES];
-	int init_phase_y[MAX_PLANES];
-	int phase_step_y[MAX_PLANES];
-
-	int num_ext_pxls_left[MAX_PLANES];
-	int num_ext_pxls_right[MAX_PLANES];
-	int num_ext_pxls_top[MAX_PLANES];
-	int num_ext_pxls_btm[MAX_PLANES];
-
-	int left_ftch[MAX_PLANES];
-	int left_rpt[MAX_PLANES];
-	int right_ftch[MAX_PLANES];
-	int right_rpt[MAX_PLANES];
-
-	int top_rpt[MAX_PLANES];
-	int btm_rpt[MAX_PLANES];
-	int top_ftch[MAX_PLANES];
-	int btm_ftch[MAX_PLANES];
-
-	uint32_t roi_w[MAX_PLANES];
-};
-
-/**
- * struct mdp_overlay - overlay surface structure
- * @src:	Source image information (width, height, format).
- * @src_rect:	Source crop rectangle, portion of image that will be fetched.
- *		This should always be within boundaries of source image.
- * @dst_rect:	Destination rectangle, the position and size of image on screen.
- *		This should always be within panel boundaries.
- * @z_order:	Blending stage to occupy in display, if multiple layers are
- *		present, highest z_order usually means the top most visible
- *		layer. The range acceptable is from 0-3 to support blending
- *		up to 4 layers.
- * @is_fg:	This flag is used to disable blending of any layers with z_order
- *		less than this overlay. It means that any layers with z_order
- *		less than this layer will not be blended and will be replaced
- *		by the background border color.
- * @alpha:	Used to set plane opacity. The range can be from 0-255, where
- *		0 means completely transparent and 255 means fully opaque.
- * @transp_mask: Color used as color key for transparency. Any pixel in fetched
- *		image matching this color will be transparent when blending.
- *		The color should be in same format as the source image format.
- * @flags:	This is used to customize operation of overlay. See MDP flags
- *		for more information.
- * @user_data:	DEPRECATED* Used to store user application specific information.
- * @bg_color:	Solid color used to fill the overlay surface when no source
- *		buffer is provided.
- * @horz_deci:	Horizontal decimation value, this indicates the amount of pixels
- *		dropped for each pixel that is fetched from a line. The value
- *		given should be power of two of decimation amount.
- *		0: no decimation
- *		1: decimate by 2 (drop 1 pixel for each pixel fetched)
- *		2: decimate by 4 (drop 3 pixels for each pixel fetched)
- *		3: decimate by 8 (drop 7 pixels for each pixel fetched)
- *		4: decimate by 16 (drop 15 pixels for each pixel fetched)
- * @vert_deci:	Vertical decimation value, this indicates the amount of lines
- *		dropped for each line that is fetched from overlay. The value
- *		given should be power of two of decimation amount.
- *		0: no decimation
- *		1: decimation by 2 (drop 1 line for each line fetched)
- *		2: decimation by 4 (drop 3 lines for each line fetched)
- *		3: decimation by 8 (drop 7 lines for each line fetched)
- *		4: decimation by 16 (drop 15 lines for each line fetched)
- * @overlay_pp_cfg: Overlay post processing configuration, for more information
- *		see struct mdp_overlay_pp_params.
- */
-struct mdp_overlay {
-	struct msmfb_img src;
-	struct mdp_rect src_rect;
-	struct mdp_rect dst_rect;
-	uint32_t z_order;	/* stage number */
-	uint32_t is_fg;		/* control alpha & transp */
-	uint32_t alpha;
-	uint32_t blend_op;
-	uint32_t transp_mask;
-	uint32_t flags;
-	uint32_t id;
-	uint32_t user_data[6];
-	uint32_t bg_color;
-	uint8_t horz_deci;
-	uint8_t vert_deci;
-	struct mdp_overlay_pp_params overlay_pp_cfg;
-	struct mdp_scale_data scale;
-};
-
-struct msmfb_overlay_3d {
-	uint32_t is_3d;
-	uint32_t width;
-	uint32_t height;
-};
-
-
-struct msmfb_overlay_blt {
-	uint32_t enable;
-	uint32_t offset;
-	uint32_t width;
-	uint32_t height;
-	uint32_t bpp;
-};
-
-struct mdp_histogram {
-	uint32_t frame_cnt;
-	uint32_t bin_cnt;
-	uint32_t *r;
-	uint32_t *g;
-	uint32_t *b;
-};
-
-enum {
-	DISPLAY_MISR_EDP,
-	DISPLAY_MISR_DSI0,
-	DISPLAY_MISR_DSI1,
-	DISPLAY_MISR_HDMI,
-	DISPLAY_MISR_LCDC,
-	DISPLAY_MISR_ATV,
-	DISPLAY_MISR_DSI_CMD,
-	DISPLAY_MISR_MAX
-};
-
-enum {
-	MISR_OP_NONE,
-	MISR_OP_SFM,
-	MISR_OP_MFM,
-	MISR_OP_BM,
-	MISR_OP_MAX
-};
-
-struct mdp_misr {
-	uint32_t block_id;
-	uint32_t frame_count;
-	uint32_t crc_op_mode;
-	uint32_t crc_value[32];
-};
-
-/*
-
-	mdp_block_type defines the identifiers for pipes in MDP 4.3 and up
-
-	MDP_BLOCK_RESERVED is provided for backward compatibility and is
-	deprecated. It corresponds to DMA_P. So MDP_BLOCK_DMA_P should be used
-	instead.
-
-	MDP_LOGICAL_BLOCK_DISP_0 identifies the display pipe which fb0 uses,
-	same for others.
-
-*/
-
-enum {
-	MDP_BLOCK_RESERVED = 0,
-	MDP_BLOCK_OVERLAY_0,
-	MDP_BLOCK_OVERLAY_1,
-	MDP_BLOCK_VG_1,
-	MDP_BLOCK_VG_2,
-	MDP_BLOCK_RGB_1,
-	MDP_BLOCK_RGB_2,
-	MDP_BLOCK_DMA_P,
-	MDP_BLOCK_DMA_S,
-	MDP_BLOCK_DMA_E,
-	MDP_BLOCK_OVERLAY_2,
-	MDP_LOGICAL_BLOCK_DISP_0 = 0x10,
-	MDP_LOGICAL_BLOCK_DISP_1,
-	MDP_LOGICAL_BLOCK_DISP_2,
-	MDP_BLOCK_MAX,
-};
-
-/*
- * mdp_histogram_start_req is used to provide the parameters for
- * histogram start request
- */
-
-struct mdp_histogram_start_req {
-	uint32_t block;
-	uint8_t frame_cnt;
-	uint8_t bit_mask;
-	uint16_t num_bins;
-};
-
-/*
- * mdp_histogram_data is used to return the histogram data, once
- * the histogram is done/stopped/cance
- */
-
-struct mdp_histogram_data {
-	uint32_t block;
-	uint32_t bin_cnt;
-	uint32_t *c0;
-	uint32_t *c1;
-	uint32_t *c2;
-	uint32_t *extra_info;
-};
-
-struct mdp_pcc_coeff {
-	uint32_t c, r, g, b, rr, gg, bb, rg, gb, rb, rgb_0, rgb_1;
-};
-
-struct mdp_pcc_cfg_data {
-	uint32_t block;
-	uint32_t ops;
-	struct mdp_pcc_coeff r, g, b;
-};
-
-#define MDP_GAMUT_TABLE_NUM		8
-
-enum {
-	mdp_lut_igc,
-	mdp_lut_pgc,
-	mdp_lut_hist,
-	mdp_lut_max,
-};
-
-struct mdp_ar_gc_lut_data {
-	uint32_t x_start;
-	uint32_t slope;
-	uint32_t offset;
-};
-
-struct mdp_pgc_lut_data {
-	uint32_t block;
-	uint32_t flags;
-	uint8_t num_r_stages;
-	uint8_t num_g_stages;
-	uint8_t num_b_stages;
-	struct mdp_ar_gc_lut_data *r_data;
-	struct mdp_ar_gc_lut_data *g_data;
-	struct mdp_ar_gc_lut_data *b_data;
-};
-
-
-struct mdp_lut_cfg_data {
-	uint32_t lut_type;
-	union {
-		struct mdp_igc_lut_data igc_lut_data;
-		struct mdp_pgc_lut_data pgc_lut_data;
-		struct mdp_hist_lut_data hist_lut_data;
-	} data;
-};
-
-struct mdp_bl_scale_data {
-	uint32_t min_lvl;
-	uint32_t scale;
-};
-
-struct mdp_pa_cfg_data {
-	uint32_t block;
-	struct mdp_pa_cfg pa_data;
-};
-
-struct mdp_dither_cfg_data {
-	uint32_t block;
-	uint32_t flags;
-	uint32_t g_y_depth;
-	uint32_t r_cr_depth;
-	uint32_t b_cb_depth;
-};
-
-struct mdp_gamut_cfg_data {
-	uint32_t block;
-	uint32_t flags;
-	uint32_t gamut_first;
-	uint32_t tbl_size[MDP_GAMUT_TABLE_NUM];
-	uint16_t *r_tbl[MDP_GAMUT_TABLE_NUM];
-	uint16_t *g_tbl[MDP_GAMUT_TABLE_NUM];
-	uint16_t *b_tbl[MDP_GAMUT_TABLE_NUM];
-};
-
-struct mdp_calib_config_data {
-	uint32_t ops;
-	uint32_t addr;
-	uint32_t data;
-};
-
-struct mdp_calib_config_buffer {
-	uint32_t ops;
-	uint32_t size;
-	uint32_t *buffer;
-};
-
-struct mdp_calib_dcm_state {
-	uint32_t ops;
-	uint32_t dcm_state;
-};
-
-enum {
-	DCM_UNINIT,
-	DCM_UNBLANK,
-	DCM_ENTER,
-	DCM_EXIT,
-	DCM_BLANK,
-};
-
-#define MDSS_MAX_BL_BRIGHTNESS 255
-#define AD_BL_LIN_LEN (MDSS_MAX_BL_BRIGHTNESS + 1)
-
-#define MDSS_AD_MODE_AUTO_BL	0x0
-#define MDSS_AD_MODE_AUTO_STR	0x1
-#define MDSS_AD_MODE_TARG_STR	0x3
-#define MDSS_AD_MODE_MAN_STR	0x7
-#define MDSS_AD_MODE_CALIB	0xF
-
-#define MDP_PP_AD_INIT	0x10
-#define MDP_PP_AD_CFG	0x20
-
-struct mdss_ad_init {
-	uint32_t asym_lut[33];
-	uint32_t color_corr_lut[33];
-	uint8_t i_control[2];
-	uint16_t black_lvl;
-	uint16_t white_lvl;
-	uint8_t var;
-	uint8_t limit_ampl;
-	uint8_t i_dither;
-	uint8_t slope_max;
-	uint8_t slope_min;
-	uint8_t dither_ctl;
-	uint8_t format;
-	uint8_t auto_size;
-	uint16_t frame_w;
-	uint16_t frame_h;
-	uint8_t logo_v;
-	uint8_t logo_h;
-	uint32_t bl_lin_len;
-	uint32_t *bl_lin;
-	uint32_t *bl_lin_inv;
-};
-
-#define MDSS_AD_BL_CTRL_MODE_EN 1
-#define MDSS_AD_BL_CTRL_MODE_DIS 0
-struct mdss_ad_cfg {
-	uint32_t mode;
-	uint32_t al_calib_lut[33];
-	uint16_t backlight_min;
-	uint16_t backlight_max;
-	uint16_t backlight_scale;
-	uint16_t amb_light_min;
-	uint16_t filter[2];
-	uint16_t calib[4];
-	uint8_t strength_limit;
-	uint8_t t_filter_recursion;
-	uint16_t stab_itr;
-	uint32_t bl_ctrl_mode;
-};
-
-/* ops uses standard MDP_PP_* flags */
-struct mdss_ad_init_cfg {
-	uint32_t ops;
-	union {
-		struct mdss_ad_init init;
-		struct mdss_ad_cfg cfg;
-	} params;
-};
-
-/* mode uses MDSS_AD_MODE_* flags */
-struct mdss_ad_input {
-	uint32_t mode;
-	union {
-		uint32_t amb_light;
-		uint32_t strength;
-		uint32_t calib_bl;
-	} in;
-	uint32_t output;
-};
-
-#define MDSS_CALIB_MODE_BL	0x1
-struct mdss_calib_cfg {
-	uint32_t ops;
-	uint32_t calib_mask;
-};
-
-enum {
-	mdp_op_pcc_cfg,
-	mdp_op_csc_cfg,
-	mdp_op_lut_cfg,
-	mdp_op_qseed_cfg,
-	mdp_bl_scale_cfg,
-	mdp_op_pa_cfg,
-	mdp_op_dither_cfg,
-	mdp_op_gamut_cfg,
-	mdp_op_calib_cfg,
-	mdp_op_ad_cfg,
-	mdp_op_ad_input,
-	mdp_op_calib_mode,
-	mdp_op_calib_buffer,
-	mdp_op_calib_dcm_state,
-	mdp_op_max,
-};
-
-enum {
-	WB_FORMAT_NV12,
-	WB_FORMAT_RGB_565,
-	WB_FORMAT_RGB_888,
-	WB_FORMAT_xRGB_8888,
-	WB_FORMAT_ARGB_8888,
-	WB_FORMAT_BGRA_8888,
-	WB_FORMAT_BGRX_8888,
-	WB_FORMAT_ARGB_8888_INPUT_ALPHA /* Need to support */
-};
-
-struct msmfb_mdp_pp {
-	uint32_t op;
-	union {
-		struct mdp_pcc_cfg_data pcc_cfg_data;
-		struct mdp_csc_cfg_data csc_cfg_data;
-		struct mdp_lut_cfg_data lut_cfg_data;
-		struct mdp_qseed_cfg_data qseed_cfg_data;
-		struct mdp_bl_scale_data bl_scale_data;
-		struct mdp_pa_cfg_data pa_cfg_data;
-		struct mdp_dither_cfg_data dither_cfg_data;
-		struct mdp_gamut_cfg_data gamut_cfg_data;
-		struct mdp_calib_config_data calib_cfg;
-		struct mdss_ad_init_cfg ad_init_cfg;
-		struct mdss_calib_cfg mdss_calib_cfg;
-		struct mdss_ad_input ad_input;
-		struct mdp_calib_config_buffer calib_buffer;
-		struct mdp_calib_dcm_state calib_dcm;
-	} data;
-};
-
-#define FB_METADATA_VIDEO_INFO_CODE_SUPPORT 1
-enum {
-	metadata_op_none,
-	metadata_op_base_blend,
-	metadata_op_frame_rate,
-	metadata_op_vic,
-	metadata_op_wb_format,
-	metadata_op_get_caps,
-	metadata_op_crc,
-	metadata_op_max
-};
-
-struct mdp_blend_cfg {
-	uint32_t is_premultiplied;
-};
-
-struct mdp_mixer_cfg {
-	uint32_t writeback_format;
-	uint32_t alpha;
-};
-
-struct mdss_hw_caps {
-	uint32_t mdp_rev;
-	uint8_t rgb_pipes;
-	uint8_t vig_pipes;
-	uint8_t dma_pipes;
-	uint32_t features;
-};
-
-struct msmfb_metadata {
-	uint32_t op;
-	uint32_t flags;
-	union {
-		struct mdp_misr misr_request;
-		struct mdp_blend_cfg blend_cfg;
-		struct mdp_mixer_cfg mixer_cfg;
-		uint32_t panel_frame_rate;
-		uint32_t video_info_code;
-		struct mdss_hw_caps caps;
-	} data;
-};
-
-#define MDP_MAX_FENCE_FD	32
-#define MDP_BUF_SYNC_FLAG_WAIT	1
-
-struct mdp_buf_sync {
-	uint32_t flags;
-	uint32_t acq_fen_fd_cnt;
-	uint32_t session_id;
-	int *acq_fen_fd;
-	int *rel_fen_fd;
-};
-
-struct mdp_async_blit_req_list {
-	struct mdp_buf_sync sync;
-	uint32_t count;
-	struct mdp_blit_req req[];
-};
-
-#define MDP_DISPLAY_COMMIT_OVERLAY	1
-struct mdp_buf_fence {
-	uint32_t flags;
-	uint32_t acq_fen_fd_cnt;
-	int acq_fen_fd[MDP_MAX_FENCE_FD];
-	int rel_fen_fd[MDP_MAX_FENCE_FD];
-};
-
-
-struct mdp_display_commit {
-	uint32_t flags;
-	uint32_t wait_for_finish;
-	struct fb_var_screeninfo var;
-	struct mdp_buf_fence buf_fence;
-	struct mdp_rect roi;
-};
-
-struct mdp_page_protection {
-	uint32_t page_protection;
-};
-
-
-struct mdp_mixer_info {
-	int pndx;
-	int pnum;
-	int ptype;
-	int mixer_num;
-	int z_order;
-};
-
-#define MAX_PIPE_PER_MIXER  4
-
-struct msmfb_mixer_info_req {
-	int mixer_num;
-	int cnt;
-	struct mdp_mixer_info info[MAX_PIPE_PER_MIXER];
-};
-
-enum {
-	DISPLAY_SUBSYSTEM_ID,
-	ROTATOR_SUBSYSTEM_ID,
-};
-
-enum {
-	MDP_IOMMU_DOMAIN_CP,
-	MDP_IOMMU_DOMAIN_NS,
-};
-
-enum {
-	MDP_WRITEBACK_MIRROR_OFF,
-	MDP_WRITEBACK_MIRROR_ON,
-	MDP_WRITEBACK_MIRROR_PAUSE,
-	MDP_WRITEBACK_MIRROR_RESUME,
-};
-
-
-#endif /*_MSM_MDP_H_*/
diff --git a/minui21/minui.h b/minui21/minui.h
deleted file mode 100644
index 4c629c1..0000000
--- a/minui21/minui.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef _MINUI_H_
-#define _MINUI_H_
-
-#include <stdbool.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef void* gr_surface;
-typedef unsigned short gr_pixel;
-
-int gr_init(void);
-void gr_exit(void);
-
-int gr_fb_width(void);
-int gr_fb_height(void);
-gr_pixel *gr_fb_data(void);
-void gr_flip(void);
-void gr_fb_blank(bool blank);
-
-void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
-void gr_fill(int x1, int y1, int x2, int y2);
-
-// system/core/charger uses different gr_print signatures in diferent
-// Android versions, either with or without int bold.
-int gr_text(int x, int y, const char *s, ...);
-int gr_text_impl(int x, int y, const char *s, int bold);
-
- void gr_texticon(int x, int y, gr_surface icon);
-int gr_measure(const char *s);
-void gr_font_size(int *x, int *y);
-void gr_get_memory_surface(gr_surface);
-
-void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy);
-unsigned int gr_get_width(gr_surface surface);
-unsigned int gr_get_height(gr_surface surface);
-
-// input event structure, include <linux/input.h> for the definition.
-// see http://www.mjmwired.net/kernel/Documentation/input/ for info.
-struct input_event;
-
-typedef int (*ev_callback)(int fd, uint32_t epevents, void *data);
-typedef int (*ev_set_key_callback)(int code, int value, void *data);
-
-int ev_init(ev_callback input_cb, void *data);
-void ev_exit(void);
-int ev_add_fd(int fd, ev_callback cb, void *data);
-int ev_sync_key_state(ev_set_key_callback set_key_cb, void *data);
-
-/* timeout has the same semantics as for poll
- *    0 : don't block
- *  < 0 : block forever
- *  > 0 : block for 'timeout' milliseconds
- */
-int ev_wait(int timeout);
-
-int ev_get_input(int fd, uint32_t epevents, struct input_event *ev);
-void ev_dispatch(void);
-int ev_get_epollfd(void);
-
-// Resources
-
-// Returns 0 if no error, else negative.
-int res_create_surface(const char* name, gr_surface* pSurface);
-
-// Load an array of display surfaces from a single PNG image.  The PNG
-// should have a 'Frames' text chunk whose value is the number of
-// frames this image represents.  The pixel data itself is interlaced
-// by row.
-int res_create_multi_display_surface(const char* name,
-                                     int* frames, gr_surface** pSurface);
-
-int res_create_localized_surface(const char* name, gr_surface* pSurface);
-void res_free_surface(gr_surface surface);
-static inline int res_create_display_surface(const char* name, gr_surface* pSurface) {
-    return res_create_surface(name, pSurface);
-}
-
-// These are new graphics functions from 5.0 that were not available in
-// 4.4 that are required by charger and healthd
-void gr_clear();
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/minui21/mkfont.c b/minui21/mkfont.c
deleted file mode 100644
index 61a5ede..0000000
--- a/minui21/mkfont.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main(int argc, char *argv)
-{
-    unsigned n;
-    unsigned char *x;
-    unsigned m;
-    unsigned run_val;
-    unsigned run_count;
- 
-    n = gimp_image.width * gimp_image.height;
-    m = 0;
-    x = gimp_image.pixel_data;
-
-    printf("struct {\n");
-    printf("  unsigned width;\n");
-    printf("  unsigned height;\n");
-    printf("  unsigned cwidth;\n");
-    printf("  unsigned cheight;\n");
-    printf("  unsigned char rundata[];\n");
-    printf("} font = {\n");
-    printf("  .width = %d,\n  .height = %d,\n  .cwidth = %d,\n  .cheight = %d,\n", gimp_image.width, gimp_image.height,
-           gimp_image.width / 96, gimp_image.height);
-    printf("  .rundata = {\n");
-   
-    run_val = (*x ? 0 : 255);
-    run_count = 1;
-    n--;
-    x+=3;
-
-    while(n-- > 0) {
-        unsigned val = (*x ? 0 : 255);
-        x+=3;
-        if((val == run_val) && (run_count < 127)) {
-            run_count++;
-        } else {
-eject:
-            printf("0x%02x,",run_count | (run_val ? 0x80 : 0x00));
-            run_val = val;
-            run_count = 1;
-            m += 5;
-            if(m >= 75) {
-                printf("\n");
-                m = 0;
-            }
-        }
-    }
-    printf("0x%02x,",run_count | (run_val ? 0x80 : 0x00));
-    printf("\n0x00,");
-    printf("\n");
-    printf("  }\n};\n");
-    return 0;
-}
diff --git a/minui21/resources.c b/minui21/resources.c
deleted file mode 100644
index ed25e45..0000000
--- a/minui21/resources.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <fcntl.h>
-#include <stdio.h>
-
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-
-#include <linux/fb.h>
-#include <linux/kd.h>
-
-#include <pixelflinger/pixelflinger.h>
-
-#include <png.h>
-
-#include "minui.h"
-
-#ifdef FASTMMI_FEATURE
-char *locale = NULL;
-#else
-extern char* locale;
-#endif
-
-// libpng gives "undefined reference to 'pow'" errors, and I have no
-// idea how to convince the build system to link with -lm.  We don't
-// need this functionality (it's used for gamma adjustment) so provide
-// a dummy implementation to satisfy the linker.
-double pow(double x, double y) {
-    return x * y;
-}
-
-#define SURFACE_DATA_ALIGNMENT 8
-
-static GGLSurface* malloc_surface(size_t data_size) {
-    unsigned char* temp = malloc(sizeof(GGLSurface) + data_size + SURFACE_DATA_ALIGNMENT);
-    if (temp == NULL) return NULL;
-    GGLSurface* surface = (GGLSurface*) temp;
-    surface->data = temp + sizeof(GGLSurface) +
-        (SURFACE_DATA_ALIGNMENT - (sizeof(GGLSurface) % SURFACE_DATA_ALIGNMENT));
-    return surface;
-}
-
-static int open_png(const char* name, png_structp* png_ptr, png_infop* info_ptr,
-                    png_uint_32* width, png_uint_32* height, png_byte* channels) {
-    char resPath[256];
-    unsigned char header[8];
-    int result = 0;
-
-    snprintf(resPath, sizeof(resPath)-1, "/res/images/%s.png", name);
-    resPath[sizeof(resPath)-1] = '\0';
-    FILE* fp = fopen(resPath, "rb");
-    if (fp == NULL) {
-        result = -1;
-        goto exit;
-    }
-
-    size_t bytesRead = fread(header, 1, sizeof(header), fp);
-    if (bytesRead != sizeof(header)) {
-        result = -2;
-        goto exit;
-    }
-
-    if (png_sig_cmp(header, 0, sizeof(header))) {
-        result = -3;
-        goto exit;
-    }
-
-    *png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-    if (!*png_ptr) {
-        result = -4;
-        goto exit;
-    }
-
-    *info_ptr = png_create_info_struct(*png_ptr);
-    if (!*info_ptr) {
-        result = -5;
-        goto exit;
-    }
-
-    if (setjmp(png_jmpbuf(*png_ptr))) {
-        result = -6;
-        goto exit;
-    }
-
-    png_init_io(*png_ptr, fp);
-    png_set_sig_bytes(*png_ptr, sizeof(header));
-    png_read_info(*png_ptr, *info_ptr);
-
-    int color_type, bit_depth;
-    png_get_IHDR(*png_ptr, *info_ptr, width, height, &bit_depth,
-            &color_type, NULL, NULL, NULL);
-
-    *channels = png_get_channels(*png_ptr, *info_ptr);
-
-    if (bit_depth == 8 && *channels == 3 && color_type == PNG_COLOR_TYPE_RGB) {
-        // 8-bit RGB images: great, nothing to do.
-    } else if (bit_depth <= 8 && *channels == 1 && color_type == PNG_COLOR_TYPE_GRAY) {
-        // 1-, 2-, 4-, or 8-bit gray images: expand to 8-bit gray.
-        png_set_expand_gray_1_2_4_to_8(*png_ptr);
-    } else if (bit_depth <= 8 && *channels == 1 && color_type == PNG_COLOR_TYPE_PALETTE) {
-        // paletted images: expand to 8-bit RGB.  Note that we DON'T
-        // currently expand the tRNS chunk (if any) to an alpha
-        // channel, because minui doesn't support alpha channels in
-        // general.
-        png_set_palette_to_rgb(*png_ptr);
-        *channels = 3;
-    } else {
-        fprintf(stderr, "minui doesn't support PNG depth %d channels %d color_type %d\n",
-                bit_depth, *channels, color_type);
-        result = -7;
-        goto exit;
-    }
-
-    return result;
-
-  exit:
-    if (result < 0) {
-        png_destroy_read_struct(png_ptr, info_ptr, NULL);
-    }
-    if (fp != NULL) {
-        fclose(fp);
-    }
-
-    return result;
-}
-
-// "display" surfaces are transformed into the framebuffer's required
-// pixel format (currently only RGBX is supported) at load time, so
-// gr_blit() can be nothing more than a memcpy() for each row.  The
-// next two functions are the only ones that know anything about the
-// framebuffer pixel format; they need to be modified if the
-// framebuffer format changes (but nothing else should).
-
-// Allocate and return a gr_surface sufficient for storing an image of
-// the indicated size in the framebuffer pixel format.
-static GGLSurface* init_display_surface(png_uint_32 width, png_uint_32 height) {
-    GGLSurface* surface;
-
-    surface = (GGLSurface*) malloc_surface(width * height * 4);
-    if (surface == NULL) return NULL;
-
-    surface->version = sizeof(GGLSurface);
-    surface->width = width;
-    surface->height = height;
-    surface->stride = width;
-
-    return surface;
-}
-
-// Copy 'input_row' to 'output_row', transforming it to the
-// framebuffer pixel format.  The input format depends on the value of
-// 'channels':
-//
-//   1 - input is 8-bit grayscale
-//   3 - input is 24-bit RGB
-//   4 - input is 32-bit RGBA/RGBX
-//
-// 'width' is the number of pixels in the row.
-static void transform_rgb_to_draw(unsigned char* input_row,
-                                  unsigned char* output_row,
-                                  int channels, int width) {
-    int x;
-    unsigned char* ip = input_row;
-    unsigned char* op = output_row;
-
-    switch (channels) {
-        case 1:
-            // expand gray level to RGBX
-            for (x = 0; x < width; ++x) {
-                *op++ = *ip;
-                *op++ = *ip;
-                *op++ = *ip;
-                *op++ = 0xff;
-                ip++;
-            }
-            break;
-
-        case 3:
-            // expand RGBA to RGBX
-            for (x = 0; x < width; ++x) {
-                *op++ = *ip++;
-                *op++ = *ip++;
-                *op++ = *ip++;
-                *op++ = 0xff;
-            }
-            break;
-
-        case 4:
-            // copy RGBA to RGBX
-            memcpy(output_row, input_row, width*4);
-            break;
-    }
-}
-
-int res_create_surface(const char* name, gr_surface* pSurface) {
-    GGLSurface* surface = NULL;
-    int result = 0;
-    png_structp png_ptr = NULL;
-    png_infop info_ptr = NULL;
-    png_uint_32 width, height;
-    png_byte channels;
-
-    *pSurface = NULL;
-
-    result = open_png(name, &png_ptr, &info_ptr, &width, &height, &channels);
-    if (result < 0) return result;
-
-    surface = init_display_surface(width, height);
-    if (surface == NULL) {
-        result = -8;
-        goto exit;
-    }
-
-    unsigned char* p_row = malloc(width * 4);
-    unsigned int y;
-    for (y = 0; y < height; ++y) {
-        png_read_row(png_ptr, p_row, NULL);
-        transform_rgb_to_draw(p_row, surface->data + y * width * 4, channels, width);
-    }
-    free(p_row);
-
-    if (channels == 3)
-        surface->format = GGL_PIXEL_FORMAT_RGBX_8888;
-    else
-        surface->format = GGL_PIXEL_FORMAT_RGBA_8888;
-
-    *pSurface = (gr_surface) surface;
-
-  exit:
-    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-    if (result < 0 && surface != NULL) free(surface);
-    return result;
-}
-
-int res_create_multi_display_surface(const char* name, int* frames, gr_surface** pSurface) {
-    gr_surface* surface = NULL;
-    int result = 0;
-    png_structp png_ptr = NULL;
-    png_infop info_ptr = NULL;
-    png_uint_32 width, height;
-    png_byte channels;
-    int i;
-
-    *pSurface = NULL;
-    *frames = -1;
-
-    result = open_png(name, &png_ptr, &info_ptr, &width, &height, &channels);
-    if (result < 0) return result;
-
-    *frames = 1;
-    png_textp text;
-    int num_text;
-    if (png_get_text(png_ptr, info_ptr, &text, &num_text)) {
-        for (i = 0; i < num_text; ++i) {
-            if (text[i].key && strcmp(text[i].key, "Frames") == 0 && text[i].text) {
-                *frames = atoi(text[i].text);
-                break;
-            }
-        }
-        printf("  found frames = %d\n", *frames);
-    }
-
-    if (height % *frames != 0) {
-        printf("bad height (%d) for frame count (%d)\n", height, *frames);
-        result = -9;
-        goto exit;
-    }
-
-    surface = malloc(*frames * sizeof(GGLSurface));
-    if (surface == NULL) {
-        result = -8;
-        goto exit;
-    }
-    for (i = 0; i < *frames; ++i) {
-        surface[i] = init_display_surface(width, height / *frames);
-        if (surface[i] == NULL) {
-            result = -8;
-            goto exit;
-        }
-    }
-
-    unsigned char* p_row = malloc(width * 4);
-    unsigned int y;
-    for (y = 0; y < height; ++y) {
-        png_read_row(png_ptr, p_row, NULL);
-        int frame = y % *frames;
-        GGLSurface* p = (GGLSurface*) surface[frame];
-        unsigned char* out_row = p->data +
-            (y / *frames) * width * 4;
-        transform_rgb_to_draw(p_row, out_row, channels, width);
-    }
-    free(p_row);
-
-    for (i = 0; i < *frames; ++i) {
-        GGLSurface* p = (GGLSurface*) surface[i];
-        if (channels == 3)
-            p->format = GGL_PIXEL_FORMAT_RGBX_8888;
-        else
-            p->format = GGL_PIXEL_FORMAT_RGBA_8888;
-    }
-
-    *pSurface = (gr_surface*) surface;
-
-exit:
-    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-
-    if (result < 0) {
-        if (surface) {
-            for (i = 0; i < *frames; ++i) {
-                if (surface[i]) free(surface[i]);
-            }
-            free(surface);
-        }
-    }
-    return result;
-}
-
-static int matches_locale(const char* loc) {
-    if (locale == NULL) return 0;
-
-    if (strcmp(loc, locale) == 0) return 1;
-
-    // if loc does *not* have an underscore, and it matches the start
-    // of locale, and the next character in locale *is* an underscore,
-    // that's a match.  For instance, loc == "en" matches locale ==
-    // "en_US".
-
-    int i;
-    for (i = 0; loc[i] != 0 && loc[i] != '_'; ++i);
-    if (loc[i] == '_') return 0;
-
-    return (strncmp(locale, loc, i) == 0 && locale[i] == '_');
-}
-
-int res_create_localized_surface(const char* name, gr_surface* pSurface) {
-    char resPath[256];
-    GGLSurface* surface = NULL;
-    int result = 0;
-    unsigned char header[8];
-    png_structp png_ptr = NULL;
-    png_infop info_ptr = NULL;
-
-    *pSurface = NULL;
-
-    snprintf(resPath, sizeof(resPath)-1, "/res/images/%s.png", name);
-    resPath[sizeof(resPath)-1] = '\0';
-    FILE* fp = fopen(resPath, "rb");
-    if (fp == NULL) {
-        result = -1;
-        goto exit;
-    }
-
-    size_t bytesRead = fread(header, 1, sizeof(header), fp);
-    if (bytesRead != sizeof(header)) {
-        result = -2;
-        goto exit;
-    }
-
-    if (png_sig_cmp(header, 0, sizeof(header))) {
-        result = -3;
-        goto exit;
-    }
-
-    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-    if (!png_ptr) {
-        result = -4;
-        goto exit;
-    }
-
-    info_ptr = png_create_info_struct(png_ptr);
-    if (!info_ptr) {
-        result = -5;
-        goto exit;
-    }
-
-    if (setjmp(png_jmpbuf(png_ptr))) {
-        result = -6;
-        goto exit;
-    }
-
-    png_init_io(png_ptr, fp);
-    png_set_sig_bytes(png_ptr, sizeof(header));
-    png_read_info(png_ptr, info_ptr);
-
-    int color_type, bit_depth;
-    size_t width, height;
-
-    png_get_IHDR(png_ptr, info_ptr, width, height, &bit_depth,
-            &color_type, NULL, NULL, NULL);
-
-    png_byte* channels = png_get_channels(png_ptr, info_ptr);
-    size_t stride = 4 * width;
-
-    if (!(bit_depth == 8 &&
-          (channels == 1 && color_type == PNG_COLOR_TYPE_GRAY))) {
-        return -7;
-        goto exit;
-    }
-
-    unsigned char* row = malloc(width);
-    int y;
-    for (y = 0; y < height; ++y) {
-        png_read_row(png_ptr, row, NULL);
-        int w = (row[1] << 8) | row[0];
-        int h = (row[3] << 8) | row[2];
-        int len = row[4];
-        char* loc = row+5;
-
-        if (y+1+h >= height || matches_locale(loc)) {
-            printf("  %20s: %s (%d x %d @ %d)\n", name, loc, w, h, y);
-
-            surface = malloc(sizeof(GGLSurface));
-            if (surface == NULL) {
-                result = -8;
-                goto exit;
-            }
-            unsigned char* pData = malloc(w*h);
-
-            surface->version = sizeof(GGLSurface);
-            surface->width = w;
-            surface->height = h;
-            surface->stride = w; /* Yes, pixels, not bytes */
-            surface->data = pData;
-            surface->format = GGL_PIXEL_FORMAT_A_8;
-
-            int i;
-            for (i = 0; i < h; ++i, ++y) {
-                png_read_row(png_ptr, row, NULL);
-                memcpy(pData + i*w, row, w);
-            }
-
-            *pSurface = (gr_surface) surface;
-            break;
-        } else {
-            int i;
-            for (i = 0; i < h; ++i, ++y) {
-                png_read_row(png_ptr, row, NULL);
-            }
-        }
-    }
-
-exit:
-    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-
-    if (fp != NULL) {
-        fclose(fp);
-    }
-    if (result < 0) {
-        if (surface) {
-            free(surface);
-        }
-    }
-    return result;
-}
-
-void res_free_surface(gr_surface surface) {
-    GGLSurface* pSurface = (GGLSurface*) surface;
-    if (pSurface) {
-        free(pSurface);
-    }
-}
diff --git a/minui21/roboto_10x18.h b/minui21/roboto_10x18.h
deleted file mode 100644
index 3119c81..0000000
--- a/minui21/roboto_10x18.h
+++ /dev/null
@@ -1,197 +0,0 @@
-struct {
-  unsigned width;
-  unsigned height;
-  unsigned cwidth;
-  unsigned cheight;
-  unsigned char rundata[];
-} font = {
-  .width = 960,
-  .height = 18,
-  .cwidth = 10,
-  .cheight = 18,
-  .rundata = {
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x3b,0x81,0x29,0x81,0x06,0x81,0x3f,0x81,0x7f,0x7f,0x7f,0x37,0x83,0x05,0x81,
-0x0a,0x83,0x7f,0x7f,0x2f,0x81,0x0e,0x81,0x29,0x82,0x07,0x81,0x01,0x82,0x07,
-0x81,0x02,0x81,0x05,0x83,0x05,0x82,0x0a,0x82,0x09,0x82,0x09,0x81,0x08,0x81,
-0x3e,0x81,0x05,0x84,0x06,0x84,0x06,0x83,0x06,0x84,0x09,0x82,0x05,0x85,0x06,
-0x84,0x04,0x87,0x04,0x84,0x07,0x84,0x39,0x83,0x06,0x84,0x07,0x81,0x06,0x86,
-0x06,0x84,0x04,0x86,0x04,0x87,0x04,0x87,0x04,0x84,0x04,0x82,0x04,0x82,0x03,
-0x86,0x08,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x07,0x82,0x05,0x82,0x02,0x82,
-0x05,0x81,0x04,0x84,0x04,0x86,0x06,0x84,0x04,0x86,0x06,0x84,0x04,0x88,0x02,
-0x82,0x05,0x81,0x01,0x82,0x06,0x81,0x01,0x81,0x07,0x81,0x02,0x81,0x05,0x82,
-0x02,0x82,0x04,0x82,0x02,0x87,0x06,0x81,0x07,0x82,0x0b,0x81,0x08,0x81,0x12,
-0x82,0x10,0x82,0x18,0x82,0x10,0x83,0x0d,0x82,0x0b,0x82,0x08,0x82,0x06,0x82,
-0x09,0x83,0x4c,0x82,0x48,0x81,0x07,0x82,0x07,0x81,0x28,0x82,0x07,0x81,0x01,
-0x82,0x07,0x81,0x02,0x81,0x04,0x82,0x01,0x82,0x03,0x81,0x02,0x81,0x08,0x81,
-0x02,0x81,0x08,0x82,0x08,0x82,0x08,0x82,0x3c,0x82,0x04,0x82,0x02,0x82,0x04,
-0x85,0x05,0x82,0x01,0x82,0x04,0x82,0x02,0x82,0x07,0x83,0x05,0x85,0x05,0x82,
-0x02,0x81,0x09,0x82,0x03,0x82,0x02,0x82,0x05,0x82,0x02,0x82,0x37,0x82,0x01,
-0x82,0x04,0x81,0x03,0x82,0x06,0x82,0x05,0x82,0x03,0x82,0x04,0x83,0x01,0x82,
-0x03,0x82,0x03,0x82,0x03,0x82,0x09,0x82,0x08,0x82,0x02,0x82,0x03,0x82,0x04,
-0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x03,0x82,0x03,0x82,0x07,0x82,0x05,0x82,
-0x02,0x82,0x05,0x81,0x03,0x82,0x02,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x02,
-0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x06,0x82,0x05,0x82,0x05,0x81,
-0x02,0x81,0x05,0x82,0x01,0x81,0x07,0x81,0x02,0x82,0x04,0x81,0x03,0x82,0x04,
-0x82,0x07,0x82,0x06,0x81,0x08,0x81,0x0b,0x81,0x07,0x82,0x13,0x81,0x10,0x82,
-0x18,0x82,0x0f,0x84,0x0d,0x82,0x1d,0x82,0x0a,0x82,0x4c,0x82,0x47,0x82,0x07,
-0x82,0x07,0x82,0x27,0x82,0x07,0x81,0x01,0x82,0x06,0x81,0x02,0x81,0x04,0x82,
-0x03,0x82,0x02,0x81,0x02,0x81,0x02,0x81,0x04,0x82,0x02,0x82,0x08,0x81,0x08,
-0x81,0x0a,0x81,0x12,0x82,0x28,0x81,0x05,0x81,0x04,0x81,0x07,0x82,0x04,0x82,
-0x03,0x82,0x03,0x81,0x04,0x81,0x07,0x83,0x05,0x81,0x08,0x82,0x0c,0x82,0x04,
-0x81,0x04,0x82,0x04,0x81,0x04,0x81,0x36,0x82,0x03,0x81,0x03,0x81,0x05,0x82,
-0x04,0x83,0x05,0x82,0x04,0x81,0x03,0x83,0x03,0x82,0x02,0x82,0x04,0x82,0x02,
-0x82,0x09,0x82,0x07,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,
-0x03,0x82,0x02,0x82,0x04,0x82,0x07,0x83,0x03,0x83,0x02,0x83,0x04,0x81,0x02,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x81,
-0x03,0x82,0x04,0x81,0x06,0x82,0x05,0x82,0x05,0x81,0x02,0x81,0x05,0x82,0x01,
-0x82,0x02,0x81,0x02,0x82,0x03,0x82,0x02,0x82,0x04,0x81,0x03,0x82,0x08,0x81,
-0x07,0x81,0x08,0x81,0x0b,0x81,0x07,0x83,0x13,0x81,0x0f,0x82,0x18,0x82,0x0e,
-0x82,0x10,0x82,0x1d,0x82,0x0a,0x82,0x4c,0x82,0x47,0x81,0x08,0x82,0x08,0x81,
-0x27,0x82,0x07,0x81,0x01,0x81,0x05,0x88,0x02,0x82,0x07,0x81,0x02,0x81,0x01,
-0x82,0x05,0x81,0x02,0x81,0x08,0x81,0x08,0x82,0x0a,0x82,0x07,0x81,0x09,0x82,
-0x27,0x82,0x04,0x82,0x04,0x82,0x06,0x82,0x0a,0x81,0x08,0x81,0x06,0x81,0x01,
-0x82,0x05,0x81,0x08,0x82,0x0c,0x81,0x05,0x81,0x04,0x82,0x04,0x81,0x04,0x81,
-0x05,0x82,0x08,0x82,0x2a,0x81,0x03,0x81,0x02,0x81,0x03,0x81,0x04,0x81,0x01,
-0x82,0x04,0x82,0x04,0x81,0x03,0x82,0x04,0x82,0x02,0x82,0x05,0x81,0x02,0x82,
-0x09,0x82,0x07,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,0x03,
-0x82,0x02,0x81,0x05,0x82,0x07,0x83,0x03,0x83,0x02,0x84,0x03,0x81,0x02,0x82,
-0x05,0x81,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,
-0x82,0x0b,0x82,0x05,0x82,0x05,0x81,0x02,0x82,0x04,0x81,0x03,0x81,0x02,0x82,
-0x01,0x82,0x04,0x81,0x01,0x82,0x05,0x82,0x01,0x82,0x08,0x82,0x07,0x81,0x08,
-0x82,0x0a,0x81,0x06,0x82,0x01,0x81,0x1a,0x85,0x04,0x82,0x01,0x83,0x06,0x84,
-0x06,0x83,0x01,0x82,0x04,0x84,0x06,0x82,0x07,0x85,0x04,0x82,0x01,0x83,0x06,
-0x83,0x08,0x82,0x06,0x82,0x02,0x82,0x06,0x82,0x05,0x81,0x01,0x82,0x01,0x82,
-0x03,0x82,0x01,0x84,0x05,0x84,0x04,0x82,0x01,0x83,0x06,0x83,0x01,0x82,0x03,
-0x82,0x01,0x84,0x04,0x84,0x04,0x86,0x04,0x82,0x04,0x82,0x02,0x82,0x04,0x81,
-0x02,0x82,0x06,0x81,0x02,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x03,0x86,0x07,
-0x81,0x08,0x82,0x08,0x81,0x27,0x82,0x11,0x81,0x02,0x81,0x05,0x82,0x06,0x84,
-0x01,0x81,0x06,0x83,0x12,0x82,0x0a,0x82,0x05,0x81,0x01,0x81,0x01,0x81,0x07,
-0x82,0x27,0x81,0x05,0x82,0x04,0x82,0x06,0x82,0x09,0x82,0x07,0x82,0x05,0x82,
-0x01,0x82,0x04,0x85,0x05,0x81,0x01,0x83,0x08,0x82,0x06,0x81,0x02,0x82,0x05,
-0x81,0x04,0x81,0x05,0x82,0x08,0x82,0x0a,0x83,0x04,0x86,0x04,0x82,0x0c,0x82,
-0x02,0x81,0x02,0x81,0x01,0x81,0x02,0x81,0x04,0x81,0x01,0x82,0x04,0x82,0x03,
-0x82,0x03,0x82,0x08,0x82,0x05,0x81,0x02,0x82,0x09,0x82,0x07,0x81,0x09,0x82,
-0x04,0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x01,0x82,0x05,0x82,0x07,0x84,0x02,
-0x83,0x02,0x82,0x01,0x81,0x03,0x81,0x02,0x82,0x05,0x81,0x02,0x82,0x04,0x82,
-0x02,0x81,0x06,0x81,0x02,0x82,0x03,0x82,0x04,0x82,0x0a,0x82,0x05,0x82,0x05,
-0x81,0x03,0x81,0x03,0x82,0x03,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x05,0x83,
-0x07,0x84,0x07,0x82,0x08,0x81,0x09,0x81,0x0a,0x81,0x06,0x81,0x02,0x81,0x19,
-0x82,0x02,0x83,0x03,0x83,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x83,
-0x03,0x82,0x02,0x82,0x04,0x85,0x04,0x83,0x01,0x83,0x03,0x83,0x02,0x82,0x06,
-0x82,0x08,0x82,0x06,0x82,0x02,0x81,0x07,0x82,0x05,0x82,0x01,0x82,0x01,0x82,
-0x02,0x83,0x03,0x82,0x03,0x82,0x02,0x82,0x03,0x83,0x02,0x82,0x04,0x82,0x02,
-0x83,0x03,0x83,0x03,0x81,0x03,0x82,0x02,0x82,0x04,0x82,0x07,0x82,0x04,0x82,
-0x03,0x81,0x03,0x82,0x02,0x82,0x02,0x82,0x02,0x81,0x03,0x82,0x02,0x81,0x05,
-0x81,0x04,0x82,0x07,0x81,0x08,0x81,0x08,0x82,0x08,0x81,0x27,0x82,0x11,0x81,
-0x02,0x81,0x06,0x83,0x08,0x81,0x07,0x82,0x13,0x82,0x0a,0x82,0x05,0x85,0x04,
-0x88,0x23,0x82,0x05,0x82,0x04,0x82,0x06,0x82,0x08,0x82,0x06,0x83,0x06,0x81,
-0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x07,0x81,0x08,0x83,0x06,
-0x82,0x02,0x82,0x19,0x83,0x11,0x83,0x09,0x82,0x03,0x81,0x01,0x81,0x02,0x81,
-0x02,0x81,0x03,0x82,0x02,0x81,0x04,0x86,0x04,0x82,0x08,0x82,0x05,0x81,0x02,
-0x86,0x05,0x86,0x03,0x81,0x09,0x88,0x05,0x82,0x0a,0x82,0x03,0x84,0x06,0x82,
-0x07,0x82,0x01,0x81,0x01,0x81,0x01,0x82,0x02,0x82,0x01,0x82,0x02,0x81,0x02,
-0x82,0x05,0x81,0x02,0x82,0x03,0x82,0x03,0x81,0x06,0x81,0x02,0x86,0x06,0x83,
-0x08,0x82,0x05,0x82,0x05,0x81,0x03,0x82,0x02,0x81,0x04,0x81,0x01,0x81,0x01,
-0x81,0x01,0x81,0x06,0x82,0x08,0x82,0x08,0x81,0x09,0x81,0x09,0x82,0x09,0x81,
-0x06,0x81,0x02,0x82,0x1d,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x04,0x81,0x03,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x04,0x82,0x06,0x82,0x03,0x82,0x03,0x82,
-0x04,0x82,0x05,0x82,0x08,0x82,0x06,0x82,0x01,0x81,0x08,0x82,0x05,0x82,0x01,
-0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,
-0x02,0x82,0x04,0x82,0x03,0x82,0x08,0x81,0x09,0x82,0x07,0x82,0x04,0x82,0x03,
-0x82,0x02,0x81,0x04,0x81,0x02,0x82,0x02,0x81,0x04,0x81,0x01,0x82,0x05,0x82,
-0x02,0x82,0x07,0x82,0x08,0x81,0x08,0x82,0x08,0x81,0x07,0x83,0x03,0x81,0x19,
-0x82,0x11,0x81,0x02,0x81,0x08,0x82,0x07,0x81,0x01,0x82,0x03,0x82,0x01,0x81,
-0x02,0x82,0x0e,0x81,0x0c,0x81,0x06,0x82,0x06,0x88,0x0d,0x86,0x10,0x81,0x06,
-0x82,0x04,0x82,0x06,0x82,0x07,0x82,0x09,0x82,0x04,0x82,0x02,0x82,0x09,0x82,
-0x03,0x81,0x04,0x82,0x05,0x82,0x06,0x82,0x03,0x81,0x06,0x85,0x18,0x82,0x15,
-0x83,0x06,0x82,0x04,0x81,0x01,0x81,0x02,0x81,0x02,0x81,0x03,0x81,0x03,0x82,
-0x03,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x05,0x81,0x02,0x82,0x09,0x82,0x07,
-0x81,0x03,0x84,0x02,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x01,0x82,
-0x05,0x82,0x07,0x82,0x01,0x81,0x01,0x81,0x01,0x82,0x02,0x82,0x02,0x82,0x01,
-0x81,0x02,0x82,0x05,0x81,0x02,0x86,0x04,0x81,0x06,0x81,0x02,0x82,0x03,0x82,
-0x07,0x82,0x07,0x82,0x05,0x82,0x05,0x81,0x03,0x82,0x02,0x81,0x04,0x83,0x01,
-0x83,0x05,0x83,0x08,0x82,0x07,0x82,0x09,0x81,0x0a,0x81,0x09,0x81,0x25,0x85,
-0x03,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x88,0x04,0x82,0x06,
-0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x05,0x82,0x08,0x82,0x06,0x84,0x08,0x82,
-0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x08,0x83,0x07,0x82,0x07,0x82,
-0x04,0x82,0x04,0x81,0x02,0x81,0x04,0x81,0x02,0x82,0x02,0x81,0x05,0x82,0x06,
-0x82,0x02,0x82,0x06,0x82,0x07,0x82,0x09,0x82,0x09,0x82,0x04,0x82,0x01,0x82,
-0x01,0x82,0x2a,0x87,0x08,0x82,0x05,0x81,0x01,0x81,0x02,0x81,0x02,0x81,0x02,
-0x82,0x01,0x82,0x0e,0x81,0x0c,0x81,0x05,0x82,0x01,0x82,0x07,0x82,0x26,0x81,
-0x06,0x82,0x04,0x82,0x06,0x82,0x06,0x82,0x0b,0x82,0x03,0x87,0x08,0x82,0x03,
-0x81,0x04,0x82,0x05,0x82,0x06,0x81,0x04,0x82,0x09,0x81,0x18,0x82,0x08,0x86,
-0x08,0x82,0x06,0x82,0x04,0x81,0x01,0x81,0x02,0x81,0x02,0x81,0x03,0x86,0x03,
-0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x05,0x81,0x02,0x82,0x09,0x82,0x07,0x82,
-0x04,0x82,0x02,0x82,0x04,0x82,0x05,0x82,0x0a,0x82,0x03,0x82,0x02,0x82,0x04,
-0x82,0x07,0x82,0x01,0x83,0x01,0x82,0x02,0x82,0x03,0x81,0x01,0x81,0x02,0x82,
-0x05,0x81,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x81,0x08,0x82,0x06,
-0x82,0x05,0x82,0x05,0x81,0x04,0x81,0x01,0x82,0x05,0x82,0x02,0x82,0x05,0x81,
-0x01,0x82,0x07,0x82,0x06,0x82,0x0a,0x81,0x0a,0x81,0x09,0x81,0x24,0x82,0x02,
-0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x0a,0x82,
-0x06,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x05,0x82,0x08,0x82,0x06,0x84,0x08,
-0x82,0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,
-0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x0b,0x83,0x04,0x82,0x07,
-0x82,0x04,0x82,0x04,0x81,0x01,0x82,0x04,0x81,0x01,0x81,0x01,0x81,0x01,0x82,
-0x05,0x82,0x07,0x81,0x02,0x82,0x06,0x81,0x0a,0x81,0x08,0x82,0x08,0x81,0x06,
-0x81,0x03,0x83,0x2c,0x81,0x02,0x81,0x05,0x81,0x04,0x82,0x04,0x81,0x02,0x81,
-0x02,0x81,0x01,0x82,0x03,0x83,0x0f,0x82,0x0a,0x82,0x11,0x82,0x25,0x82,0x07,
-0x81,0x04,0x81,0x07,0x82,0x05,0x82,0x07,0x81,0x04,0x82,0x03,0x87,0x03,0x81,
-0x04,0x82,0x03,0x81,0x04,0x82,0x05,0x81,0x07,0x81,0x04,0x82,0x08,0x82,0x19,
-0x84,0x10,0x83,0x0e,0x81,0x01,0x81,0x02,0x81,0x01,0x82,0x02,0x82,0x04,0x81,
-0x03,0x82,0x04,0x82,0x02,0x83,0x03,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x09,
-0x82,0x07,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x05,0x82,0x05,0x81,0x04,0x82,
-0x03,0x82,0x03,0x81,0x04,0x82,0x07,0x82,0x02,0x81,0x02,0x82,0x02,0x82,0x03,
-0x83,0x02,0x82,0x04,0x82,0x02,0x82,0x08,0x82,0x04,0x82,0x02,0x82,0x04,0x82,
-0x02,0x81,0x05,0x81,0x06,0x82,0x05,0x83,0x03,0x82,0x04,0x83,0x06,0x82,0x02,
-0x82,0x04,0x82,0x02,0x81,0x07,0x82,0x06,0x81,0x0b,0x81,0x0a,0x82,0x08,0x81,
-0x23,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x04,0x81,0x03,0x82,0x04,
-0x82,0x02,0x82,0x0a,0x82,0x06,0x82,0x03,0x82,0x03,0x82,0x04,0x82,0x05,0x82,
-0x08,0x82,0x06,0x82,0x01,0x82,0x07,0x82,0x05,0x82,0x01,0x82,0x01,0x82,0x02,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x04,0x82,
-0x03,0x82,0x0d,0x81,0x04,0x82,0x07,0x82,0x03,0x83,0x04,0x83,0x06,0x82,0x02,
-0x82,0x05,0x81,0x01,0x82,0x06,0x84,0x06,0x81,0x0b,0x81,0x08,0x82,0x08,0x81,
-0x27,0x82,0x10,0x81,0x02,0x81,0x05,0x82,0x02,0x83,0x04,0x81,0x02,0x81,0x02,
-0x81,0x02,0x81,0x04,0x82,0x0f,0x82,0x0a,0x82,0x11,0x82,0x07,0x82,0x12,0x82,
-0x08,0x81,0x08,0x82,0x02,0x82,0x07,0x82,0x05,0x81,0x08,0x82,0x03,0x81,0x08,
-0x82,0x04,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x06,0x81,0x07,0x82,0x02,0x82,
-0x08,0x82,0x06,0x82,0x08,0x82,0x0b,0x82,0x0e,0x82,0x0a,0x82,0x04,0x81,0x01,
-0x83,0x01,0x82,0x03,0x81,0x05,0x82,0x02,0x82,0x04,0x82,0x03,0x83,0x01,0x82,
-0x03,0x82,0x03,0x82,0x03,0x82,0x09,0x82,0x08,0x82,0x03,0x82,0x02,0x82,0x04,
-0x82,0x05,0x82,0x05,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x03,0x82,0x07,0x82,
-0x05,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x03,0x82,0x09,0x82,0x02,
-0x82,0x03,0x82,0x04,0x82,0x02,0x82,0x03,0x82,0x06,0x82,0x06,0x82,0x03,0x82,
-0x05,0x82,0x06,0x82,0x02,0x81,0x04,0x82,0x03,0x82,0x06,0x82,0x05,0x82,0x0b,
-0x81,0x0b,0x81,0x08,0x81,0x23,0x82,0x02,0x83,0x03,0x83,0x02,0x82,0x04,0x82,
-0x02,0x82,0x04,0x82,0x02,0x83,0x03,0x82,0x03,0x82,0x04,0x82,0x06,0x83,0x01,
-0x83,0x03,0x82,0x04,0x82,0x05,0x82,0x08,0x82,0x06,0x82,0x02,0x82,0x06,0x82,
-0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x03,
-0x83,0x02,0x82,0x04,0x82,0x02,0x83,0x03,0x82,0x08,0x82,0x02,0x82,0x04,0x82,
-0x03,0x81,0x03,0x83,0x01,0x84,0x05,0x82,0x06,0x82,0x02,0x82,0x04,0x82,0x02,
-0x81,0x07,0x83,0x05,0x82,0x0b,0x81,0x08,0x82,0x08,0x81,0x27,0x82,0x10,0x81,
-0x02,0x81,0x06,0x85,0x09,0x82,0x04,0x84,0x01,0x82,0x0f,0x81,0x0a,0x81,0x1b,
-0x82,0x12,0x82,0x08,0x81,0x09,0x84,0x08,0x82,0x04,0x87,0x04,0x84,0x09,0x82,
-0x05,0x84,0x06,0x84,0x07,0x81,0x08,0x84,0x06,0x84,0x07,0x82,0x08,0x82,0x27,
-0x82,0x04,0x82,0x09,0x81,0x06,0x81,0x02,0x87,0x05,0x84,0x04,0x86,0x04,0x87,
-0x04,0x82,0x09,0x85,0x03,0x82,0x04,0x82,0x03,0x86,0x04,0x84,0x05,0x82,0x04,
-0x82,0x02,0x87,0x02,0x82,0x05,0x82,0x02,0x82,0x05,0x81,0x04,0x84,0x04,0x82,
-0x0a,0x86,0x02,0x82,0x04,0x82,0x03,0x85,0x07,0x82,0x07,0x85,0x06,0x82,0x06,
-0x82,0x02,0x81,0x04,0x82,0x04,0x82,0x05,0x82,0x05,0x87,0x06,0x81,0x0b,0x82,
-0x07,0x81,0x23,0x84,0x01,0x82,0x03,0x82,0x01,0x83,0x06,0x84,0x06,0x83,0x01,
-0x82,0x04,0x85,0x05,0x82,0x07,0x83,0x01,0x82,0x03,0x82,0x04,0x82,0x03,0x86,
-0x06,0x82,0x06,0x82,0x03,0x81,0x04,0x86,0x03,0x82,0x01,0x82,0x01,0x82,0x02,
-0x82,0x04,0x82,0x04,0x84,0x04,0x82,0x01,0x83,0x06,0x83,0x01,0x82,0x03,0x82,
-0x09,0x84,0x06,0x84,0x05,0x84,0x01,0x82,0x05,0x82,0x06,0x81,0x03,0x82,0x03,
-0x82,0x03,0x82,0x07,0x82,0x05,0x86,0x07,0x81,0x08,0x82,0x08,0x81,0x45,0x81,
-0x27,0x81,0x0a,0x81,0x1c,0x81,0x1b,0x82,0x78,0x81,0x2e,0x82,0x7f,0x30,0x82,
-0x5e,0x81,0x0c,0x81,0x07,0x81,0x0f,0x88,0x4d,0x82,0x1a,0x82,0x37,0x82,0x0e,
-0x82,0x4b,0x82,0x13,0x82,0x07,0x82,0x07,0x82,0x45,0x81,0x28,0x81,0x08,0x81,
-0x1c,0x81,0x1c,0x81,0x78,0x81,0x30,0x84,0x7f,0x7f,0x0e,0x83,0x0a,0x81,0x05,
-0x83,0x64,0x82,0x1a,0x82,0x37,0x82,0x0e,0x82,0x4b,0x82,0x14,0x81,0x07,0x82,
-0x07,0x81,0x70,0x81,0x06,0x81,0x7f,0x7f,0x7f,0x7f,0x6e,0x85,0x1a,0x82,0x38,
-0x82,0x0e,0x82,0x4a,0x82,0x16,0x81,0x0e,0x81,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x62,
-0x00,
-  }
-};
diff --git a/minui21/roboto_15x24.h b/minui21/roboto_15x24.h
deleted file mode 100644
index 7271d74..0000000
--- a/minui21/roboto_15x24.h
+++ /dev/null
@@ -1,281 +0,0 @@
-struct {
-  unsigned width;
-  unsigned height;
-  unsigned cwidth;
-  unsigned cheight;
-  unsigned char rundata[];
-} font = {
-  .width = 1440,
-  .height = 24,
-  .cwidth = 15,
-  .cheight = 24,
-  .rundata = {
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x6e,0x81,0x3e,0x81,
-0x07,0x81,0x7f,0x7f,0x7f,0x7f,0x7f,0x76,0x84,0x17,0x84,0x7f,0x7f,0x7f,0x7f,
-0x4c,0x81,0x3d,0x82,0x07,0x82,0x5f,0x81,0x7f,0x7f,0x7f,0x7f,0x7f,0x15,0x84,
-0x07,0x82,0x0e,0x84,0x45,0x82,0x24,0x82,0x1a,0x83,0x16,0x82,0x10,0x82,0x0e,
-0x82,0x0a,0x82,0x0d,0x84,0x7f,0x62,0x82,0x0b,0x82,0x0b,0x82,0x3b,0x82,0x0c,
-0x82,0x02,0x82,0x0a,0x82,0x03,0x81,0x0a,0x84,0x08,0x83,0x0e,0x84,0x0b,0x82,
-0x10,0x82,0x09,0x82,0x5e,0x81,0x09,0x84,0x0b,0x84,0x0b,0x84,0x0b,0x84,0x0e,
-0x83,0x08,0x88,0x09,0x84,0x07,0x8a,0x08,0x84,0x0b,0x84,0x56,0x84,0x1c,0x82,
-0x08,0x87,0x0b,0x85,0x07,0x87,0x09,0x89,0x06,0x8a,0x07,0x85,0x06,0x82,0x08,
-0x82,0x06,0x86,0x0f,0x82,0x06,0x82,0x07,0x82,0x04,0x82,0x0a,0x83,0x09,0x82,
-0x03,0x82,0x08,0x82,0x06,0x85,0x07,0x87,0x0b,0x85,0x07,0x87,0x0c,0x84,0x06,
-0x8d,0x03,0x82,0x07,0x82,0x02,0x83,0x08,0x83,0x01,0x82,0x0a,0x82,0x02,0x82,
-0x08,0x82,0x03,0x82,0x08,0x82,0x04,0x8b,0x09,0x82,0x09,0x82,0x10,0x82,0x0d,
-0x81,0x1d,0x82,0x18,0x82,0x24,0x82,0x19,0x84,0x16,0x82,0x10,0x82,0x0e,0x82,
-0x0a,0x82,0x0d,0x84,0x7f,0x61,0x82,0x0c,0x82,0x0c,0x82,0x3a,0x82,0x0c,0x82,
-0x02,0x82,0x0a,0x82,0x03,0x81,0x08,0x87,0x06,0x82,0x01,0x82,0x0c,0x86,0x0a,
-0x82,0x0f,0x82,0x0b,0x82,0x5c,0x82,0x08,0x87,0x07,0x86,0x0a,0x87,0x08,0x87,
-0x0c,0x83,0x08,0x88,0x07,0x87,0x06,0x8a,0x07,0x87,0x07,0x87,0x54,0x87,0x08,
-0x86,0x0c,0x82,0x08,0x89,0x07,0x88,0x06,0x89,0x07,0x89,0x06,0x8a,0x05,0x88,
-0x05,0x82,0x08,0x82,0x06,0x86,0x0f,0x82,0x06,0x82,0x06,0x82,0x05,0x82,0x0a,
-0x83,0x08,0x83,0x03,0x83,0x07,0x82,0x04,0x88,0x06,0x89,0x07,0x88,0x06,0x89,
-0x08,0x88,0x04,0x8d,0x03,0x82,0x07,0x82,0x03,0x82,0x08,0x82,0x02,0x82,0x04,
-0x81,0x05,0x82,0x03,0x82,0x06,0x82,0x04,0x82,0x07,0x83,0x04,0x8b,0x09,0x82,
-0x0a,0x82,0x0f,0x82,0x0c,0x83,0x1d,0x82,0x17,0x82,0x24,0x82,0x18,0x83,0x18,
-0x82,0x2c,0x82,0x0f,0x82,0x7f,0x60,0x83,0x0c,0x82,0x0d,0x82,0x39,0x82,0x0c,
-0x82,0x02,0x82,0x0a,0x82,0x02,0x82,0x07,0x83,0x03,0x83,0x04,0x82,0x03,0x81,
-0x04,0x81,0x06,0x83,0x03,0x82,0x09,0x82,0x0f,0x82,0x0b,0x82,0x5c,0x82,0x07,
-0x82,0x04,0x82,0x0a,0x83,0x09,0x82,0x04,0x83,0x06,0x82,0x04,0x83,0x0a,0x84,
-0x08,0x82,0x0d,0x82,0x13,0x82,0x06,0x82,0x04,0x83,0x06,0x82,0x04,0x82,0x52,
-0x82,0x04,0x82,0x07,0x82,0x05,0x82,0x09,0x84,0x07,0x82,0x05,0x83,0x06,0x82,
-0x05,0x82,0x05,0x82,0x05,0x83,0x06,0x82,0x0d,0x82,0x0d,0x82,0x05,0x82,0x04,
-0x82,0x08,0x82,0x08,0x82,0x11,0x82,0x06,0x82,0x05,0x82,0x06,0x82,0x0a,0x83,
-0x08,0x83,0x03,0x83,0x07,0x82,0x04,0x82,0x05,0x82,0x05,0x82,0x06,0x82,0x06,
-0x82,0x05,0x82,0x05,0x82,0x05,0x83,0x06,0x83,0x04,0x83,0x08,0x83,0x08,0x82,
-0x07,0x82,0x03,0x82,0x08,0x82,0x02,0x82,0x03,0x83,0x04,0x82,0x03,0x83,0x04,
-0x83,0x05,0x82,0x06,0x82,0x0d,0x82,0x0a,0x82,0x0a,0x82,0x0f,0x82,0x0c,0x83,
-0x1e,0x81,0x17,0x82,0x24,0x82,0x18,0x82,0x19,0x82,0x2c,0x82,0x0f,0x82,0x74,
-0x82,0x69,0x82,0x0d,0x82,0x0d,0x82,0x39,0x82,0x0c,0x82,0x02,0x82,0x0a,0x82,
-0x02,0x82,0x07,0x82,0x05,0x82,0x04,0x82,0x03,0x82,0x02,0x82,0x06,0x82,0x04,
-0x82,0x09,0x82,0x0e,0x82,0x0d,0x82,0x1c,0x82,0x3c,0x82,0x08,0x82,0x05,0x82,
-0x09,0x83,0x09,0x82,0x05,0x82,0x05,0x83,0x05,0x82,0x09,0x85,0x07,0x82,0x0d,
-0x82,0x13,0x82,0x07,0x82,0x05,0x82,0x05,0x82,0x05,0x83,0x51,0x82,0x04,0x82,
-0x06,0x82,0x07,0x82,0x08,0x84,0x07,0x82,0x06,0x82,0x05,0x82,0x07,0x82,0x04,
-0x82,0x06,0x83,0x05,0x82,0x0d,0x82,0x0c,0x82,0x07,0x82,0x03,0x82,0x08,0x82,
-0x08,0x82,0x11,0x82,0x06,0x82,0x04,0x83,0x06,0x82,0x0a,0x84,0x06,0x84,0x03,
-0x84,0x06,0x82,0x03,0x82,0x07,0x82,0x04,0x82,0x07,0x82,0x04,0x82,0x07,0x82,
-0x04,0x82,0x06,0x82,0x06,0x82,0x06,0x82,0x08,0x83,0x08,0x82,0x07,0x82,0x03,
-0x83,0x06,0x83,0x02,0x82,0x03,0x83,0x03,0x82,0x05,0x82,0x04,0x82,0x06,0x82,
-0x05,0x83,0x0c,0x83,0x0a,0x82,0x0b,0x82,0x0e,0x82,0x0c,0x81,0x01,0x82,0x35,
-0x82,0x24,0x82,0x18,0x82,0x19,0x82,0x2c,0x82,0x0f,0x82,0x74,0x82,0x69,0x82,
-0x0d,0x82,0x0d,0x83,0x38,0x82,0x0c,0x82,0x02,0x81,0x0b,0x81,0x03,0x82,0x07,
-0x82,0x05,0x82,0x04,0x82,0x03,0x82,0x02,0x81,0x07,0x82,0x04,0x82,0x09,0x82,
-0x0e,0x82,0x0d,0x82,0x0d,0x82,0x0d,0x82,0x3c,0x82,0x07,0x82,0x06,0x82,0x09,
-0x83,0x08,0x83,0x05,0x82,0x0d,0x82,0x09,0x85,0x07,0x82,0x0d,0x82,0x12,0x83,
-0x07,0x82,0x05,0x82,0x05,0x82,0x06,0x82,0x57,0x83,0x04,0x82,0x09,0x81,0x08,
-0x84,0x07,0x82,0x06,0x82,0x05,0x82,0x07,0x82,0x04,0x82,0x07,0x82,0x05,0x82,
-0x0d,0x82,0x0c,0x82,0x07,0x82,0x03,0x82,0x08,0x82,0x08,0x82,0x11,0x82,0x06,
-0x82,0x03,0x83,0x07,0x82,0x0a,0x84,0x06,0x84,0x03,0x85,0x05,0x82,0x03,0x82,
-0x07,0x82,0x04,0x82,0x07,0x82,0x04,0x82,0x07,0x82,0x04,0x82,0x06,0x83,0x05,
-0x82,0x06,0x82,0x08,0x83,0x08,0x82,0x07,0x82,0x04,0x82,0x06,0x82,0x03,0x82,
-0x03,0x83,0x03,0x82,0x05,0x83,0x02,0x83,0x07,0x82,0x04,0x82,0x0d,0x82,0x0b,
-0x82,0x0b,0x82,0x0e,0x82,0x0b,0x82,0x01,0x82,0x29,0x84,0x08,0x82,0x01,0x84,
-0x0a,0x86,0x0a,0x83,0x02,0x82,0x08,0x84,0x0a,0x86,0x0a,0x83,0x02,0x82,0x06,
-0x82,0x01,0x84,0x09,0x84,0x0e,0x82,0x0a,0x82,0x04,0x83,0x08,0x82,0x07,0x81,
-0x02,0x83,0x03,0x83,0x05,0x81,0x02,0x84,0x0b,0x84,0x09,0x81,0x02,0x84,0x0a,
-0x83,0x02,0x82,0x08,0x81,0x02,0x84,0x08,0x84,0x08,0x88,0x07,0x82,0x06,0x82,
-0x05,0x82,0x06,0x82,0x03,0x82,0x03,0x82,0x05,0x82,0x04,0x82,0x05,0x82,0x04,
-0x83,0x05,0x83,0x06,0x89,0x09,0x82,0x0d,0x82,0x0d,0x83,0x38,0x82,0x0c,0x82,
-0x02,0x81,0x08,0x8b,0x05,0x82,0x0b,0x82,0x03,0x81,0x02,0x82,0x07,0x83,0x02,
-0x82,0x0a,0x81,0x0f,0x82,0x0d,0x82,0x0d,0x82,0x0d,0x82,0x3c,0x82,0x07,0x82,
-0x06,0x82,0x09,0x83,0x10,0x82,0x0d,0x82,0x08,0x82,0x01,0x83,0x07,0x82,0x0d,
-0x82,0x12,0x82,0x08,0x82,0x05,0x82,0x05,0x82,0x06,0x82,0x08,0x82,0x0d,0x82,
-0x13,0x81,0x06,0x89,0x06,0x81,0x14,0x82,0x05,0x81,0x04,0x84,0x02,0x82,0x06,
-0x82,0x02,0x82,0x06,0x82,0x06,0x82,0x04,0x82,0x0e,0x82,0x07,0x82,0x05,0x82,
-0x0d,0x82,0x0b,0x82,0x0d,0x82,0x08,0x82,0x08,0x82,0x11,0x82,0x06,0x82,0x03,
-0x82,0x08,0x82,0x0a,0x82,0x01,0x82,0x05,0x84,0x03,0x82,0x01,0x82,0x05,0x82,
-0x02,0x82,0x09,0x82,0x03,0x82,0x07,0x82,0x03,0x82,0x09,0x82,0x03,0x82,0x06,
-0x83,0x05,0x82,0x10,0x83,0x08,0x82,0x07,0x82,0x04,0x82,0x06,0x82,0x03,0x82,
-0x03,0x81,0x01,0x82,0x02,0x82,0x06,0x82,0x02,0x82,0x08,0x82,0x03,0x83,0x0c,
-0x82,0x0c,0x82,0x0b,0x82,0x0e,0x82,0x0b,0x82,0x02,0x81,0x28,0x87,0x06,0x88,
-0x08,0x88,0x08,0x88,0x07,0x86,0x09,0x86,0x09,0x88,0x06,0x88,0x08,0x84,0x0e,
-0x82,0x0a,0x82,0x03,0x83,0x09,0x82,0x07,0x87,0x01,0x85,0x04,0x88,0x09,0x87,
-0x07,0x81,0x01,0x86,0x08,0x88,0x08,0x87,0x06,0x87,0x07,0x88,0x07,0x82,0x06,
-0x82,0x05,0x82,0x05,0x82,0x04,0x82,0x03,0x82,0x05,0x82,0x04,0x83,0x03,0x83,
-0x05,0x82,0x05,0x82,0x07,0x89,0x09,0x82,0x0d,0x82,0x0d,0x83,0x38,0x82,0x1b,
-0x82,0x03,0x81,0x08,0x83,0x0b,0x85,0x01,0x82,0x09,0x85,0x1a,0x83,0x0d,0x83,
-0x09,0x81,0x02,0x82,0x01,0x81,0x0b,0x82,0x3b,0x82,0x08,0x82,0x06,0x82,0x09,
-0x83,0x0f,0x82,0x0d,0x82,0x09,0x82,0x01,0x83,0x07,0x87,0x07,0x83,0x01,0x84,
-0x0c,0x82,0x09,0x83,0x03,0x82,0x06,0x82,0x06,0x82,0x08,0x82,0x0d,0x82,0x11,
-0x83,0x06,0x89,0x06,0x83,0x12,0x82,0x05,0x81,0x03,0x82,0x02,0x82,0x02,0x81,
-0x06,0x82,0x02,0x82,0x06,0x82,0x05,0x82,0x05,0x82,0x0e,0x82,0x07,0x83,0x04,
-0x82,0x0d,0x82,0x0b,0x82,0x0d,0x82,0x08,0x82,0x08,0x82,0x11,0x82,0x06,0x82,
-0x02,0x82,0x09,0x82,0x0a,0x82,0x01,0x82,0x04,0x82,0x01,0x82,0x03,0x82,0x02,
-0x82,0x04,0x82,0x02,0x82,0x09,0x82,0x03,0x82,0x07,0x82,0x03,0x82,0x09,0x82,
-0x03,0x82,0x06,0x82,0x06,0x83,0x0f,0x83,0x08,0x82,0x07,0x82,0x05,0x82,0x04,
-0x82,0x05,0x81,0x02,0x82,0x01,0x82,0x02,0x82,0x07,0x84,0x0a,0x82,0x02,0x82,
-0x0c,0x83,0x0c,0x82,0x0c,0x82,0x0d,0x82,0x0a,0x82,0x03,0x82,0x26,0x82,0x04,
-0x82,0x06,0x83,0x03,0x83,0x07,0x82,0x05,0x82,0x06,0x82,0x04,0x83,0x06,0x82,
-0x04,0x82,0x0a,0x82,0x0a,0x83,0x03,0x83,0x06,0x82,0x04,0x83,0x09,0x82,0x0e,
-0x82,0x0a,0x82,0x03,0x82,0x0a,0x82,0x07,0x82,0x03,0x84,0x02,0x82,0x04,0x82,
-0x04,0x83,0x07,0x82,0x04,0x83,0x06,0x82,0x04,0x83,0x06,0x82,0x04,0x83,0x08,
-0x83,0x0a,0x82,0x04,0x82,0x08,0x82,0x0b,0x82,0x06,0x82,0x05,0x82,0x05,0x82,
-0x04,0x82,0x03,0x83,0x03,0x82,0x06,0x82,0x03,0x82,0x06,0x82,0x05,0x82,0x0d,
-0x82,0x0a,0x82,0x0d,0x82,0x0d,0x83,0x38,0x82,0x1b,0x82,0x02,0x82,0x09,0x85,
-0x0e,0x81,0x0b,0x83,0x1b,0x82,0x0f,0x82,0x09,0x87,0x0b,0x82,0x3b,0x82,0x08,
-0x82,0x06,0x82,0x09,0x83,0x0e,0x83,0x09,0x85,0x09,0x82,0x02,0x83,0x07,0x88,
-0x06,0x89,0x0b,0x82,0x0a,0x86,0x07,0x82,0x06,0x82,0x27,0x85,0x17,0x84,0x0f,
-0x82,0x05,0x82,0x03,0x81,0x03,0x82,0x02,0x81,0x06,0x82,0x02,0x82,0x06,0x88,
-0x06,0x82,0x0e,0x82,0x07,0x83,0x04,0x88,0x07,0x88,0x05,0x82,0x0d,0x8c,0x08,
-0x82,0x11,0x82,0x06,0x85,0x0a,0x82,0x0a,0x82,0x01,0x82,0x04,0x82,0x01,0x82,
-0x03,0x82,0x02,0x82,0x04,0x82,0x02,0x82,0x09,0x82,0x03,0x82,0x06,0x82,0x04,
-0x82,0x09,0x82,0x03,0x82,0x04,0x83,0x08,0x85,0x0c,0x83,0x08,0x82,0x07,0x82,
-0x05,0x82,0x04,0x82,0x05,0x82,0x01,0x82,0x01,0x82,0x02,0x81,0x08,0x84,0x0a,
-0x86,0x0c,0x82,0x0d,0x82,0x0c,0x82,0x0d,0x82,0x0a,0x82,0x03,0x82,0x26,0x82,
-0x04,0x83,0x05,0x82,0x05,0x82,0x06,0x83,0x05,0x82,0x05,0x83,0x05,0x82,0x05,
-0x83,0x04,0x82,0x0a,0x82,0x0a,0x82,0x05,0x82,0x06,0x82,0x05,0x82,0x09,0x82,
-0x0e,0x82,0x0a,0x82,0x02,0x82,0x0b,0x82,0x07,0x82,0x03,0x83,0x03,0x83,0x03,
-0x82,0x05,0x82,0x06,0x83,0x05,0x82,0x06,0x82,0x05,0x82,0x05,0x83,0x05,0x82,
-0x08,0x82,0x0b,0x82,0x04,0x82,0x08,0x82,0x0b,0x82,0x06,0x82,0x06,0x82,0x04,
-0x82,0x04,0x82,0x02,0x84,0x03,0x82,0x07,0x82,0x01,0x82,0x07,0x83,0x03,0x83,
-0x0c,0x83,0x0a,0x82,0x0d,0x82,0x0e,0x82,0x0a,0x82,0x2c,0x82,0x1b,0x82,0x02,
-0x82,0x0b,0x85,0x0b,0x82,0x09,0x85,0x1b,0x82,0x0f,0x82,0x0b,0x83,0x09,0x8b,
-0x36,0x81,0x09,0x82,0x06,0x82,0x09,0x83,0x0e,0x82,0x0a,0x86,0x07,0x82,0x03,
-0x83,0x07,0x82,0x04,0x83,0x05,0x84,0x03,0x83,0x09,0x82,0x0b,0x87,0x07,0x82,
-0x04,0x83,0x25,0x85,0x1b,0x85,0x0b,0x82,0x06,0x82,0x02,0x82,0x03,0x82,0x02,
-0x81,0x05,0x82,0x04,0x82,0x05,0x8a,0x04,0x82,0x0e,0x82,0x07,0x83,0x04,0x88,
-0x07,0x88,0x05,0x82,0x04,0x86,0x03,0x8c,0x08,0x82,0x11,0x82,0x06,0x86,0x09,
-0x82,0x0a,0x82,0x02,0x82,0x02,0x82,0x02,0x82,0x03,0x82,0x03,0x82,0x03,0x82,
-0x02,0x82,0x09,0x82,0x03,0x8a,0x04,0x82,0x09,0x82,0x03,0x89,0x0a,0x85,0x0a,
-0x83,0x08,0x82,0x07,0x82,0x05,0x82,0x04,0x82,0x05,0x82,0x01,0x82,0x02,0x81,
-0x01,0x82,0x09,0x82,0x0c,0x84,0x0c,0x82,0x0e,0x82,0x0d,0x82,0x0c,0x82,0x3d,
-0x83,0x05,0x82,0x05,0x82,0x06,0x82,0x0d,0x82,0x06,0x82,0x05,0x82,0x06,0x82,
-0x09,0x82,0x09,0x82,0x06,0x82,0x06,0x82,0x05,0x82,0x09,0x82,0x0e,0x82,0x0a,
-0x82,0x01,0x83,0x0b,0x82,0x07,0x82,0x04,0x82,0x04,0x82,0x03,0x82,0x05,0x82,
-0x06,0x82,0x06,0x82,0x06,0x82,0x05,0x82,0x05,0x82,0x06,0x82,0x08,0x82,0x0b,
-0x82,0x0e,0x82,0x0b,0x82,0x06,0x82,0x06,0x82,0x03,0x82,0x06,0x82,0x01,0x82,
-0x01,0x81,0x03,0x82,0x07,0x82,0x01,0x82,0x08,0x82,0x03,0x82,0x0c,0x83,0x09,
-0x83,0x0e,0x82,0x0e,0x83,0x07,0x86,0x04,0x82,0x24,0x82,0x1b,0x81,0x03,0x82,
-0x0d,0x84,0x0a,0x81,0x02,0x84,0x03,0x83,0x01,0x83,0x03,0x82,0x15,0x82,0x0f,
-0x82,0x0b,0x84,0x08,0x8b,0x15,0x86,0x1a,0x82,0x09,0x82,0x06,0x82,0x09,0x83,
-0x0d,0x82,0x0f,0x83,0x06,0x82,0x03,0x83,0x0e,0x82,0x05,0x83,0x05,0x82,0x09,
-0x82,0x0a,0x82,0x04,0x83,0x06,0x89,0x24,0x83,0x21,0x84,0x08,0x82,0x07,0x81,
-0x03,0x82,0x03,0x81,0x03,0x81,0x05,0x82,0x04,0x82,0x05,0x82,0x06,0x83,0x03,
-0x82,0x0e,0x82,0x07,0x83,0x04,0x82,0x0d,0x82,0x0b,0x82,0x04,0x86,0x03,0x82,
-0x08,0x82,0x08,0x82,0x11,0x82,0x06,0x82,0x02,0x82,0x09,0x82,0x0a,0x82,0x02,
-0x82,0x02,0x82,0x02,0x82,0x03,0x82,0x03,0x83,0x02,0x82,0x02,0x82,0x09,0x82,
-0x03,0x88,0x06,0x82,0x09,0x82,0x03,0x82,0x05,0x83,0x0c,0x84,0x08,0x83,0x08,
-0x82,0x07,0x82,0x06,0x82,0x02,0x82,0x06,0x82,0x01,0x81,0x03,0x84,0x08,0x84,
-0x0b,0x83,0x0c,0x83,0x0e,0x82,0x0d,0x82,0x0c,0x82,0x39,0x87,0x05,0x82,0x05,
-0x82,0x06,0x82,0x0d,0x82,0x06,0x82,0x05,0x8a,0x09,0x82,0x09,0x82,0x06,0x82,
-0x06,0x82,0x05,0x82,0x09,0x82,0x0e,0x82,0x0a,0x85,0x0c,0x82,0x07,0x82,0x04,
-0x82,0x04,0x82,0x03,0x82,0x05,0x82,0x06,0x82,0x06,0x82,0x06,0x82,0x05,0x82,
-0x05,0x82,0x06,0x82,0x08,0x82,0x0b,0x85,0x0b,0x82,0x0b,0x82,0x06,0x82,0x06,
-0x82,0x03,0x82,0x06,0x82,0x01,0x82,0x01,0x82,0x02,0x82,0x08,0x83,0x09,0x82,
-0x03,0x82,0x0c,0x82,0x0a,0x82,0x0f,0x82,0x0f,0x83,0x06,0x82,0x02,0x83,0x02,
-0x82,0x25,0x82,0x18,0x8b,0x0d,0x82,0x09,0x82,0x01,0x82,0x02,0x82,0x02,0x82,
-0x03,0x83,0x02,0x82,0x15,0x82,0x0f,0x82,0x0a,0x82,0x01,0x82,0x0c,0x82,0x3a,
-0x82,0x09,0x82,0x06,0x82,0x09,0x83,0x0c,0x82,0x11,0x82,0x05,0x82,0x04,0x83,
-0x0e,0x82,0x05,0x83,0x05,0x82,0x09,0x82,0x09,0x82,0x06,0x82,0x08,0x83,0x02,
-0x82,0x24,0x83,0x0c,0x89,0x0d,0x83,0x08,0x82,0x07,0x81,0x03,0x82,0x03,0x81,
-0x03,0x81,0x04,0x89,0x05,0x82,0x07,0x82,0x03,0x82,0x0e,0x82,0x07,0x82,0x05,
-0x82,0x0d,0x82,0x0b,0x82,0x08,0x82,0x03,0x82,0x08,0x82,0x08,0x82,0x11,0x82,
-0x06,0x82,0x03,0x82,0x08,0x82,0x0a,0x82,0x03,0x81,0x02,0x81,0x03,0x82,0x03,
-0x82,0x04,0x82,0x02,0x82,0x02,0x82,0x09,0x82,0x03,0x82,0x0c,0x82,0x09,0x82,
-0x03,0x82,0x06,0x82,0x0e,0x82,0x08,0x83,0x08,0x82,0x07,0x82,0x06,0x82,0x02,
-0x82,0x06,0x84,0x03,0x84,0x07,0x86,0x0b,0x82,0x0c,0x82,0x0f,0x82,0x0d,0x82,
-0x0c,0x82,0x37,0x89,0x05,0x82,0x05,0x82,0x06,0x82,0x0d,0x82,0x06,0x82,0x05,
-0x8a,0x09,0x82,0x09,0x82,0x06,0x82,0x06,0x82,0x05,0x82,0x09,0x82,0x0e,0x82,
-0x0a,0x85,0x0c,0x82,0x07,0x82,0x04,0x82,0x04,0x82,0x03,0x82,0x05,0x82,0x06,
-0x82,0x06,0x82,0x06,0x82,0x05,0x82,0x05,0x82,0x06,0x82,0x08,0x82,0x0d,0x85,
-0x09,0x82,0x0b,0x82,0x06,0x82,0x07,0x82,0x02,0x81,0x07,0x82,0x01,0x81,0x02,
-0x82,0x01,0x82,0x09,0x83,0x0a,0x82,0x01,0x83,0x0b,0x82,0x0c,0x82,0x0e,0x82,
-0x0e,0x82,0x07,0x82,0x04,0x86,0x3f,0x8b,0x05,0x82,0x06,0x82,0x08,0x82,0x02,
-0x81,0x04,0x81,0x02,0x82,0x04,0x85,0x16,0x82,0x0f,0x82,0x0e,0x81,0x0c,0x82,
-0x39,0x82,0x0a,0x82,0x06,0x82,0x09,0x83,0x0b,0x83,0x11,0x82,0x05,0x8b,0x0c,
-0x82,0x06,0x82,0x05,0x82,0x08,0x83,0x09,0x82,0x06,0x82,0x0d,0x82,0x25,0x85,
-0x09,0x89,0x0a,0x85,0x09,0x82,0x07,0x81,0x03,0x82,0x03,0x81,0x02,0x82,0x04,
-0x8a,0x04,0x82,0x07,0x82,0x03,0x83,0x07,0x82,0x04,0x82,0x07,0x82,0x05,0x82,
-0x0d,0x82,0x0b,0x83,0x07,0x82,0x03,0x82,0x08,0x82,0x08,0x82,0x11,0x82,0x06,
-0x82,0x03,0x83,0x07,0x82,0x0a,0x82,0x03,0x84,0x03,0x82,0x03,0x82,0x05,0x82,
-0x01,0x82,0x02,0x83,0x07,0x83,0x03,0x82,0x0c,0x83,0x07,0x83,0x03,0x82,0x06,
-0x83,0x04,0x82,0x07,0x82,0x08,0x83,0x08,0x82,0x07,0x82,0x06,0x82,0x01,0x83,
-0x07,0x83,0x03,0x84,0x07,0x82,0x02,0x82,0x0b,0x82,0x0b,0x82,0x10,0x82,0x0e,
-0x82,0x0b,0x82,0x36,0x83,0x04,0x83,0x05,0x82,0x05,0x82,0x06,0x82,0x0d,0x82,
-0x06,0x82,0x05,0x82,0x11,0x82,0x09,0x82,0x06,0x82,0x06,0x82,0x05,0x82,0x09,
-0x82,0x0e,0x82,0x0a,0x82,0x02,0x82,0x0b,0x82,0x07,0x82,0x04,0x82,0x04,0x82,
-0x03,0x82,0x05,0x82,0x06,0x82,0x06,0x82,0x06,0x82,0x05,0x82,0x05,0x82,0x06,
-0x82,0x08,0x82,0x10,0x83,0x08,0x82,0x0b,0x82,0x06,0x82,0x07,0x82,0x01,0x82,
-0x08,0x83,0x03,0x81,0x01,0x82,0x08,0x85,0x09,0x82,0x01,0x82,0x0b,0x83,0x0d,
-0x82,0x0d,0x82,0x0e,0x82,0x0f,0x82,0x43,0x82,0x02,0x82,0x08,0x83,0x05,0x82,
-0x08,0x81,0x03,0x81,0x04,0x81,0x02,0x82,0x05,0x84,0x16,0x82,0x0f,0x82,0x1b,
-0x82,0x39,0x82,0x0a,0x83,0x05,0x82,0x09,0x83,0x0a,0x83,0x0a,0x82,0x06,0x82,
-0x0b,0x83,0x07,0x82,0x05,0x82,0x06,0x82,0x05,0x82,0x08,0x82,0x0a,0x82,0x06,
-0x82,0x0c,0x83,0x27,0x85,0x18,0x84,0x15,0x82,0x02,0x82,0x02,0x82,0x02,0x81,
-0x05,0x82,0x06,0x82,0x04,0x82,0x07,0x82,0x04,0x82,0x07,0x82,0x04,0x82,0x06,
-0x83,0x05,0x82,0x0d,0x82,0x0c,0x82,0x07,0x82,0x03,0x82,0x08,0x82,0x08,0x82,
-0x0a,0x82,0x05,0x82,0x06,0x82,0x04,0x83,0x06,0x82,0x0a,0x82,0x03,0x84,0x03,
-0x82,0x03,0x82,0x05,0x85,0x03,0x82,0x07,0x82,0x04,0x82,0x0d,0x82,0x05,0x81,
-0x01,0x82,0x04,0x82,0x06,0x83,0x04,0x83,0x06,0x82,0x08,0x83,0x08,0x82,0x07,
-0x82,0x07,0x84,0x08,0x83,0x04,0x82,0x07,0x82,0x04,0x82,0x0a,0x82,0x0a,0x83,
-0x10,0x82,0x0e,0x82,0x0b,0x82,0x36,0x82,0x05,0x83,0x05,0x82,0x05,0x82,0x06,
-0x83,0x05,0x82,0x05,0x82,0x06,0x82,0x05,0x83,0x10,0x82,0x09,0x83,0x05,0x82,
-0x06,0x82,0x05,0x82,0x09,0x82,0x0e,0x82,0x0a,0x82,0x02,0x83,0x0a,0x82,0x07,
-0x82,0x04,0x82,0x04,0x82,0x03,0x82,0x05,0x82,0x06,0x83,0x05,0x82,0x06,0x82,
-0x05,0x82,0x05,0x82,0x06,0x82,0x08,0x82,0x0a,0x82,0x05,0x82,0x08,0x82,0x0b,
-0x82,0x06,0x82,0x08,0x81,0x01,0x82,0x08,0x83,0x03,0x84,0x08,0x82,0x01,0x82,
-0x09,0x82,0x01,0x82,0x0b,0x82,0x0e,0x82,0x0d,0x82,0x0d,0x83,0x54,0x82,0x02,
-0x82,0x09,0x82,0x04,0x83,0x07,0x82,0x03,0x81,0x04,0x81,0x02,0x82,0x06,0x82,
-0x18,0x82,0x0d,0x82,0x1c,0x82,0x39,0x81,0x0c,0x82,0x04,0x83,0x09,0x83,0x09,
-0x83,0x0c,0x82,0x05,0x82,0x0b,0x83,0x07,0x82,0x04,0x83,0x06,0x83,0x04,0x82,
-0x08,0x82,0x0a,0x83,0x05,0x82,0x0c,0x82,0x2b,0x83,0x15,0x84,0x18,0x81,0x03,
-0x83,0x01,0x83,0x05,0x82,0x07,0x83,0x03,0x82,0x06,0x83,0x04,0x83,0x05,0x82,
-0x05,0x82,0x06,0x82,0x06,0x82,0x0d,0x82,0x0c,0x83,0x06,0x82,0x03,0x82,0x08,
-0x82,0x08,0x82,0x0a,0x82,0x05,0x82,0x06,0x82,0x05,0x83,0x05,0x82,0x0a,0x82,
-0x04,0x82,0x04,0x82,0x03,0x82,0x06,0x84,0x03,0x83,0x05,0x83,0x04,0x82,0x0d,
-0x83,0x05,0x83,0x04,0x82,0x06,0x83,0x05,0x82,0x06,0x82,0x08,0x83,0x08,0x83,
-0x05,0x83,0x07,0x84,0x08,0x82,0x05,0x82,0x06,0x83,0x04,0x83,0x09,0x82,0x0a,
-0x82,0x11,0x82,0x0e,0x82,0x0b,0x82,0x36,0x82,0x05,0x83,0x05,0x83,0x04,0x82,
-0x07,0x82,0x05,0x82,0x06,0x82,0x04,0x83,0x06,0x82,0x10,0x82,0x0a,0x82,0x04,
-0x83,0x06,0x82,0x05,0x82,0x09,0x82,0x0e,0x82,0x0a,0x82,0x03,0x82,0x0a,0x82,
-0x07,0x82,0x04,0x82,0x04,0x82,0x03,0x82,0x05,0x82,0x07,0x82,0x04,0x83,0x06,
-0x82,0x05,0x82,0x06,0x82,0x04,0x83,0x08,0x82,0x0a,0x83,0x04,0x82,0x08,0x82,
-0x03,0x82,0x06,0x83,0x04,0x83,0x08,0x83,0x09,0x82,0x04,0x83,0x08,0x82,0x03,
-0x82,0x09,0x83,0x0b,0x82,0x0f,0x82,0x0d,0x82,0x0d,0x83,0x38,0x82,0x1a,0x81,
-0x03,0x82,0x09,0x88,0x08,0x81,0x04,0x82,0x02,0x82,0x03,0x83,0x02,0x85,0x17,
-0x82,0x0d,0x82,0x29,0x82,0x1d,0x82,0x0c,0x82,0x0c,0x83,0x02,0x83,0x0a,0x83,
-0x09,0x89,0x06,0x84,0x01,0x83,0x0c,0x83,0x07,0x84,0x01,0x83,0x08,0x83,0x01,
-0x83,0x09,0x82,0x0b,0x84,0x01,0x83,0x07,0x82,0x02,0x84,0x09,0x82,0x0d,0x82,
-0x13,0x81,0x15,0x82,0x10,0x82,0x08,0x81,0x0f,0x82,0x08,0x82,0x03,0x8a,0x06,
-0x83,0x02,0x84,0x05,0x89,0x07,0x89,0x06,0x82,0x0d,0x84,0x02,0x84,0x03,0x82,
-0x08,0x82,0x06,0x86,0x09,0x83,0x01,0x83,0x07,0x82,0x06,0x83,0x04,0x8a,0x02,
-0x82,0x04,0x82,0x04,0x82,0x03,0x82,0x07,0x83,0x04,0x89,0x05,0x82,0x0e,0x8a,
-0x04,0x82,0x07,0x82,0x05,0x84,0x02,0x83,0x09,0x83,0x09,0x84,0x01,0x84,0x08,
-0x83,0x09,0x82,0x05,0x82,0x06,0x82,0x06,0x82,0x09,0x82,0x09,0x8b,0x09,0x82,
-0x0f,0x82,0x0a,0x82,0x37,0x89,0x05,0x88,0x08,0x88,0x07,0x89,0x06,0x84,0x02,
-0x82,0x0a,0x82,0x0a,0x89,0x06,0x82,0x05,0x82,0x06,0x88,0x0b,0x82,0x0a,0x82,
-0x04,0x82,0x06,0x88,0x04,0x82,0x04,0x82,0x04,0x82,0x03,0x82,0x05,0x82,0x07,
-0x84,0x01,0x83,0x07,0x84,0x01,0x83,0x07,0x83,0x02,0x84,0x08,0x82,0x0b,0x83,
-0x02,0x83,0x08,0x87,0x06,0x8a,0x08,0x83,0x09,0x82,0x05,0x82,0x07,0x83,0x03,
-0x83,0x08,0x83,0x0a,0x89,0x09,0x82,0x0d,0x82,0x0d,0x83,0x38,0x82,0x1a,0x81,
-0x03,0x82,0x0a,0x86,0x0f,0x84,0x05,0x86,0x01,0x83,0x16,0x82,0x0d,0x82,0x29,
-0x82,0x1d,0x82,0x0c,0x82,0x0d,0x86,0x0b,0x83,0x09,0x89,0x07,0x86,0x0d,0x83,
-0x08,0x86,0x0a,0x85,0x0a,0x82,0x0c,0x86,0x08,0x86,0x0b,0x82,0x0d,0x82,0x3b,
-0x82,0x09,0x81,0x0e,0x82,0x08,0x82,0x03,0x89,0x08,0x86,0x07,0x88,0x08,0x89,
-0x06,0x82,0x0e,0x87,0x05,0x82,0x08,0x82,0x06,0x86,0x0a,0x85,0x08,0x82,0x07,
-0x82,0x04,0x8a,0x02,0x82,0x0a,0x82,0x03,0x82,0x07,0x83,0x05,0x86,0x07,0x82,
-0x0f,0x86,0x01,0x83,0x03,0x82,0x07,0x82,0x07,0x86,0x0a,0x83,0x0a,0x87,0x0a,
-0x82,0x09,0x82,0x06,0x81,0x05,0x83,0x06,0x83,0x08,0x82,0x09,0x8b,0x09,0x82,
-0x0f,0x82,0x0a,0x82,0x37,0x85,0x02,0x82,0x05,0x81,0x01,0x85,0x0b,0x85,0x09,
-0x85,0x01,0x82,0x08,0x86,0x0a,0x82,0x0b,0x85,0x01,0x82,0x06,0x82,0x05,0x82,
-0x06,0x88,0x0b,0x82,0x0a,0x82,0x04,0x83,0x05,0x88,0x04,0x82,0x04,0x82,0x04,
-0x82,0x03,0x82,0x05,0x82,0x09,0x85,0x08,0x87,0x09,0x85,0x01,0x82,0x08,0x82,
-0x0c,0x86,0x0a,0x84,0x09,0x86,0x01,0x82,0x09,0x82,0x0a,0x81,0x05,0x82,0x07,
-0x82,0x05,0x82,0x08,0x83,0x0a,0x89,0x09,0x82,0x0d,0x82,0x0d,0x82,0x68,0x81,
-0x3b,0x82,0x0b,0x82,0x2a,0x82,0x2a,0x82,0x7f,0x35,0x82,0x46,0x83,0x7f,0x7f,
-0x08,0x82,0x7f,0x10,0x82,0x10,0x82,0x09,0x82,0x18,0x8a,0x76,0x82,0x28,0x82,
-0x54,0x82,0x14,0x82,0x71,0x82,0x1d,0x82,0x0d,0x82,0x0d,0x82,0x68,0x81,0x3b,
-0x82,0x0b,0x82,0x2a,0x82,0x2a,0x82,0x7f,0x35,0x82,0x48,0x86,0x7f,0x7f,0x7f,
-0x15,0x84,0x0e,0x82,0x07,0x84,0x18,0x8a,0x76,0x82,0x28,0x82,0x54,0x82,0x14,
-0x82,0x71,0x82,0x1d,0x83,0x0c,0x82,0x0d,0x82,0x7f,0x26,0x82,0x09,0x82,0x2b,
-0x81,0x7f,0x62,0x81,0x7f,0x7f,0x7f,0x64,0x84,0x17,0x84,0x7f,0x12,0x82,0x04,
-0x82,0x28,0x83,0x54,0x82,0x14,0x82,0x70,0x83,0x1e,0x83,0x0b,0x82,0x0c,0x82,
-0x7f,0x28,0x82,0x07,0x82,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x27,0x88,0x26,
-0x84,0x55,0x82,0x14,0x82,0x6e,0x84,0x21,0x81,0x0b,0x82,0x0c,0x81,0x7f,0x2a,
-0x81,0x07,0x81,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x2a,0x84,0x28,0x83,0x7f,
-0x5d,0x83,0x64,
-0x00,
-  }
-};
diff --git a/minui21/roboto_23x41.h b/minui21/roboto_23x41.h
deleted file mode 100644
index 6e7566e..0000000
--- a/minui21/roboto_23x41.h
+++ /dev/null
@@ -1,461 +0,0 @@
-struct {
-  unsigned width;
-  unsigned height;
-  unsigned cwidth;
-  unsigned cheight;
-  unsigned char rundata[];
-} font = {
-  .width = 2208,
-  .height = 41,
-  .cwidth = 23,
-  .cheight = 41,
-  .rundata = {
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x7f,0x17,0x83,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x2e,0x83,0x60,0x82,0x0a,0x81,0x7f,0x7f,
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x0b,0x87,0x23,0x86,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x7f,0x05,0x83,0x5f,0x83,0x09,0x83,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x7f,0x0a,0x87,0x23,0x86,0x7f,0x7f,0x7f,0x7f,0x7f,0x39,0x82,0x26,
-0x82,0x7f,0x21,0x83,0x5e,0x83,0x0b,0x83,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x09,0x87,0x23,0x86,0x40,0x84,0x27,0x83,0x37,0x83,0x27,0x86,0x20,
-0x83,0x1a,0x83,0x17,0x83,0x0c,0x83,0x16,0x86,0x7f,0x7f,0x5a,0x85,0x10,0x83,
-0x11,0x85,0x7f,0x1d,0x87,0x5c,0x83,0x0b,0x83,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x7f,0x09,0x83,0x2a,0x83,0x41,0x83,0x27,0x83,0x37,0x83,0x26,0x86,
-0x21,0x83,0x1a,0x83,0x17,0x83,0x0c,0x83,0x16,0x86,0x7f,0x7f,0x59,0x84,0x12,
-0x83,0x13,0x84,0x58,0x83,0x11,0x83,0x03,0x83,0x10,0x83,0x04,0x83,0x0a,0x8a,
-0x0c,0x84,0x16,0x85,0x14,0x83,0x18,0x83,0x0d,0x83,0x7f,0x11,0x83,0x0d,0x86,
-0x13,0x84,0x11,0x86,0x11,0x86,0x16,0x83,0x0d,0x8c,0x0e,0x86,0x0b,0x91,0x0c,
-0x87,0x0f,0x86,0x7f,0x05,0x86,0x2a,0x83,0x0d,0x8c,0x10,0x87,0x0a,0x8c,0x0c,
-0x90,0x07,0x90,0x0d,0x86,0x0a,0x83,0x0d,0x83,0x09,0x89,0x16,0x83,0x08,0x83,
-0x0b,0x84,0x06,0x83,0x10,0x84,0x0e,0x84,0x03,0x83,0x0d,0x83,0x0a,0x86,0x0c,
-0x8d,0x0f,0x86,0x0c,0x8c,0x10,0x87,0x09,0x94,0x04,0x83,0x0d,0x83,0x03,0x83,
-0x0e,0x84,0x01,0x83,0x10,0x83,0x03,0x84,0x0b,0x84,0x03,0x84,0x0d,0x84,0x04,
-0x92,0x0c,0x83,0x0e,0x83,0x19,0x83,0x14,0x83,0x2b,0x83,0x26,0x83,0x37,0x83,
-0x25,0x87,0x21,0x83,0x1a,0x83,0x17,0x83,0x0c,0x83,0x19,0x83,0x7f,0x7f,0x59,
-0x83,0x13,0x83,0x14,0x83,0x58,0x83,0x11,0x83,0x03,0x83,0x10,0x83,0x04,0x83,
-0x09,0x8c,0x09,0x88,0x12,0x89,0x12,0x83,0x17,0x83,0x0f,0x83,0x7f,0x0f,0x83,
-0x0c,0x8a,0x0e,0x87,0x0f,0x8a,0x0d,0x8a,0x13,0x84,0x0d,0x8c,0x0c,0x8a,0x09,
-0x91,0x0a,0x8b,0x0b,0x8a,0x7f,0x01,0x8a,0x28,0x83,0x0d,0x8e,0x0c,0x8b,0x08,
-0x8e,0x0a,0x90,0x07,0x90,0x0a,0x8c,0x07,0x83,0x0d,0x83,0x09,0x89,0x16,0x83,
-0x08,0x83,0x0a,0x84,0x07,0x83,0x10,0x85,0x0d,0x84,0x03,0x84,0x0c,0x83,0x08,
-0x8a,0x0a,0x8f,0x0b,0x8a,0x0a,0x8e,0x0c,0x8b,0x07,0x94,0x04,0x83,0x0d,0x83,
-0x03,0x84,0x0d,0x84,0x01,0x83,0x08,0x81,0x07,0x83,0x03,0x84,0x0b,0x84,0x04,
-0x84,0x0b,0x84,0x05,0x92,0x0c,0x83,0x0e,0x84,0x18,0x83,0x14,0x83,0x2b,0x84,
-0x25,0x83,0x37,0x83,0x24,0x84,0x25,0x83,0x43,0x83,0x19,0x83,0x7f,0x33,0x83,
-0x7f,0x22,0x84,0x13,0x83,0x14,0x83,0x58,0x83,0x11,0x83,0x03,0x83,0x10,0x83,
-0x04,0x83,0x09,0x84,0x05,0x84,0x08,0x83,0x02,0x83,0x11,0x8b,0x11,0x83,0x17,
-0x83,0x0f,0x83,0x7f,0x0f,0x83,0x0b,0x8c,0x0b,0x89,0x0e,0x8c,0x0b,0x8c,0x11,
-0x85,0x0c,0x8d,0x0b,0x8b,0x09,0x91,0x09,0x8d,0x09,0x8c,0x7e,0x8c,0x0e,0x87,
-0x11,0x85,0x0c,0x8f,0x0a,0x8e,0x06,0x8f,0x09,0x90,0x07,0x90,0x09,0x8e,0x06,
-0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x09,0x84,0x08,0x83,0x10,0x85,
-0x0c,0x85,0x03,0x85,0x0b,0x83,0x06,0x8e,0x08,0x90,0x08,0x8e,0x08,0x8f,0x0a,
-0x8d,0x06,0x94,0x04,0x83,0x0d,0x83,0x03,0x84,0x0d,0x83,0x02,0x83,0x08,0x81,
-0x07,0x83,0x04,0x84,0x09,0x84,0x05,0x84,0x0b,0x84,0x05,0x92,0x0c,0x83,0x0f,
-0x83,0x18,0x83,0x13,0x85,0x2b,0x83,0x25,0x83,0x37,0x83,0x24,0x83,0x26,0x83,
-0x43,0x83,0x19,0x83,0x7f,0x33,0x83,0x7f,0x22,0x83,0x14,0x83,0x15,0x83,0x57,
-0x83,0x11,0x83,0x03,0x83,0x10,0x82,0x05,0x83,0x08,0x84,0x07,0x83,0x07,0x83,
-0x04,0x83,0x05,0x82,0x08,0x85,0x04,0x84,0x10,0x83,0x16,0x83,0x11,0x83,0x7f,
-0x0e,0x83,0x0a,0x85,0x04,0x85,0x09,0x86,0x01,0x83,0x0d,0x84,0x05,0x84,0x0a,
-0x84,0x05,0x84,0x11,0x85,0x0c,0x84,0x13,0x84,0x06,0x82,0x16,0x84,0x09,0x84,
-0x05,0x84,0x08,0x85,0x04,0x85,0x7d,0x84,0x04,0x84,0x0c,0x8b,0x0f,0x85,0x0c,
-0x83,0x08,0x85,0x08,0x85,0x06,0x84,0x06,0x83,0x08,0x85,0x08,0x83,0x14,0x83,
-0x15,0x85,0x06,0x85,0x05,0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x08,
-0x84,0x09,0x83,0x10,0x86,0x0b,0x85,0x03,0x85,0x0b,0x83,0x05,0x85,0x06,0x85,
-0x07,0x83,0x09,0x85,0x06,0x85,0x06,0x85,0x07,0x83,0x08,0x85,0x08,0x85,0x05,
-0x85,0x0e,0x83,0x0c,0x83,0x0d,0x83,0x04,0x83,0x0c,0x84,0x02,0x83,0x07,0x82,
-0x07,0x83,0x05,0x84,0x07,0x84,0x07,0x84,0x09,0x84,0x14,0x83,0x0d,0x83,0x0f,
-0x83,0x18,0x83,0x13,0x85,0x53,0x83,0x37,0x83,0x24,0x83,0x26,0x83,0x43,0x83,
-0x19,0x83,0x7f,0x33,0x83,0x7f,0x22,0x83,0x14,0x83,0x15,0x83,0x57,0x83,0x11,
-0x83,0x03,0x83,0x10,0x82,0x05,0x82,0x09,0x83,0x08,0x84,0x06,0x83,0x04,0x83,
-0x05,0x82,0x08,0x83,0x07,0x83,0x10,0x83,0x16,0x83,0x11,0x83,0x2c,0x83,0x5d,
-0x83,0x0b,0x83,0x08,0x83,0x09,0x83,0x04,0x83,0x0d,0x83,0x07,0x84,0x08,0x84,
-0x07,0x84,0x0f,0x86,0x0c,0x83,0x13,0x84,0x1e,0x84,0x09,0x84,0x07,0x84,0x07,
-0x83,0x08,0x83,0x7c,0x84,0x06,0x84,0x0a,0x83,0x06,0x84,0x0e,0x86,0x0b,0x83,
-0x0a,0x84,0x07,0x84,0x08,0x84,0x05,0x83,0x0a,0x84,0x07,0x83,0x14,0x83,0x15,
-0x84,0x09,0x83,0x05,0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x08,0x83,
-0x0a,0x83,0x10,0x86,0x0b,0x85,0x03,0x86,0x0a,0x83,0x05,0x84,0x08,0x84,0x07,
-0x83,0x0b,0x83,0x06,0x84,0x08,0x84,0x07,0x83,0x0a,0x84,0x06,0x84,0x09,0x83,
-0x0e,0x83,0x0c,0x83,0x0d,0x83,0x04,0x84,0x0b,0x84,0x03,0x82,0x07,0x83,0x06,
-0x82,0x06,0x84,0x07,0x84,0x08,0x83,0x09,0x84,0x13,0x84,0x0d,0x83,0x0f,0x84,
-0x17,0x83,0x13,0x82,0x01,0x83,0x52,0x83,0x37,0x83,0x24,0x83,0x26,0x83,0x43,
-0x83,0x19,0x83,0x7f,0x33,0x83,0x7f,0x22,0x83,0x14,0x83,0x15,0x83,0x57,0x83,
-0x11,0x83,0x03,0x83,0x0f,0x83,0x04,0x83,0x09,0x83,0x09,0x83,0x06,0x83,0x04,
-0x83,0x04,0x82,0x09,0x83,0x07,0x83,0x10,0x83,0x15,0x83,0x13,0x83,0x2b,0x83,
-0x5d,0x83,0x0b,0x83,0x08,0x83,0x10,0x83,0x0c,0x83,0x09,0x83,0x08,0x83,0x09,
-0x83,0x0f,0x86,0x0c,0x83,0x13,0x83,0x1e,0x84,0x0a,0x83,0x09,0x83,0x06,0x84,
-0x08,0x83,0x7c,0x83,0x08,0x83,0x09,0x83,0x09,0x83,0x0c,0x87,0x0b,0x83,0x0b,
-0x83,0x06,0x84,0x0a,0x84,0x04,0x83,0x0b,0x84,0x06,0x83,0x14,0x83,0x14,0x84,
-0x0a,0x84,0x04,0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x07,0x84,0x0a,
-0x83,0x10,0x86,0x0a,0x86,0x03,0x87,0x09,0x83,0x04,0x84,0x0a,0x84,0x06,0x83,
-0x0b,0x84,0x04,0x84,0x0a,0x84,0x06,0x83,0x0b,0x83,0x06,0x83,0x0a,0x84,0x0d,
-0x83,0x0c,0x83,0x0d,0x83,0x04,0x84,0x0b,0x83,0x04,0x83,0x06,0x83,0x06,0x82,
-0x07,0x84,0x05,0x84,0x09,0x84,0x07,0x84,0x13,0x84,0x0e,0x83,0x10,0x83,0x17,
-0x83,0x12,0x83,0x01,0x83,0x52,0x83,0x37,0x83,0x24,0x83,0x26,0x83,0x43,0x83,
-0x19,0x83,0x7f,0x33,0x83,0x7f,0x22,0x83,0x14,0x83,0x15,0x83,0x57,0x83,0x11,
-0x82,0x04,0x82,0x10,0x83,0x04,0x83,0x09,0x83,0x09,0x83,0x06,0x83,0x04,0x83,
-0x04,0x82,0x09,0x83,0x07,0x83,0x10,0x82,0x16,0x83,0x13,0x83,0x14,0x83,0x14,
-0x83,0x5d,0x82,0x0b,0x83,0x0a,0x83,0x0f,0x83,0x0c,0x83,0x09,0x83,0x08,0x83,
-0x09,0x83,0x0e,0x83,0x01,0x83,0x0c,0x83,0x13,0x83,0x1e,0x83,0x0b,0x83,0x09,
-0x83,0x06,0x83,0x0a,0x83,0x0d,0x83,0x14,0x83,0x5f,0x83,0x08,0x83,0x0b,0x82,
-0x0c,0x83,0x01,0x83,0x0b,0x83,0x0b,0x83,0x06,0x83,0x0c,0x83,0x04,0x83,0x0c,
-0x83,0x06,0x83,0x14,0x83,0x14,0x83,0x0c,0x83,0x04,0x83,0x0d,0x83,0x0c,0x83,
-0x19,0x83,0x08,0x83,0x06,0x84,0x0b,0x83,0x10,0x87,0x09,0x86,0x03,0x87,0x09,
-0x83,0x04,0x83,0x0c,0x83,0x06,0x83,0x0c,0x83,0x04,0x83,0x0c,0x83,0x06,0x83,
-0x0b,0x83,0x06,0x83,0x0b,0x83,0x0d,0x83,0x0c,0x83,0x0d,0x83,0x05,0x83,0x0a,
-0x84,0x04,0x83,0x06,0x83,0x05,0x83,0x07,0x84,0x05,0x84,0x0a,0x83,0x07,0x84,
-0x13,0x83,0x0f,0x83,0x10,0x83,0x17,0x83,0x12,0x83,0x01,0x83,0x40,0x86,0x0c,
-0x83,0x03,0x85,0x11,0x86,0x10,0x85,0x03,0x83,0x0d,0x85,0x0f,0x8a,0x0f,0x85,
-0x04,0x82,0x08,0x83,0x03,0x85,0x0f,0x86,0x17,0x83,0x0c,0x83,0x07,0x84,0x0e,
-0x83,0x0a,0x83,0x02,0x83,0x07,0x83,0x09,0x83,0x03,0x85,0x10,0x86,0x0d,0x82,
-0x04,0x85,0x10,0x85,0x04,0x82,0x09,0x83,0x02,0x85,0x11,0x86,0x0c,0x8d,0x0a,
-0x83,0x09,0x83,0x08,0x84,0x09,0x83,0x03,0x84,0x0f,0x83,0x05,0x84,0x08,0x84,
-0x07,0x83,0x0a,0x83,0x07,0x8f,0x0e,0x83,0x14,0x83,0x15,0x83,0x57,0x83,0x11,
-0x82,0x04,0x82,0x0b,0x92,0x06,0x83,0x12,0x83,0x04,0x83,0x03,0x82,0x0a,0x83,
-0x06,0x84,0x10,0x82,0x16,0x83,0x13,0x83,0x14,0x83,0x14,0x83,0x5c,0x83,0x0b,
-0x83,0x0a,0x83,0x0f,0x83,0x0c,0x83,0x09,0x83,0x14,0x83,0x0d,0x84,0x01,0x83,
-0x0c,0x83,0x12,0x83,0x1e,0x83,0x0c,0x83,0x09,0x83,0x06,0x83,0x0a,0x83,0x0d,
-0x83,0x14,0x83,0x5f,0x83,0x07,0x83,0x0d,0x82,0x0b,0x83,0x01,0x84,0x0a,0x83,
-0x0b,0x83,0x05,0x84,0x0c,0x83,0x04,0x83,0x0c,0x83,0x06,0x83,0x14,0x83,0x13,
-0x83,0x0d,0x83,0x04,0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x05,0x84,
-0x0c,0x83,0x10,0x83,0x01,0x83,0x08,0x83,0x01,0x83,0x03,0x83,0x01,0x84,0x08,
-0x83,0x03,0x84,0x0c,0x84,0x05,0x83,0x0c,0x83,0x03,0x84,0x0c,0x84,0x05,0x83,
-0x0b,0x83,0x06,0x83,0x0b,0x83,0x0d,0x83,0x0c,0x83,0x0d,0x83,0x05,0x84,0x09,
-0x84,0x04,0x83,0x06,0x83,0x05,0x83,0x08,0x84,0x03,0x84,0x0b,0x84,0x05,0x84,
-0x13,0x84,0x0f,0x83,0x10,0x84,0x16,0x83,0x11,0x83,0x03,0x83,0x3d,0x8a,0x0a,
-0x83,0x01,0x89,0x0d,0x89,0x0d,0x89,0x01,0x83,0x0b,0x89,0x0d,0x8a,0x0d,0x89,
-0x01,0x83,0x08,0x83,0x01,0x89,0x0d,0x86,0x17,0x83,0x0c,0x83,0x06,0x84,0x0f,
-0x83,0x0a,0x83,0x01,0x86,0x03,0x87,0x07,0x83,0x01,0x89,0x0d,0x89,0x0b,0x83,
-0x01,0x89,0x0c,0x89,0x01,0x83,0x09,0x83,0x01,0x88,0x0d,0x8a,0x0a,0x8d,0x0a,
-0x83,0x09,0x83,0x08,0x84,0x09,0x83,0x03,0x84,0x06,0x82,0x06,0x84,0x06,0x84,
-0x06,0x84,0x08,0x84,0x08,0x84,0x07,0x8f,0x0e,0x83,0x14,0x83,0x15,0x83,0x57,
-0x83,0x11,0x82,0x04,0x82,0x0b,0x92,0x06,0x84,0x12,0x83,0x02,0x83,0x03,0x83,
-0x0a,0x84,0x04,0x84,0x11,0x82,0x16,0x83,0x13,0x83,0x14,0x83,0x14,0x83,0x5c,
-0x83,0x0b,0x83,0x0a,0x83,0x0f,0x83,0x18,0x83,0x13,0x84,0x0d,0x83,0x02,0x83,
-0x0c,0x83,0x12,0x83,0x1d,0x84,0x0c,0x84,0x07,0x84,0x06,0x83,0x0a,0x83,0x0d,
-0x83,0x14,0x83,0x1a,0x82,0x0a,0x8f,0x08,0x81,0x21,0x83,0x07,0x82,0x06,0x84,
-0x04,0x83,0x09,0x83,0x03,0x83,0x0a,0x83,0x0b,0x83,0x05,0x83,0x0d,0x83,0x04,
-0x83,0x0d,0x83,0x05,0x83,0x14,0x83,0x13,0x83,0x14,0x83,0x0d,0x83,0x0c,0x83,
-0x19,0x83,0x08,0x83,0x04,0x84,0x0d,0x83,0x10,0x83,0x01,0x84,0x07,0x83,0x01,
-0x83,0x03,0x83,0x01,0x85,0x07,0x83,0x03,0x83,0x0e,0x83,0x05,0x83,0x0c,0x83,
-0x03,0x83,0x0e,0x83,0x05,0x83,0x0b,0x83,0x06,0x83,0x1b,0x83,0x0c,0x83,0x0d,
-0x83,0x05,0x84,0x09,0x83,0x06,0x82,0x06,0x83,0x05,0x82,0x0a,0x83,0x02,0x84,
-0x0d,0x83,0x05,0x83,0x13,0x84,0x10,0x83,0x11,0x83,0x16,0x83,0x11,0x83,0x03,
-0x83,0x3c,0x8c,0x09,0x8e,0x0b,0x8b,0x0b,0x8e,0x0a,0x8b,0x0c,0x8a,0x0c,0x8e,
-0x08,0x8e,0x0f,0x83,0x17,0x83,0x0c,0x83,0x06,0x84,0x0f,0x83,0x0a,0x8b,0x01,
-0x89,0x06,0x8e,0x0a,0x8c,0x0a,0x8e,0x0a,0x8e,0x09,0x8d,0x0b,0x8c,0x09,0x8d,
-0x0a,0x83,0x09,0x83,0x08,0x84,0x08,0x84,0x03,0x84,0x05,0x83,0x06,0x84,0x06,
-0x84,0x06,0x83,0x09,0x84,0x08,0x84,0x07,0x8f,0x0e,0x83,0x14,0x83,0x15,0x83,
-0x57,0x83,0x24,0x92,0x07,0x83,0x12,0x88,0x03,0x82,0x0c,0x83,0x03,0x84,0x29,
-0x83,0x15,0x83,0x0f,0x81,0x03,0x83,0x03,0x81,0x10,0x83,0x5b,0x83,0x0c,0x83,
-0x0a,0x83,0x0f,0x83,0x17,0x83,0x13,0x84,0x0d,0x83,0x03,0x83,0x0c,0x83,0x01,
-0x85,0x0c,0x83,0x03,0x85,0x15,0x83,0x0e,0x84,0x05,0x84,0x07,0x83,0x0a,0x83,
-0x3f,0x84,0x0a,0x8f,0x08,0x83,0x1e,0x83,0x07,0x82,0x06,0x86,0x04,0x82,0x09,
-0x83,0x03,0x83,0x0a,0x83,0x0a,0x83,0x06,0x83,0x14,0x83,0x0d,0x83,0x05,0x83,
-0x14,0x83,0x13,0x83,0x14,0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x03,
-0x84,0x0e,0x83,0x10,0x83,0x02,0x83,0x06,0x84,0x01,0x83,0x03,0x83,0x02,0x84,
-0x07,0x83,0x03,0x83,0x0e,0x83,0x05,0x83,0x0c,0x83,0x03,0x83,0x0e,0x83,0x05,
-0x83,0x0b,0x83,0x07,0x83,0x1a,0x83,0x0c,0x83,0x0d,0x83,0x06,0x83,0x08,0x84,
-0x06,0x83,0x04,0x85,0x04,0x82,0x0a,0x84,0x01,0x84,0x0d,0x84,0x03,0x84,0x12,
-0x84,0x11,0x83,0x11,0x84,0x15,0x83,0x11,0x83,0x03,0x84,0x3b,0x84,0x04,0x84,
-0x09,0x85,0x05,0x84,0x0b,0x84,0x04,0x84,0x0a,0x84,0x05,0x85,0x09,0x84,0x05,
-0x84,0x0e,0x83,0x10,0x84,0x05,0x85,0x08,0x85,0x05,0x84,0x0f,0x83,0x17,0x83,
-0x0c,0x83,0x05,0x84,0x10,0x83,0x0a,0x85,0x02,0x84,0x01,0x83,0x02,0x84,0x06,
-0x85,0x05,0x84,0x0a,0x84,0x05,0x84,0x09,0x85,0x05,0x84,0x0a,0x84,0x05,0x85,
-0x09,0x85,0x05,0x84,0x09,0x84,0x05,0x84,0x0c,0x83,0x11,0x83,0x09,0x83,0x09,
-0x83,0x08,0x83,0x05,0x83,0x05,0x83,0x06,0x83,0x08,0x84,0x04,0x84,0x0a,0x83,
-0x08,0x83,0x12,0x84,0x0f,0x83,0x14,0x83,0x15,0x83,0x57,0x83,0x28,0x83,0x05,
-0x82,0x0b,0x85,0x12,0x84,0x04,0x82,0x0d,0x89,0x2a,0x83,0x15,0x83,0x0e,0x88,
-0x01,0x83,0x10,0x83,0x5b,0x83,0x0c,0x83,0x0a,0x83,0x0f,0x83,0x17,0x83,0x0e,
-0x88,0x0e,0x83,0x03,0x83,0x0c,0x8b,0x0a,0x83,0x01,0x89,0x12,0x83,0x10,0x8b,
-0x08,0x83,0x0a,0x83,0x3c,0x87,0x0a,0x8f,0x08,0x86,0x1a,0x84,0x07,0x82,0x05,
-0x83,0x02,0x82,0x04,0x82,0x08,0x84,0x03,0x84,0x09,0x83,0x09,0x84,0x06,0x83,
-0x14,0x83,0x0d,0x83,0x05,0x83,0x14,0x83,0x13,0x83,0x14,0x83,0x0d,0x83,0x0c,
-0x83,0x19,0x83,0x08,0x83,0x02,0x84,0x0f,0x83,0x10,0x83,0x02,0x83,0x06,0x83,
-0x02,0x83,0x03,0x83,0x03,0x84,0x06,0x83,0x03,0x83,0x0e,0x83,0x05,0x83,0x0b,
-0x84,0x03,0x83,0x0e,0x83,0x05,0x83,0x0a,0x83,0x08,0x84,0x19,0x83,0x0c,0x83,
-0x0d,0x83,0x06,0x84,0x07,0x84,0x06,0x83,0x04,0x85,0x03,0x83,0x0b,0x87,0x0f,
-0x83,0x03,0x83,0x13,0x84,0x11,0x83,0x12,0x83,0x15,0x83,0x10,0x83,0x05,0x83,
-0x3a,0x83,0x07,0x84,0x08,0x84,0x07,0x84,0x09,0x84,0x06,0x84,0x08,0x84,0x07,
-0x84,0x08,0x84,0x07,0x83,0x0e,0x83,0x0f,0x84,0x07,0x84,0x08,0x84,0x07,0x84,
-0x0e,0x83,0x17,0x83,0x0c,0x83,0x04,0x84,0x11,0x83,0x0a,0x84,0x04,0x85,0x05,
-0x84,0x05,0x84,0x07,0x84,0x08,0x84,0x07,0x84,0x08,0x84,0x07,0x84,0x08,0x84,
-0x07,0x84,0x09,0x84,0x08,0x82,0x09,0x83,0x07,0x84,0x0b,0x83,0x11,0x83,0x09,
-0x83,0x09,0x84,0x07,0x83,0x05,0x83,0x05,0x83,0x06,0x83,0x09,0x83,0x04,0x83,
-0x0b,0x84,0x06,0x84,0x12,0x84,0x0f,0x83,0x14,0x83,0x15,0x83,0x57,0x83,0x28,
-0x83,0x04,0x83,0x0c,0x86,0x17,0x83,0x0e,0x86,0x2c,0x83,0x15,0x83,0x0e,0x8d,
-0x0f,0x83,0x5b,0x82,0x0d,0x83,0x0a,0x83,0x0f,0x83,0x16,0x83,0x0f,0x87,0x0e,
-0x83,0x04,0x83,0x0c,0x8c,0x09,0x8e,0x11,0x83,0x12,0x87,0x0a,0x84,0x09,0x83,
-0x3a,0x88,0x22,0x88,0x18,0x83,0x08,0x82,0x04,0x83,0x03,0x82,0x04,0x83,0x07,
-0x83,0x05,0x83,0x09,0x8f,0x07,0x83,0x14,0x83,0x0d,0x83,0x05,0x8e,0x09,0x8f,
-0x07,0x83,0x14,0x93,0x0c,0x83,0x19,0x83,0x08,0x88,0x10,0x83,0x10,0x83,0x02,
-0x84,0x05,0x83,0x02,0x83,0x03,0x83,0x03,0x85,0x05,0x83,0x03,0x83,0x0e,0x83,
-0x05,0x83,0x0b,0x83,0x04,0x83,0x0e,0x83,0x05,0x83,0x09,0x84,0x09,0x86,0x16,
-0x83,0x0c,0x83,0x0d,0x83,0x07,0x83,0x07,0x83,0x07,0x83,0x04,0x82,0x01,0x82,
-0x03,0x83,0x0c,0x85,0x10,0x84,0x01,0x84,0x12,0x84,0x12,0x83,0x12,0x83,0x15,
-0x83,0x10,0x83,0x05,0x83,0x3a,0x83,0x08,0x83,0x08,0x83,0x09,0x83,0x09,0x83,
-0x08,0x83,0x08,0x83,0x09,0x83,0x08,0x83,0x09,0x83,0x0d,0x83,0x0f,0x83,0x09,
-0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,0x83,0x04,0x84,0x11,0x83,
-0x0a,0x83,0x06,0x84,0x06,0x83,0x05,0x83,0x09,0x83,0x08,0x83,0x09,0x83,0x08,
-0x83,0x09,0x83,0x08,0x83,0x09,0x83,0x09,0x83,0x14,0x83,0x08,0x83,0x0b,0x83,
-0x11,0x83,0x09,0x83,0x0a,0x83,0x06,0x84,0x05,0x84,0x04,0x84,0x05,0x83,0x09,
-0x84,0x02,0x84,0x0b,0x84,0x06,0x84,0x11,0x84,0x0f,0x83,0x15,0x83,0x16,0x83,
-0x56,0x83,0x28,0x83,0x04,0x83,0x0d,0x88,0x14,0x82,0x0f,0x85,0x2d,0x83,0x15,
-0x83,0x11,0x88,0x0a,0x92,0x52,0x83,0x0d,0x83,0x0a,0x83,0x0f,0x83,0x15,0x84,
-0x0f,0x89,0x0b,0x83,0x05,0x83,0x0b,0x85,0x04,0x85,0x08,0x85,0x05,0x85,0x0f,
-0x83,0x11,0x8b,0x09,0x83,0x08,0x84,0x38,0x88,0x26,0x88,0x15,0x83,0x08,0x82,
-0x05,0x83,0x03,0x82,0x05,0x82,0x07,0x83,0x05,0x83,0x09,0x8f,0x07,0x83,0x14,
-0x83,0x0d,0x83,0x05,0x8e,0x09,0x8f,0x07,0x83,0x07,0x89,0x04,0x93,0x0c,0x83,
-0x19,0x83,0x08,0x88,0x10,0x83,0x10,0x83,0x03,0x83,0x04,0x83,0x03,0x83,0x03,
-0x83,0x04,0x84,0x05,0x83,0x03,0x83,0x0e,0x83,0x05,0x83,0x09,0x85,0x04,0x83,
-0x0e,0x83,0x05,0x8f,0x0c,0x87,0x13,0x83,0x0c,0x83,0x0d,0x83,0x07,0x83,0x06,
-0x84,0x08,0x82,0x04,0x82,0x01,0x83,0x02,0x82,0x0d,0x85,0x11,0x83,0x01,0x83,
-0x12,0x84,0x13,0x83,0x12,0x84,0x14,0x83,0x0f,0x84,0x06,0x83,0x44,0x83,0x08,
-0x83,0x09,0x84,0x07,0x83,0x09,0x83,0x07,0x84,0x09,0x83,0x07,0x83,0x0a,0x83,
-0x0d,0x83,0x0e,0x84,0x09,0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,
-0x83,0x03,0x84,0x12,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,
-0x07,0x84,0x09,0x84,0x07,0x83,0x09,0x84,0x06,0x84,0x09,0x83,0x09,0x83,0x14,
-0x83,0x16,0x83,0x11,0x83,0x09,0x83,0x0a,0x83,0x06,0x83,0x06,0x84,0x03,0x85,
-0x04,0x83,0x0b,0x88,0x0d,0x83,0x06,0x83,0x11,0x84,0x0f,0x84,0x15,0x83,0x16,
-0x84,0x0c,0x85,0x44,0x83,0x28,0x82,0x05,0x83,0x0e,0x88,0x12,0x82,0x0f,0x87,
-0x2c,0x83,0x15,0x83,0x12,0x85,0x0c,0x92,0x1f,0x8d,0x26,0x83,0x0d,0x83,0x0a,
-0x83,0x0f,0x83,0x15,0x83,0x16,0x84,0x0a,0x83,0x05,0x83,0x0b,0x84,0x07,0x83,
-0x08,0x84,0x08,0x83,0x0f,0x83,0x10,0x84,0x04,0x85,0x08,0x85,0x04,0x86,0x36,
-0x87,0x2c,0x87,0x12,0x83,0x09,0x82,0x04,0x83,0x04,0x82,0x05,0x82,0x06,0x83,
-0x06,0x84,0x08,0x90,0x06,0x83,0x14,0x83,0x0d,0x83,0x05,0x8e,0x09,0x8f,0x07,
-0x83,0x07,0x89,0x04,0x93,0x0c,0x83,0x19,0x83,0x08,0x89,0x0f,0x83,0x10,0x83,
-0x03,0x84,0x03,0x83,0x03,0x83,0x03,0x83,0x05,0x84,0x04,0x83,0x03,0x83,0x0e,
-0x83,0x05,0x90,0x05,0x83,0x0e,0x83,0x05,0x8e,0x0f,0x87,0x11,0x83,0x0c,0x83,
-0x0d,0x83,0x07,0x84,0x05,0x83,0x09,0x83,0x02,0x83,0x02,0x82,0x02,0x82,0x0d,
-0x85,0x11,0x87,0x12,0x84,0x13,0x83,0x13,0x83,0x14,0x83,0x60,0x83,0x08,0x83,
-0x0a,0x83,0x07,0x83,0x13,0x83,0x0a,0x83,0x07,0x83,0x0a,0x83,0x0d,0x83,0x0e,
-0x83,0x0a,0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,0x83,0x02,0x84,
-0x13,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,0x07,0x83,0x0b,
-0x83,0x07,0x83,0x0a,0x83,0x06,0x83,0x0a,0x83,0x09,0x83,0x14,0x84,0x15,0x83,
-0x11,0x83,0x09,0x83,0x0a,0x84,0x05,0x83,0x07,0x83,0x03,0x85,0x04,0x83,0x0c,
-0x86,0x0e,0x84,0x05,0x83,0x10,0x84,0x0f,0x84,0x16,0x83,0x17,0x85,0x09,0x88,
-0x07,0x83,0x38,0x83,0x28,0x82,0x05,0x82,0x12,0x86,0x11,0x82,0x03,0x84,0x07,
-0x84,0x01,0x84,0x06,0x83,0x22,0x83,0x15,0x83,0x11,0x87,0x0b,0x92,0x1f,0x8d,
-0x26,0x82,0x0e,0x83,0x0a,0x83,0x0f,0x83,0x14,0x83,0x18,0x83,0x09,0x83,0x06,
-0x83,0x16,0x84,0x07,0x83,0x09,0x84,0x0d,0x83,0x10,0x83,0x08,0x83,0x09,0x8e,
-0x34,0x87,0x30,0x87,0x0f,0x83,0x0a,0x82,0x04,0x83,0x04,0x82,0x05,0x82,0x06,
-0x83,0x07,0x83,0x08,0x83,0x09,0x85,0x05,0x83,0x14,0x83,0x0d,0x83,0x05,0x83,
-0x14,0x83,0x13,0x83,0x07,0x89,0x04,0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,
-0x83,0x03,0x84,0x0e,0x83,0x10,0x83,0x04,0x83,0x02,0x84,0x03,0x83,0x03,0x83,
-0x05,0x85,0x03,0x83,0x03,0x83,0x0e,0x83,0x05,0x8f,0x06,0x83,0x0e,0x83,0x05,
-0x8f,0x11,0x86,0x0f,0x83,0x0c,0x83,0x0d,0x83,0x08,0x83,0x05,0x83,0x09,0x83,
-0x02,0x82,0x03,0x82,0x01,0x83,0x0d,0x86,0x11,0x85,0x12,0x84,0x14,0x83,0x13,
-0x83,0x14,0x83,0x59,0x8a,0x08,0x83,0x0a,0x83,0x07,0x83,0x13,0x83,0x0a,0x83,
-0x07,0x90,0x0d,0x83,0x0e,0x83,0x0a,0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,
-0x83,0x0c,0x88,0x14,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,
-0x07,0x83,0x0b,0x83,0x07,0x83,0x0a,0x83,0x06,0x83,0x0a,0x83,0x09,0x83,0x15,
-0x85,0x13,0x83,0x11,0x83,0x09,0x83,0x0b,0x83,0x04,0x84,0x07,0x83,0x03,0x86,
-0x03,0x83,0x0c,0x86,0x0f,0x83,0x04,0x84,0x10,0x84,0x0f,0x83,0x17,0x83,0x18,
-0x84,0x08,0x8a,0x06,0x83,0x38,0x83,0x27,0x83,0x05,0x82,0x14,0x85,0x0f,0x82,
-0x03,0x86,0x05,0x84,0x03,0x84,0x05,0x83,0x22,0x83,0x15,0x83,0x10,0x84,0x01,
-0x83,0x12,0x83,0x27,0x8d,0x25,0x83,0x0e,0x83,0x0a,0x83,0x0f,0x83,0x13,0x83,
-0x1a,0x83,0x07,0x84,0x06,0x83,0x17,0x83,0x07,0x83,0x0a,0x83,0x0d,0x83,0x0f,
-0x84,0x08,0x84,0x09,0x89,0x01,0x83,0x34,0x85,0x35,0x85,0x0d,0x84,0x0a,0x82,
-0x04,0x83,0x04,0x82,0x05,0x82,0x06,0x83,0x07,0x83,0x08,0x83,0x0b,0x83,0x05,
-0x83,0x14,0x83,0x0d,0x83,0x05,0x83,0x14,0x83,0x13,0x83,0x0d,0x83,0x04,0x83,
-0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x03,0x85,0x0d,0x83,0x10,0x83,0x04,
-0x84,0x01,0x83,0x04,0x83,0x03,0x83,0x06,0x84,0x03,0x83,0x03,0x83,0x0e,0x83,
-0x05,0x8d,0x08,0x83,0x0e,0x83,0x05,0x83,0x09,0x84,0x13,0x84,0x0e,0x83,0x0c,
-0x83,0x0d,0x83,0x08,0x83,0x04,0x84,0x09,0x83,0x02,0x82,0x03,0x82,0x01,0x83,
-0x0c,0x87,0x11,0x85,0x11,0x84,0x15,0x83,0x13,0x84,0x13,0x83,0x56,0x8d,0x08,
-0x83,0x0a,0x83,0x07,0x83,0x13,0x83,0x0a,0x83,0x07,0x90,0x0d,0x83,0x0e,0x83,
-0x0a,0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,0x88,0x14,0x83,0x0a,
-0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,0x07,0x83,0x0b,0x83,0x07,0x83,
-0x0a,0x83,0x06,0x83,0x0a,0x83,0x09,0x83,0x16,0x88,0x0f,0x83,0x11,0x83,0x09,
-0x83,0x0b,0x83,0x04,0x83,0x08,0x84,0x01,0x83,0x01,0x83,0x03,0x83,0x0d,0x84,
-0x10,0x83,0x04,0x83,0x10,0x84,0x10,0x84,0x16,0x83,0x17,0x85,0x07,0x84,0x04,
-0x84,0x04,0x84,0x38,0x83,0x23,0x92,0x12,0x84,0x0d,0x83,0x02,0x83,0x02,0x83,
-0x03,0x84,0x05,0x84,0x04,0x83,0x22,0x83,0x15,0x83,0x10,0x83,0x03,0x83,0x11,
-0x83,0x59,0x82,0x0f,0x83,0x0a,0x83,0x0f,0x83,0x12,0x84,0x1a,0x83,0x07,0x83,
-0x07,0x83,0x17,0x83,0x07,0x83,0x0a,0x83,0x0d,0x83,0x0f,0x83,0x0a,0x83,0x0b,
-0x85,0x03,0x83,0x34,0x85,0x14,0x8f,0x13,0x84,0x0d,0x83,0x0b,0x82,0x04,0x83,
-0x04,0x82,0x05,0x82,0x05,0x8f,0x07,0x83,0x0c,0x83,0x04,0x83,0x14,0x83,0x0d,
-0x83,0x05,0x83,0x14,0x83,0x13,0x83,0x0d,0x83,0x04,0x83,0x0d,0x83,0x0c,0x83,
-0x19,0x83,0x08,0x83,0x04,0x85,0x0c,0x83,0x10,0x83,0x04,0x84,0x01,0x83,0x04,
-0x83,0x03,0x83,0x07,0x84,0x02,0x83,0x03,0x83,0x0e,0x83,0x05,0x83,0x12,0x83,
-0x0e,0x83,0x05,0x83,0x0a,0x84,0x13,0x83,0x0e,0x83,0x0c,0x83,0x0d,0x83,0x08,
-0x84,0x03,0x83,0x0a,0x83,0x01,0x83,0x03,0x82,0x01,0x83,0x0b,0x84,0x01,0x84,
-0x11,0x83,0x12,0x83,0x16,0x83,0x14,0x83,0x13,0x83,0x55,0x8e,0x08,0x83,0x0a,
-0x83,0x07,0x83,0x13,0x83,0x0a,0x83,0x07,0x90,0x0d,0x83,0x0e,0x83,0x0a,0x83,
-0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,0x88,0x14,0x83,0x0a,0x83,0x06,
-0x83,0x07,0x83,0x05,0x83,0x09,0x83,0x07,0x83,0x0b,0x83,0x07,0x83,0x0a,0x83,
-0x06,0x83,0x0a,0x83,0x09,0x83,0x19,0x87,0x0d,0x83,0x11,0x83,0x09,0x83,0x0b,
-0x84,0x03,0x83,0x09,0x83,0x01,0x83,0x01,0x83,0x02,0x83,0x0e,0x84,0x10,0x84,
-0x03,0x83,0x0f,0x84,0x12,0x84,0x15,0x83,0x16,0x84,0x09,0x83,0x06,0x8a,0x39,
-0x83,0x23,0x92,0x12,0x84,0x0d,0x82,0x02,0x83,0x04,0x83,0x02,0x83,0x07,0x84,
-0x02,0x84,0x22,0x83,0x15,0x83,0x11,0x81,0x04,0x82,0x12,0x83,0x58,0x83,0x0f,
-0x83,0x0a,0x83,0x0f,0x83,0x11,0x84,0x1b,0x83,0x06,0x92,0x13,0x83,0x07,0x83,
-0x0a,0x83,0x0d,0x83,0x0f,0x83,0x0a,0x83,0x13,0x83,0x35,0x87,0x11,0x8f,0x10,
-0x87,0x0d,0x83,0x0b,0x82,0x04,0x82,0x05,0x82,0x05,0x82,0x05,0x8f,0x07,0x83,
-0x0c,0x83,0x04,0x83,0x0d,0x83,0x04,0x83,0x0d,0x83,0x05,0x83,0x14,0x83,0x13,
-0x83,0x0d,0x83,0x04,0x83,0x0d,0x83,0x0c,0x83,0x19,0x83,0x08,0x83,0x05,0x84,
-0x0c,0x83,0x10,0x83,0x05,0x86,0x05,0x83,0x03,0x83,0x07,0x85,0x01,0x83,0x03,
-0x83,0x0e,0x83,0x05,0x83,0x12,0x83,0x0e,0x83,0x05,0x83,0x0b,0x83,0x14,0x83,
-0x0d,0x83,0x0c,0x83,0x0d,0x83,0x09,0x83,0x03,0x83,0x0b,0x82,0x01,0x82,0x04,
-0x86,0x0b,0x83,0x02,0x84,0x11,0x83,0x11,0x84,0x16,0x83,0x14,0x84,0x12,0x83,
-0x55,0x84,0x07,0x83,0x08,0x83,0x0a,0x83,0x07,0x83,0x13,0x83,0x0a,0x83,0x07,
-0x83,0x1a,0x83,0x0e,0x83,0x0a,0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,
-0x0c,0x83,0x02,0x84,0x13,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,
-0x83,0x07,0x83,0x0b,0x83,0x07,0x83,0x0a,0x83,0x06,0x83,0x0a,0x83,0x09,0x83,
-0x1c,0x85,0x0c,0x83,0x11,0x83,0x09,0x83,0x0c,0x83,0x02,0x84,0x09,0x83,0x01,
-0x83,0x01,0x83,0x02,0x83,0x0d,0x86,0x10,0x83,0x02,0x84,0x0e,0x84,0x14,0x83,
-0x15,0x83,0x16,0x83,0x0a,0x83,0x07,0x88,0x60,0x92,0x13,0x83,0x0c,0x82,0x03,
-0x83,0x04,0x83,0x02,0x83,0x07,0x85,0x01,0x83,0x23,0x83,0x15,0x83,0x2a,0x83,
-0x58,0x83,0x0f,0x83,0x0a,0x83,0x0f,0x83,0x10,0x84,0x0f,0x83,0x0a,0x83,0x06,
-0x92,0x13,0x83,0x07,0x83,0x0a,0x83,0x0c,0x83,0x10,0x83,0x0a,0x83,0x13,0x83,
-0x37,0x87,0x0f,0x8f,0x0e,0x87,0x0f,0x83,0x0b,0x82,0x04,0x82,0x05,0x82,0x05,
-0x82,0x05,0x8f,0x07,0x83,0x0c,0x83,0x04,0x84,0x0c,0x83,0x04,0x83,0x0c,0x84,
-0x05,0x83,0x14,0x83,0x13,0x84,0x0c,0x83,0x04,0x83,0x0d,0x83,0x0c,0x83,0x0d,
-0x83,0x09,0x83,0x08,0x83,0x06,0x84,0x0b,0x83,0x10,0x83,0x05,0x86,0x05,0x83,
-0x03,0x83,0x08,0x84,0x01,0x83,0x03,0x84,0x0c,0x84,0x05,0x83,0x12,0x84,0x0c,
-0x84,0x05,0x83,0x0b,0x83,0x05,0x83,0x0c,0x83,0x0d,0x83,0x0c,0x83,0x0d,0x83,
-0x09,0x84,0x01,0x84,0x0b,0x82,0x01,0x82,0x05,0x84,0x0b,0x84,0x03,0x84,0x10,
-0x83,0x10,0x84,0x17,0x83,0x15,0x83,0x12,0x83,0x54,0x84,0x08,0x83,0x08,0x83,
-0x0a,0x83,0x07,0x83,0x13,0x83,0x0a,0x83,0x07,0x83,0x1a,0x83,0x0e,0x83,0x0a,
-0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,0x83,0x03,0x84,0x12,0x83,
-0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,0x07,0x83,0x0b,0x83,0x07,
-0x83,0x0a,0x83,0x06,0x83,0x0a,0x83,0x09,0x83,0x1e,0x84,0x0b,0x83,0x11,0x83,
-0x09,0x83,0x0c,0x83,0x02,0x83,0x0a,0x83,0x01,0x82,0x03,0x83,0x01,0x83,0x0d,
-0x87,0x0f,0x83,0x02,0x83,0x0f,0x83,0x16,0x83,0x14,0x83,0x15,0x83,0x17,0x85,
-0x65,0x82,0x05,0x83,0x0a,0x83,0x0a,0x83,0x0c,0x82,0x03,0x83,0x04,0x83,0x02,
-0x83,0x08,0x88,0x23,0x83,0x15,0x83,0x2a,0x83,0x58,0x82,0x10,0x83,0x0a,0x83,
-0x0f,0x83,0x0f,0x84,0x10,0x83,0x0a,0x83,0x06,0x92,0x07,0x83,0x09,0x83,0x07,
-0x84,0x09,0x83,0x0c,0x83,0x10,0x83,0x0a,0x83,0x12,0x84,0x39,0x87,0x27,0x88,
-0x1f,0x82,0x04,0x82,0x05,0x82,0x04,0x82,0x05,0x83,0x0a,0x84,0x06,0x83,0x0c,
-0x83,0x05,0x83,0x0c,0x83,0x04,0x83,0x0c,0x83,0x06,0x83,0x14,0x83,0x14,0x83,
-0x0c,0x83,0x04,0x83,0x0d,0x83,0x0c,0x83,0x0d,0x83,0x09,0x83,0x08,0x83,0x07,
-0x84,0x0a,0x83,0x10,0x83,0x06,0x85,0x05,0x83,0x03,0x83,0x09,0x87,0x04,0x83,
-0x0c,0x83,0x06,0x83,0x13,0x83,0x0c,0x83,0x06,0x83,0x0b,0x83,0x05,0x83,0x0c,
-0x83,0x0d,0x83,0x0c,0x83,0x0c,0x84,0x0a,0x83,0x01,0x83,0x0c,0x85,0x05,0x84,
-0x0a,0x84,0x05,0x84,0x0f,0x83,0x10,0x83,0x18,0x83,0x15,0x83,0x12,0x83,0x54,
-0x83,0x09,0x83,0x08,0x83,0x0a,0x83,0x07,0x83,0x09,0x83,0x07,0x83,0x0a,0x83,
-0x07,0x83,0x1a,0x83,0x0e,0x83,0x0a,0x83,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,
-0x83,0x0c,0x83,0x04,0x84,0x11,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,
-0x09,0x83,0x07,0x84,0x09,0x84,0x07,0x83,0x0a,0x83,0x06,0x83,0x0a,0x83,0x09,
-0x83,0x1f,0x83,0x0b,0x83,0x11,0x83,0x09,0x83,0x0d,0x83,0x01,0x83,0x0a,0x86,
-0x03,0x83,0x01,0x82,0x0d,0x83,0x02,0x83,0x0f,0x84,0x01,0x83,0x0e,0x84,0x16,
-0x83,0x14,0x83,0x15,0x83,0x7f,0x02,0x82,0x05,0x82,0x0b,0x83,0x0a,0x83,0x0b,
-0x82,0x04,0x83,0x04,0x83,0x02,0x83,0x09,0x86,0x24,0x83,0x15,0x83,0x2a,0x83,
-0x57,0x83,0x11,0x83,0x08,0x83,0x10,0x83,0x0f,0x83,0x11,0x84,0x08,0x84,0x11,
-0x83,0x0b,0x83,0x08,0x84,0x08,0x83,0x08,0x84,0x0c,0x83,0x10,0x84,0x08,0x84,
-0x12,0x83,0x3c,0x88,0x22,0x88,0x21,0x82,0x04,0x83,0x03,0x83,0x04,0x82,0x05,
-0x83,0x0b,0x83,0x06,0x83,0x0c,0x83,0x05,0x84,0x0a,0x83,0x05,0x83,0x0b,0x84,
-0x06,0x83,0x14,0x83,0x14,0x84,0x0b,0x83,0x04,0x83,0x0d,0x83,0x0c,0x83,0x0d,
-0x83,0x08,0x84,0x08,0x83,0x07,0x85,0x09,0x83,0x10,0x83,0x07,0x83,0x06,0x83,
-0x03,0x83,0x09,0x87,0x04,0x84,0x0a,0x84,0x06,0x83,0x13,0x84,0x0a,0x84,0x06,
-0x83,0x0b,0x83,0x05,0x84,0x0b,0x83,0x0d,0x83,0x0d,0x83,0x0b,0x83,0x0b,0x83,
-0x01,0x83,0x0c,0x85,0x05,0x84,0x0a,0x84,0x05,0x84,0x0f,0x83,0x0f,0x84,0x18,
-0x83,0x15,0x84,0x11,0x83,0x54,0x83,0x09,0x83,0x08,0x83,0x09,0x83,0x09,0x83,
-0x08,0x83,0x07,0x84,0x09,0x83,0x08,0x83,0x19,0x83,0x0e,0x84,0x09,0x83,0x08,
-0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,0x83,0x04,0x84,0x11,0x83,0x0a,0x83,
-0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,0x08,0x83,0x09,0x83,0x08,0x83,0x09,
-0x83,0x07,0x84,0x09,0x83,0x09,0x83,0x13,0x83,0x09,0x83,0x0b,0x83,0x11,0x83,
-0x09,0x83,0x0d,0x86,0x0c,0x85,0x03,0x83,0x01,0x82,0x0c,0x84,0x02,0x84,0x0f,
-0x87,0x0d,0x84,0x17,0x83,0x14,0x83,0x15,0x83,0x7f,0x01,0x83,0x05,0x82,0x0b,
-0x83,0x0a,0x83,0x0a,0x83,0x04,0x83,0x04,0x83,0x02,0x84,0x09,0x84,0x26,0x83,
-0x13,0x83,0x2b,0x83,0x57,0x83,0x11,0x83,0x08,0x83,0x10,0x83,0x0e,0x83,0x13,
-0x83,0x08,0x83,0x12,0x83,0x0b,0x84,0x07,0x83,0x09,0x84,0x07,0x83,0x0d,0x83,
-0x11,0x83,0x08,0x83,0x12,0x84,0x25,0x83,0x16,0x86,0x21,0x86,0x25,0x82,0x03,
-0x83,0x02,0x85,0x02,0x82,0x05,0x84,0x0b,0x83,0x06,0x83,0x0b,0x84,0x06,0x83,
-0x09,0x84,0x05,0x83,0x0a,0x84,0x07,0x83,0x14,0x83,0x15,0x84,0x09,0x84,0x04,
-0x83,0x0d,0x83,0x0c,0x83,0x0d,0x84,0x07,0x83,0x09,0x83,0x08,0x85,0x08,0x83,
-0x10,0x83,0x07,0x83,0x06,0x83,0x03,0x83,0x0a,0x86,0x05,0x83,0x09,0x84,0x07,
-0x83,0x14,0x83,0x09,0x84,0x07,0x83,0x0b,0x83,0x06,0x84,0x09,0x84,0x0d,0x83,
-0x0d,0x84,0x09,0x84,0x0b,0x87,0x0c,0x84,0x07,0x83,0x09,0x84,0x07,0x84,0x0e,
-0x83,0x0e,0x84,0x19,0x83,0x16,0x83,0x11,0x83,0x54,0x83,0x08,0x84,0x08,0x84,
-0x08,0x83,0x09,0x83,0x07,0x84,0x08,0x83,0x08,0x84,0x08,0x83,0x0a,0x81,0x0e,
-0x83,0x0f,0x83,0x08,0x84,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,0x83,
-0x05,0x84,0x10,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,0x08,
-0x84,0x07,0x84,0x08,0x84,0x07,0x84,0x08,0x84,0x07,0x84,0x09,0x83,0x13,0x84,
-0x08,0x83,0x0b,0x83,0x11,0x84,0x07,0x84,0x0d,0x86,0x0c,0x84,0x05,0x85,0x0c,
-0x83,0x04,0x83,0x0f,0x86,0x0d,0x84,0x18,0x83,0x14,0x83,0x15,0x83,0x7f,0x01,
-0x83,0x04,0x83,0x0c,0x83,0x08,0x84,0x0a,0x82,0x05,0x83,0x04,0x83,0x03,0x84,
-0x06,0x87,0x25,0x83,0x13,0x83,0x2b,0x83,0x57,0x82,0x12,0x85,0x04,0x85,0x10,
-0x83,0x0d,0x83,0x14,0x85,0x04,0x85,0x12,0x83,0x0c,0x84,0x05,0x84,0x0a,0x84,
-0x04,0x85,0x0d,0x83,0x11,0x85,0x04,0x85,0x09,0x81,0x07,0x84,0x26,0x83,0x18,
-0x84,0x21,0x84,0x18,0x83,0x0c,0x82,0x04,0x85,0x01,0x86,0x06,0x83,0x0c,0x84,
-0x05,0x83,0x0a,0x84,0x07,0x85,0x06,0x84,0x06,0x83,0x08,0x85,0x08,0x83,0x14,
-0x83,0x15,0x85,0x07,0x85,0x04,0x83,0x0d,0x83,0x0c,0x83,0x0e,0x84,0x05,0x84,
-0x09,0x83,0x09,0x84,0x08,0x83,0x10,0x83,0x10,0x83,0x03,0x83,0x0b,0x85,0x05,
-0x85,0x06,0x85,0x07,0x83,0x14,0x85,0x06,0x85,0x07,0x83,0x0b,0x83,0x06,0x85,
-0x06,0x85,0x0e,0x83,0x0e,0x85,0x05,0x85,0x0d,0x85,0x0d,0x84,0x07,0x83,0x08,
-0x84,0x09,0x84,0x0d,0x83,0x0d,0x84,0x1a,0x83,0x16,0x83,0x11,0x83,0x54,0x84,
-0x05,0x86,0x08,0x85,0x05,0x85,0x0a,0x84,0x04,0x84,0x09,0x85,0x05,0x85,0x09,
-0x84,0x06,0x83,0x0e,0x83,0x0f,0x85,0x05,0x85,0x08,0x83,0x09,0x83,0x0e,0x83,
-0x17,0x83,0x0c,0x83,0x06,0x84,0x0f,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,
-0x83,0x09,0x83,0x09,0x84,0x05,0x84,0x09,0x85,0x05,0x85,0x08,0x85,0x05,0x85,
-0x09,0x83,0x14,0x84,0x05,0x85,0x0b,0x84,0x05,0x83,0x09,0x84,0x05,0x85,0x0e,
-0x85,0x0c,0x84,0x05,0x85,0x0b,0x84,0x04,0x84,0x0e,0x86,0x0d,0x83,0x19,0x83,
-0x14,0x83,0x15,0x83,0x57,0x83,0x26,0x83,0x04,0x83,0x0c,0x85,0x05,0x84,0x13,
-0x83,0x02,0x83,0x05,0x91,0x24,0x83,0x13,0x83,0x40,0x83,0x2c,0x83,0x12,0x83,
-0x13,0x8c,0x11,0x83,0x0c,0x90,0x09,0x8c,0x13,0x83,0x0c,0x8c,0x0b,0x8c,0x0e,
-0x83,0x12,0x8c,0x0a,0x8c,0x0f,0x83,0x14,0x83,0x1a,0x82,0x21,0x82,0x1a,0x83,
-0x0c,0x83,0x04,0x83,0x03,0x84,0x07,0x83,0x0d,0x83,0x05,0x90,0x09,0x8e,0x06,
-0x8f,0x09,0x90,0x07,0x83,0x16,0x8f,0x05,0x83,0x0d,0x83,0x0c,0x83,0x0e,0x8c,
-0x0a,0x83,0x0a,0x84,0x07,0x90,0x03,0x83,0x10,0x83,0x03,0x83,0x0b,0x85,0x06,
-0x8e,0x08,0x83,0x15,0x90,0x06,0x83,0x0b,0x83,0x07,0x8e,0x0f,0x83,0x0e,0x8e,
-0x0e,0x85,0x0e,0x83,0x07,0x83,0x08,0x84,0x09,0x84,0x0d,0x83,0x0d,0x92,0x0c,
-0x83,0x16,0x84,0x10,0x83,0x55,0x8a,0x01,0x83,0x08,0x8e,0x0b,0x8b,0x0b,0x8e,
-0x09,0x8e,0x0d,0x83,0x10,0x8e,0x08,0x83,0x09,0x83,0x0e,0x83,0x17,0x83,0x0c,
-0x83,0x06,0x84,0x0f,0x83,0x0a,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,
-0x09,0x8d,0x09,0x8e,0x0a,0x8e,0x09,0x83,0x14,0x8d,0x0c,0x8c,0x09,0x8e,0x0e,
-0x84,0x0e,0x83,0x05,0x84,0x0b,0x84,0x06,0x84,0x0e,0x85,0x0c,0x8f,0x0e,0x83,
-0x14,0x83,0x15,0x83,0x57,0x83,0x26,0x82,0x05,0x83,0x0d,0x8c,0x15,0x86,0x07,
-0x8b,0x02,0x84,0x23,0x83,0x13,0x83,0x40,0x83,0x2c,0x83,0x12,0x82,0x15,0x8a,
-0x12,0x83,0x0c,0x90,0x0a,0x8a,0x14,0x83,0x0d,0x8a,0x0e,0x89,0x0f,0x83,0x13,
-0x8a,0x0b,0x8a,0x11,0x83,0x14,0x83,0x59,0x83,0x0d,0x82,0x14,0x84,0x0d,0x83,
-0x05,0x8f,0x0b,0x8b,0x08,0x8e,0x0a,0x90,0x07,0x83,0x18,0x8b,0x07,0x83,0x0d,
-0x83,0x09,0x89,0x0c,0x8a,0x0b,0x83,0x0b,0x84,0x06,0x90,0x03,0x83,0x10,0x83,
-0x03,0x83,0x0c,0x84,0x07,0x8b,0x0a,0x83,0x17,0x8a,0x01,0x84,0x05,0x83,0x0b,
-0x83,0x09,0x8b,0x10,0x83,0x10,0x8b,0x0f,0x84,0x0f,0x82,0x09,0x82,0x07,0x84,
-0x0b,0x84,0x0c,0x83,0x0d,0x92,0x0c,0x83,0x17,0x83,0x10,0x83,0x56,0x88,0x02,
-0x83,0x08,0x83,0x01,0x89,0x0d,0x89,0x0d,0x89,0x01,0x83,0x0b,0x8a,0x0f,0x83,
-0x11,0x89,0x01,0x83,0x08,0x83,0x09,0x83,0x0a,0x8b,0x13,0x83,0x0c,0x83,0x07,
-0x84,0x0a,0x8b,0x06,0x83,0x06,0x83,0x07,0x83,0x05,0x83,0x09,0x83,0x0b,0x89,
-0x0b,0x83,0x01,0x89,0x0c,0x89,0x01,0x83,0x09,0x83,0x16,0x8a,0x0e,0x8a,0x0b,
-0x89,0x01,0x83,0x0e,0x84,0x0e,0x83,0x06,0x83,0x0b,0x84,0x06,0x84,0x0e,0x84,
-0x0d,0x8f,0x0e,0x83,0x14,0x83,0x15,0x83,0x57,0x83,0x25,0x83,0x05,0x82,0x0f,
-0x8a,0x17,0x84,0x0a,0x87,0x04,0x84,0x24,0x83,0x11,0x83,0x41,0x83,0x2c,0x83,
-0x11,0x83,0x17,0x86,0x14,0x83,0x0c,0x90,0x0c,0x86,0x16,0x83,0x0f,0x86,0x11,
-0x86,0x11,0x83,0x15,0x86,0x0e,0x87,0x13,0x83,0x14,0x82,0x5a,0x83,0x0d,0x83,
-0x13,0x83,0x0e,0x84,0x04,0x8d,0x0f,0x87,0x0a,0x8c,0x0c,0x90,0x07,0x83,0x1a,
-0x87,0x09,0x83,0x0d,0x83,0x09,0x89,0x0e,0x86,0x0d,0x83,0x0b,0x85,0x05,0x90,
-0x03,0x83,0x10,0x83,0x03,0x83,0x0d,0x83,0x0a,0x86,0x0c,0x83,0x19,0x86,0x04,
-0x84,0x04,0x83,0x0c,0x83,0x0a,0x87,0x12,0x83,0x12,0x87,0x12,0x83,0x10,0x81,
-0x09,0x81,0x07,0x85,0x0b,0x85,0x0b,0x83,0x0d,0x92,0x0c,0x83,0x17,0x84,0x0f,
-0x83,0x57,0x86,0x03,0x83,0x08,0x82,0x04,0x85,0x11,0x86,0x10,0x85,0x04,0x82,
-0x0d,0x86,0x11,0x83,0x13,0x85,0x03,0x83,0x08,0x83,0x09,0x83,0x0a,0x8b,0x13,
-0x83,0x0c,0x83,0x08,0x84,0x09,0x8b,0x06,0x83,0x06,0x83,0x07,0x83,0x05,0x83,
-0x09,0x83,0x0c,0x87,0x0c,0x83,0x03,0x85,0x10,0x85,0x03,0x83,0x09,0x83,0x17,
-0x87,0x11,0x87,0x0f,0x85,0x03,0x83,0x0f,0x83,0x0e,0x82,0x07,0x83,0x0a,0x84,
-0x08,0x84,0x0d,0x84,0x0d,0x8f,0x0e,0x83,0x14,0x83,0x15,0x83,0x7f,0x1c,0x85,
-0x5a,0x83,0x11,0x83,0x41,0x83,0x40,0x83,0x7f,0x7f,0x16,0x83,0x6b,0x83,0x7f,
-0x7f,0x7f,0x17,0x83,0x7f,0x5b,0x83,0x18,0x83,0x0f,0x83,0x25,0x90,0x7f,0x36,
-0x83,0x3f,0x83,0x7e,0x83,0x20,0x83,0x7f,0x30,0x83,0x2b,0x83,0x14,0x83,0x15,
-0x83,0x7f,0x1d,0x83,0x5c,0x83,0x0f,0x83,0x42,0x82,0x41,0x82,0x7f,0x7f,0x17,
-0x82,0x6d,0x84,0x06,0x81,0x7f,0x7f,0x7f,0x0f,0x81,0x7f,0x5c,0x83,0x18,0x83,
-0x0f,0x83,0x25,0x90,0x7f,0x36,0x83,0x3f,0x83,0x7e,0x83,0x20,0x83,0x7f,0x30,
-0x83,0x2b,0x84,0x13,0x83,0x14,0x83,0x7f,0x1e,0x83,0x5c,0x83,0x0f,0x83,0x41,
-0x83,0x7f,0x7f,0x5a,0x82,0x6e,0x8b,0x7f,0x7f,0x7f,0x7f,0x6b,0x83,0x2a,0x83,
-0x25,0x90,0x7f,0x36,0x83,0x3f,0x83,0x7e,0x83,0x20,0x83,0x7f,0x2f,0x84,0x2c,
-0x83,0x13,0x83,0x14,0x83,0x7f,0x1e,0x83,0x5d,0x83,0x0d,0x83,0x42,0x82,0x7f,
-0x7f,0x7f,0x4e,0x86,0x7f,0x7f,0x7f,0x7f,0x6e,0x87,0x23,0x86,0x7f,0x6a,0x83,
-0x3f,0x84,0x7e,0x83,0x20,0x83,0x7f,0x2f,0x83,0x2d,0x84,0x12,0x83,0x13,0x84,
-0x7f,0x7f,0x82,0x0d,0x82,0x43,0x82,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x43,0x87,0x23,0x86,0x7f,0x60,0x82,0x07,0x84,0x3e,0x84,0x7f,0x83,0x20,0x83,
-0x7f,0x2e,0x84,0x2e,0x84,0x11,0x83,0x11,0x85,0x7f,0x7f,0x01,0x83,0x0b,0x83,
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x09,0x87,0x23,0x86,0x7f,0x60,
-0x8c,0x3b,0x88,0x7f,0x83,0x20,0x83,0x7f,0x2b,0x86,0x31,0x82,0x11,0x83,0x12,
-0x82,0x7f,0x7f,0x04,0x83,0x09,0x83,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x7f,0x1b,0x8b,0x3c,0x87,0x7f,0x01,0x83,0x20,0x83,0x7f,0x2b,0x86,
-0x7f,0x7f,0x60,0x81,0x0b,0x81,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x1e,0x87,0x3e,0x85,0x7f,0x03,0x83,0x20,0x83,0x7f,0x2b,0x84,0x7f,
-0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
-0x7f,0x7f,0x4a,
-0x00,
-  }
-};
diff --git a/mmcutils/mmcutils.c b/mmcutils/mmcutils.c
old mode 100644
new mode 100755
index a003a2d..3f5514e
--- a/mmcutils/mmcutils.c
+++ b/mmcutils/mmcutils.c
@@ -315,9 +315,9 @@
     return NULL;
 }
 
-#define MKE2FS_BIN      "/sbin/mke2fs"
-#define TUNE2FS_BIN     "/sbin/tune2fs"
-#define E2FSCK_BIN      "/sbin/e2fsck"
+#define MKE2FS_BIN      "/system/bin/mke2fs"
+#define TUNE2FS_BIN     "/system/bin/tune2fs"
+#define E2FSCK_BIN      "/system/bin/e2fsck"
 
 int
 run_exec_process ( char *const *argv) {
diff --git a/mtp/legacy/Android.mk b/mtp/legacy/Android.mk
deleted file mode 100644
index cd04ac0..0000000
--- a/mtp/legacy/Android.mk
+++ /dev/null
@@ -1,47 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-# Build libtwrpmtp library
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libtwrpmtp-legacy
-LOCAL_MODULE_TAGS := optional
-LOCAL_CFLAGS = -D_FILE_OFFSET_BITS=64 -DMTP_DEVICE -DMTP_HOST -fno-strict-aliasing -Wno-unused-variable -Wno-format -Wno-unused-parameter -Wno-unused-private-field
-LOCAL_C_INCLUDES += $(LOCAL_PATH) bionic frameworks/base/include system/core/include bionic/libc/private/
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
-    LOCAL_C_INCLUDES += external/stlport/stlport
-    LOCAL_SHARED_LIBRARIES += libstlport
-else
-    LOCAL_SHARED_LIBRARIES += libc++
-endif
-
-LOCAL_SRC_FILES = \
-    btree.cpp \
-    MtpDataPacket.cpp \
-    MtpDebug.cpp \
-    MtpDevice.cpp \
-    MtpDeviceInfo.cpp \
-    MtpEventPacket.cpp \
-    MtpObjectInfo.cpp \
-    MtpPacket.cpp \
-    MtpProperty.cpp \
-    MtpRequestPacket.cpp \
-    MtpResponsePacket.cpp \
-    MtpServer.cpp \
-    MtpStorage.cpp \
-    MtpStorageInfo.cpp \
-    MtpStringBuffer.cpp \
-    MtpUtils.cpp \
-    mtp_MtpServer.cpp \
-    twrpMtp.cpp \
-    mtp_MtpDatabase.cpp \
-    node.cpp
-LOCAL_SHARED_LIBRARIES += libz libc libusbhost libstdc++ libdl libcutils libutils libaosprecovery libselinux
-
-ifneq ($(TW_MTP_DEVICE),)
-	LOCAL_CFLAGS += -DUSB_MTP_DEVICE=$(TW_MTP_DEVICE)
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0)
-    LOCAL_CFLAGS += -DHAS_USBHOST_TIMEOUT
-endif
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/mtp/legacy/MtpDataPacket.cpp b/mtp/legacy/MtpDataPacket.cpp
deleted file mode 100644
index 845db96..0000000
--- a/mtp/legacy/MtpDataPacket.cpp
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to c++
- *
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#include <usbhost/usbhost.h>
-
-#include "MtpDataPacket.h"
-#include "MtpStringBuffer.h"
-#include "MtpDebug.h"
-
-#define MTP_BUFFER_SIZE 16384
-
-
-MtpDataPacket::MtpDataPacket()
-	:   MtpPacket(MTP_BUFFER_SIZE),   // MAX_USBFS_BUFFER_SIZE
-		mOffset(MTP_CONTAINER_HEADER_SIZE)
-{
-}
-
-MtpDataPacket::~MtpDataPacket() {
-}
-
-void MtpDataPacket::reset() {
-	MtpPacket::reset();
-	mOffset = MTP_CONTAINER_HEADER_SIZE;
-}
-
-void MtpDataPacket::setOperationCode(MtpOperationCode code) {
-	MtpPacket::putUInt16(MTP_CONTAINER_CODE_OFFSET, code);
-}
-
-void MtpDataPacket::setTransactionID(MtpTransactionID id) {
-	MtpPacket::putUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET, id);
-}
-
-uint16_t MtpDataPacket::getUInt16() {
-	int offset = mOffset;
-	uint16_t result = (uint16_t)mBuffer[offset] | ((uint16_t)mBuffer[offset + 1] << 8);
-	mOffset += 2;
-	return result;
-}
-
-uint32_t MtpDataPacket::getUInt32() {
-	int offset = mOffset;
-	uint32_t result = (uint32_t)mBuffer[offset] | ((uint32_t)mBuffer[offset + 1] << 8) |
-		   ((uint32_t)mBuffer[offset + 2] << 16)  | ((uint32_t)mBuffer[offset + 3] << 24);
-	mOffset += 4;
-	return result;
-}
-
-uint64_t MtpDataPacket::getUInt64() {
-	int offset = mOffset;
-	uint64_t result = (uint64_t)mBuffer[offset] | ((uint64_t)mBuffer[offset + 1] << 8) |
-		   ((uint64_t)mBuffer[offset + 2] << 16) | ((uint64_t)mBuffer[offset + 3] << 24) |
-		   ((uint64_t)mBuffer[offset + 4] << 32) | ((uint64_t)mBuffer[offset + 5] << 40) |
-		   ((uint64_t)mBuffer[offset + 6] << 48)  | ((uint64_t)mBuffer[offset + 7] << 56);
-	mOffset += 8;
-	return result;
-}
-
-void MtpDataPacket::getUInt128(uint128_t& value) {
-	value[0] = getUInt32();
-	value[1] = getUInt32();
-	value[2] = getUInt32();
-	value[3] = getUInt32();
-}
-
-void MtpDataPacket::getString(MtpStringBuffer& string)
-{
-	string.readFromPacket(this);
-}
-
-Int8List* MtpDataPacket::getAInt8() {
-	Int8List* result = new Int8List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getInt8());
-	return result;
-}
-
-UInt8List* MtpDataPacket::getAUInt8() {
-	UInt8List* result = new UInt8List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getUInt8());
-	return result;
-}
-
-Int16List* MtpDataPacket::getAInt16() {
-	Int16List* result = new Int16List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getInt16());
-	return result;
-}
-
-UInt16List* MtpDataPacket::getAUInt16() {
-	UInt16List* result = new UInt16List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getUInt16());
-	return result;
-}
-
-Int32List* MtpDataPacket::getAInt32() {
-	Int32List* result = new Int32List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getInt32());
-	return result;
-}
-
-UInt32List* MtpDataPacket::getAUInt32() {
-	UInt32List* result = new UInt32List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getUInt32());
-	return result;
-}
-
-Int64List* MtpDataPacket::getAInt64() {
-	Int64List* result = new Int64List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getInt64());
-	return result;
-}
-
-UInt64List* MtpDataPacket::getAUInt64() {
-	UInt64List* result = new UInt64List;
-	int count = getUInt32();
-	for (int i = 0; i < count; i++)
-		result->push(getUInt64());
-	return result;
-}
-
-void MtpDataPacket::putInt8(int8_t value) {
-	allocate(mOffset + 1);
-	mBuffer[mOffset++] = (uint8_t)value;
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt8(uint8_t value) {
-	allocate(mOffset + 1);
-	mBuffer[mOffset++] = (uint8_t)value;
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt16(int16_t value) {
-	allocate(mOffset + 2);
-	mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt16(uint16_t value) {
-	allocate(mOffset + 2);
-	mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt32(int32_t value) {
-	allocate(mOffset + 4);
-	mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt32(uint32_t value) {
-	allocate(mOffset + 4);
-	mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt64(int64_t value) {
-	allocate(mOffset + 8);
-	mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 32) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 40) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 48) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 56) & 0xFF);
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt64(uint64_t value) {
-	allocate(mOffset + 8);
-	mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 32) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 40) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 48) & 0xFF);
-	mBuffer[mOffset++] = (uint8_t)((value >> 56) & 0xFF);
-	if (mPacketSize < mOffset)
-		mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt128(const int128_t& value) {
-	putInt32(value[0]);
-	putInt32(value[1]);
-	putInt32(value[2]);
-	putInt32(value[3]);
-}
-
-void MtpDataPacket::putUInt128(const uint128_t& value) {
-	putUInt32(value[0]);
-	putUInt32(value[1]);
-	putUInt32(value[2]);
-	putUInt32(value[3]);
-}
-
-void MtpDataPacket::putInt128(int64_t value) {
-	putInt64(value);
-	putInt64(value < 0 ? -1 : 0);
-}
-
-void MtpDataPacket::putUInt128(uint64_t value) {
-	putUInt64(value);
-	putUInt64(0);
-}
-
-void MtpDataPacket::putAInt8(const int8_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putInt8(*values++);
-}
-
-void MtpDataPacket::putAUInt8(const uint8_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putUInt8(*values++);
-}
-
-void MtpDataPacket::putAInt16(const int16_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putInt16(*values++);
-}
-
-void MtpDataPacket::putAUInt16(const uint16_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putUInt16(*values++);
-}
-
-void MtpDataPacket::putAUInt16(const UInt16List* values) {
-	size_t count = (values ? values->size() : 0);
-	putUInt32(count);
-	for (size_t i = 0; i < count; i++)
-		putUInt16((*values)[i]);
-}
-
-void MtpDataPacket::putAInt32(const int32_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putInt32(*values++);
-}
-
-void MtpDataPacket::putAUInt32(const uint32_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putUInt32(*values++);
-}
-
-void MtpDataPacket::putAUInt32(const UInt32List* list) {
-	if (!list) {
-		putEmptyArray();
-	} else {
-		size_t size = list->size();
-		putUInt32(size);
-		for (size_t i = 0; i < size; i++)
-			putUInt32((*list)[i]);
-	}
-}
-
-void MtpDataPacket::putAInt64(const int64_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putInt64(*values++);
-}
-
-void MtpDataPacket::putAUInt64(const uint64_t* values, int count) {
-	putUInt32(count);
-	for (int i = 0; i < count; i++)
-		putUInt64(*values++);
-}
-
-void MtpDataPacket::putString(const MtpStringBuffer& string) {
-	string.writeToPacket(this);
-}
-
-void MtpDataPacket::putString(const char* s) {
-	MtpStringBuffer string(s);
-	string.writeToPacket(this);
-}
-
-void MtpDataPacket::putString(const uint16_t* string) {
-	int count = 0;
-	for (int i = 0; i < 256; i++) {
-		if (string[i])
-			count++;
-		else
-			break;
-	}
-	putUInt8(count > 0 ? count + 1 : 0);
-	for (int i = 0; i < count; i++)
-		putUInt16(string[i]);
-	// only terminate with zero if string is not empty
-	if (count > 0)
-		putUInt16(0);
-}
-
-#ifdef MTP_DEVICE 
-int MtpDataPacket::read(int fd) {
-	int ret = ::read(fd, mBuffer, MTP_BUFFER_SIZE);
-	if (ret < MTP_CONTAINER_HEADER_SIZE)
-		return -1;
-	mPacketSize = ret;
-	mOffset = MTP_CONTAINER_HEADER_SIZE;
-	return ret;
-}
-
-int MtpDataPacket::write(int fd) {
-	MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
-	MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
-	int ret = ::write(fd, mBuffer, mPacketSize);
-	return (ret < 0 ? ret : 0);
-}
-
-int MtpDataPacket::writeData(int fd, void* data, uint32_t length) {
-	allocate(length);
-	memcpy(mBuffer + MTP_CONTAINER_HEADER_SIZE, data, length);
-	length += MTP_CONTAINER_HEADER_SIZE;
-	MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, length);
-	MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
-	int ret = ::write(fd, mBuffer, length);
-	return (ret < 0 ? ret : 0);
-}
-
-#endif // MTP_DEVICE
-
-#ifdef MTP_HOST
-int MtpDataPacket::read(struct usb_request *request) {
-	// first read the header
-	request->buffer = mBuffer;
-	request->buffer_length = mBufferSize;
-	int32_t length = transfer(request);
-	if (length >= MTP_CONTAINER_HEADER_SIZE) {
-		// look at the length field to see if the data spans multiple packets
-		uint32_t totalLength = MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET);
-		allocate(totalLength);
-		while (totalLength > (uint32_t)length) {
-			request->buffer = mBuffer + length;
-			request->buffer_length = totalLength - length;
-			int ret = transfer(request);
-			if (ret >= 0)
-				length += ret;
-			else {
-				length = ret;
-				break;
-			}
-		}
-	}
-	if (length >= 0)
-		mPacketSize = length;
-	return length;
-}
-
-int MtpDataPacket::readData(struct usb_request *request, void* buffer, int length) {
-	int read = 0;
-	while (read < length) {
-		request->buffer = (char *)buffer + read;
-		request->buffer_length = length - read;
-		int ret = transfer(request);
-		if (ret < 0) {
-			return ret;
-		}
-		read += ret;
-	}
-	return read;
-}
-
-// Queue a read request.  Call readDataWait to wait for result
-int MtpDataPacket::readDataAsync(struct usb_request *req) {
-	if (usb_request_queue(req)) {
-		MTPE("usb_endpoint_queue failed, errno: %d", errno);
-		return -1;
-	}
-	return 0;
-}
-
-// Wait for result of readDataAsync
-int MtpDataPacket::readDataWait(struct usb_device *device) {
-#ifdef HAS_USBHOST_TIMEOUT
-	struct usb_request *req = usb_request_wait(device, 200);
-#else
-	struct usb_request *req = usb_request_wait(device);
-#endif
-	return (req ? req->actual_length : -1);
-}
-
-int MtpDataPacket::readDataHeader(struct usb_request *request) {
-	request->buffer = mBuffer;
-	request->buffer_length = request->max_packet_size;
-	int length = transfer(request);
-	if (length >= 0)
-		mPacketSize = length;
-	return length;
-}
-
-int MtpDataPacket::writeDataHeader(struct usb_request *request, uint32_t length) {
-	MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, length);
-	MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
-	request->buffer = mBuffer;
-	request->buffer_length = MTP_CONTAINER_HEADER_SIZE;
-	int ret = transfer(request);
-	return (ret < 0 ? ret : 0);
-}
-int MtpDataPacket::write(struct usb_request *request) {
-	MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
-	MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
-
-	// send header separately from data
-	request->buffer = mBuffer;
-	request->buffer_length = MTP_CONTAINER_HEADER_SIZE;
-	int ret = transfer(request);
-	if (ret == MTP_CONTAINER_HEADER_SIZE) {
-		request->buffer = mBuffer + MTP_CONTAINER_HEADER_SIZE;
-		request->buffer_length = mPacketSize - MTP_CONTAINER_HEADER_SIZE;
-		ret = transfer(request);
-	}
-	return (ret < 0 ? ret : 0);
-}
-
-int MtpDataPacket::write(struct usb_request *request, void* buffer, uint32_t length) {
-	request->buffer = buffer;
-	request->buffer_length = length;
-	int ret = transfer(request);
-	return (ret < 0 ? ret : 0);
-}
-
-#endif // MTP_HOST
-void* MtpDataPacket::getData(int& outLength) const {
-	int length = mPacketSize - MTP_CONTAINER_HEADER_SIZE;
-	if (length > 0) {
-		void* result = malloc(length);
-		if (result) {
-			memcpy(result, mBuffer + MTP_CONTAINER_HEADER_SIZE, length);
-			outLength = length;
-			return result;
-		}
-	}
-	outLength = 0;
-	return NULL;
-}
-
diff --git a/mtp/legacy/MtpDataPacket.h b/mtp/legacy/MtpDataPacket.h
deleted file mode 100644
index 5ad440d..0000000
--- a/mtp/legacy/MtpDataPacket.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to c++
- *
- */
-
-#ifndef _MTP_DATA_PACKET_H
-#define _MTP_DATA_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-struct usb_device;
-struct usb_request;
-
-
-class MtpStringBuffer;
-
-class MtpDataPacket : public MtpPacket {
-private:
-	// current offset for get/put methods
-	uint64_t			mOffset;
-
-public:
-						MtpDataPacket();
-	virtual				~MtpDataPacket();
-
-	virtual void		reset();
-
-	void				setOperationCode(MtpOperationCode code);
-	void				setTransactionID(MtpTransactionID id);
-
-	inline const uint8_t*	  getData() const { return mBuffer + MTP_CONTAINER_HEADER_SIZE; }
-	inline uint8_t		getUInt8() { return (uint8_t)mBuffer[mOffset++]; }
-	inline int8_t		getInt8() { return (int8_t)mBuffer[mOffset++]; }
-	uint16_t			getUInt16();
-	inline int16_t		getInt16() { return (int16_t)getUInt16(); }
-	uint32_t			getUInt32();
-	inline int32_t		getInt32() { return (int32_t)getUInt32(); }
-	uint64_t			getUInt64();
-	inline int64_t		getInt64() { return (int64_t)getUInt64(); }
-	void				getUInt128(uint128_t& value);
-	inline void			getInt128(int128_t& value) { getUInt128((uint128_t&)value); }
-	void				getString(MtpStringBuffer& string);
-
-	Int8List*			getAInt8();
-	UInt8List*			getAUInt8();
-	Int16List*			getAInt16();
-	UInt16List*			getAUInt16();
-	Int32List*			getAInt32();
-	UInt32List*			getAUInt32();
-	Int64List*			getAInt64();
-	UInt64List*			getAUInt64();
-
-	void				putInt8(int8_t value);
-	void				putUInt8(uint8_t value);
-	void				putInt16(int16_t value);
-	void				putUInt16(uint16_t value);
-	void				putInt32(int32_t value);
-	void				putUInt32(uint32_t value);
-	void				putInt64(int64_t value);
-	void				putUInt64(uint64_t value);
-	void				putInt128(const int128_t& value);
-	void				putUInt128(const uint128_t& value);
-	void				putInt128(int64_t value);
-	void				putUInt128(uint64_t value);
-
-	void				putAInt8(const int8_t* values, int count);
-	void				putAUInt8(const uint8_t* values, int count);
-	void				putAInt16(const int16_t* values, int count);
-	void				putAUInt16(const uint16_t* values, int count);
-	void				putAUInt16(const UInt16List* values);
-	void				putAInt32(const int32_t* values, int count);
-	void				putAUInt32(const uint32_t* values, int count);
-	void				putAUInt32(const UInt32List* list);
-	void				putAInt64(const int64_t* values, int count);
-	void				putAUInt64(const uint64_t* values, int count);
-	void				putString(const MtpStringBuffer& string);
-	void				putString(const char* string);
-	void				putString(const uint16_t* string);
-	inline void			putEmptyString() { putUInt8(0); }
-	inline void			putEmptyArray() { putUInt32(0); }
-
-
-#ifdef MTP_DEVICE
-	// fill our buffer with data from the given file descriptor
-	int					read(int fd);
-
-	// write our data to the given file descriptor
-	int					write(int fd);
-	int					writeData(int fd, void* data, uint32_t length);
-#endif
-#ifdef MTP_HOST
-	int					read(struct usb_request *request);
-	int					readData(struct usb_request *request, void* buffer, int length);
-	int					readDataAsync(struct usb_request *req);
-	int					readDataWait(struct usb_device *device);
-	int					readDataHeader(struct usb_request *ep);
-
-	int					writeDataHeader(struct usb_request *ep, uint32_t length);
-	int					write(struct usb_request *ep);
-	int					write(struct usb_request *ep, void* buffer, uint32_t length);
-#endif
-	inline bool			hasData() const { return mPacketSize > MTP_CONTAINER_HEADER_SIZE; }
-	inline uint32_t		getContainerLength() const { return MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); }
-	void*				getData(int& outLength) const;
-};
-
-
-#endif // _MTP_DATA_PACKET_H
diff --git a/mtp/legacy/MtpDatabase.h b/mtp/legacy/MtpDatabase.h
deleted file mode 100644
index f7f33ff..0000000
--- a/mtp/legacy/MtpDatabase.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to c++
- */
-
-#ifndef _MTP_DATABASE_H
-#define _MTP_DATABASE_H
-
-#include "MtpTypes.h"
-
-class MtpDataPacket;
-class MtpProperty;
-class MtpObjectInfo;
-
-class MtpDatabase {
-public:
-	virtual ~MtpDatabase() {}
-
-	// called from SendObjectInfo to reserve a database entry for the incoming file
-	virtual MtpObjectHandle			beginSendObject(const char* path,
-											MtpObjectFormat format,
-											MtpObjectHandle parent,
-											MtpStorageID storage,
-											uint64_t size,
-											time_t modified) = 0;
-
-	// called to report success or failure of the SendObject file transfer
-	// success should signal a notification of the new object's creation,
-	// failure should remove the database entry created in beginSendObject
-	virtual void					endSendObject(const char* path,
-											MtpObjectHandle handle,
-											MtpObjectFormat format,
-											bool succeeded) = 0;
-
-	virtual MtpObjectHandleList*	getObjectList(MtpStorageID storageID,
-											MtpObjectFormat format,
-											MtpObjectHandle parent) = 0;
-
-	virtual int						getNumObjects(MtpStorageID storageID,
-											MtpObjectFormat format,
-											MtpObjectHandle parent) = 0;
-
-	// callee should delete[] the results from these
-	// results can be NULL
-	virtual MtpObjectFormatList*	getSupportedPlaybackFormats() = 0;
-	virtual MtpObjectFormatList*	getSupportedCaptureFormats() = 0;
-	virtual MtpObjectPropertyList*	getSupportedObjectProperties(MtpObjectFormat format) = 0;
-	virtual MtpDevicePropertyList*	getSupportedDeviceProperties() = 0;
-
-	virtual void					createDB(MtpStorage* storage, MtpStorageID storageID) = 0;
-	virtual void					destroyDB(MtpStorageID storageID) = 0;
-
-	virtual MtpResponseCode			getObjectPropertyValue(MtpObjectHandle handle,
-											MtpObjectProperty property,
-											MtpDataPacket& packet) = 0;
-
-	virtual MtpResponseCode			setObjectPropertyValue(MtpObjectHandle handle,
-											MtpObjectProperty property,
-											MtpDataPacket& packet) = 0;
-
-	virtual MtpResponseCode			getDevicePropertyValue(MtpDeviceProperty property,
-											MtpDataPacket& packet) = 0;
-
-	virtual MtpResponseCode			setDevicePropertyValue(MtpDeviceProperty property,
-											MtpDataPacket& packet) = 0;
-
-	virtual MtpResponseCode			resetDeviceProperty(MtpDeviceProperty property) = 0;
-
-	virtual MtpResponseCode			getObjectPropertyList(MtpObjectHandle handle,
-											uint32_t format, uint32_t property,
-											int groupCode, int depth,
-											MtpDataPacket& packet) = 0;
-
-	virtual MtpResponseCode			getObjectInfo(MtpObjectHandle handle,
-											MtpObjectInfo& info) = 0;
-
-	virtual void*					getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) = 0;
-
-	virtual MtpResponseCode			getObjectFilePath(MtpObjectHandle handle,
-											MtpString& outFilePath,
-											int64_t& outFileLength,
-											MtpObjectFormat& outFormat) = 0;
-
-	virtual MtpResponseCode			deleteFile(MtpObjectHandle handle) = 0;
-
-	virtual MtpObjectHandleList*	getObjectReferences(MtpObjectHandle handle) = 0;
-
-	virtual MtpResponseCode			setObjectReferences(MtpObjectHandle handle,
-											MtpObjectHandleList* references) = 0;
-
-	virtual MtpProperty*			getObjectPropertyDesc(MtpObjectProperty property,
-											MtpObjectFormat format) = 0;
-
-	virtual MtpProperty*			getDevicePropertyDesc(MtpDeviceProperty property) = 0;
-
-	virtual void					sessionStarted() = 0;
-
-	virtual void					sessionEnded() = 0;
-	virtual void					lockMutex() = 0;
-	virtual void					unlockMutex() = 0;
-};
-
-#endif // _MTP_DATABASE_H
diff --git a/mtp/legacy/MtpDebug.cpp b/mtp/legacy/MtpDebug.cpp
deleted file mode 100644
index c986923..0000000
--- a/mtp/legacy/MtpDebug.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright (C) 2017 TeamWin
- * Copyright (C) 2010 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.
- *
- */
-
-#include "MtpDebug.h"
-#include <stdarg.h>
-#include <stdio.h>
-
-#define MTP_DEBUG_BUFFER_SIZE 2048
-static int debug_enabled = 0;
-
-extern "C" void mtpdebug(const char *fmt, ...)
-{
-	if (debug_enabled) {
-		char buf[MTP_DEBUG_BUFFER_SIZE];		// We're going to limit a single request to 512 bytes
-
-		va_list ap;
-		va_start(ap, fmt);
-		vsnprintf(buf, MTP_DEBUG_BUFFER_SIZE, fmt, ap);
-		va_end(ap);
-
-		fputs(buf, stdout);
-	}
-}
-
-struct CodeEntry {
-	const char* name;
-	uint16_t code;
-};
-
-static const CodeEntry sOperationCodes[] = {
-	{ "MTP_OPERATION_GET_DEVICE_INFO",              0x1001 },
-	{ "MTP_OPERATION_OPEN_SESSION",                 0x1002 },
-	{ "MTP_OPERATION_CLOSE_SESSION",                0x1003 },
-	{ "MTP_OPERATION_GET_STORAGE_IDS",              0x1004 },
-	{ "MTP_OPERATION_GET_STORAGE_INFO",             0x1005 },
-	{ "MTP_OPERATION_GET_NUM_OBJECTS",              0x1006 },
-	{ "MTP_OPERATION_GET_OBJECT_HANDLES",           0x1007 },
-	{ "MTP_OPERATION_GET_OBJECT_INFO",              0x1008 },
-	{ "MTP_OPERATION_GET_OBJECT",                   0x1009 },
-	{ "MTP_OPERATION_GET_THUMB",                    0x100A },
-	{ "MTP_OPERATION_DELETE_OBJECT",                0x100B },
-	{ "MTP_OPERATION_SEND_OBJECT_INFO",             0x100C },
-	{ "MTP_OPERATION_SEND_OBJECT",                  0x100D },
-	{ "MTP_OPERATION_INITIATE_CAPTURE",             0x100E },
-	{ "MTP_OPERATION_FORMAT_STORE",                 0x100F },
-	{ "MTP_OPERATION_RESET_DEVICE",                 0x1010 },
-	{ "MTP_OPERATION_SELF_TEST",                    0x1011 },
-	{ "MTP_OPERATION_SET_OBJECT_PROTECTION",        0x1012 },
-	{ "MTP_OPERATION_POWER_DOWN",                   0x1013 },
-	{ "MTP_OPERATION_GET_DEVICE_PROP_DESC",         0x1014 },
-	{ "MTP_OPERATION_GET_DEVICE_PROP_VALUE",        0x1015 },
-	{ "MTP_OPERATION_SET_DEVICE_PROP_VALUE",        0x1016 },
-	{ "MTP_OPERATION_RESET_DEVICE_PROP_VALUE",      0x1017 },
-	{ "MTP_OPERATION_TERMINATE_OPEN_CAPTURE",       0x1018 },
-	{ "MTP_OPERATION_MOVE_OBJECT",                  0x1019 },
-	{ "MTP_OPERATION_COPY_OBJECT",                  0x101A },
-	{ "MTP_OPERATION_GET_PARTIAL_OBJECT",           0x101B },
-	{ "MTP_OPERATION_INITIATE_OPEN_CAPTURE",        0x101C },
-	{ "MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED",   0x9801 },
-	{ "MTP_OPERATION_GET_OBJECT_PROP_DESC",         0x9802 },
-	{ "MTP_OPERATION_GET_OBJECT_PROP_VALUE",        0x9803 },
-	{ "MTP_OPERATION_SET_OBJECT_PROP_VALUE",        0x9804 },
-	{ "MTP_OPERATION_GET_OBJECT_PROP_LIST",         0x9805 },
-	{ "MTP_OPERATION_SET_OBJECT_PROP_LIST",         0x9806 },
-	{ "MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC", 0x9807 },
-	{ "MTP_OPERATION_SEND_OBJECT_PROP_LIST",        0x9808 },
-	{ "MTP_OPERATION_GET_OBJECT_REFERENCES",        0x9810 },
-	{ "MTP_OPERATION_SET_OBJECT_REFERENCES",        0x9811 },
-	{ "MTP_OPERATION_SKIP",                         0x9820 },
-    // android extensions
-	{ "MTP_OPERATION_GET_PARTIAL_OBJECT_64",        0x95C1 },
-	{ "MTP_OPERATION_SEND_PARTIAL_OBJECT",          0x95C2 },
-	{ "MTP_OPERATION_TRUNCATE_OBJECT",              0x95C3 },
-	{ "MTP_OPERATION_BEGIN_EDIT_OBJECT",            0x95C4 },
-	{ "MTP_OPERATION_END_EDIT_OBJECT",              0x95C5 },
-	{ 0,                                            0      },
-};
-
-static const CodeEntry sFormatCodes[] = {
-	{ "MTP_FORMAT_UNDEFINED",                       0x3000 },
-	{ "MTP_FORMAT_ASSOCIATION",                     0x3001 },
-	{ "MTP_FORMAT_SCRIPT",                          0x3002 },
-	{ "MTP_FORMAT_EXECUTABLE",                      0x3003 },
-	{ "MTP_FORMAT_TEXT",                            0x3004 },
-	{ "MTP_FORMAT_HTML",                            0x3005 },
-	{ "MTP_FORMAT_DPOF",                            0x3006 },
-	{ "MTP_FORMAT_AIFF",                            0x3007 },
-	{ "MTP_FORMAT_WAV",                             0x3008 },
-	{ "MTP_FORMAT_MP3",                             0x3009 },
-	{ "MTP_FORMAT_AVI",                             0x300A },
-	{ "MTP_FORMAT_MPEG",                            0x300B },
-	{ "MTP_FORMAT_ASF",                             0x300C },
-	{ "MTP_FORMAT_DEFINED",                         0x3800 },
-	{ "MTP_FORMAT_EXIF_JPEG",                       0x3801 },
-	{ "MTP_FORMAT_TIFF_EP",                         0x3802 },
-	{ "MTP_FORMAT_FLASHPIX",                        0x3803 },
-	{ "MTP_FORMAT_BMP",                             0x3804 },
-	{ "MTP_FORMAT_CIFF",                            0x3805 },
-	{ "MTP_FORMAT_GIF",                             0x3807 },
-	{ "MTP_FORMAT_JFIF",                            0x3808 },
-	{ "MTP_FORMAT_CD",                              0x3809 },
-	{ "MTP_FORMAT_PICT",                            0x380A },
-	{ "MTP_FORMAT_PNG",                             0x380B },
-	{ "MTP_FORMAT_TIFF",                            0x380D },
-	{ "MTP_FORMAT_TIFF_IT",                         0x380E },
-	{ "MTP_FORMAT_JP2",                             0x380F },
-	{ "MTP_FORMAT_JPX",                             0x3810 },
-	{ "MTP_FORMAT_UNDEFINED_FIRMWARE",              0xB802 },
-	{ "MTP_FORMAT_WINDOWS_IMAGE_FORMAT",            0xB881 },
-	{ "MTP_FORMAT_UNDEFINED_AUDIO",                 0xB900 },
-	{ "MTP_FORMAT_WMA",                             0xB901 },
-	{ "MTP_FORMAT_OGG",                             0xB902 },
-	{ "MTP_FORMAT_AAC",                             0xB903 },
-	{ "MTP_FORMAT_AUDIBLE",                         0xB904 },
-	{ "MTP_FORMAT_FLAC",                            0xB906 },
-	{ "MTP_FORMAT_UNDEFINED_VIDEO",                 0xB980 },
-	{ "MTP_FORMAT_WMV",                             0xB981 },
-	{ "MTP_FORMAT_MP4_CONTAINER",                   0xB982 },
-	{ "MTP_FORMAT_MP2",                             0xB983 },
-	{ "MTP_FORMAT_3GP_CONTAINER",                   0xB984 },
-	{ "MTP_FORMAT_UNDEFINED_COLLECTION",            0xBA00 },
-	{ "MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM",       0xBA01 },
-	{ "MTP_FORMAT_ABSTRACT_IMAGE_ALBUM",            0xBA02 },
-	{ "MTP_FORMAT_ABSTRACT_AUDIO_ALBUM",            0xBA03 },
-	{ "MTP_FORMAT_ABSTRACT_VIDEO_ALBUM",            0xBA04 },
-	{ "MTP_FORMAT_ABSTRACT_AV_PLAYLIST",            0xBA05 },
-	{ "MTP_FORMAT_ABSTRACT_CONTACT_GROUP",          0xBA06 },
-	{ "MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER",         0xBA07 },
-	{ "MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION",   0xBA08 },
-	{ "MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST",         0xBA09 },
-	{ "MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST",         0xBA0A },
-	{ "MTP_FORMAT_ABSTRACT_MEDIACAST",              0xBA0B },
-	{ "MTP_FORMAT_WPL_PLAYLIST",                    0xBA10 },
-	{ "MTP_FORMAT_M3U_PLAYLIST",                    0xBA11 },
-	{ "MTP_FORMAT_MPL_PLAYLIST",                    0xBA12 },
-	{ "MTP_FORMAT_ASX_PLAYLIST",                    0xBA13 },
-	{ "MTP_FORMAT_PLS_PLAYLIST",                    0xBA14 },
-	{ "MTP_FORMAT_UNDEFINED_DOCUMENT",              0xBA80 },
-	{ "MTP_FORMAT_ABSTRACT_DOCUMENT",               0xBA81 },
-	{ "MTP_FORMAT_XML_DOCUMENT",                    0xBA82 },
-	{ "MTP_FORMAT_MS_WORD_DOCUMENT",                0xBA83 },
-	{ "MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT",      0xBA84 },
-	{ "MTP_FORMAT_MS_EXCEL_SPREADSHEET",            0xBA85 },
-	{ "MTP_FORMAT_MS_POWERPOINT_PRESENTATION",      0xBA86 },
-	{ "MTP_FORMAT_UNDEFINED_MESSAGE",               0xBB00 },
-	{ "MTP_FORMAT_ABSTRACT_MESSSAGE",               0xBB01 },
-	{ "MTP_FORMAT_UNDEFINED_CONTACT",               0xBB80 },
-	{ "MTP_FORMAT_ABSTRACT_CONTACT",                0xBB81 },
-	{ "MTP_FORMAT_VCARD_2",                         0xBB82 },
-	{ 0,                                            0      },
-};
-
-static const CodeEntry sObjectPropCodes[] = {
-	{ "MTP_PROPERTY_STORAGE_ID",                             0xDC01 },
-	{ "MTP_PROPERTY_OBJECT_FORMAT",                          0xDC02 },
-	{ "MTP_PROPERTY_PROTECTION_STATUS",                      0xDC03 },
-	{ "MTP_PROPERTY_OBJECT_SIZE",                            0xDC04 },
-	{ "MTP_PROPERTY_ASSOCIATION_TYPE",                       0xDC05 },
-	{ "MTP_PROPERTY_ASSOCIATION_DESC",                       0xDC06 },
-	{ "MTP_PROPERTY_OBJECT_FILE_NAME",                       0xDC07 },
-	{ "MTP_PROPERTY_DATE_CREATED",                           0xDC08 },
-	{ "MTP_PROPERTY_DATE_MODIFIED",                          0xDC09 },
-	{ "MTP_PROPERTY_KEYWORDS",                               0xDC0A },
-	{ "MTP_PROPERTY_PARENT_OBJECT",                          0xDC0B },
-	{ "MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS",                0xDC0C },
-	{ "MTP_PROPERTY_HIDDEN",                                 0xDC0D },
-	{ "MTP_PROPERTY_SYSTEM_OBJECT",                          0xDC0E },
-	{ "MTP_PROPERTY_PERSISTENT_UID",                         0xDC41 },
-	{ "MTP_PROPERTY_SYNC_ID",                                0xDC42 },
-	{ "MTP_PROPERTY_PROPERTY_BAG",                           0xDC43 },
-	{ "MTP_PROPERTY_NAME",                                   0xDC44 },
-	{ "MTP_PROPERTY_CREATED_BY",                             0xDC45 },
-	{ "MTP_PROPERTY_ARTIST",                                 0xDC46 },
-	{ "MTP_PROPERTY_DATE_AUTHORED",                          0xDC47 },
-	{ "MTP_PROPERTY_DESCRIPTION",                            0xDC48 },
-	{ "MTP_PROPERTY_URL_REFERENCE",                          0xDC49 },
-	{ "MTP_PROPERTY_LANGUAGE_LOCALE",                        0xDC4A },
-	{ "MTP_PROPERTY_COPYRIGHT_INFORMATION",                  0xDC4B },
-	{ "MTP_PROPERTY_SOURCE",                                 0xDC4C },
-	{ "MTP_PROPERTY_ORIGIN_LOCATION",                        0xDC4D },
-	{ "MTP_PROPERTY_DATE_ADDED",                             0xDC4E },
-	{ "MTP_PROPERTY_NON_CONSUMABLE",                         0xDC4F },
-	{ "MTP_PROPERTY_CORRUPT_UNPLAYABLE",                     0xDC50 },
-	{ "MTP_PROPERTY_PRODUCER_SERIAL_NUMBER",                 0xDC51 },
-	{ "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT",           0xDC81 },
-	{ "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE",             0xDC82 },
-	{ "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT",           0xDC83 },
-	{ "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH",            0xDC84 },
-	{ "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION",         0xDC85 },
-	{ "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA",             0xDC86 },
-	{ "MTP_PROPERTY_WIDTH",                                  0xDC87 },
-	{ "MTP_PROPERTY_HEIGHT",                                 0xDC88 },
-	{ "MTP_PROPERTY_DURATION",                               0xDC89 },
-	{ "MTP_PROPERTY_RATING",                                 0xDC8A },
-	{ "MTP_PROPERTY_TRACK",                                  0xDC8B },
-	{ "MTP_PROPERTY_GENRE",                                  0xDC8C },
-	{ "MTP_PROPERTY_CREDITS",                                0xDC8D },
-	{ "MTP_PROPERTY_LYRICS",                                 0xDC8E },
-	{ "MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID",                0xDC8F },
-	{ "MTP_PROPERTY_PRODUCED_BY",                            0xDC90 },
-	{ "MTP_PROPERTY_USE_COUNT",                              0xDC91 },
-	{ "MTP_PROPERTY_SKIP_COUNT",                             0xDC92 },
-	{ "MTP_PROPERTY_LAST_ACCESSED",                          0xDC93 },
-	{ "MTP_PROPERTY_PARENTAL_RATING",                        0xDC94 },
-	{ "MTP_PROPERTY_META_GENRE",                             0xDC95 },
-	{ "MTP_PROPERTY_COMPOSER",                               0xDC96 },
-	{ "MTP_PROPERTY_EFFECTIVE_RATING",                       0xDC97 },
-	{ "MTP_PROPERTY_SUBTITLE",                               0xDC98 },
-	{ "MTP_PROPERTY_ORIGINAL_RELEASE_DATE",                  0xDC99 },
-	{ "MTP_PROPERTY_ALBUM_NAME",                             0xDC9A },
-	{ "MTP_PROPERTY_ALBUM_ARTIST",                           0xDC9B },
-	{ "MTP_PROPERTY_MOOD",                                   0xDC9C },
-	{ "MTP_PROPERTY_DRM_STATUS",                             0xDC9D },
-	{ "MTP_PROPERTY_SUB_DESCRIPTION",                        0xDC9E },
-	{ "MTP_PROPERTY_IS_CROPPED",                             0xDCD1 },
-	{ "MTP_PROPERTY_IS_COLOUR_CORRECTED",                    0xDCD2 },
-	{ "MTP_PROPERTY_IMAGE_BIT_DEPTH",                        0xDCD3 },
-	{ "MTP_PROPERTY_F_NUMBER",                               0xDCD4 },
-	{ "MTP_PROPERTY_EXPOSURE_TIME",                          0xDCD5 },
-	{ "MTP_PROPERTY_EXPOSURE_INDEX",                         0xDCD6 },
-	{ "MTP_PROPERTY_TOTAL_BITRATE",                          0xDE91 },
-	{ "MTP_PROPERTY_BITRATE_TYPE",                           0xDE92 },
-	{ "MTP_PROPERTY_SAMPLE_RATE",                            0xDE93 },
-	{ "MTP_PROPERTY_NUMBER_OF_CHANNELS",                     0xDE94 },
-	{ "MTP_PROPERTY_AUDIO_BIT_DEPTH",                        0xDE95 },
-	{ "MTP_PROPERTY_SCAN_TYPE",                              0xDE97 },
-	{ "MTP_PROPERTY_AUDIO_WAVE_CODEC",                       0xDE99 },
-	{ "MTP_PROPERTY_AUDIO_BITRATE",                          0xDE9A },
-	{ "MTP_PROPERTY_VIDEO_FOURCC_CODEC",                     0xDE9B },
-	{ "MTP_PROPERTY_VIDEO_BITRATE",                          0xDE9C },
-	{ "MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS",            0xDE9D },
-	{ "MTP_PROPERTY_KEYFRAME_DISTANCE",                      0xDE9E },
-	{ "MTP_PROPERTY_BUFFER_SIZE",                            0xDE9F },
-	{ "MTP_PROPERTY_ENCODING_QUALITY",                       0xDEA0 },
-	{ "MTP_PROPERTY_ENCODING_PROFILE",                       0xDEA1 },
-	{ "MTP_PROPERTY_DISPLAY_NAME",                           0xDCE0 },
-	{ "MTP_PROPERTY_BODY_TEXT",                              0xDCE1 },
-	{ "MTP_PROPERTY_SUBJECT",                                0xDCE2 },
-	{ "MTP_PROPERTY_PRIORITY",                               0xDCE3 },
-	{ "MTP_PROPERTY_GIVEN_NAME",                             0xDD00 },
-	{ "MTP_PROPERTY_MIDDLE_NAMES",                           0xDD01 },
-	{ "MTP_PROPERTY_FAMILY_NAME",                            0xDD02 },
-	{ "MTP_PROPERTY_PREFIX",                                 0xDD03 },
-	{ "MTP_PROPERTY_SUFFIX",                                 0xDD04 },
-	{ "MTP_PROPERTY_PHONETIC_GIVEN_NAME",                    0xDD05 },
-	{ "MTP_PROPERTY_PHONETIC_FAMILY_NAME",                   0xDD06 },
-	{ "MTP_PROPERTY_EMAIL_PRIMARY",                          0xDD07 },
-	{ "MTP_PROPERTY_EMAIL_PERSONAL_1",                       0xDD08 },
-	{ "MTP_PROPERTY_EMAIL_PERSONAL_2",                       0xDD09 },
-	{ "MTP_PROPERTY_EMAIL_BUSINESS_1",                       0xDD0A },
-	{ "MTP_PROPERTY_EMAIL_BUSINESS_2",                       0xDD0B },
-	{ "MTP_PROPERTY_EMAIL_OTHERS",                           0xDD0C },
-	{ "MTP_PROPERTY_PHONE_NUMBER_PRIMARY",                   0xDD0D },
-	{ "MTP_PROPERTY_PHONE_NUMBER_PERSONAL",                  0xDD0E },
-	{ "MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2",                0xDD0F },
-	{ "MTP_PROPERTY_PHONE_NUMBER_BUSINESS",                  0xDD10 },
-	{ "MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2",                0xDD11 },
-	{ "MTP_PROPERTY_PHONE_NUMBER_MOBILE",                    0xDD12 },
-	{ "MTP_PROPERTY_PHONE_NUMBER_MOBILE_2",                  0xDD13 },
-	{ "MTP_PROPERTY_FAX_NUMBER_PRIMARY",                     0xDD14 },
-	{ "MTP_PROPERTY_FAX_NUMBER_PERSONAL",                    0xDD15 },
-	{ "MTP_PROPERTY_FAX_NUMBER_BUSINESS",                    0xDD16 },
-	{ "MTP_PROPERTY_PAGER_NUMBER",                           0xDD17 },
-	{ "MTP_PROPERTY_PHONE_NUMBER_OTHERS",                    0xDD18 },
-	{ "MTP_PROPERTY_PRIMARY_WEB_ADDRESS",                    0xDD19 },
-	{ "MTP_PROPERTY_PERSONAL_WEB_ADDRESS",                   0xDD1A },
-	{ "MTP_PROPERTY_BUSINESS_WEB_ADDRESS",                   0xDD1B },
-	{ "MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS",              0xDD1C },
-	{ "MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_2",            0xDD1D },
-	{ "MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_3",            0xDD1E },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL",           0xDD1F },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1",         0xDD20 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2",         0xDD21 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY",           0xDD22 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION",         0xDD23 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE",    0xDD24 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY",        0xDD25 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL",           0xDD26 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1",         0xDD27 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2",         0xDD28 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY",           0xDD29 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION",         0xDD2A },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE",    0xDD2B },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY",        0xDD2C },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL",              0xDD2D },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1",            0xDD2E },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2",            0xDD2F },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY",              0xDD30 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION",            0xDD31 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE",       0xDD32 },
-	{ "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY",           0xDD33 },
-	{ "MTP_PROPERTY_ORGANIZATION_NAME",                      0xDD34 },
-	{ "MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME",             0xDD35 },
-	{ "MTP_PROPERTY_ROLE",                                   0xDD36 },
-	{ "MTP_PROPERTY_BIRTHDATE",                              0xDD37 },
-	{ "MTP_PROPERTY_MESSAGE_TO",                             0xDD40 },
-	{ "MTP_PROPERTY_MESSAGE_CC",                             0xDD41 },
-	{ "MTP_PROPERTY_MESSAGE_BCC",                            0xDD42 },
-	{ "MTP_PROPERTY_MESSAGE_READ",                           0xDD43 },
-	{ "MTP_PROPERTY_MESSAGE_RECEIVED_TIME",                  0xDD44 },
-	{ "MTP_PROPERTY_MESSAGE_SENDER",                         0xDD45 },
-	{ "MTP_PROPERTY_ACTIVITY_BEGIN_TIME",                    0xDD50 },
-	{ "MTP_PROPERTY_ACTIVITY_END_TIME",                      0xDD51 },
-	{ "MTP_PROPERTY_ACTIVITY_LOCATION",                      0xDD52 },
-	{ "MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES",            0xDD54 },
-	{ "MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES",            0xDD55 },
-	{ "MTP_PROPERTY_ACTIVITY_RESOURCES",                     0xDD56 },
-	{ "MTP_PROPERTY_ACTIVITY_ACCEPTED",                      0xDD57 },
-	{ "MTP_PROPERTY_ACTIVITY_TENTATIVE",                     0xDD58 },
-	{ "MTP_PROPERTY_ACTIVITY_DECLINED",                      0xDD59 },
-	{ "MTP_PROPERTY_ACTIVITY_REMAINDER_TIME",                0xDD5A },
-	{ "MTP_PROPERTY_ACTIVITY_OWNER",                         0xDD5B },
-	{ "MTP_PROPERTY_ACTIVITY_STATUS",                        0xDD5C },
-	{ "MTP_PROPERTY_OWNER",                                  0xDD5D },
-	{ "MTP_PROPERTY_EDITOR",                                 0xDD5E },
-	{ "MTP_PROPERTY_WEBMASTER",                              0xDD5F },
-	{ "MTP_PROPERTY_URL_SOURCE",                             0xDD60 },
-	{ "MTP_PROPERTY_URL_DESTINATION",                        0xDD61 },
-	{ "MTP_PROPERTY_TIME_BOOKMARK",                          0xDD62 },
-	{ "MTP_PROPERTY_OBJECT_BOOKMARK",                        0xDD63 },
-	{ "MTP_PROPERTY_BYTE_BOOKMARK",                          0xDD64 },
-	{ "MTP_PROPERTY_LAST_BUILD_DATE",                        0xDD70 },
-	{ "MTP_PROPERTY_TIME_TO_LIVE",                           0xDD71 },
-	{ "MTP_PROPERTY_MEDIA_GUID",                             0xDD72 },
-	{ 0,                                                     0      },
-};
-
-static const CodeEntry sDevicePropCodes[] = {
-	{ "MTP_DEVICE_PROPERTY_UNDEFINED",                       0x5000 },
-	{ "MTP_DEVICE_PROPERTY_BATTERY_LEVEL",                   0x5001 },
-	{ "MTP_DEVICE_PROPERTY_FUNCTIONAL_MODE",                 0x5002 },
-	{ "MTP_DEVICE_PROPERTY_IMAGE_SIZE",                      0x5003 },
-	{ "MTP_DEVICE_PROPERTY_COMPRESSION_SETTING",             0x5004 },
-	{ "MTP_DEVICE_PROPERTY_WHITE_BALANCE",                   0x5005 },
-	{ "MTP_DEVICE_PROPERTY_RGB_GAIN",                        0x5006 },
-	{ "MTP_DEVICE_PROPERTY_F_NUMBER",                        0x5007 },
-	{ "MTP_DEVICE_PROPERTY_FOCAL_LENGTH",                    0x5008 },
-	{ "MTP_DEVICE_PROPERTY_FOCUS_DISTANCE",                  0x5009 },
-	{ "MTP_DEVICE_PROPERTY_FOCUS_MODE",                      0x500A },
-	{ "MTP_DEVICE_PROPERTY_EXPOSURE_METERING_MODE",          0x500B },
-	{ "MTP_DEVICE_PROPERTY_FLASH_MODE",                      0x500C },
-	{ "MTP_DEVICE_PROPERTY_EXPOSURE_TIME",                   0x500D },
-	{ "MTP_DEVICE_PROPERTY_EXPOSURE_PROGRAM_MODE",           0x500E },
-	{ "MTP_DEVICE_PROPERTY_EXPOSURE_INDEX",                  0x500F },
-	{ "MTP_DEVICE_PROPERTY_EXPOSURE_BIAS_COMPENSATION",      0x5010 },
-	{ "MTP_DEVICE_PROPERTY_DATETIME",                        0x5011 },
-	{ "MTP_DEVICE_PROPERTY_CAPTURE_DELAY",                   0x5012 },
-	{ "MTP_DEVICE_PROPERTY_STILL_CAPTURE_MODE",              0x5013 },
-	{ "MTP_DEVICE_PROPERTY_CONTRAST",                        0x5014 },
-	{ "MTP_DEVICE_PROPERTY_SHARPNESS",                       0x5015 },
-	{ "MTP_DEVICE_PROPERTY_DIGITAL_ZOOM",                    0x5016 },
-	{ "MTP_DEVICE_PROPERTY_EFFECT_MODE",                     0x5017 },
-	{ "MTP_DEVICE_PROPERTY_BURST_NUMBER",                    0x5018 },
-	{ "MTP_DEVICE_PROPERTY_BURST_INTERVAL",                  0x5019 },
-	{ "MTP_DEVICE_PROPERTY_TIMELAPSE_NUMBER",                0x501A },
-	{ "MTP_DEVICE_PROPERTY_TIMELAPSE_INTERVAL",              0x501B },
-	{ "MTP_DEVICE_PROPERTY_FOCUS_METERING_MODE",             0x501C },
-	{ "MTP_DEVICE_PROPERTY_UPLOAD_URL",                      0x501D },
-	{ "MTP_DEVICE_PROPERTY_ARTIST",                          0x501E },
-	{ "MTP_DEVICE_PROPERTY_COPYRIGHT_INFO",                  0x501F },
-	{ "MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER",         0xD401 },
-	{ "MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME",            0xD402 },
-	{ "MTP_DEVICE_PROPERTY_VOLUME",                          0xD403 },
-	{ "MTP_DEVICE_PROPERTY_SUPPORTED_FORMATS_ORDERED",       0xD404 },
-	{ "MTP_DEVICE_PROPERTY_DEVICE_ICON",                     0xD405 },
-	{ "MTP_DEVICE_PROPERTY_PLAYBACK_RATE",                   0xD410 },
-	{ "MTP_DEVICE_PROPERTY_PLAYBACK_OBJECT",                 0xD411 },
-	{ "MTP_DEVICE_PROPERTY_PLAYBACK_CONTAINER_INDEX",        0xD412 },
-	{ "MTP_DEVICE_PROPERTY_SESSION_INITIATOR_VERSION_INFO",  0xD406 },
-	{ "MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE",           0xD407 },
-	{ 0,                                                     0      },
-};
-
-static const char* getCodeName(uint16_t code, const CodeEntry* table) {
-	const CodeEntry* entry = table;
-	while (entry->name) {
-		if (entry->code == code)
-			return entry->name;
-		entry++;
-	}
-	return "UNKNOWN";
-}
-
-const char* MtpDebug::getOperationCodeName(MtpOperationCode code) {
-	return getCodeName(code, sOperationCodes);
-}
-
-const char* MtpDebug::getFormatCodeName(MtpObjectFormat code) {
-	if (code == 0)
-		return "NONE";
-	return getCodeName(code, sFormatCodes);
-}
-
-const char* MtpDebug::getObjectPropCodeName(MtpPropertyCode code) {
-	if (code == 0)
-		return "NONE";
-	return getCodeName(code, sObjectPropCodes);
-}
-
-const char* MtpDebug::getDevicePropCodeName(MtpPropertyCode code) {
-	if (code == 0)
-		return "NONE";
-	return getCodeName(code, sDevicePropCodes);
-}
-
-void MtpDebug::enableDebug(void) {
-	debug_enabled = 1;
-	MTPD("MTP debug logging enabled\n");
-}
diff --git a/mtp/legacy/MtpDebug.h b/mtp/legacy/MtpDebug.h
deleted file mode 100644
index 073ddcc..0000000
--- a/mtp/legacy/MtpDebug.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2017 TeamWin
- * Copyright (C) 2010 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.
- *
- */
-
-#ifndef _MTP_DEBUG_H
-#define _MTP_DEBUG_H
-
-// #define LOG_NDEBUG 0
-#include <utils/Log.h>
-
-#include "MtpTypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-void mtpdebug(const char *fmt, ...);
-
-#define MTPI(...) fprintf(stdout, "I:[MTP] " __VA_ARGS__)
-#define MTPD(...) mtpdebug("D:[MTP] " __VA_ARGS__)
-#define MTPE(...) fprintf(stdout, "E:[MTP] " __VA_ARGS__)
-
-#ifdef __cplusplus
-}
-#endif
-
-class MtpDebug {
-public:
-	static const char* getOperationCodeName(MtpOperationCode code);
-	static const char* getFormatCodeName(MtpObjectFormat code);
-	static const char* getObjectPropCodeName(MtpPropertyCode code);
-	static const char* getDevicePropCodeName(MtpPropertyCode code);
-	static void enableDebug();
-};
-
-
-#endif // _MTP_DEBUG_H
diff --git a/mtp/legacy/MtpDevice.cpp b/mtp/legacy/MtpDevice.cpp
deleted file mode 100644
index 089fc22..0000000
--- a/mtp/legacy/MtpDevice.cpp
+++ /dev/null
@@ -1,851 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include "MtpDevice.h"
-#include "MtpDebug.h"
-#include "MtpDeviceInfo.h"
-#include "MtpObjectInfo.h"
-#include "MtpProperty.h"
-#include "MtpStorageInfo.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-#include "MtpDataPacket.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <endian.h>
-
-#include <usbhost/usbhost.h>
-
-
-#if 0
-static bool isMtpDevice(uint16_t vendor, uint16_t product) {
-	// Sandisk Sansa Fuze
-	if (vendor == 0x0781 && product == 0x74c2)
-		return true;
-	// Samsung YP-Z5
-	if (vendor == 0x04e8 && product == 0x503c)
-		return true;
-	return false;
-}
-#endif
-
-#ifdef HAS_USBHOST_TIMEOUT
-static const int USB_CONTROL_TRANSFER_TIMEOUT_MS = 200;
-#endif
-
-MtpDevice* MtpDevice::open(const char* deviceName, int fd) {
-	struct usb_device *device = usb_device_new(deviceName, fd);
-	if (!device) {
-		MTPE("usb_device_new failed for %s", deviceName);
-		return NULL;
-	}
-
-	struct usb_descriptor_header* desc;
-	struct usb_descriptor_iter iter;
-
-	usb_descriptor_iter_init(device, &iter);
-
-	while ((desc = usb_descriptor_iter_next(&iter)) != NULL) {
-		if (desc->bDescriptorType == USB_DT_INTERFACE) {
-			struct usb_interface_descriptor *interface = (struct usb_interface_descriptor *)desc;
-
-			if (interface->bInterfaceClass == USB_CLASS_STILL_IMAGE &&
-				interface->bInterfaceSubClass == 1 && // Still Image Capture
-				interface->bInterfaceProtocol == 1)	 // Picture Transfer Protocol (PIMA 15470)
-			{
-#ifdef HAS_USBHOST_TIMEOUT
-				char* manufacturerName = usb_device_get_manufacturer_name(device, USB_CONTROL_TRANSFER_TIMEOUT_MS);
-				char* productName = usb_device_get_product_name(device, USB_CONTROL_TRANSFER_TIMEOUT_MS);
-#else
-				char* manufacturerName = usb_device_get_manufacturer_name(device);
-				char* productName = usb_device_get_product_name(device);
-#endif
-				MTPD("Found camera: \"%s\" \"%s\"\n", manufacturerName, productName);
-				free(manufacturerName);
-				free(productName);
-			} else if (interface->bInterfaceClass == 0xFF &&
-					interface->bInterfaceSubClass == 0xFF &&
-					interface->bInterfaceProtocol == 0) {
-#ifdef HAS_USBHOST_TIMEOUT
-				char* interfaceName = usb_device_get_string(device, interface->iInterface, USB_CONTROL_TRANSFER_TIMEOUT_MS);
-#else
-				char* interfaceName = usb_device_get_string(device, interface->iInterface);
-#endif
-				if (!interfaceName) {
-					continue;
-				} else if (strcmp(interfaceName, "MTP")) {
-					free(interfaceName);
-					continue;
-				}
-				free(interfaceName);
-
-				// Looks like an android style MTP device
-#ifdef HAS_USBHOST_TIMEOUT
-				char* manufacturerName = usb_device_get_manufacturer_name(device, USB_CONTROL_TRANSFER_TIMEOUT_MS);
-				char* productName = usb_device_get_product_name(device, USB_CONTROL_TRANSFER_TIMEOUT_MS);
-#else
-				char* manufacturerName = usb_device_get_manufacturer_name(device);
-				char* productName = usb_device_get_product_name(device);
-#endif
-				MTPI("Found MTP device: \"%s\" \"%s\"\n", manufacturerName, productName);
-				free(manufacturerName);
-				free(productName);
-			}
-#if 0
-			 else {
-				// look for special cased devices based on vendor/product ID
-				// we are doing this mainly for testing purposes
-				uint16_t vendor = usb_device_get_vendor_id(device);
-				uint16_t product = usb_device_get_product_id(device);
-				if (!isMtpDevice(vendor, product)) {
-					// not an MTP or PTP device
-					continue;
-				}
-				// request MTP OS string and descriptor
-				// some music players need to see this before entering MTP mode.
-				char buffer[256];
-				memset(buffer, 0, sizeof(buffer));
-				int ret = usb_device_control_transfer(device,
-						USB_DIR_IN|USB_RECIP_DEVICE|USB_TYPE_STANDARD,
-						USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) | 0xEE,
-						0, buffer, sizeof(buffer), 0);
-				MTPE("usb_device_control_transfer returned %d errno: %d\n", ret, errno);
-				if (ret > 0) {
-					MTPI("got MTP string %s\n", buffer);
-					ret = usb_device_control_transfer(device,
-							USB_DIR_IN|USB_RECIP_DEVICE|USB_TYPE_VENDOR, 1,
-							0, 4, buffer, sizeof(buffer), 0);
-					MTPI("OS descriptor got %d\n", ret);
-				} else {
-					MTPI("no MTP string\n");
-				}
-			}
-#endif
-			// if we got here, then we have a likely MTP or PTP device
-
-			// interface should be followed by three endpoints
-			struct usb_endpoint_descriptor *ep;
-			struct usb_endpoint_descriptor *ep_in_desc = NULL;
-			struct usb_endpoint_descriptor *ep_out_desc = NULL;
-			struct usb_endpoint_descriptor *ep_intr_desc = NULL;
-			for (int i = 0; i < 3; i++) {
-				ep = (struct usb_endpoint_descriptor *)usb_descriptor_iter_next(&iter);
-				if (!ep || ep->bDescriptorType != USB_DT_ENDPOINT) {
-					MTPE("endpoints not found\n");
-					usb_device_close(device);
-					return NULL;
-				}
-				if (ep->bmAttributes == USB_ENDPOINT_XFER_BULK) {
-					if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
-						ep_in_desc = ep;
-					else
-						ep_out_desc = ep;
-				} else if (ep->bmAttributes == USB_ENDPOINT_XFER_INT &&
-					ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) {
-					ep_intr_desc = ep;
-				}
-			}
-			if (!ep_in_desc || !ep_out_desc || !ep_intr_desc) {
-				MTPE("endpoints not found\n");
-				usb_device_close(device);
-				return NULL;
-			}
-
-			if (usb_device_claim_interface(device, interface->bInterfaceNumber)) {
-				MTPE("usb_device_claim_interface failed errno: %d\n", errno);
-				usb_device_close(device);
-				return NULL;
-			}
-
-			MtpDevice* mtpDevice = new MtpDevice(device, interface->bInterfaceNumber,
-						ep_in_desc, ep_out_desc, ep_intr_desc);
-			mtpDevice->initialize();
-			return mtpDevice;
-		}
-	}
-
-	usb_device_close(device);
-	MTPE("device not found");
-	return NULL;
-}
-
-MtpDevice::MtpDevice(struct usb_device* device, int interface,
-			const struct usb_endpoint_descriptor *ep_in,
-			const struct usb_endpoint_descriptor *ep_out,
-			const struct usb_endpoint_descriptor *ep_intr)
-	:   mDevice(device),
-		mInterface(interface),
-		mRequestIn1(NULL),
-		mRequestIn2(NULL),
-		mRequestOut(NULL),
-		mRequestIntr(NULL),
-		mDeviceInfo(NULL),
-		mSessionID(0),
-		mTransactionID(0),
-		mReceivedResponse(false)
-{
-	mRequestIn1 = usb_request_new(device, ep_in);
-	mRequestIn2 = usb_request_new(device, ep_in);
-	mRequestOut = usb_request_new(device, ep_out);
-	mRequestIntr = usb_request_new(device, ep_intr);
-}
-
-MtpDevice::~MtpDevice() {
-	close();
-	for (size_t i = 0; i < mDeviceProperties.size(); i++)
-		delete mDeviceProperties[i];
-	usb_request_free(mRequestIn1);
-	usb_request_free(mRequestIn2);
-	usb_request_free(mRequestOut);
-	usb_request_free(mRequestIntr);
-}
-
-void MtpDevice::initialize() {
-	openSession();
-	mDeviceInfo = getDeviceInfo();
-	if (mDeviceInfo) {
-		if (mDeviceInfo->mDeviceProperties) {
-			int count = mDeviceInfo->mDeviceProperties->size();
-			for (int i = 0; i < count; i++) {
-				MtpDeviceProperty propCode = (*mDeviceInfo->mDeviceProperties)[i];
-				MtpProperty* property = getDevicePropDesc(propCode);
-				if (property)
-					mDeviceProperties.push(property);
-			}
-		}
-	}
-}
-
-void MtpDevice::close() {
-	if (mDevice) {
-		usb_device_release_interface(mDevice, mInterface);
-		usb_device_close(mDevice);
-		mDevice = NULL;
-	}
-}
-
-void MtpDevice::print() {
-	if (mDeviceInfo) {
-		mDeviceInfo->print();
-
-		if (mDeviceInfo->mDeviceProperties) {
-			MTPI("***** DEVICE PROPERTIES *****\n");
-			int count = mDeviceInfo->mDeviceProperties->size();
-			for (int i = 0; i < count; i++) {
-				MtpDeviceProperty propCode = (*mDeviceInfo->mDeviceProperties)[i];
-				MtpProperty* property = getDevicePropDesc(propCode);
-				if (property) {
-					property->print();
-					delete property;
-				}
-			}
-		}
-	}
-
-	if (mDeviceInfo->mPlaybackFormats) {
-			MTPI("***** OBJECT PROPERTIES *****\n");
-		int count = mDeviceInfo->mPlaybackFormats->size();
-		for (int i = 0; i < count; i++) {
-			MtpObjectFormat format = (*mDeviceInfo->mPlaybackFormats)[i];
-			MTPI("*** FORMAT: %s\n", MtpDebug::getFormatCodeName(format));
-			MtpObjectPropertyList* props = getObjectPropsSupported(format);
-			if (props) {
-				for (size_t j = 0; j < props->size(); j++) {
-					MtpObjectProperty prop = (*props)[j];
-					MtpProperty* property = getObjectPropDesc(prop, format);
-					if (property) {
-						property->print();
-						delete property;
-					} else {
-						MTPI("could not fetch property: %s",
-								MtpDebug::getObjectPropCodeName(prop));
-					}
-				}
-			}
-		}
-	}
-}
-
-const char* MtpDevice::getDeviceName() {
-	if (mDevice)
-		return usb_device_get_name(mDevice);
-	else
-		return "???";
-}
-
-bool MtpDevice::openSession() {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mSessionID = 0;
-	mTransactionID = 0;
-	MtpSessionID newSession = 1;
-	mRequest.reset();
-	mRequest.setParameter(1, newSession);
-	if (!sendRequest(MTP_OPERATION_OPEN_SESSION))
-		return false;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_SESSION_ALREADY_OPEN)
-		newSession = mResponse.getParameter(1);
-	else if (ret != MTP_RESPONSE_OK)
-		return false;
-
-	mSessionID = newSession;
-	mTransactionID = 1;
-	return true;
-}
-
-bool MtpDevice::closeSession() {
-	// FIXME
-	return true;
-}
-
-MtpDeviceInfo* MtpDevice::getDeviceInfo() {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	if (!sendRequest(MTP_OPERATION_GET_DEVICE_INFO))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		MtpDeviceInfo* info = new MtpDeviceInfo;
-		info->read(mData);
-		return info;
-	}
-	return NULL;
-}
-
-MtpStorageIDList* MtpDevice::getStorageIDs() {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	if (!sendRequest(MTP_OPERATION_GET_STORAGE_IDS))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		return mData.getAUInt32();
-	}
-	return NULL;
-}
-
-MtpStorageInfo* MtpDevice::getStorageInfo(MtpStorageID storageID) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	mRequest.setParameter(1, storageID);
-	if (!sendRequest(MTP_OPERATION_GET_STORAGE_INFO))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		MtpStorageInfo* info = new MtpStorageInfo(storageID);
-		info->read(mData);
-		return info;
-	}
-	return NULL;
-}
-
-MtpObjectHandleList* MtpDevice::getObjectHandles(MtpStorageID storageID,
-			MtpObjectFormat format, MtpObjectHandle parent) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	mRequest.setParameter(1, storageID);
-	mRequest.setParameter(2, format);
-	mRequest.setParameter(3, parent);
-	if (!sendRequest(MTP_OPERATION_GET_OBJECT_HANDLES))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		return mData.getAUInt32();
-	}
-	return NULL;
-}
-
-MtpObjectInfo* MtpDevice::getObjectInfo(MtpObjectHandle handle) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	// FIXME - we might want to add some caching here
-
-	mRequest.reset();
-	mRequest.setParameter(1, handle);
-	if (!sendRequest(MTP_OPERATION_GET_OBJECT_INFO))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		MtpObjectInfo* info = new MtpObjectInfo(handle);
-		info->read(mData);
-		return info;
-	}
-	return NULL;
-}
-
-void* MtpDevice::getThumbnail(MtpObjectHandle handle, int& outLength) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	mRequest.setParameter(1, handle);
-	if (sendRequest(MTP_OPERATION_GET_THUMB) && readData()) {
-		MtpResponseCode ret = readResponse();
-		if (ret == MTP_RESPONSE_OK) {
-			return mData.getData(outLength);
-		}
-	}
-	outLength = 0;
-	return NULL;
-}
-
-MtpObjectHandle MtpDevice::sendObjectInfo(MtpObjectInfo* info) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	MtpObjectHandle parent = info->mParent;
-	if (parent == 0)
-		parent = MTP_PARENT_ROOT;
-
-	mRequest.setParameter(1, info->mStorageID);
-	mRequest.setParameter(2, info->mParent);
-
-	mData.putUInt32(info->mStorageID);
-	mData.putUInt16(info->mFormat);
-	mData.putUInt16(info->mProtectionStatus);
-	mData.putUInt32(info->mCompressedSize);
-	mData.putUInt16(info->mThumbFormat);
-	mData.putUInt32(info->mThumbCompressedSize);
-	mData.putUInt32(info->mThumbPixWidth);
-	mData.putUInt32(info->mThumbPixHeight);
-	mData.putUInt32(info->mImagePixWidth);
-	mData.putUInt32(info->mImagePixHeight);
-	mData.putUInt32(info->mImagePixDepth);
-	mData.putUInt32(info->mParent);
-	mData.putUInt16(info->mAssociationType);
-	mData.putUInt32(info->mAssociationDesc);
-	mData.putUInt32(info->mSequenceNumber);
-	mData.putString(info->mName);
-
-	char created[100], modified[100];
-	formatDateTime(info->mDateCreated, created, sizeof(created));
-	formatDateTime(info->mDateModified, modified, sizeof(modified));
-
-	mData.putString(created);
-	mData.putString(modified);
-	if (info->mKeywords)
-		mData.putString(info->mKeywords);
-	else
-		mData.putEmptyString();
-
-   if (sendRequest(MTP_OPERATION_SEND_OBJECT_INFO) && sendData()) {
-		MtpResponseCode ret = readResponse();
-		if (ret == MTP_RESPONSE_OK) {
-			info->mStorageID = mResponse.getParameter(1);
-			info->mParent = mResponse.getParameter(2);
-			info->mHandle = mResponse.getParameter(3);
-			return info->mHandle;
-		}
-	}
-	return (MtpObjectHandle)-1;
-}
-
-bool MtpDevice::sendObject(MtpObjectInfo* info, int srcFD) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	int remaining = info->mCompressedSize;
-	mRequest.reset();
-	mRequest.setParameter(1, info->mHandle);
-	if (sendRequest(MTP_OPERATION_SEND_OBJECT)) {
-		// send data header
-		writeDataHeader(MTP_OPERATION_SEND_OBJECT, remaining);
-
-		char buffer[65536];
-		while (remaining > 0) {
-			int count = read(srcFD, buffer, sizeof(buffer));
-			if (count > 0) {
-				int written = mData.write(mRequestOut, buffer, count);
-				// FIXME check error
-				remaining -= count;
-			} else {
-				break;
-			}
-		}
-	}
-	MtpResponseCode ret = readResponse();
-	return (remaining == 0 && ret == MTP_RESPONSE_OK);
-}
-
-bool MtpDevice::deleteObject(MtpObjectHandle handle) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	mRequest.setParameter(1, handle);
-	if (sendRequest(MTP_OPERATION_DELETE_OBJECT)) {
-		MtpResponseCode ret = readResponse();
-		if (ret == MTP_RESPONSE_OK)
-			return true;
-	}
-	return false;
-}
-
-MtpObjectHandle MtpDevice::getParent(MtpObjectHandle handle) {
-	MtpObjectInfo* info = getObjectInfo(handle);
-	if (info) {
-		MtpObjectHandle parent = info->mParent;
-		delete info;
-		return parent;
-	} else {
-		return -1;
-	}
-}
-
-MtpObjectHandle MtpDevice::getStorageID(MtpObjectHandle handle) {
-	MtpObjectInfo* info = getObjectInfo(handle);
-	if (info) {
-		MtpObjectHandle storageId = info->mStorageID;
-		delete info;
-		return storageId;
-	} else {
-		return -1;
-	}
-}
-
-MtpObjectPropertyList* MtpDevice::getObjectPropsSupported(MtpObjectFormat format) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	mRequest.setParameter(1, format);
-	if (!sendRequest(MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		return mData.getAUInt16();
-	}
-	return NULL;
-
-}
-
-MtpProperty* MtpDevice::getDevicePropDesc(MtpDeviceProperty code) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	mRequest.setParameter(1, code);
-	if (!sendRequest(MTP_OPERATION_GET_DEVICE_PROP_DESC))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		MtpProperty* property = new MtpProperty;
-		property->read(mData);
-		return property;
-	}
-	return NULL;
-}
-
-MtpProperty* MtpDevice::getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	mRequest.reset();
-	mRequest.setParameter(1, code);
-	mRequest.setParameter(2, format);
-	if (!sendRequest(MTP_OPERATION_GET_OBJECT_PROP_DESC))
-		return NULL;
-	if (!readData())
-		return NULL;
-	MtpResponseCode ret = readResponse();
-	if (ret == MTP_RESPONSE_OK) {
-		MtpProperty* property = new MtpProperty;
-		property->read(mData);
-		return property;
-	}
-	return NULL;
-}
-
-bool MtpDevice::readObject(MtpObjectHandle handle,
-		bool (* callback)(void* data, int offset, int length, void* clientData),
-		int objectSize, void* clientData) {
-	android::Mutex::Autolock autoLock(mMutex);
-	bool result = false;
-
-	mRequest.reset();
-	mRequest.setParameter(1, handle);
-	if (sendRequest(MTP_OPERATION_GET_OBJECT)
-			&& mData.readDataHeader(mRequestIn1)) {
-		uint32_t length = mData.getContainerLength();
-		if ((int)length - MTP_CONTAINER_HEADER_SIZE != objectSize) {
-			MTPE("readObject error objectSize: %d, length: %d",
-					objectSize, length);
-			goto fail;
-		}
-		length -= MTP_CONTAINER_HEADER_SIZE;
-		uint32_t remaining = length;
-		int offset = 0;
-
-		int initialDataLength = 0;
-		void* initialData = mData.getData(initialDataLength);
-		if (initialData) {
-			if (initialDataLength > 0) {
-				if (!callback(initialData, 0, initialDataLength, clientData))
-					goto fail;
-				remaining -= initialDataLength;
-				offset += initialDataLength;
-			}
-			free(initialData);
-		}
-
-		// USB reads greater than 16K don't work
-		char buffer1[16384], buffer2[16384];
-		mRequestIn1->buffer = buffer1;
-		mRequestIn2->buffer = buffer2;
-		struct usb_request* req = mRequestIn1;
-		void* writeBuffer = NULL;
-		int writeLength = 0;
-
-		while (remaining > 0 || writeBuffer) {
-			if (remaining > 0) {
-				// queue up a read request
-				req->buffer_length = (remaining > sizeof(buffer1) ? sizeof(buffer1) : remaining);
-				if (mData.readDataAsync(req)) {
-					MTPE("readDataAsync failed");
-					goto fail;
-				}
-			} else {
-				req = NULL;
-			}
-
-			if (writeBuffer) {
-				// write previous buffer
-				if (!callback(writeBuffer, offset, writeLength, clientData)) {
-					MTPE("write failed");
-					// wait for pending read before failing
-					if (req)
-						mData.readDataWait(mDevice);
-					goto fail;
-				}
-				offset += writeLength;
-				writeBuffer = NULL;
-			}
-
-			// wait for read to complete
-			if (req) {
-				int read = mData.readDataWait(mDevice);
-				if (read < 0)
-					goto fail;
-
-				if (read > 0) {
-					writeBuffer = req->buffer;
-					writeLength = read;
-					remaining -= read;
-					req = (req == mRequestIn1 ? mRequestIn2 : mRequestIn1);
-				} else {
-					writeBuffer = NULL;
-				}
-			}
-		}
-
-		MtpResponseCode response = readResponse();
-		if (response == MTP_RESPONSE_OK)
-			result = true;
-	}
-
-fail:
-	return result;
-}
-
-
-// reads the object's data and writes it to the specified file path
-bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int group, int perm) {
-	MTPI("readObject: %s", destPath);
-	int fd = ::open(destPath, O_RDWR | O_CREAT | O_TRUNC, 0640);
-	if (fd < 0) {
-		MTPE("open failed for %s", destPath);
-		return false;
-	}
-
-	fchown(fd, getuid(), group);
-	// set permissions
-	int mask = umask(0);
-	fchmod(fd, perm);
-	umask(mask);
-
-	android::Mutex::Autolock autoLock(mMutex);
-	bool result = false;
-
-	mRequest.reset();
-	mRequest.setParameter(1, handle);
-	if (sendRequest(MTP_OPERATION_GET_OBJECT)
-			&& mData.readDataHeader(mRequestIn1)) {
-		uint32_t length = mData.getContainerLength();
-		if (length < MTP_CONTAINER_HEADER_SIZE)
-			goto fail;
-		length -= MTP_CONTAINER_HEADER_SIZE;
-		uint32_t remaining = length;
-
-		int initialDataLength = 0;
-		void* initialData = mData.getData(initialDataLength);
-		if (initialData) {
-			if (initialDataLength > 0) {
-				if (write(fd, initialData, initialDataLength) != initialDataLength) {
-					free(initialData);
-					goto fail;
-				}
-				remaining -= initialDataLength;
-			}
-			free(initialData);
-		}
-
-		// USB reads greater than 16K don't work
-		char buffer1[16384], buffer2[16384];
-		mRequestIn1->buffer = buffer1;
-		mRequestIn2->buffer = buffer2;
-		struct usb_request* req = mRequestIn1;
-		void* writeBuffer = NULL;
-		int writeLength = 0;
-
-		while (remaining > 0 || writeBuffer) {
-			if (remaining > 0) {
-				// queue up a read request
-				req->buffer_length = (remaining > sizeof(buffer1) ? sizeof(buffer1) : remaining);
-				if (mData.readDataAsync(req)) {
-					MTPE("readDataAsync failed");
-					goto fail;
-				}
-			} else {
-				req = NULL;
-			}
-
-			if (writeBuffer) {
-				// write previous buffer
-				if (write(fd, writeBuffer, writeLength) != writeLength) {
-					MTPE("write failed");
-					// wait for pending read before failing
-					if (req)
-						mData.readDataWait(mDevice);
-					goto fail;
-				}
-				writeBuffer = NULL;
-			}
-
-			// wait for read to complete
-			if (req) {
-				int read = mData.readDataWait(mDevice);
-				if (read < 0)
-					goto fail;
-
-				if (read > 0) {
-					writeBuffer = req->buffer;
-					writeLength = read;
-					remaining -= read;
-					req = (req == mRequestIn1 ? mRequestIn2 : mRequestIn1);
-				} else {
-					writeBuffer = NULL;
-				}
-			}
-		}
-
-		MtpResponseCode response = readResponse();
-		if (response == MTP_RESPONSE_OK)
-			result = true;
-	}
-
-fail:
-	::close(fd);
-	return result;
-}
-
-bool MtpDevice::sendRequest(MtpOperationCode operation) {
-	MTPD("sendRequest: %s\n", MtpDebug::getOperationCodeName(operation));
-	mReceivedResponse = false;
-	mRequest.setOperationCode(operation);
-	if (mTransactionID > 0)
-		mRequest.setTransactionID(mTransactionID++);
-	int ret = mRequest.write(mRequestOut);
-	mRequest.dump();
-	return (ret > 0);
-}
-
-bool MtpDevice::sendData() {
-	MTPD("sendData\n");
-	mData.setOperationCode(mRequest.getOperationCode());
-	mData.setTransactionID(mRequest.getTransactionID());
-	int ret = mData.write(mRequestOut);
-	mData.dump();
-	return (ret > 0);
-}
-
-bool MtpDevice::readData() {
-	mData.reset();
-	int ret = mData.read(mRequestIn1);
-	MTPD("readData returned %d\n", ret);
-	if (ret >= MTP_CONTAINER_HEADER_SIZE) {
-		if (mData.getContainerType() == MTP_CONTAINER_TYPE_RESPONSE) {
-			MTPD("got response packet instead of data packet");
-			// we got a response packet rather than data
-			// copy it to mResponse
-			mResponse.copyFrom(mData);
-			mReceivedResponse = true;
-			return false;
-		}
-		mData.dump();
-		return true;
-	}
-	else {
-		MTPE("readResponse failed\n");
-		return false;
-	}
-}
-
-bool MtpDevice::writeDataHeader(MtpOperationCode operation, int dataLength) {
-	mData.setOperationCode(operation);
-	mData.setTransactionID(mRequest.getTransactionID());
-	return (!mData.writeDataHeader(mRequestOut, dataLength));
-}
-
-MtpResponseCode MtpDevice::readResponse() {
-	MTPD("readResponse\n");
-	if (mReceivedResponse) {
-		mReceivedResponse = false;
-		return mResponse.getResponseCode();
-	}
-	int ret = mResponse.read(mRequestIn1);
-	// handle zero length packets, which might occur if the data transfer
-	// ends on a packet boundary
-	if (ret == 0)
-		ret = mResponse.read(mRequestIn1);
-	if (ret >= MTP_CONTAINER_HEADER_SIZE) {
-		mResponse.dump();
-		return mResponse.getResponseCode();
-	} else {
-		MTPE("readResponse failed\n");
-		return -1;
-	}
-}
diff --git a/mtp/legacy/MtpDevice.h b/mtp/legacy/MtpDevice.h
deleted file mode 100644
index 34b39ec..0000000
--- a/mtp/legacy/MtpDevice.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_DEVICE_H
-#define _MTP_DEVICE_H
-
-#include "MtpRequestPacket.h"
-#include "MtpDataPacket.h"
-#include "MtpResponsePacket.h"
-#include "MtpTypes.h"
-
-#include <utils/threads.h>
-
-struct usb_device;
-struct usb_request;
-struct usb_endpoint_descriptor;
-
-
-class MtpDeviceInfo;
-class MtpObjectInfo;
-class MtpStorageInfo;
-
-class MtpDevice {
-private:
-	struct usb_device*		mDevice;
-	int						mInterface;
-	struct usb_request*		mRequestIn1;
-	struct usb_request*		mRequestIn2;
-	struct usb_request*		mRequestOut;
-	struct usb_request*		mRequestIntr;
-	MtpDeviceInfo*			mDeviceInfo;
-	MtpPropertyList			mDeviceProperties;
-
-	// current session ID
-	MtpSessionID			mSessionID;
-	// current transaction ID
-	MtpTransactionID		mTransactionID;
-
-	MtpRequestPacket		mRequest;
-	MtpDataPacket			mData;
-	MtpResponsePacket		mResponse;
-	// set to true if we received a response packet instead of a data packet
-	bool					mReceivedResponse;
-
-	// to ensure only one MTP transaction at a time
-	android::Mutex					 mMutex;
-
-public:
-							MtpDevice(struct usb_device* device, int interface,
-									const struct usb_endpoint_descriptor *ep_in,
-									const struct usb_endpoint_descriptor *ep_out,
-									const struct usb_endpoint_descriptor *ep_intr);
-
-	static MtpDevice*		open(const char* deviceName, int fd);
-
-	virtual					~MtpDevice();
-
-	void					initialize();
-	void					close();
-	void					print();
-	const char*				getDeviceName();
-
-	bool					openSession();
-	bool					closeSession();
-
-	MtpDeviceInfo*			getDeviceInfo();
-	MtpStorageIDList*		getStorageIDs();
-	MtpStorageInfo*			getStorageInfo(MtpStorageID storageID);
-	MtpObjectHandleList*	getObjectHandles(MtpStorageID storageID, MtpObjectFormat format,
-									MtpObjectHandle parent);
-	MtpObjectInfo*			getObjectInfo(MtpObjectHandle handle);
-	void*					getThumbnail(MtpObjectHandle handle, int& outLength);
-	MtpObjectHandle			sendObjectInfo(MtpObjectInfo* info);
-	bool					sendObject(MtpObjectInfo* info, int srcFD);
-	bool					deleteObject(MtpObjectHandle handle);
-	MtpObjectHandle			getParent(MtpObjectHandle handle);
-	MtpObjectHandle			getStorageID(MtpObjectHandle handle);
-
-	MtpObjectPropertyList*	getObjectPropsSupported(MtpObjectFormat format);
-
-	MtpProperty*			getDevicePropDesc(MtpDeviceProperty code);
-	MtpProperty*			getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format);
-
-	bool					readObject(MtpObjectHandle handle,
-									bool (* callback)(void* data, int offset,
-											int length, void* clientData),
-									int objectSize, void* clientData);
-	bool					readObject(MtpObjectHandle handle, const char* destPath, int group,
-									int perm);
-
-private:
-	bool					sendRequest(MtpOperationCode operation);
-	bool					sendData();
-	bool					readData();
-	bool					writeDataHeader(MtpOperationCode operation, int dataLength);
-	MtpResponseCode			readResponse();
-
-};
-
-
-#endif // _MTP_DEVICE_H
diff --git a/mtp/legacy/MtpDeviceInfo.cpp b/mtp/legacy/MtpDeviceInfo.cpp
deleted file mode 100644
index 337cc13..0000000
--- a/mtp/legacy/MtpDeviceInfo.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include "MtpDebug.h"
-#include "MtpDataPacket.h"
-#include "MtpDeviceInfo.h"
-#include "MtpStringBuffer.h"
-
-MtpDeviceInfo::MtpDeviceInfo()
-	:	mStandardVersion(0),
-		mVendorExtensionID(0),
-		mVendorExtensionVersion(0),
-		mVendorExtensionDesc(NULL),
-		mFunctionalCode(0),
-		mOperations(NULL),
-		mEvents(NULL),
-		mDeviceProperties(NULL),
-		mCaptureFormats(NULL),
-		mPlaybackFormats(NULL),
-		mManufacturer(NULL),
-		mModel(NULL),
-		mVersion(NULL),
-		mSerial(NULL)
-{
-}
-
-MtpDeviceInfo::~MtpDeviceInfo() {
-	if (mVendorExtensionDesc)
-		free(mVendorExtensionDesc);
-	delete mOperations;
-	delete mEvents;
-	delete mDeviceProperties;
-	delete mCaptureFormats;
-	delete mPlaybackFormats;
-	if (mManufacturer)
-		free(mManufacturer);
-	if (mModel)
-		free(mModel);
-	if (mVersion)
-		free(mVersion);
-	if (mSerial)
-		free(mSerial);
-}
-
-void MtpDeviceInfo::read(MtpDataPacket& packet) {
-	MtpStringBuffer string;
-
-	// read the device info
-	mStandardVersion = packet.getUInt16();
-	mVendorExtensionID = packet.getUInt32();
-	mVendorExtensionVersion = packet.getUInt16();
-
-	packet.getString(string);
-	mVendorExtensionDesc = strdup((const char *)string);
-
-	mFunctionalCode = packet.getUInt16();
-	mOperations = packet.getAUInt16();
-	mEvents = packet.getAUInt16();
-	mDeviceProperties = packet.getAUInt16();
-	mCaptureFormats = packet.getAUInt16();
-	mPlaybackFormats = packet.getAUInt16();
-
-	packet.getString(string);
-	mManufacturer = strdup((const char *)string);
-	packet.getString(string);
-	mModel = strdup((const char *)string);
-	packet.getString(string);
-	mVersion = strdup((const char *)string);
-	packet.getString(string);
-	mSerial = strdup((const char *)string);
-}
-
-void MtpDeviceInfo::print() {
-	MTPI("Device Info:\n\tmStandardVersion: %d\n\tmVendorExtensionID: %d\n\tmVendorExtensionVersiony: %d\n",
-			mStandardVersion, mVendorExtensionID, mVendorExtensionVersion);
-	MTPI("\tmVendorExtensionDesc: %s\n\tmFunctionalCode: %d\n\tmManufacturer: %s\n\tmModel: %s\n\tmVersion: %s\n\tmSerial: %s\n",
-			mVendorExtensionDesc, mFunctionalCode, mManufacturer, mModel, mVersion, mSerial);
-}
-
diff --git a/mtp/legacy/MtpDeviceInfo.h b/mtp/legacy/MtpDeviceInfo.h
deleted file mode 100644
index 264e199..0000000
--- a/mtp/legacy/MtpDeviceInfo.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_DEVICE_INFO_H
-#define _MTP_DEVICE_INFO_H
-
-struct stat;
-
-
-class MtpDataPacket;
-
-class MtpDeviceInfo {
-public:
-	uint16_t				mStandardVersion;
-	uint32_t				mVendorExtensionID;
-	uint16_t				mVendorExtensionVersion;
-	char*					mVendorExtensionDesc;
-	uint16_t				mFunctionalCode;
-	UInt16List*				mOperations;
-	UInt16List*				mEvents;
-	MtpDevicePropertyList*	mDeviceProperties;
-	MtpObjectFormatList*	mCaptureFormats;
-	MtpObjectFormatList*	mPlaybackFormats;
-	char*					mManufacturer;
-	char*					mModel;
-	char*					mVersion;
-	char*					mSerial;
-
-public:
-							MtpDeviceInfo();
-	virtual					~MtpDeviceInfo();
-
-	void					read(MtpDataPacket& packet);
-
-	void					print();
-};
-
-
-#endif // _MTP_DEVICE_INFO_H
diff --git a/mtp/legacy/MtpEventPacket.cpp b/mtp/legacy/MtpEventPacket.cpp
deleted file mode 100644
index 1119f7d..0000000
--- a/mtp/legacy/MtpEventPacket.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-
-#ifdef MTP_DEVICE
-#include <linux/usb/f_mtp.h>
-#endif
-
-#include "MtpEventPacket.h"
-
-#include <usbhost/usbhost.h>
-
-
-MtpEventPacket::MtpEventPacket()
-	:	MtpPacket(512)
-{
-}
-
-MtpEventPacket::~MtpEventPacket() {
-}
-
-#ifdef MTP_DEVICE
-int MtpEventPacket::write(int fd) {
-	struct mtp_event	event;
-
-	putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
-	putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_EVENT);
-
-	event.data = mBuffer;
-	event.length = mPacketSize;
-	int ret = ::ioctl(fd, MTP_SEND_EVENT, (unsigned long)&event);
-	return (ret < 0 ? ret : 0);
-}
-#endif
-
-#ifdef MTP_HOST
-int MtpEventPacket::read(struct usb_request *request) {
-	request->buffer = mBuffer;
-	request->buffer_length = mBufferSize;
-	int ret = transfer(request);
-	 if (ret >= 0)
-		mPacketSize = ret;
-	else
-		mPacketSize = 0;
-	return ret;
-}
-#endif
-
-
diff --git a/mtp/legacy/MtpEventPacket.h b/mtp/legacy/MtpEventPacket.h
deleted file mode 100644
index 6439856..0000000
--- a/mtp/legacy/MtpEventPacket.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_EVENT_PACKET_H
-#define _MTP_EVENT_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-class MtpEventPacket : public MtpPacket {
-
-public:
-						MtpEventPacket();
-	virtual				~MtpEventPacket();
-
-#ifdef MTP_DEVICE
-	// write our data to the given file descriptor
-	int					write(int fd);
-#endif
-
-#ifdef MTP_HOST
-	// read our buffer with the given request
-	int					read(struct usb_request *request);
-#endif
-
-	inline MtpEventCode		getEventCode() const { return getContainerCode(); }
-	inline void				setEventCode(MtpEventCode code)
-													 { return setContainerCode(code); }
-};
-
-#endif // _MTP_EVENT_PACKET_H
diff --git a/mtp/legacy/MtpMessage.hpp b/mtp/legacy/MtpMessage.hpp
deleted file mode 100644
index 31465d8..0000000
--- a/mtp/legacy/MtpMessage.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTPMESSAGE_HPP
-#define _MTPMESSAGE_HPP
-
-#define MTP_MESSAGE_ADD_STORAGE    1
-#define MTP_MESSAGE_REMOVE_STORAGE 2
-
-struct mtpmsg {
-	int message_type; // 1 is add, 2 is remove, see above
-	unsigned int storage_id;
-	char display[1024];
-	char path[1024];
-	uint64_t maxFileSize;
-};
-
-#endif //_MTPMESSAGE_HPP
diff --git a/mtp/legacy/MtpObjectInfo.cpp b/mtp/legacy/MtpObjectInfo.cpp
deleted file mode 100644
index 50192d7..0000000
--- a/mtp/legacy/MtpObjectInfo.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include "MtpDebug.h"
-#include "MtpDataPacket.h"
-#include "MtpObjectInfo.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-
-MtpObjectInfo::MtpObjectInfo(MtpObjectHandle handle)
-	:   mHandle(handle),
-		mStorageID(0),
-		mFormat(0),
-		mProtectionStatus(0),
-		mCompressedSize(0),
-		mThumbFormat(0),
-		mThumbCompressedSize(0),
-		mThumbPixWidth(0),
-		mThumbPixHeight(0),
-		mImagePixWidth(0),
-		mImagePixHeight(0),
-		mImagePixDepth(0),
-		mParent(0),
-		mAssociationType(0),
-		mAssociationDesc(0),
-		mSequenceNumber(0),
-		mName(NULL),
-		mDateCreated(0),
-		mDateModified(0),
-		mKeywords(NULL)
-{
-}
-
-MtpObjectInfo::~MtpObjectInfo() {
-	if (mName)
-		free(mName);
-	if (mKeywords)
-		free(mKeywords);
-}
-
-void MtpObjectInfo::read(MtpDataPacket& packet) {
-	MtpStringBuffer string;
-	time_t time;
-
-	mStorageID = packet.getUInt32();
-	mFormat = packet.getUInt16();
-	mProtectionStatus = packet.getUInt16();
-	mCompressedSize = packet.getUInt32();
-	mThumbFormat = packet.getUInt16();
-	mThumbCompressedSize = packet.getUInt32();
-	mThumbPixWidth = packet.getUInt32();
-	mThumbPixHeight = packet.getUInt32();
-	mImagePixWidth = packet.getUInt32();
-	mImagePixHeight = packet.getUInt32();
-	mImagePixDepth = packet.getUInt32();
-	mParent = packet.getUInt32();
-	mAssociationType = packet.getUInt16();
-	mAssociationDesc = packet.getUInt32();
-	mSequenceNumber = packet.getUInt32();
-
-	packet.getString(string);
-	mName = strdup((const char *)string);
-
-	packet.getString(string);
-	if (parseDateTime((const char*)string, time))
-		mDateCreated = time;
-
-	packet.getString(string);
-	if (parseDateTime((const char*)string, time))
-		mDateModified = time;
-
-	packet.getString(string);
-	mKeywords = strdup((const char *)string);
-}
-
-void MtpObjectInfo::print() {
-	MTPI("MtpObject Info %08X: %s\n", mHandle, mName);
-	MTPI("  mStorageID: %08X mFormat: %04X mProtectionStatus: %d\n",
-			mStorageID, mFormat, mProtectionStatus);
-	MTPI("  mCompressedSize: %d mThumbFormat: %04X mThumbCompressedSize: %d\n",
-			mCompressedSize, mFormat, mThumbCompressedSize);
-	MTPI("  mThumbPixWidth: %d mThumbPixHeight: %d\n", mThumbPixWidth, mThumbPixHeight);
-	MTPI("  mImagePixWidth: %d mImagePixHeight: %d mImagePixDepth: %d\n",
-			mImagePixWidth, mImagePixHeight, mImagePixDepth);
-	MTPI("  mParent: %08X mAssociationType: %04X mAssociationDesc: %04X\n",
-			mParent, mAssociationType, mAssociationDesc);
-	MTPI("  mSequenceNumber: %d mDateCreated: %ld mDateModified: %ld mKeywords: %s\n",
-			mSequenceNumber, mDateCreated, mDateModified, mKeywords);
-}
-
diff --git a/mtp/legacy/MtpObjectInfo.h b/mtp/legacy/MtpObjectInfo.h
deleted file mode 100644
index 9b023bc..0000000
--- a/mtp/legacy/MtpObjectInfo.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_OBJECT_INFO_H
-#define _MTP_OBJECT_INFO_H
-
-#include "MtpTypes.h"
-
-
-class MtpDataPacket;
-
-class MtpObjectInfo {
-public:
-	MtpObjectHandle		mHandle;
-	MtpStorageID		mStorageID;
-	MtpObjectFormat		mFormat;
-	uint16_t			mProtectionStatus;
-	uint32_t			mCompressedSize;
-	MtpObjectFormat		mThumbFormat;
-	uint32_t			mThumbCompressedSize;
-	uint32_t			mThumbPixWidth;
-	uint32_t			mThumbPixHeight;
-	uint32_t			mImagePixWidth;
-	uint32_t			mImagePixHeight;
-	uint32_t			mImagePixDepth;
-	MtpObjectHandle		mParent;
-	uint16_t			mAssociationType;
-	uint32_t			mAssociationDesc;
-	uint32_t			mSequenceNumber;
-	char*				mName;
-	time_t				mDateCreated;
-	time_t				mDateModified;
-	char*				mKeywords;
-
-public:
-						MtpObjectInfo(MtpObjectHandle handle);
-	virtual				~MtpObjectInfo();
-
-	void				read(MtpDataPacket& packet);
-
-	void				print();
-};
-
-
-#endif // _MTP_OBJECT_INFO_H
diff --git a/mtp/legacy/MtpPacket.cpp b/mtp/legacy/MtpPacket.cpp
deleted file mode 100644
index 2f9e438..0000000
--- a/mtp/legacy/MtpPacket.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include "MtpDebug.h"
-#include "MtpPacket.h"
-#include "mtp.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <usbhost/usbhost.h>
-
-
-MtpPacket::MtpPacket(int bufferSize)
-	:   mBuffer(NULL),
-		mBufferSize(bufferSize),
-		mAllocationIncrement(bufferSize),
-		mPacketSize(0)
-{
-	mBuffer = (uint8_t *)malloc(bufferSize);
-	if (!mBuffer) {
-		MTPE("out of memory!");
-		abort();
-	}
-}
-
-MtpPacket::~MtpPacket() {
-	if (mBuffer)
-		free(mBuffer);
-}
-
-void MtpPacket::reset() {
-	allocate(MTP_CONTAINER_HEADER_SIZE);
-	mPacketSize = MTP_CONTAINER_HEADER_SIZE;
-	memset(mBuffer, 0, mBufferSize);
-}
-
-void MtpPacket::allocate(int length) {
-	if (length > mBufferSize) {
-		int newLength = length + mAllocationIncrement;
-		mBuffer = (uint8_t *)realloc(mBuffer, newLength);
-		if (!mBuffer) {
-			MTPE("out of memory!");
-			abort();
-		}
-		mBufferSize = newLength;
-	}
-}
-
-void MtpPacket::dump() {
-#define DUMP_BYTES_PER_ROW  16
-	char buffer[500];
-	char* bufptr = buffer;
-
-	for (size_t i = 0; i < mPacketSize; i++) {
-		sprintf(bufptr, "%02X ", mBuffer[i]);
-		bufptr += strlen(bufptr);
-		if (i % DUMP_BYTES_PER_ROW == (DUMP_BYTES_PER_ROW - 1)) {
-			MTPD("%s", buffer);
-			bufptr = buffer;
-		}
-	}
-	if (bufptr != buffer) {
-		// print last line
-		MTPD("%s", buffer);
-	}
-	MTPD("\n");
-}
-
-void MtpPacket::copyFrom(const MtpPacket& src) {
-	int length = src.mPacketSize;
-	allocate(length);
-	mPacketSize = length;
-	memcpy(mBuffer, src.mBuffer, length);
-}
-
-uint16_t MtpPacket::getUInt16(int offset) const {
-	return ((uint16_t)mBuffer[offset + 1] << 8) | (uint16_t)mBuffer[offset];
-}
-
-uint32_t MtpPacket::getUInt32(int offset) const {
-	return ((uint32_t)mBuffer[offset + 3] << 24) | ((uint32_t)mBuffer[offset + 2] << 16) |
-		   ((uint32_t)mBuffer[offset + 1] << 8)  | (uint32_t)mBuffer[offset];
-}
-
-void MtpPacket::putUInt16(int offset, uint16_t value) {
-	mBuffer[offset++] = (uint8_t)(value & 0xFF);
-	mBuffer[offset++] = (uint8_t)((value >> 8) & 0xFF);
-}
-
-void MtpPacket::putUInt32(int offset, uint32_t value) {
-	mBuffer[offset++] = (uint8_t)(value & 0xFF);
-	mBuffer[offset++] = (uint8_t)((value >> 8) & 0xFF);
-	mBuffer[offset++] = (uint8_t)((value >> 16) & 0xFF);
-	mBuffer[offset++] = (uint8_t)((value >> 24) & 0xFF);
-}
-
-uint16_t MtpPacket::getContainerCode() const {
-	return getUInt16(MTP_CONTAINER_CODE_OFFSET);
-}
-
-void MtpPacket::setContainerCode(uint16_t code) {
-	putUInt16(MTP_CONTAINER_CODE_OFFSET, code);
-}
-
-uint16_t MtpPacket::getContainerType() const {
-	return getUInt16(MTP_CONTAINER_TYPE_OFFSET);
-}
-
-MtpTransactionID MtpPacket::getTransactionID() const {
-	return getUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET);
-}
-
-void MtpPacket::setTransactionID(MtpTransactionID id) {
-	putUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET, id);
-}
-
-uint32_t MtpPacket::getParameter(int index) const {
-	if (index < 1 || index > 5) {
-		MTPE("index %d out of range in MtpPacket::getParameter", index);
-		return 0;
-	}
-	return getUInt32(MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t));
-}
-
-void MtpPacket::setParameter(int index, uint32_t value) {
-	if (index < 1 || index > 5) {
-		MTPE("index %d out of range in MtpPacket::setParameter", index);
-		return;
-	}
-	int offset = MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t);
-	if (mPacketSize < offset + sizeof(uint32_t))
-		mPacketSize = offset + sizeof(uint32_t);
-	putUInt32(offset, value);
-}
-
-#ifdef MTP_HOST
-int MtpPacket::transfer(struct usb_request* request) {
-	int result = usb_device_bulk_transfer(request->dev,
-							request->endpoint,
-							request->buffer,
-							request->buffer_length,
-							0);
-	request->actual_length = result;
-	return result;
-}
-#endif
-
diff --git a/mtp/legacy/MtpPacket.h b/mtp/legacy/MtpPacket.h
deleted file mode 100644
index be3db30..0000000
--- a/mtp/legacy/MtpPacket.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_PACKET_H
-#define _MTP_PACKET_H
-
-#include "MtpTypes.h"
-
-struct usb_request;
-
-
-class MtpPacket {
-
-protected:
-	uint8_t*			mBuffer;
-	// current size of the buffer
-	int					mBufferSize;
-	// number of bytes to add when resizing the buffer
-	int					mAllocationIncrement;
-	// size of the data in the packet
-	unsigned			mPacketSize;
-
-public:
-						MtpPacket(int bufferSize);
-	virtual				~MtpPacket();
-
-	// sets packet size to the default container size and sets buffer to zero
-	virtual void		reset();
-
-	void				allocate(int length);
-	void				dump();
-	void				copyFrom(const MtpPacket& src);
-
-	uint16_t			getContainerCode() const;
-	void				setContainerCode(uint16_t code);
-
-	uint16_t			getContainerType() const;
-
-	MtpTransactionID	getTransactionID() const;
-	void				setTransactionID(MtpTransactionID id);
-
-	uint32_t			getParameter(int index) const;
-	void				setParameter(int index, uint32_t value);
-
-#ifdef MTP_HOST
-	int					transfer(struct usb_request* request);
-#endif
-
-protected:
-	uint16_t			getUInt16(int offset) const;
-	uint32_t			getUInt32(int offset) const;
-	void				putUInt16(int offset, uint16_t value);
-	void				putUInt32(int offset, uint32_t value);
-};
-
-
-#endif // _MTP_PACKET_H
diff --git a/mtp/legacy/MtpProperty.cpp b/mtp/legacy/MtpProperty.cpp
deleted file mode 100644
index e105f24..0000000
--- a/mtp/legacy/MtpProperty.cpp
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include "MtpDataPacket.h"
-#include "MtpDebug.h"
-#include "MtpProperty.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-
-MtpProperty::MtpProperty()
-	:	mCode(0),
-		mType(0),
-		mWriteable(false),
-		mDefaultArrayLength(0),
-		mDefaultArrayValues(NULL),
-		mCurrentArrayLength(0),
-		mCurrentArrayValues(NULL),
-		mGroupCode(0),
-		mFormFlag(kFormNone),
-		mEnumLength(0),
-		mEnumValues(NULL)
-{
-	memset(&mDefaultValue, 0, sizeof(mDefaultValue));
-	memset(&mCurrentValue, 0, sizeof(mCurrentValue));
-	memset(&mMinimumValue, 0, sizeof(mMinimumValue));
-	memset(&mMaximumValue, 0, sizeof(mMaximumValue));
-}
-
-MtpProperty::MtpProperty(MtpPropertyCode propCode,
-						 MtpDataType type,
-						 bool writeable,
-						 int defaultValue)
-	:   mCode(propCode),
-		mType(type),
-		mWriteable(writeable),
-		mDefaultArrayLength(0),
-		mDefaultArrayValues(NULL),
-		mCurrentArrayLength(0),
-		mCurrentArrayValues(NULL),
-		mGroupCode(0),
-		mFormFlag(kFormNone),
-		mEnumLength(0),
-		mEnumValues(NULL)
-{
-	memset(&mDefaultValue, 0, sizeof(mDefaultValue));
-	memset(&mCurrentValue, 0, sizeof(mCurrentValue));
-	memset(&mMinimumValue, 0, sizeof(mMinimumValue));
-	memset(&mMaximumValue, 0, sizeof(mMaximumValue));
-
-	if (defaultValue) {
-		switch (type) {
-			case MTP_TYPE_INT8:
-				mDefaultValue.u.i8 = defaultValue;
-				break;
-			case MTP_TYPE_UINT8:
-				mDefaultValue.u.u8 = defaultValue;
-				break;
-			case MTP_TYPE_INT16:
-				mDefaultValue.u.i16 = defaultValue;
-				break;
-			case MTP_TYPE_UINT16:
-				mDefaultValue.u.u16 = defaultValue;
-				break;
-			case MTP_TYPE_INT32:
-				mDefaultValue.u.i32 = defaultValue;
-				break;
-			case MTP_TYPE_UINT32:
-				mDefaultValue.u.u32 = defaultValue;
-				break;
-			case MTP_TYPE_INT64:
-				mDefaultValue.u.i64 = defaultValue;
-				break;
-			case MTP_TYPE_UINT64:
-				mDefaultValue.u.u64 = defaultValue;
-				break;
-			default:
-				MTPE("unknown type %04X in MtpProperty::MtpProperty", type);
-		}
-	}
-}
-
-MtpProperty::~MtpProperty() {
-	if (mType == MTP_TYPE_STR) {
-		// free all strings
-		free(mDefaultValue.str);
-		free(mCurrentValue.str);
-		free(mMinimumValue.str);
-		free(mMaximumValue.str);
-		if (mDefaultArrayValues) {
-			for (int i = 0; i < mDefaultArrayLength; i++)
-				free(mDefaultArrayValues[i].str);
-		}
-		if (mCurrentArrayValues) {
-			for (int i = 0; i < mCurrentArrayLength; i++)
-				free(mCurrentArrayValues[i].str);
-		}
-		if (mEnumValues) {
-			for (int i = 0; i < mEnumLength; i++)
-				free(mEnumValues[i].str);
-		}
-	}
-	delete[] mDefaultArrayValues;
-	delete[] mCurrentArrayValues;
-	delete[] mEnumValues;
-}
-
-void MtpProperty::read(MtpDataPacket& packet) {
-	mCode = packet.getUInt16();
-	bool deviceProp = isDeviceProperty();
-	mType = packet.getUInt16();
-	mWriteable = (packet.getUInt8() == 1);
-	switch (mType) {
-		case MTP_TYPE_AINT8:
-		case MTP_TYPE_AUINT8:
-		case MTP_TYPE_AINT16:
-		case MTP_TYPE_AUINT16:
-		case MTP_TYPE_AINT32:
-		case MTP_TYPE_AUINT32:
-		case MTP_TYPE_AINT64:
-		case MTP_TYPE_AUINT64:
-		case MTP_TYPE_AINT128:
-		case MTP_TYPE_AUINT128:
-			mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
-			if (deviceProp)
-				mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
-			break;
-		default:
-			readValue(packet, mDefaultValue);
-			if (deviceProp)
-				readValue(packet, mCurrentValue);
-	}
-	if (!deviceProp)
-		mGroupCode = packet.getUInt32();
-	mFormFlag = packet.getUInt8();
-
-	if (mFormFlag == kFormRange) {
-			readValue(packet, mMinimumValue);
-			readValue(packet, mMaximumValue);
-			readValue(packet, mStepSize);
-	} else if (mFormFlag == kFormEnum) {
-		mEnumLength = packet.getUInt16();
-		mEnumValues = new MtpPropertyValue[mEnumLength];
-		for (int i = 0; i < mEnumLength; i++)
-			readValue(packet, mEnumValues[i]);
-	}
-}
-
-void MtpProperty::write(MtpDataPacket& packet) {
-	bool deviceProp = isDeviceProperty();
-
-	packet.putUInt16(mCode);
-	packet.putUInt16(mType);
-	packet.putUInt8(mWriteable ? 1 : 0);
-
-	switch (mType) {
-		case MTP_TYPE_AINT8:
-		case MTP_TYPE_AUINT8:
-		case MTP_TYPE_AINT16:
-		case MTP_TYPE_AUINT16:
-		case MTP_TYPE_AINT32:
-		case MTP_TYPE_AUINT32:
-		case MTP_TYPE_AINT64:
-		case MTP_TYPE_AUINT64:
-		case MTP_TYPE_AINT128:
-		case MTP_TYPE_AUINT128:
-			writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
-			if (deviceProp)
-				writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
-			break;
-		default:
-			writeValue(packet, mDefaultValue);
-			if (deviceProp)
-				writeValue(packet, mCurrentValue);
-	}
-	packet.putUInt32(mGroupCode);
-	if (!deviceProp)
-		packet.putUInt8(mFormFlag);
-	if (mFormFlag == kFormRange) {
-			writeValue(packet, mMinimumValue);
-			writeValue(packet, mMaximumValue);
-			writeValue(packet, mStepSize);
-	} else if (mFormFlag == kFormEnum) {
-		packet.putUInt16(mEnumLength);
-		for (int i = 0; i < mEnumLength; i++)
-			writeValue(packet, mEnumValues[i]);
-	}
-}
-
-void MtpProperty::setDefaultValue(const uint16_t* string) {
-	free(mDefaultValue.str);
-	if (string) {
-		MtpStringBuffer buffer(string);
-		mDefaultValue.str = strdup(buffer);
-	}
-	else
-		mDefaultValue.str = NULL;
-}
-
-void MtpProperty::setCurrentValue(const uint16_t* string) {
-	free(mCurrentValue.str);
-	if (string) {
-		MtpStringBuffer buffer(string);
-		mCurrentValue.str = strdup(buffer);
-	}
-	else
-		mCurrentValue.str = NULL;
-}
-
-void MtpProperty::setFormRange(int min, int max, int step) {
-	mFormFlag = kFormRange;
-	switch (mType) {
-		case MTP_TYPE_INT8:
-			mMinimumValue.u.i8 = min;
-			mMaximumValue.u.i8 = max;
-			mStepSize.u.i8 = step;
-			break;
-		case MTP_TYPE_UINT8:
-			mMinimumValue.u.u8 = min;
-			mMaximumValue.u.u8 = max;
-			mStepSize.u.u8 = step;
-			break;
-		case MTP_TYPE_INT16:
-			mMinimumValue.u.i16 = min;
-			mMaximumValue.u.i16 = max;
-			mStepSize.u.i16 = step;
-			break;
-		case MTP_TYPE_UINT16:
-			mMinimumValue.u.u16 = min;
-			mMaximumValue.u.u16 = max;
-			mStepSize.u.u16 = step;
-			break;
-		case MTP_TYPE_INT32:
-			mMinimumValue.u.i32 = min;
-			mMaximumValue.u.i32 = max;
-			mStepSize.u.i32 = step;
-			break;
-		case MTP_TYPE_UINT32:
-			mMinimumValue.u.u32 = min;
-			mMaximumValue.u.u32 = max;
-			mStepSize.u.u32 = step;
-			break;
-		case MTP_TYPE_INT64:
-			mMinimumValue.u.i64 = min;
-			mMaximumValue.u.i64 = max;
-			mStepSize.u.i64 = step;
-			break;
-		case MTP_TYPE_UINT64:
-			mMinimumValue.u.u64 = min;
-			mMaximumValue.u.u64 = max;
-			mStepSize.u.u64 = step;
-			break;
-		default:
-			MTPE("unsupported type for MtpProperty::setRange");
-			break;
-	}
-}
-
-void MtpProperty::setFormEnum(const int* values, int count) {
-	 mFormFlag = kFormEnum;
-	 delete[] mEnumValues;
-	 mEnumValues = new MtpPropertyValue[count];
-	 mEnumLength = count;
-
-	for (int i = 0; i < count; i++) {
-		int value = *values++;
-			switch (mType) {
-				case MTP_TYPE_INT8:
-					mEnumValues[i].u.i8 = value;
-					break;
-				case MTP_TYPE_UINT8:
-					mEnumValues[i].u.u8 = value;
-					break;
-				case MTP_TYPE_INT16:
-					mEnumValues[i].u.i16 = value;
-					break;
-				case MTP_TYPE_UINT16:
-					mEnumValues[i].u.u16 = value;
-					break;
-				case MTP_TYPE_INT32:
-					mEnumValues[i].u.i32 = value;
-					break;
-				case MTP_TYPE_UINT32:
-					mEnumValues[i].u.u32 = value;
-					break;
-				case MTP_TYPE_INT64:
-					mEnumValues[i].u.i64 = value;
-					break;
-				case MTP_TYPE_UINT64:
-					mEnumValues[i].u.u64 = value;
-					break;
-				default:
-					MTPE("unsupported type for MtpProperty::setEnum");
-					break;
-		}
-	}
-}
-
-void MtpProperty::setFormDateTime() {
-	 mFormFlag = kFormDateTime;
-}
-
-void MtpProperty::print() {
-	MtpString buffer;
-	bool deviceProp = isDeviceProperty();
-	if (deviceProp)
-		MTPI("	%s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
-	else
-		MTPI("	%s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
-	MTPI("	type %04X", mType);
-	MTPI("	writeable %s", (mWriteable ? "true" : "false"));
-	buffer = "	default value: ";
-	print(mDefaultValue, buffer);
-	MTPI("%s", (const char *)buffer);
-	if (deviceProp) {
-		buffer = "	current value: ";
-		print(mCurrentValue, buffer);
-		MTPI("%s", (const char *)buffer);
-	}
-	switch (mFormFlag) {
-		case kFormNone:
-			break;
-		case kFormRange:
-			buffer = "	Range (";
-			print(mMinimumValue, buffer);
-			buffer += ", ";
-			print(mMaximumValue, buffer);
-			buffer += ", ";
-			print(mStepSize, buffer);
-			buffer += ")";
-			MTPI("%s", (const char *)buffer);
-			break;
-		case kFormEnum:
-			buffer = "	Enum { ";
-			for (int i = 0; i < mEnumLength; i++) {
-				print(mEnumValues[i], buffer);
-				buffer += " ";
-			}
-			buffer += "}";
-			MTPI("%s", (const char *)buffer);
-			break;
-		case kFormDateTime:
-			MTPI("	DateTime\n");
-			break;
-		default:
-			MTPI("	form %d\n", mFormFlag);
-			break;
-	}
-}
-
-void MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
-	switch (mType) {
-		case MTP_TYPE_INT8:
-			buffer.appendFormat("%d", value.u.i8);
-			break;
-		case MTP_TYPE_UINT8:
-			buffer.appendFormat("%d", value.u.u8);
-			break;
-		case MTP_TYPE_INT16:
-			buffer.appendFormat("%d", value.u.i16);
-			break;
-		case MTP_TYPE_UINT16:
-			buffer.appendFormat("%d", value.u.u16);
-			break;
-		case MTP_TYPE_INT32:
-			buffer.appendFormat("%d", value.u.i32);
-			break;
-		case MTP_TYPE_UINT32:
-			buffer.appendFormat("%d", value.u.u32);
-			break;
-		case MTP_TYPE_INT64:
-			buffer.appendFormat("%lld", value.u.i64);
-			break;
-		case MTP_TYPE_UINT64:
-			buffer.appendFormat("%lld", value.u.u64);
-			break;
-		case MTP_TYPE_INT128:
-			buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1],
-					value.u.i128[2], value.u.i128[3]);
-			break;
-		case MTP_TYPE_UINT128:
-			buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1],
-					value.u.u128[2], value.u.u128[3]);
-			break;
-		case MTP_TYPE_STR:
-			buffer.appendFormat("%s", value.str);
-			break;
-		default:
-			MTPE("unsupported type for MtpProperty::print\n");
-			break;
-	}
-}
-
-void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
-	MtpStringBuffer stringBuffer;
-
-	switch (mType) {
-		case MTP_TYPE_INT8:
-		case MTP_TYPE_AINT8:
-			value.u.i8 = packet.getInt8();
-			break;
-		case MTP_TYPE_UINT8:
-		case MTP_TYPE_AUINT8:
-			value.u.u8 = packet.getUInt8();
-			break;
-		case MTP_TYPE_INT16:
-		case MTP_TYPE_AINT16:
-			value.u.i16 = packet.getInt16();
-			break;
-		case MTP_TYPE_UINT16:
-		case MTP_TYPE_AUINT16:
-			value.u.u16 = packet.getUInt16();
-			break;
-		case MTP_TYPE_INT32:
-		case MTP_TYPE_AINT32:
-			value.u.i32 = packet.getInt32();
-			break;
-		case MTP_TYPE_UINT32:
-		case MTP_TYPE_AUINT32:
-			value.u.u32 = packet.getUInt32();
-			break;
-		case MTP_TYPE_INT64:
-		case MTP_TYPE_AINT64:
-			value.u.i64 = packet.getInt64();
-			break;
-		case MTP_TYPE_UINT64:
-		case MTP_TYPE_AUINT64:
-			value.u.u64 = packet.getUInt64();
-			break;
-		case MTP_TYPE_INT128:
-		case MTP_TYPE_AINT128:
-			packet.getInt128(value.u.i128);
-			break;
-		case MTP_TYPE_UINT128:
-		case MTP_TYPE_AUINT128:
-			packet.getUInt128(value.u.u128);
-			break;
-		case MTP_TYPE_STR:
-			packet.getString(stringBuffer);
-			value.str = strdup(stringBuffer);
-			break;
-		default:
-			MTPE("unknown type %04X in MtpProperty::readValue", mType);
-	}
-}
-
-void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
-	MtpStringBuffer stringBuffer;
-
-	switch (mType) {
-		case MTP_TYPE_INT8:
-		case MTP_TYPE_AINT8:
-			packet.putInt8(value.u.i8);
-			break;
-		case MTP_TYPE_UINT8:
-		case MTP_TYPE_AUINT8:
-			packet.putUInt8(value.u.u8);
-			break;
-		case MTP_TYPE_INT16:
-		case MTP_TYPE_AINT16:
-			packet.putInt16(value.u.i16);
-			break;
-		case MTP_TYPE_UINT16:
-		case MTP_TYPE_AUINT16:
-			packet.putUInt16(value.u.u16);
-			break;
-		case MTP_TYPE_INT32:
-		case MTP_TYPE_AINT32:
-			packet.putInt32(value.u.i32);
-			break;
-		case MTP_TYPE_UINT32:
-		case MTP_TYPE_AUINT32:
-			packet.putUInt32(value.u.u32);
-			break;
-		case MTP_TYPE_INT64:
-		case MTP_TYPE_AINT64:
-			packet.putInt64(value.u.i64);
-			break;
-		case MTP_TYPE_UINT64:
-		case MTP_TYPE_AUINT64:
-			packet.putUInt64(value.u.u64);
-			break;
-		case MTP_TYPE_INT128:
-		case MTP_TYPE_AINT128:
-			packet.putInt128(value.u.i128);
-			break;
-		case MTP_TYPE_UINT128:
-		case MTP_TYPE_AUINT128:
-			packet.putUInt128(value.u.u128);
-			break;
-		case MTP_TYPE_STR:
-			if (value.str)
-				packet.putString(value.str);
-			else
-				packet.putEmptyString();
-			break;
-		default:
-			MTPE("unknown type %04X in MtpProperty::writeValue", mType);
-	}
-}
-
-MtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
-	length = packet.getUInt32();
-	if (length == 0)
-		return NULL;
-	MtpPropertyValue* result = new MtpPropertyValue[length];
-	for (int i = 0; i < length; i++)
-		readValue(packet, result[i]);
-	return result;
-}
-
-void MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
-	packet.putUInt32(length);
-	for (int i = 0; i < length; i++)
-		writeValue(packet, values[i]);
-}
-
diff --git a/mtp/legacy/MtpProperty.h b/mtp/legacy/MtpProperty.h
deleted file mode 100644
index c1f3233..0000000
--- a/mtp/legacy/MtpProperty.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_PROPERTY_H
-#define _MTP_PROPERTY_H
-
-#include "MtpTypes.h"
-
-
-class MtpDataPacket;
-
-struct MtpPropertyValue {
-	union {
-		int8_t			i8;
-		uint8_t			u8;
-		int16_t			i16;
-		uint16_t		u16;
-		int32_t			i32;
-		uint32_t		u32;
-		int64_t			i64;
-		uint64_t		u64;
-		int128_t		i128;
-		uint128_t		u128;
-	} u;
-	// string in UTF8 format
-	char*				str;
-};
-
-class MtpProperty {
-public:
-	MtpPropertyCode		mCode;
-	MtpDataType			mType;
-	bool				mWriteable;
-	MtpPropertyValue	mDefaultValue;
-	MtpPropertyValue	mCurrentValue;
-
-	// for array types
-	int					mDefaultArrayLength;
-	MtpPropertyValue*	mDefaultArrayValues;
-	int					mCurrentArrayLength;
-	MtpPropertyValue*	mCurrentArrayValues;
-
-	enum {
-		kFormNone = 0,
-		kFormRange = 1,
-		kFormEnum = 2,
-		kFormDateTime = 3,
-	};
-
-	uint32_t			mGroupCode;
-	uint8_t				mFormFlag;
-
-	// for range form
-	MtpPropertyValue	mMinimumValue;
-	MtpPropertyValue	mMaximumValue;
-	MtpPropertyValue	mStepSize;
-
-	// for enum form
-	int					mEnumLength;
-	MtpPropertyValue*	mEnumValues;
-
-public:
-						MtpProperty();
-						MtpProperty(MtpPropertyCode propCode,
-									 MtpDataType type,
-									 bool writeable = false,
-									 int defaultValue = 0);
-	virtual				~MtpProperty();
-
-	inline MtpPropertyCode getPropertyCode() const { return mCode; }
-
-	void				read(MtpDataPacket& packet);
-	void				write(MtpDataPacket& packet);
-
-	void				setDefaultValue(const uint16_t* string);
-	void				setCurrentValue(const uint16_t* string);
-
-	void				setFormRange(int min, int max, int step);
-	void				setFormEnum(const int* values, int count);
-	void				setFormDateTime();
-
-	void				print();
-	void				print(MtpPropertyValue& value, MtpString& buffer);
-
-	inline bool			isDeviceProperty() const {
-							return (   ((mCode & 0xF000) == 0x5000)
-									|| ((mCode & 0xF800) == 0xD000));
-						}
-
-private:
-	void				readValue(MtpDataPacket& packet, MtpPropertyValue& value);
-	void				writeValue(MtpDataPacket& packet, MtpPropertyValue& value);
-	MtpPropertyValue*	readArrayValues(MtpDataPacket& packet, int& length);
-	void				writeArrayValues(MtpDataPacket& packet,
-											MtpPropertyValue* values, int length);
-};
-
-
-#endif // _MTP_PROPERTY_H
diff --git a/mtp/legacy/MtpRequestPacket.cpp b/mtp/legacy/MtpRequestPacket.cpp
deleted file mode 100644
index e700e3b..0000000
--- a/mtp/legacy/MtpRequestPacket.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#include "MtpRequestPacket.h"
-#include "MtpDebug.h"
-
-#include <usbhost/usbhost.h>
-
-
-MtpRequestPacket::MtpRequestPacket()
-	:	MtpPacket(512)
-{
-}
-
-MtpRequestPacket::~MtpRequestPacket() {
-}
-
-#ifdef MTP_DEVICE
-int MtpRequestPacket::read(int fd) {
-	int ret = ::read(fd, mBuffer, mBufferSize);
-	if (ret >= 0)
-		mPacketSize = ret;
-	else
-		mPacketSize = 0;
-	return ret;
-}
-#endif
-
-#ifdef MTP_HOST
-	// write our buffer to the given endpoint (host mode)
-int MtpRequestPacket::write(struct usb_request *request)
-{
-	putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
-	putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_COMMAND);
-	request->buffer = mBuffer;
-	request->buffer_length = mPacketSize;
-	return transfer(request);
-}
-#endif
-
diff --git a/mtp/legacy/MtpRequestPacket.h b/mtp/legacy/MtpRequestPacket.h
deleted file mode 100644
index dcf00d6..0000000
--- a/mtp/legacy/MtpRequestPacket.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_REQUEST_PACKET_H
-#define _MTP_REQUEST_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-struct usb_request;
-
-
-class MtpRequestPacket : public MtpPacket {
-
-public:
-						MtpRequestPacket();
-	virtual				~MtpRequestPacket();
-#ifdef MTP_DEVICE
-	// fill our buffer with data from the given file descriptor
-	int					read(int fd);
-#endif
-
-#ifdef MTP_HOST
-	// write our buffer to the given endpoint
-	int					write(struct usb_request *request);
-#endif
-
-	inline MtpOperationCode    getOperationCode() const { return getContainerCode(); }
-	inline void				   setOperationCode(MtpOperationCode code)
-													{ return setContainerCode(code); }
-};
-
-
-#endif // _MTP_REQUEST_PACKET_H
diff --git a/mtp/legacy/MtpResponsePacket.cpp b/mtp/legacy/MtpResponsePacket.cpp
deleted file mode 100644
index 8eed13a..0000000
--- a/mtp/legacy/MtpResponsePacket.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use 	 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#include "MtpResponsePacket.h"
-
-#include <usbhost/usbhost.h>
-
-
-MtpResponsePacket::MtpResponsePacket()
-	:   MtpPacket(512)
-{
-}
-
-MtpResponsePacket::~MtpResponsePacket() {
-}
-
-#ifdef MTP_DEVICE
-int MtpResponsePacket::write(int fd) {
-	putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
-	putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_RESPONSE);
-	int ret = ::write(fd, mBuffer, mPacketSize);
-	return (ret < 0 ? ret : 0);
-}
-#endif
-
-#ifdef MTP_HOST
-int MtpResponsePacket::read(struct usb_request *request) {
-	request->buffer = mBuffer;
-	request->buffer_length = mBufferSize;
-	int ret = transfer(request);
-	 if (ret >= 0)
-		mPacketSize = ret;
-	else
-		mPacketSize = 0;
-	return ret;
-}
-#endif
-
-
diff --git a/mtp/legacy/MtpResponsePacket.h b/mtp/legacy/MtpResponsePacket.h
deleted file mode 100644
index f9621aa..0000000
--- a/mtp/legacy/MtpResponsePacket.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_RESPONSE_PACKET_H
-#define _MTP_RESPONSE_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-
-class MtpResponsePacket : public MtpPacket {
-
-public:
-						MtpResponsePacket();
-	virtual				~MtpResponsePacket();
-
-#ifdef MTP_DEVICE
-	// write our data to the given file descriptor
-	int					write(int fd);
-#endif
-
-#ifdef MTP_HOST
-	// read our buffer with the given request
-	int					read(struct usb_request *request);
-#endif
-
-	inline MtpResponseCode		getResponseCode() const { return getContainerCode(); }
-	inline void					setResponseCode(MtpResponseCode code)
-													 { return setContainerCode(code); }
-};
-
-
-#endif // _MTP_RESPONSE_PACKET_H
diff --git a/mtp/legacy/MtpServer.cpp b/mtp/legacy/MtpServer.cpp
deleted file mode 100644
index c4e1cd3..0000000
--- a/mtp/legacy/MtpServer.cpp
+++ /dev/null
@@ -1,1379 +0,0 @@
-/*
- * Copyright (C) 2017 TeamWin
- * Copyright (C) 2010 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.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include "../../twcommon.h"
-#include "../../set_metadata.h"
-#include <cutils/properties.h>
-
-#include "MtpTypes.h"
-#include "MtpDebug.h"
-#include "MtpDatabase.h"
-#include "MtpObjectInfo.h"
-#include "MtpProperty.h"
-#include "MtpServer.h"
-#include "MtpStorage.h"
-#include "MtpStringBuffer.h"
-
-#include <linux/usb/f_mtp.h>
-
-static const MtpOperationCode kSupportedOperationCodes[] = {
-	MTP_OPERATION_GET_DEVICE_INFO,
-	MTP_OPERATION_OPEN_SESSION,
-	MTP_OPERATION_CLOSE_SESSION,
-	MTP_OPERATION_GET_STORAGE_IDS,
-	MTP_OPERATION_GET_STORAGE_INFO,
-	MTP_OPERATION_GET_NUM_OBJECTS,
-	MTP_OPERATION_GET_OBJECT_HANDLES,
-	MTP_OPERATION_GET_OBJECT_INFO,
-	MTP_OPERATION_GET_OBJECT,
-	MTP_OPERATION_GET_THUMB,
-	MTP_OPERATION_DELETE_OBJECT,
-	MTP_OPERATION_SEND_OBJECT_INFO,
-	MTP_OPERATION_SEND_OBJECT,
-//	MTP_OPERATION_INITIATE_CAPTURE,
-//	MTP_OPERATION_FORMAT_STORE,
-//	MTP_OPERATION_RESET_DEVICE,
-//	MTP_OPERATION_SELF_TEST,
-//	MTP_OPERATION_SET_OBJECT_PROTECTION,
-//	MTP_OPERATION_POWER_DOWN,
-	MTP_OPERATION_GET_DEVICE_PROP_DESC,
-	MTP_OPERATION_GET_DEVICE_PROP_VALUE,
-	MTP_OPERATION_SET_DEVICE_PROP_VALUE,
-	MTP_OPERATION_RESET_DEVICE_PROP_VALUE,
-//	MTP_OPERATION_TERMINATE_OPEN_CAPTURE,
-//	MTP_OPERATION_MOVE_OBJECT,
-//	MTP_OPERATION_COPY_OBJECT,
-	MTP_OPERATION_GET_PARTIAL_OBJECT,
-//	MTP_OPERATION_INITIATE_OPEN_CAPTURE,
-	MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED,
-	MTP_OPERATION_GET_OBJECT_PROP_DESC,
-	MTP_OPERATION_GET_OBJECT_PROP_VALUE,
-	MTP_OPERATION_SET_OBJECT_PROP_VALUE,
-	MTP_OPERATION_GET_OBJECT_PROP_LIST,
-//	MTP_OPERATION_SET_OBJECT_PROP_LIST,
-//	MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC,
-//	MTP_OPERATION_SEND_OBJECT_PROP_LIST,
-	MTP_OPERATION_GET_OBJECT_REFERENCES,
-	MTP_OPERATION_SET_OBJECT_REFERENCES,
-//	MTP_OPERATION_SKIP,
-	// Android extension for direct file IO
-	MTP_OPERATION_GET_PARTIAL_OBJECT_64,
-	MTP_OPERATION_SEND_PARTIAL_OBJECT,
-	MTP_OPERATION_TRUNCATE_OBJECT,
-	MTP_OPERATION_BEGIN_EDIT_OBJECT,
-	MTP_OPERATION_END_EDIT_OBJECT,
-};
-
-static const MtpEventCode kSupportedEventCodes[] = {
-	MTP_EVENT_OBJECT_ADDED,
-	MTP_EVENT_OBJECT_REMOVED,
-	MTP_EVENT_STORE_ADDED,
-	MTP_EVENT_STORE_REMOVED,
-	MTP_EVENT_OBJECT_PROP_CHANGED,
-};
-
-MtpServer::MtpServer(MtpDatabase* database, bool ptp,
-					int fileGroup, int filePerm, int directoryPerm)
-	:	mDatabase(database),
-		mPtp(ptp),
-		mFileGroup(fileGroup),
-		mFilePermission(filePerm),
-		mDirectoryPermission(directoryPerm),
-		mSessionID(0),
-		mSessionOpen(false),
-		mSendObjectHandle(kInvalidObjectHandle),
-		mSendObjectFormat(0),
-		mSendObjectFileSize(0)
-{
-	mFD = -1;
-}
-
-MtpServer::~MtpServer() {
-}
-
-void MtpServer::addStorage(MtpStorage* storage) {
-	android::Mutex::Autolock autoLock(mMutex);
-	MTPD("addStorage(): storage: %x\n", storage);
-	if (getStorage(storage->getStorageID()) != NULL) {
-		MTPE("MtpServer::addStorage Storage for storage ID %i already exists.\n", storage->getStorageID());
-		return;
-	}
-	mDatabase->createDB(storage, storage->getStorageID());
-	mStorages.push(storage);
-	sendStoreAdded(storage->getStorageID());
-}
-
-void MtpServer::removeStorage(MtpStorage* storage) {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	for (size_t i = 0; i < mStorages.size(); i++) {
-		if (mStorages[i] == storage) {
-			MTPD("MtpServer::removeStorage calling sendStoreRemoved\n");
-			// First lock the mutex so that the inotify thread and main
-			// thread do not do anything while we remove the storage
-			// item, and to make sure we don't remove the item while an
-			// operation is in progress
-			mDatabase->lockMutex();
-			// Grab the storage ID before we delete the item from the
-			// database
-			MtpStorageID storageID = storage->getStorageID();
-			// Remove the item from the mStorages from the vector. At
-			// this point the main thread will no longer be able to find
-			// this storage item anymore.
-			mStorages.removeAt(i);
-			// Destroy the storage item, free up all the memory, kill
-			// the inotify thread.
-			mDatabase->destroyDB(storageID);
-			// Tell the host OS that the storage item is gone.
-			sendStoreRemoved(storageID);
-			// Unlock any remaining mutexes on other storage devices.
-			// If no storage devices exist anymore this will do nothing.
-			mDatabase->unlockMutex();
-			break;
-		}
-	}
-	MTPD("MtpServer::removeStorage DONE\n");
-}
-
-MtpStorage* MtpServer::getStorage(MtpStorageID id) {
-	MTPD("getStorage\n");
-	if (id == 0) {
-		MTPD("mStorages\n");
-		return mStorages[0];
-	}
-	for (size_t i = 0; i < mStorages.size(); i++) {
-		MtpStorage* storage = mStorages[i];
-		MTPD("id: %d\n", id);
-		MTPD("storage: %d\n", storage->getStorageID());
-		if (storage->getStorageID() == id) {
-			return storage;
-		}
-	}
-	return NULL;
-}
-
-bool MtpServer::hasStorage(MtpStorageID id) {
-	MTPD("in hasStorage\n");
-	if (id == 0 || id == 0xFFFFFFFF)
-		return mStorages.size() > 0;
-	return (getStorage(id) != NULL);
-}
-
-void MtpServer::run(int fd) {
-	if (fd < 0)
-		return;
-
-	mFD = fd;
-	MTPI("MtpServer::run fd: %d\n", fd);
-
-	while (1) {
-		MTPD("About to read device...\n");
-		int ret = mRequest.read(fd);
-		if (ret < 0) {
-			if (errno == ECANCELED) {
-				// return to top of loop and wait for next command
-				MTPD("request read returned %d ECANCELED, starting over\n", ret);
-				continue;
-			}
-			MTPE("request read returned %d, errno: %d, exiting MtpServer::run loop\n", ret, errno);
-			break;
-		}
-		MtpOperationCode operation = mRequest.getOperationCode();
-		MtpTransactionID transaction = mRequest.getTransactionID();
-
-		MTPD("operation: %s", MtpDebug::getOperationCodeName(operation));
-		mRequest.dump();
-
-		// FIXME need to generalize this
-		bool dataIn = (operation == MTP_OPERATION_SEND_OBJECT_INFO
-					|| operation == MTP_OPERATION_SET_OBJECT_REFERENCES
-					|| operation == MTP_OPERATION_SET_OBJECT_PROP_VALUE
-					|| operation == MTP_OPERATION_SET_DEVICE_PROP_VALUE);
-		if (dataIn) {
-			int ret = mData.read(fd);
-			if (ret < 0) {
-				if (errno == ECANCELED) {
-					// return to top of loop and wait for next command
-					MTPD("data read returned %d ECANCELED, starting over\n", ret);
-					continue;
-				}
-				MTPD("data read returned %d, errno: %d, exiting MtpServer::run loop\n", ret, errno);
-				break;
-			}
-			MTPD("received data:");
-			mData.dump();
-		} else {
-			mData.reset();
-		}
-
-		if (handleRequest()) {
-			if (!dataIn && mData.hasData()) {
-				mData.setOperationCode(operation);
-				mData.setTransactionID(transaction);
-				MTPD("sending data:");
-				mData.dump();
-				ret = mData.write(fd);
-				if (ret < 0) {
-					if (errno == ECANCELED) {
-						// return to top of loop and wait for next command
-						MTPD("data write returned %d ECANCELED, starting over\n", ret);
-						continue;
-					}
-					MTPE("data write returned %d, errno: %d, exiting MtpServer::run loop\n", ret, errno);
-					break;
-				}
-			}
-
-			mResponse.setTransactionID(transaction);
-			MTPD("sending response %04X\n", mResponse.getResponseCode());
-			ret = mResponse.write(fd);
-			MTPD("ret: %d\n", ret);
-			mResponse.dump();
-			if (ret < 0) {
-				if (errno == ECANCELED) {
-					// return to top of loop and wait for next command
-					MTPD("response write returned %d ECANCELED, starting over\n", ret);
-					continue;
-				}
-				MTPE("response write returned %d, errno: %d, exiting MtpServer::run loop\n", ret, errno);
-				break;
-			}
-		} else {
-			MTPD("skipping response\n");
-		}
-	}
-
-	// commit any open edits
-	int count = mObjectEditList.size();
-	for (int i = 0; i < count; i++) {
-		ObjectEdit* edit = mObjectEditList[i];
-		commitEdit(edit);
-		delete edit;
-	}
-	mObjectEditList.clear();
-
-	if (mSessionOpen)
-		mDatabase->sessionEnded(); // This doesn't actually do anything but was carry over from AOSP
-	close(fd);
-	mFD = -1;
-}
-
-void MtpServer::sendObjectAdded(MtpObjectHandle handle) {
-	MTPD("sendObjectAdded %d\n", handle);
-	sendEvent(MTP_EVENT_OBJECT_ADDED, handle);
-}
-
-void MtpServer::sendObjectRemoved(MtpObjectHandle handle) {
-	MTPD("sendObjectRemoved %d\n", handle);
-	sendEvent(MTP_EVENT_OBJECT_REMOVED, handle);
-}
-
-void MtpServer::sendObjectUpdated(MtpObjectHandle handle) {
-	MTPD("sendObjectUpdated %d\n", handle);
-	sendEvent(MTP_EVENT_OBJECT_PROP_CHANGED, handle);
-}
-
-void MtpServer::sendStoreAdded(MtpStorageID id) {
-	MTPD("sendStoreAdded %08X\n", id);
-	sendEvent(MTP_EVENT_STORE_ADDED, id);
-}
-
-void MtpServer::sendStoreRemoved(MtpStorageID id) {
-	MTPD("sendStoreRemoved %08X\n", id);
-	sendEvent(MTP_EVENT_STORE_REMOVED, id);
-	MTPD("MtpServer::sendStoreRemoved done\n");
-}
-
-void MtpServer::sendEvent(MtpEventCode code, uint32_t param1) {
-	MTPD("MtpServer::sendEvent sending event code: %x\n", code);
-	if (mSessionOpen) {
-		mEvent.setEventCode(code);
-		mEvent.setTransactionID(mRequest.getTransactionID());
-		mEvent.setParameter(1, param1);
-		int ret = mEvent.write(mFD);
-		MTPD("mEvent.write returned %d\n", ret);
-	}
-}
-
-void MtpServer::addEditObject(MtpObjectHandle handle, MtpString& path,
-		uint64_t size, MtpObjectFormat format, int fd) {
-	ObjectEdit*  edit = new ObjectEdit(handle, path, size, format, fd);
-	mObjectEditList.add(edit);
-}
-
-MtpServer::ObjectEdit* MtpServer::getEditObject(MtpObjectHandle handle) {
-	int count = mObjectEditList.size();
-	for (int i = 0; i < count; i++) {
-		ObjectEdit* edit = mObjectEditList[i];
-		if (edit->mHandle == handle) return edit;
-	}
-	return NULL;
-}
-
-void MtpServer::removeEditObject(MtpObjectHandle handle) {
-	int count = mObjectEditList.size();
-	for (int i = 0; i < count; i++) {
-		ObjectEdit* edit = mObjectEditList[i];
-		if (edit->mHandle == handle) {
-			delete edit;
-			mObjectEditList.removeAt(i);
-			return;
-		}
-	}
-	MTPE("ObjectEdit not found in removeEditObject");
-}
-
-void MtpServer::commitEdit(ObjectEdit* edit) {
-	mDatabase->endSendObject((const char *)edit->mPath, edit->mHandle, edit->mFormat, true);
-}
-
-
-bool MtpServer::handleRequest() {
-	android::Mutex::Autolock autoLock(mMutex);
-
-	MtpOperationCode operation = mRequest.getOperationCode();
-	MtpResponseCode response;
-
-	mResponse.reset();
-
-	if (mSendObjectHandle != kInvalidObjectHandle && operation != MTP_OPERATION_SEND_OBJECT) {
-		// FIXME - need to delete mSendObjectHandle from the database
-		MTPE("expected SendObject after SendObjectInfo");
-		mSendObjectHandle = kInvalidObjectHandle;
-	}
-
-	switch (operation) {
-		case MTP_OPERATION_GET_DEVICE_INFO:
-				MTPD("doGetDeviceInfo()\n");
-				response = doGetDeviceInfo();
-				break;
-			case MTP_OPERATION_OPEN_SESSION:
-				MTPD("doOpenSesion()\n");
-				response = doOpenSession();
-				break;
-			case MTP_OPERATION_CLOSE_SESSION:
-				MTPD("doCloseSession()\n");
-				response = doCloseSession();
-				break;
-			case MTP_OPERATION_GET_STORAGE_IDS:
-				MTPD("doGetStorageIDs()\n");
-				response = doGetStorageIDs();
-				break;
-			 case MTP_OPERATION_GET_STORAGE_INFO:
-				MTPD("about to call doGetStorageInfo()\n");
-				response = doGetStorageInfo();
-				break;
-			case MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED:
-				MTPD("about to call doGetObjectPropsSupported()\n");
-				response = doGetObjectPropsSupported();
-				break;
-			case MTP_OPERATION_GET_OBJECT_HANDLES:
-				MTPD("about to call doGetObjectHandles()\n");
-				response = doGetObjectHandles();
-				break;
-			case MTP_OPERATION_GET_NUM_OBJECTS:
-				MTPD("about to call doGetNumbObjects()\n");
-				response = doGetNumObjects();
-				break;
-			case MTP_OPERATION_GET_OBJECT_REFERENCES:
-				MTPD("about to call doGetObjectReferences()\n");
-				response = doGetObjectReferences();
-				break;
-			case MTP_OPERATION_SET_OBJECT_REFERENCES:
-				MTPD("about to call doSetObjectReferences()\n");
-				response = doSetObjectReferences();
-				break;
-			case MTP_OPERATION_GET_OBJECT_PROP_VALUE:
-				MTPD("about to call doGetObjectPropValue()\n");
-				response = doGetObjectPropValue();
-				break;
-			case MTP_OPERATION_SET_OBJECT_PROP_VALUE:
-				MTPD("about to call doSetObjectPropValue()\n");
-				response = doSetObjectPropValue();
-				break;
-			case MTP_OPERATION_GET_DEVICE_PROP_VALUE:
-				MTPD("about to call doGetDevicPropValue()\n");
-				response = doGetDevicePropValue();
-				break;
-			case MTP_OPERATION_SET_DEVICE_PROP_VALUE:
-				MTPD("about to call doSetDevicePropVaue()\n");
-				response = doSetDevicePropValue();
-				break;
-			case MTP_OPERATION_RESET_DEVICE_PROP_VALUE:
-				MTPD("about to call doResetDevicePropValue()\n");
-				response = doResetDevicePropValue();
-				break;
-			case MTP_OPERATION_GET_OBJECT_PROP_LIST:
-				MTPD("calling doGetObjectPropList()\n");
-				response = doGetObjectPropList();
-				break;
-			case MTP_OPERATION_GET_OBJECT_INFO:
-				MTPD("calling doGetObjectInfo()\n");
-				response = doGetObjectInfo();
-				break;
-			case MTP_OPERATION_GET_OBJECT:
-				MTPD("about to call doGetObject()\n");
-				response = doGetObject();
-				break;
-			case MTP_OPERATION_GET_THUMB:
-				response = doGetThumb();
-				break;
-			case MTP_OPERATION_GET_PARTIAL_OBJECT:
-			case MTP_OPERATION_GET_PARTIAL_OBJECT_64:
-				response = doGetPartialObject(operation);
-				break;
-			case MTP_OPERATION_SEND_OBJECT_INFO:
-				MTPD("about to call doSendObjectInfo()\n");
-				response = doSendObjectInfo();
-				break;
-			case MTP_OPERATION_SEND_OBJECT:
-				MTPD("about to call doSendObject()\n");
-				response = doSendObject();
-				break;
-			case MTP_OPERATION_DELETE_OBJECT:
-				response = doDeleteObject();
-				break;
-			case MTP_OPERATION_GET_OBJECT_PROP_DESC:
-				MTPD("about to call doGetObjectPropDesc()\n");
-				response = doGetObjectPropDesc();
-				break;
-			case MTP_OPERATION_GET_DEVICE_PROP_DESC:
-				MTPD("about to call doGetDevicePropDesc()\n");
-				response = doGetDevicePropDesc();
-				break;
-			case MTP_OPERATION_SEND_PARTIAL_OBJECT:
-				response = doSendPartialObject();
-				break;
-			case MTP_OPERATION_TRUNCATE_OBJECT:
-				response = doTruncateObject();
-				break;
-			case MTP_OPERATION_BEGIN_EDIT_OBJECT:
-				response = doBeginEditObject();
-				break;
-			case MTP_OPERATION_END_EDIT_OBJECT:
-				response = doEndEditObject();
-				break;
-			default:
-				MTPE("got unsupported command %s", MtpDebug::getOperationCodeName(operation));
-				response = MTP_RESPONSE_OPERATION_NOT_SUPPORTED;
-				break;
-		}
-
-		if (response == MTP_RESPONSE_TRANSACTION_CANCELLED)
-			return false;
-		mResponse.setResponseCode(response);
-		return true;
-}
-
-MtpResponseCode MtpServer::doGetDeviceInfo() {
-	MtpStringBuffer   string;
-	char prop_value[PROPERTY_VALUE_MAX];
-
-	MtpObjectFormatList* playbackFormats = mDatabase->getSupportedPlaybackFormats();
-	MtpObjectFormatList* captureFormats = mDatabase->getSupportedCaptureFormats();
-	MtpDevicePropertyList* deviceProperties = mDatabase->getSupportedDeviceProperties();
-
-	// fill in device info
-	mData.putUInt16(MTP_STANDARD_VERSION);
-	if (mPtp) {
-		MTPD("doGetDeviceInfo putting 0\n");
-		mData.putUInt32(0);
-	} else {
-		// MTP Vendor Extension ID
-		MTPD("doGetDeviceInfo putting 6\n");
-		mData.putUInt32(6);
-	}
-	mData.putUInt16(MTP_STANDARD_VERSION);
-	if (mPtp) {
-		// no extensions
-		MTPD("doGetDeviceInfo no extensions\n");
-		string.set("");
-	} else {
-		// MTP extensions
-		MTPD("doGetDeviceInfo microsoft.com: 1.0; android.com: 1.0;\n");
-		string.set("microsoft.com: 1.0; android.com: 1.0;");
-	}
-	mData.putString(string); // MTP Extensions
-	mData.putUInt16(0); //Functional Mode
-	MTPD("doGetDeviceInfo opcodes, %i\n", sizeof(kSupportedOperationCodes) / sizeof(uint16_t));
-	MTPD("doGetDeviceInfo eventcodes, %i\n", sizeof(kSupportedEventCodes) / sizeof(uint16_t));
-	mData.putAUInt16(kSupportedOperationCodes,
-			sizeof(kSupportedOperationCodes) / sizeof(uint16_t)); // Operations Supported
-	mData.putAUInt16(kSupportedEventCodes,
-			sizeof(kSupportedEventCodes) / sizeof(uint16_t)); // Events Supported
-	mData.putAUInt16(deviceProperties); // Device Properties Supported
-	mData.putAUInt16(captureFormats); // Capture Formats
-	mData.putAUInt16(playbackFormats);	// Playback Formats
-
-	property_get("ro.product.manufacturer", prop_value, "unknown manufacturer");
-	MTPD("prop: %s\n", prop_value);
-	string.set(prop_value);
-	mData.putString(string);   // Manufacturer
-
-	property_get("ro.product.model", prop_value, "MTP Device");
-	string.set(prop_value);
-	mData.putString(string);   // Model
-	string.set("1.0");
-	mData.putString(string);   // Device Version
-
-	property_get("ro.serialno", prop_value, "????????");
-	MTPD("sn: %s\n", prop_value);
-	string.set(prop_value);
-	mData.putString(string);   // Serial Number
-
-	delete playbackFormats;
-	delete captureFormats;
-	delete deviceProperties;
-
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doOpenSession() {
-	if (mSessionOpen) {
-		mResponse.setParameter(1, mSessionID);
-		return MTP_RESPONSE_SESSION_ALREADY_OPEN;
-	}
-	mSessionID = mRequest.getParameter(1);
-	mSessionOpen = true;
-
-	mDatabase->sessionStarted();
-
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doCloseSession() {
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	mSessionID = 0;
-	mSessionOpen = false;
-	mDatabase->sessionEnded();
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetStorageIDs() {
-	MTPD("doGetStorageIDs()\n");
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	int count = mStorages.size();
-	mData.putUInt32(count);
-	for (int i = 0; i < count; i++) {
-		MTPD("getting storageid %d\n", mStorages[i]->getStorageID());
-		mData.putUInt32(mStorages[i]->getStorageID());
-	}
-
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetStorageInfo() {
-	MtpStringBuffer   string;
-	MTPD("doGetStorageInfo()\n");
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	MtpStorageID id = mRequest.getParameter(1);
-	MtpStorage* storage = getStorage(id);
-	if (!storage) {
-		MTPE("invalid storage id\n");
-		return MTP_RESPONSE_INVALID_STORAGE_ID;
-	}
-
-	mData.putUInt16(storage->getType());
-	mData.putUInt16(storage->getFileSystemType());
-	mData.putUInt16(storage->getAccessCapability());
-	mData.putUInt64(storage->getMaxCapacity());
-	mData.putUInt64(storage->getFreeSpace());
-	mData.putUInt32(1024*1024*1024); // Free Space in Objects
-	string.set(storage->getDescription());
-	mData.putString(string);
-	mData.putEmptyString();   // Volume Identifier
-
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetObjectPropsSupported() {
-	MTPD("doGetObjectPropsSupported()\n");
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	MtpObjectFormat format = mRequest.getParameter(1);
-	mDatabase->lockMutex();
-	MtpObjectPropertyList* properties = mDatabase->getSupportedObjectProperties(format);
-	mData.putAUInt16(properties);
-	delete properties;
-	mDatabase->unlockMutex();
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetObjectHandles() {
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	MtpStorageID storageID = mRequest.getParameter(1);	  // 0xFFFFFFFF for all storage
-	MtpObjectFormat format = mRequest.getParameter(2);	  // 0 for all formats
-	MtpObjectHandle parent = mRequest.getParameter(3);	  // 0xFFFFFFFF for objects with no parent
-															// 0x00000000 for all objects
-
-	if (!hasStorage(storageID))
-		return MTP_RESPONSE_INVALID_STORAGE_ID;
-
-	MTPD("calling MtpDatabase->getObjectList()\n");
-	mDatabase->lockMutex();
-	MtpObjectHandleList* handles = mDatabase->getObjectList(storageID, format, parent);
-	mData.putAUInt32(handles);
-	delete handles;
-	mDatabase->unlockMutex();
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetNumObjects() {
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	MtpStorageID storageID = mRequest.getParameter(1);	  // 0xFFFFFFFF for all storage
-	MtpObjectFormat format = mRequest.getParameter(2);	  // 0 for all formats
-	MtpObjectHandle parent = mRequest.getParameter(3);	  // 0xFFFFFFFF for objects with no parent
-															// 0x00000000 for all objects
-	if (!hasStorage(storageID))
-		return MTP_RESPONSE_INVALID_STORAGE_ID;
-
-	mDatabase->lockMutex();
-	int count = mDatabase->getNumObjects(storageID, format, parent);
-	mDatabase->unlockMutex();
-	if (count >= 0) {
-		mResponse.setParameter(1, count);
-		return MTP_RESPONSE_OK;
-	} else {
-		mResponse.setParameter(1, 0);
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	}
-}
-
-MtpResponseCode MtpServer::doGetObjectReferences() {
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-
-	// FIXME - check for invalid object handle
-	mDatabase->lockMutex();
-	MtpObjectHandleList* handles = mDatabase->getObjectReferences(handle);
-	if (handles) {
-		mData.putAUInt32(handles);
-		delete handles;
-	} else {
-		MTPD("MtpServer::doGetObjectReferences putEmptyArray\n");
-		mData.putEmptyArray();
-	}
-	mDatabase->unlockMutex();
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSetObjectReferences() {
-	if (!mSessionOpen)
-		return MTP_RESPONSE_SESSION_NOT_OPEN;
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpStorageID handle = mRequest.getParameter(1);
-
-	MtpObjectHandleList* references = mData.getAUInt32();
-	mDatabase->lockMutex();
-	MtpResponseCode result = mDatabase->setObjectReferences(handle, references);
-	mDatabase->unlockMutex();
-	delete references;
-	return result;
-}
-
-MtpResponseCode MtpServer::doGetObjectPropValue() {
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	MtpObjectProperty property = mRequest.getParameter(2);
-	MTPD("GetObjectPropValue %d %s\n", handle,
-			MtpDebug::getObjectPropCodeName(property));
-
-	mDatabase->lockMutex();
-	MtpResponseCode res = mDatabase->getObjectPropertyValue(handle, property, mData);
-	mDatabase->unlockMutex();
-	return res;
-}
-
-MtpResponseCode MtpServer::doSetObjectPropValue() {
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	MtpObjectProperty property = mRequest.getParameter(2);
-	MTPD("SetObjectPropValue %d %s\n", handle,
-			MtpDebug::getObjectPropCodeName(property));
-
-	mDatabase->lockMutex();
-	MtpResponseCode res = mDatabase->setObjectPropertyValue(handle, property, mData);
-	mDatabase->unlockMutex();
-	return res;
-}
-
-MtpResponseCode MtpServer::doGetDevicePropValue() {
-	MtpDeviceProperty property = mRequest.getParameter(1);
-	MTPD("GetDevicePropValue %s\n",
-			MtpDebug::getDevicePropCodeName(property));
-
-	mDatabase->lockMutex();
-	MtpResponseCode res = mDatabase->getDevicePropertyValue(property, mData);
-	mDatabase->unlockMutex();
-	return res;
-}
-
-MtpResponseCode MtpServer::doSetDevicePropValue() {
-	MtpDeviceProperty property = mRequest.getParameter(1);
-	MTPD("SetDevicePropValue %s\n",
-			MtpDebug::getDevicePropCodeName(property));
-
-	mDatabase->lockMutex();
-	MtpResponseCode res = mDatabase->setDevicePropertyValue(property, mData);
-	mDatabase->unlockMutex();
-	return res;
-}
-
-MtpResponseCode MtpServer::doResetDevicePropValue() {
-	MtpDeviceProperty property = mRequest.getParameter(1);
-	MTPD("ResetDevicePropValue %s\n",
-			MtpDebug::getDevicePropCodeName(property));
-
-	mDatabase->lockMutex();
-	MtpResponseCode res = mDatabase->resetDeviceProperty(property);
-	mDatabase->unlockMutex();
-	return res;
-}
-
-MtpResponseCode MtpServer::doGetObjectPropList() {
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	// use uint32_t so we can support 0xFFFFFFFF
-	uint32_t format = mRequest.getParameter(2);
-	uint32_t property = mRequest.getParameter(3);
-	int groupCode = mRequest.getParameter(4);
-	int depth = mRequest.getParameter(5);
-	MTPD("GetObjectPropList %d format: %s property: %x group: %d depth: %d\n",
-			handle, MtpDebug::getFormatCodeName(format),
-			property, groupCode, depth);
-
-	mDatabase->lockMutex();
-	MtpResponseCode res = mDatabase->getObjectPropertyList(handle, format, property, groupCode, depth, mData);
-	mDatabase->unlockMutex();
-	return res;
-}
-
-MtpResponseCode MtpServer::doGetObjectInfo() {
-	MTPD("inside doGetObjectInfo()\n");
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	MtpObjectInfo info(handle);
-	MTPD("calling mtpdatabase getObjectInfo()\n");
-	mDatabase->lockMutex();
-	MtpResponseCode result = mDatabase->getObjectInfo(handle, info);
-	mDatabase->unlockMutex();
-	if (result == MTP_RESPONSE_OK) {
-		char	date[20];
-
-		mData.putUInt32(info.mStorageID);
-		mData.putUInt16(info.mFormat);
-		mData.putUInt16(info.mProtectionStatus);
-
-		// if object is being edited the database size may be out of date
-		uint32_t size = info.mCompressedSize;
-		ObjectEdit* edit = getEditObject(handle);
-		if (edit)
-			size = (edit->mSize > 0xFFFFFFFFLL ? 0xFFFFFFFF : (uint32_t)edit->mSize);
-		mData.putUInt32(size);
-
-		mData.putUInt16(info.mThumbFormat);
-		mData.putUInt32(info.mThumbCompressedSize);
-		mData.putUInt32(info.mThumbPixWidth);
-		mData.putUInt32(info.mThumbPixHeight);
-		mData.putUInt32(info.mImagePixWidth);
-		mData.putUInt32(info.mImagePixHeight);
-		mData.putUInt32(info.mImagePixDepth);
-		mData.putUInt32(info.mParent);
-		mData.putUInt16(info.mAssociationType);
-		mData.putUInt32(info.mAssociationDesc);
-		mData.putUInt32(info.mSequenceNumber);
-		MTPD("info.mName: %s\n", info.mName);
-		mData.putString(info.mName);
-		mData.putEmptyString();	// date created
-		formatDateTime(info.mDateModified, date, sizeof(date));
-		mData.putString(date);	 // date modified
-		mData.putEmptyString();   // keywords
-	}
-	return result;
-}
-
-MtpResponseCode MtpServer::doGetObject() {
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	MtpString pathBuf;
-	int64_t fileLength;
-	MtpObjectFormat format;
-	MTPD("MtpServer::doGetObject calling getObjectFilePath\n");
-	mDatabase->lockMutex();
-	int result = mDatabase->getObjectFilePath(handle, pathBuf, fileLength, format);
-	mDatabase->unlockMutex();
-	if (result != MTP_RESPONSE_OK)
-		return result;
-
-	const char* filePath = (const char *)pathBuf;
-	MTPD("filePath: %s\n", filePath);
-	mtp_file_range	mfr;
-	mfr.fd = open(filePath, O_RDONLY);
-	if (mfr.fd < 0) {
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-	mfr.offset = 0;
-	mfr.length = fileLength;
-	MTPD("mfr.length: %lld\n", mfr.length);
-	mfr.command = mRequest.getOperationCode();
-	mfr.transaction_id = mRequest.getTransactionID();
-
-	// then transfer the file
-	int ret = ioctl(mFD, MTP_SEND_FILE_WITH_HEADER, (unsigned long)&mfr);
-	MTPD("MTP_SEND_FILE_WITH_HEADER returned %d\n", ret);
-	close(mfr.fd);
-	if (ret < 0) {
-		if (errno == ECANCELED)
-			return MTP_RESPONSE_TRANSACTION_CANCELLED;
-		else
-			return MTP_RESPONSE_GENERAL_ERROR;
-	}
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetThumb() {
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	size_t thumbSize;
-	mDatabase->lockMutex();
-	void* thumb = mDatabase->getThumbnail(handle, thumbSize);
-	mDatabase->unlockMutex();
-	if (thumb) {
-		// send data
-		mData.setOperationCode(mRequest.getOperationCode());
-		mData.setTransactionID(mRequest.getTransactionID());
-		mData.writeData(mFD, thumb, thumbSize);
-		free(thumb);
-		return MTP_RESPONSE_OK;
-	} else {
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-}
-
-MtpResponseCode MtpServer::doGetPartialObject(MtpOperationCode operation) {
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	uint64_t offset;
-	uint32_t length;
-	offset = mRequest.getParameter(2);
-	if (operation == MTP_OPERATION_GET_PARTIAL_OBJECT_64) {
-		// android extension with 64 bit offset
-		uint64_t offset2 = mRequest.getParameter(3);
-		offset = offset | (offset2 << 32);
-		length = mRequest.getParameter(4);
-	} else {
-		// standard GetPartialObject
-		length = mRequest.getParameter(3);
-	}
-	MtpString pathBuf;
-	int64_t fileLength;
-	MtpObjectFormat format;
-	MTPD("MtpServer::doGetPartialObject calling getObjectFilePath\n");
-	mDatabase->lockMutex();
-	int result = mDatabase->getObjectFilePath(handle, pathBuf, fileLength, format);
-	mDatabase->unlockMutex();
-	if (result != MTP_RESPONSE_OK) {
-		return result;
-	}
-	if (offset + length > (uint64_t)fileLength)
-		length = fileLength - offset;
-
-	const char* filePath = (const char *)pathBuf;
-	mtp_file_range	mfr;
-	mfr.fd = open(filePath, O_RDONLY);
-	if (mfr.fd < 0) {
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-	mfr.offset = offset;
-	mfr.length = length;
-	mfr.command = mRequest.getOperationCode();
-	mfr.transaction_id = mRequest.getTransactionID();
-	mResponse.setParameter(1, length);
-
-	// transfer the file
-	int ret = ioctl(mFD, MTP_SEND_FILE_WITH_HEADER, (unsigned long)&mfr);
-	MTPD("MTP_SEND_FILE_WITH_HEADER returned %d\n", ret);
-	close(mfr.fd);
-	if (ret < 0) {
-		if (errno == ECANCELED)
-			return MTP_RESPONSE_TRANSACTION_CANCELLED;
-		else
-			return MTP_RESPONSE_GENERAL_ERROR;
-	}
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSendObjectInfo() {
-	MTPD("MtpServer::doSendObjectInfo starting\n");
-	MtpString path;
-	MtpStorageID storageID = mRequest.getParameter(1);
-	MtpStorage* storage = getStorage(storageID);
-	MtpObjectHandle parent = mRequest.getParameter(2);
-	if (!storage)
-		return MTP_RESPONSE_INVALID_STORAGE_ID;
-
-	// special case the root
-	if (parent == MTP_PARENT_ROOT) {
-		MTPD("MtpServer::doSendObjectInfo special case root\n");
-		path = storage->getPath();
-		parent = 0;
-	} else {
-		int64_t length;
-		MtpObjectFormat format;
-		MTPD("MtpServer::doSendObjectInfo calling getObjectFilePath\n");
-		mDatabase->lockMutex();
-		int result = mDatabase->getObjectFilePath(parent, path, length, format);
-		mDatabase->unlockMutex();
-		if (result != MTP_RESPONSE_OK) {
-			return result;
-		}
-		if (format != MTP_FORMAT_ASSOCIATION)
-			return MTP_RESPONSE_INVALID_PARENT_OBJECT;
-	}
-
-	// read only the fields we need
-	mData.getUInt32();	// storage ID
-	MtpObjectFormat format = mData.getUInt16();
-	mData.getUInt16();	// protection status
-	mSendObjectFileSize = mData.getUInt32();
-	mData.getUInt16();	// thumb format
-	mData.getUInt32();	// thumb compressed size
-	mData.getUInt32();	// thumb pix width
-	mData.getUInt32();	// thumb pix height
-	mData.getUInt32();	// image pix width
-	mData.getUInt32();	// image pix height
-	mData.getUInt32();	// image bit depth
-	mData.getUInt32();	// parent
-	uint16_t associationType = mData.getUInt16();
-	uint32_t associationDesc = mData.getUInt32();	// association desc
-	mData.getUInt32();	// sequence number
-	MtpStringBuffer name, created, modified;
-	mData.getString(name);	// file name
-	mData.getString(created);	  // date created
-	mData.getString(modified);	 // date modified
-	// keywords follow
-
-	MTPD("name: %s format: %04X\n", (const char *)name, format);
-	time_t modifiedTime;
-	if (!parseDateTime(modified, modifiedTime)) {
-		modifiedTime = 0;
-	}
-	if (path[path.size() - 1] != '/') {
-		path += "/";
-	}
-	path += (const char *)name;
-
-	// check space first
-	if (mSendObjectFileSize > storage->getFreeSpace())
-		return MTP_RESPONSE_STORAGE_FULL;
-	uint64_t maxFileSize = storage->getMaxFileSize();
-	// check storage max file size
-	MTPD("maxFileSize: %ld\n", maxFileSize); 
-	if (maxFileSize != 0) {
-		// if mSendObjectFileSize is 0xFFFFFFFF, then all we know is the file size
-		// is >= 0xFFFFFFFF
-		if (mSendObjectFileSize > maxFileSize || mSendObjectFileSize == 0xFFFFFFFF)
-			return MTP_RESPONSE_OBJECT_TOO_LARGE;
-	}
-
-	MTPD("MtpServer::doSendObjectInfo path: %s parent: %d storageID: %08X\n", (const char*)path, parent, storageID);
-	mDatabase->lockMutex();
-	MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path,
-			format, parent, storageID, mSendObjectFileSize, modifiedTime);
-	mDatabase->unlockMutex();
-	if (handle == kInvalidObjectHandle) {
-		MTPE("MtpServer::doSendObjectInfo returning MTP_RESPONSE_GENERAL_ERROR, handle == kInvalidObjectHandle\n");
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-  if (format == MTP_FORMAT_ASSOCIATION) {
-		mode_t mask = umask(0);
-		MTPD("MtpServer::doSendObjectInfo mkdir '%s'\n", (const char *)path);
-		int ret = mkdir((const char *)path, mDirectoryPermission);
-		umask(mask);
-		if (ret && ret != -EEXIST) {
-			MTPE("MtpServer::doSendObjectInfo returning MTP_RESPONSE_GENERAL_ERROR, ret && ret != -EEXIST\n");
-			return MTP_RESPONSE_GENERAL_ERROR;
-		}
-		chown((const char *)path, getuid(), mFileGroup);
-		tw_set_default_metadata((const char *)path);
-
-		// SendObject does not get sent for directories, so call endSendObject here instead
-		mDatabase->lockMutex();
-		mDatabase->endSendObject(path, handle, MTP_FORMAT_ASSOCIATION, MTP_RESPONSE_OK);
-		mDatabase->unlockMutex();
-	} else {
-		mSendObjectFilePath = path;
-		// save the handle for the SendObject call, which should follow
-		mSendObjectHandle = handle;
-		mSendObjectFormat = format;
-	}
-
-	mResponse.setParameter(1, storageID);
-	mResponse.setParameter(2, parent);
-	mResponse.setParameter(3, handle);
-	MTPD("MtpServer::doSendObjectInfo returning MTP_RESPONSE_OK\n");
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSendObject() {
-	if (!hasStorage())
-		return MTP_RESPONSE_GENERAL_ERROR;
-	MtpResponseCode result = MTP_RESPONSE_OK;
-	mode_t mask;
-	int ret = 0, initialData;
-
-	if (mSendObjectHandle == kInvalidObjectHandle) {
-		MTPE("Expected SendObjectInfo before SendObject");
-		result = MTP_RESPONSE_NO_VALID_OBJECT_INFO;
-		goto done;
-	}
-
-	// read the header, and possibly some data
-	ret = mData.read(mFD);
-	if (ret < MTP_CONTAINER_HEADER_SIZE) {
-		MTPE("MTP_RESPONSE_GENERAL_ERROR\n");
-		result = MTP_RESPONSE_GENERAL_ERROR;
-		goto done;
-	}
-	initialData = ret - MTP_CONTAINER_HEADER_SIZE;
-
-	mtp_file_range	mfr;
-	mfr.fd = open(mSendObjectFilePath, O_RDWR | O_CREAT | O_TRUNC, 0640);
-	if (mfr.fd < 0) {
-		result = MTP_RESPONSE_GENERAL_ERROR;
-		MTPE("fd error\n");
-		goto done;
-	}
-	fchown(mfr.fd, getuid(), mFileGroup);
-	// set permissions
-	mask = umask(0);
-	fchmod(mfr.fd, mFilePermission);
-	umask(mask);
-
-	if (initialData > 0)
-		ret = write(mfr.fd, mData.getData(), initialData);
-
-	if (mSendObjectFileSize - initialData > 0) {
-		mfr.offset = initialData;
-		if (mSendObjectFileSize == 0xFFFFFFFF) {
-			// tell driver to read until it receives a short packet
-			mfr.length = 0xFFFFFFFF;
-		} else {
-			mfr.length = mSendObjectFileSize - initialData;
-		}
-
-		MTPD("receiving %s\n", (const char *)mSendObjectFilePath);
-		// transfer the file
-		ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
-	}
-	close(mfr.fd);
-	tw_set_default_metadata((const char *)mSendObjectFilePath);
-
-	if (ret < 0) {
-		unlink(mSendObjectFilePath);
-		if (errno == ECANCELED)
-			result = MTP_RESPONSE_TRANSACTION_CANCELLED;
-		else {
-				MTPD("errno: %d\n", errno);
-			result = MTP_RESPONSE_GENERAL_ERROR;
-		}
-	}
-
-done:
-	// reset so we don't attempt to send the data back
-	MTPD("MTP_RECEIVE_FILE returned %d\n", ret);
-	mData.reset();
-	mDatabase->lockMutex();
-	mDatabase->endSendObject(mSendObjectFilePath, mSendObjectHandle, mSendObjectFormat,
-			result == MTP_RESPONSE_OK);
-	mDatabase->unlockMutex();
-	mSendObjectHandle = kInvalidObjectHandle;
-	MTPD("result: %d\n", result);
-	mSendObjectFormat = 0;
-	return result;
-}
-
-static void deleteRecursive(const char* path) {
-	char pathbuf[PATH_MAX];
-	size_t pathLength = strlen(path);
-	if (pathLength >= sizeof(pathbuf) - 1) {
-		MTPE("path too long: %s\n", path);
-	}
-	strcpy(pathbuf, path);
-	if (pathbuf[pathLength - 1] != '/') {
-		pathbuf[pathLength++] = '/';
-	}
-	char* fileSpot = pathbuf + pathLength;
-	int pathRemaining = sizeof(pathbuf) - pathLength - 1;
-
-	DIR* dir = opendir(path);
-	if (!dir) {
-		MTPE("opendir %s failed: %s", path, strerror(errno));
-		return;
-	}
-
-	struct dirent* entry;
-	while ((entry = readdir(dir))) {
-		const char* name = entry->d_name;
-
-		// ignore "." and ".."
-		if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) {
-			continue;
-		}
-
-		int nameLength = strlen(name);
-		if (nameLength > pathRemaining) {
-			MTPE("path %s/%s too long\n", path, name);
-			continue;
-		}
-		strcpy(fileSpot, name);
-
-		int type = entry->d_type;
-		struct stat st;
-		if (lstat(pathbuf, &st)) {
-			MTPE("Failed to lstat '%s'\n", pathbuf);
-			continue;
-		}
-		if (st.st_mode & S_IFDIR) {
-			deleteRecursive(pathbuf);
-			rmdir(pathbuf);
-		} else {
-			unlink(pathbuf);
-		}
-	}
-	closedir(dir);
-}
-
-static void deletePath(const char* path) {
-	struct stat statbuf;
-	if (stat(path, &statbuf) == 0) {
-		if (S_ISDIR(statbuf.st_mode)) {
-			deleteRecursive(path);
-			rmdir(path);
-		} else {
-			unlink(path);
-		}
-	} else {
-		MTPE("deletePath stat failed for %s: %s", path, strerror(errno));
-	}
-}
-
-MtpResponseCode MtpServer::doDeleteObject() {
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	MtpObjectFormat format = mRequest.getParameter(2);
-	// FIXME - support deleting all objects if handle is 0xFFFFFFFF
-	// FIXME - implement deleting objects by format
-
-	MtpString filePath;
-	int64_t fileLength;
-	MTPD("MtpServer::doDeleteObject calling getObjectFilePath\n");
-	mDatabase->lockMutex();
-	int result = mDatabase->getObjectFilePath(handle, filePath, fileLength, format);
-	if (result == MTP_RESPONSE_OK) {
-		MTPD("deleting %s", (const char *)filePath);
-		result = mDatabase->deleteFile(handle);
-		// Don't delete the actual files unless the database deletion is allowed
-		if (result == MTP_RESPONSE_OK) {
-			deletePath((const char *)filePath);
-		}
-	}
-	mDatabase->unlockMutex();
-	return result;
-}
-
-MtpResponseCode MtpServer::doGetObjectPropDesc() {
-	MtpObjectProperty propCode = mRequest.getParameter(1);
-	MtpObjectFormat format = mRequest.getParameter(2);
-	MTPD("MtpServer::doGetObjectPropDesc %s %s\n", MtpDebug::getObjectPropCodeName(propCode),
-										MtpDebug::getFormatCodeName(format));
-	mDatabase->lockMutex();
-	MtpProperty* property = mDatabase->getObjectPropertyDesc(propCode, format);
-	mDatabase->unlockMutex();
-	if (!property) {
-		MTPE("MtpServer::doGetObjectPropDesc propery not supported\n");
-		return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
-	}
-	property->write(mData);
-	delete property;
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetDevicePropDesc() {
-	MtpDeviceProperty propCode = mRequest.getParameter(1);
-	MTPD("GetDevicePropDesc %s\n", MtpDebug::getDevicePropCodeName(propCode));
-	mDatabase->lockMutex();
-	MtpProperty* property = mDatabase->getDevicePropertyDesc(propCode);
-	mDatabase->unlockMutex();
-	if (!property) {
-		MTPE("MtpServer::doGetDevicePropDesc property not supported\n");
-		return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED;
-	}
-	property->write(mData);
-	delete property;
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSendPartialObject() {
-	if (!hasStorage())
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	uint64_t offset = mRequest.getParameter(2);
-	uint64_t offset2 = mRequest.getParameter(3);
-	offset = offset | (offset2 << 32);
-	uint32_t length = mRequest.getParameter(4);
-
-	ObjectEdit* edit = getEditObject(handle);
-	if (!edit) {
-		MTPE("object not open for edit in doSendPartialObject");
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-	// can't start writing past the end of the file
-	if (offset > edit->mSize) {
-		MTPE("writing past end of object, offset: %lld, edit->mSize: %lld", offset, edit->mSize);
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-	const char* filePath = (const char *)edit->mPath;
-	MTPD("receiving partial %s %lld %lld\n", filePath, offset, length);
-
-	// read the header, and possibly some data
-	int ret = mData.read(mFD);
-	if (ret < MTP_CONTAINER_HEADER_SIZE)
-		return MTP_RESPONSE_GENERAL_ERROR;
-	int initialData = ret - MTP_CONTAINER_HEADER_SIZE;
-
-	if (initialData > 0) {
-		ret = write(edit->mFD, mData.getData(), initialData);
-		offset += initialData;
-		length -= initialData;
-	}
-
-	if (length > 0) {
-		mtp_file_range	mfr;
-		mfr.fd = edit->mFD;
-		mfr.offset = offset;
-		mfr.length = length;
-
-		// transfer the file
-		ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
-		MTPD("MTP_RECEIVE_FILE returned %d", ret);
-	}
-	if (ret < 0) {
-		mResponse.setParameter(1, 0);
-		if (errno == ECANCELED)
-			return MTP_RESPONSE_TRANSACTION_CANCELLED;
-		else
-			return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-	// reset so we don't attempt to send this back
-	mData.reset();
-	mResponse.setParameter(1, length);
-	uint64_t end = offset + length;
-	if (end > edit->mSize) {
-		edit->mSize = end;
-	}
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doTruncateObject() {
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	ObjectEdit* edit = getEditObject(handle);
-	if (!edit) {
-		MTPE("object not open for edit in doTruncateObject");
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-	uint64_t offset = mRequest.getParameter(2);
-	uint64_t offset2 = mRequest.getParameter(3);
-	offset |= (offset2 << 32);
-	if (ftruncate(edit->mFD, offset) != 0) {
-		return MTP_RESPONSE_GENERAL_ERROR;
-	} else {
-		edit->mSize = offset;
-		return MTP_RESPONSE_OK;
-	}
-}
-
-MtpResponseCode MtpServer::doBeginEditObject() {
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	if (getEditObject(handle)) {
-		MTPE("object already open for edit in doBeginEditObject");
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-	MtpString path;
-	int64_t fileLength;
-	MtpObjectFormat format;
-	MTPD("MtpServer::doBeginEditObject calling getObjectFilePath\n");
-	mDatabase->lockMutex();
-	int result = mDatabase->getObjectFilePath(handle, path, fileLength, format);
-	mDatabase->unlockMutex();
-	if (result != MTP_RESPONSE_OK)
-		return result;
-
-	int fd = open((const char *)path, O_RDWR | O_EXCL);
-	if (fd < 0) {
-		MTPE("open failed for %s in doBeginEditObject (%d)", (const char *)path, errno);
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-	addEditObject(handle, path, fileLength, format, fd);
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doEndEditObject() {
-	MtpObjectHandle handle = mRequest.getParameter(1);
-	ObjectEdit* edit = getEditObject(handle);
-	if (!edit) {
-		MTPE("object not open for edit in doEndEditObject");
-		return MTP_RESPONSE_GENERAL_ERROR;
-	}
-
-	commitEdit(edit);
-	removeEditObject(handle);
-	return MTP_RESPONSE_OK;
-}
diff --git a/mtp/legacy/MtpServer.h b/mtp/legacy/MtpServer.h
deleted file mode 100644
index d58cb30..0000000
--- a/mtp/legacy/MtpServer.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_SERVER_H
-#define _MTP_SERVER_H
-
-#include <utils/threads.h>
-#include <utils/Vector.h>
-#include "MtpRequestPacket.h"
-#include "MtpDatabase.h"
-#include "MtpDataPacket.h"
-#include "MtpResponsePacket.h"
-#include "MtpEventPacket.h"
-#include "mtp.h"
-#include "MtpUtils.h"
-
-
-class MtpDatabase;
-class MtpStorage;
-
-class MtpServer {
-
-private:
-	// file descriptor for MTP kernel driver
-	int					mFD;
-	android::Mutex					 mMutex;
-	MtpDatabase*		mDatabase;
-
-	// appear as a PTP device
-	bool				mPtp;
-
-	// group to own new files and folders
-	int					mFileGroup;
-	// permissions for new files and directories
-	int					mFilePermission;
-	int					mDirectoryPermission;
-
-	// current session ID
-	MtpSessionID		mSessionID;
-	// true if we have an open session and mSessionID is valid
-	bool				mSessionOpen;
-
-	MtpRequestPacket	mRequest;
-	MtpDataPacket		mData;
-	MtpResponsePacket	mResponse;
-	MtpEventPacket		mEvent;
-
-	MtpStorageList		mStorages;
-
-	// handle for new object, set by SendObjectInfo and used by SendObject
-	MtpObjectHandle		mSendObjectHandle;
-	MtpObjectFormat		mSendObjectFormat;
-	MtpString			mSendObjectFilePath;
-	size_t				mSendObjectFileSize;
-
-	pthread_mutex_t mtpMutex;
-
-	// represents an MTP object that is being edited using the android extensions
-	// for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject)
-	class ObjectEdit {
-		public:
-		MtpObjectHandle		mHandle;
-		MtpString			mPath;
-		uint64_t			mSize;
-		MtpObjectFormat		mFormat;
-		int					mFD;
-
-		ObjectEdit(MtpObjectHandle handle, const char* path, uint64_t size,
-			MtpObjectFormat format, int fd)
-				: mHandle(handle), mPath(path), mSize(size), mFormat(format), mFD(fd) {
-			}
-
-		virtual ~ObjectEdit() {
-			close(mFD);
-		}
-	};
-	android::Vector<ObjectEdit*>  mObjectEditList;
-
-public:
-						MtpServer(MtpDatabase* database, bool ptp,
-									int fileGroup, int filePerm, int directoryPerm);
-	virtual				~MtpServer();
-
-	MtpStorage*			getStorage(MtpStorageID id);
-	inline bool			hasStorage() { return mStorages.size() > 0; }
-	bool				hasStorage(MtpStorageID id);
-	void				addStorage(MtpStorage* storage);
-	void				removeStorage(MtpStorage* storage);
-
-	void				run(int fd);
-
-	void				sendObjectAdded(MtpObjectHandle handle);
-	void				sendObjectRemoved(MtpObjectHandle handle);
-	void				sendObjectUpdated(MtpObjectHandle handle);
-
-private:
-	void				sendStoreAdded(MtpStorageID id);
-	void				sendStoreRemoved(MtpStorageID id);
-	void				sendEvent(MtpEventCode code, uint32_t param1);
-
-	void				addEditObject(MtpObjectHandle handle, MtpString& path,
-								uint64_t size, MtpObjectFormat format, int fd);
-	ObjectEdit*			getEditObject(MtpObjectHandle handle);
-	void				removeEditObject(MtpObjectHandle handle);
-	void				commitEdit(ObjectEdit* edit);
-
-	bool				handleRequest();
-
-	MtpResponseCode		doGetDeviceInfo();
-	MtpResponseCode		doOpenSession();
-	MtpResponseCode		doCloseSession();
-	MtpResponseCode		doGetStorageIDs();
-	MtpResponseCode		doGetStorageInfo();
-	MtpResponseCode		doGetObjectPropsSupported();
-	MtpResponseCode		doGetObjectHandles();
-	MtpResponseCode		doGetNumObjects();
-	MtpResponseCode		doGetObjectReferences();
-	MtpResponseCode		doSetObjectReferences();
-	MtpResponseCode		doGetObjectPropValue();
-	MtpResponseCode		doSetObjectPropValue();
-	MtpResponseCode		doGetDevicePropValue();
-	MtpResponseCode		doSetDevicePropValue();
-	MtpResponseCode		doResetDevicePropValue();
-	MtpResponseCode		doGetObjectPropList();
-	MtpResponseCode		doGetObjectInfo();
-	MtpResponseCode		doGetObject();
-	MtpResponseCode		doGetThumb();
-	MtpResponseCode		doGetPartialObject(MtpOperationCode operation);
-	MtpResponseCode		doSendObjectInfo();
-	MtpResponseCode		doSendObject();
-	MtpResponseCode		doDeleteObject();
-	MtpResponseCode		doGetObjectPropDesc();
-	MtpResponseCode		doGetDevicePropDesc();
-	MtpResponseCode		doSendPartialObject();
-	MtpResponseCode		doTruncateObject();
-	MtpResponseCode		doBeginEditObject();
-	MtpResponseCode		doEndEditObject();
-};
-
-#endif // _MTP_SERVER_H
diff --git a/mtp/legacy/MtpStorage.cpp b/mtp/legacy/MtpStorage.cpp
deleted file mode 100644
index b22158a..0000000
--- a/mtp/legacy/MtpStorage.cpp
+++ /dev/null
@@ -1,856 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include "MtpDebug.h"
-#include "MtpStorage.h"
-#include "MtpDataPacket.h"
-#include "MtpServer.h"
-#include "MtpEventPacket.h"
-#include "MtpDatabase.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <limits.h>
-#include <pthread.h>
-#include <signal.h>
-#include <sys/inotify.h>
-#include <fcntl.h>
-#include "../../tw_atomic.hpp"
-
-#define WATCH_FLAGS ( IN_CREATE | IN_DELETE | IN_MOVE | IN_MODIFY )
-
-MtpStorage::MtpStorage(MtpStorageID id, const char* filePath,
-		const char* description, uint64_t reserveSpace,
-		bool removable, uint64_t maxFileSize, MtpServer* refserver)
-	:	mStorageID(id),
-		mFilePath(filePath),
-		mDescription(description),
-		mMaxCapacity(0),
-		mMaxFileSize(maxFileSize),
-		mReserveSpace(reserveSpace),
-		mRemovable(removable),
-		mServer(refserver)
-{
-	MTPI("MtpStorage id: %d path: %s\n", id, filePath);
-	inotify_thread = 0;
-	inotify_fd = -1;
-	// Threading has not started yet so we should be safe to set these directly instead of using atomics
-	inotify_thread_kill.set_value(0);
-	sendEvents = false;
-	handleCurrentlySending = 0;
-	use_mutex = true;
-	if (pthread_mutex_init(&mtpMutex, NULL) != 0) {
-		MTPE("Failed to init mtpMutex\n");
-		use_mutex = false;
-	}
-	if (pthread_mutex_init(&inMutex, NULL) != 0) {
-		MTPE("Failed to init inMutex\n");
-		pthread_mutex_destroy(&mtpMutex);
-		use_mutex = false;
-	}
-}
-
-MtpStorage::~MtpStorage() {
-	if (inotify_thread) {
-		inotify_thread_kill.set_value(1);
-		MTPD("joining inotify_thread after sending the kill notification.\n");
-		pthread_join(inotify_thread, NULL); // There's not much we can do if there's an error here
-		inotify_thread = 0;
-		MTPD("~MtpStorage removing inotify watches and closing inotify_fd\n");
-		for (std::map<int, Tree*>::iterator i = inotifymap.begin(); i != inotifymap.end(); i++) {
-			inotify_rm_watch(inotify_fd, i->first);
-		}
-		close(inotify_fd);
-		inotifymap.clear();
-	}
-	// Deleting the root tree causes a cascade in btree.cpp that ends up
-	// deleting all of the trees and nodes.
-	delete mtpmap[0];
-	mtpmap.clear();
-	if (use_mutex) {
-		use_mutex = false;
-		MTPD("~MtpStorage destroying mutexes\n");
-		pthread_mutex_destroy(&mtpMutex);
-		pthread_mutex_destroy(&inMutex);
-	}
-}
-
-int MtpStorage::getType() const {
-	return (mRemovable ? MTP_STORAGE_REMOVABLE_RAM :  MTP_STORAGE_FIXED_RAM);
-}
-
-int MtpStorage::getFileSystemType() const {
-	return MTP_STORAGE_FILESYSTEM_HIERARCHICAL;
-}
-
-int MtpStorage::getAccessCapability() const {
-	return MTP_STORAGE_READ_WRITE;
-}
-
-uint64_t MtpStorage::getMaxCapacity() {
-	if (mMaxCapacity == 0) {
-		struct statfs	stat;
-		if (statfs(getPath(), &stat))
-			return -1;
-		mMaxCapacity = (uint64_t)stat.f_blocks * (uint64_t)stat.f_bsize;
-	}
-	return mMaxCapacity;
-}
-
-uint64_t MtpStorage::getFreeSpace() {
-	struct statfs	stat;
-	if (statfs(getPath(), &stat))
-		return -1;
-	uint64_t freeSpace = (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
-	return (freeSpace > mReserveSpace ? freeSpace - mReserveSpace : 0);
-}
-
-const char* MtpStorage::getDescription() const {
-	return (const char *)mDescription;
-}
-
-int MtpStorage::createDB() {
-	std::string mtpParent = "";
-	mtpstorageparent = getPath();
-	// root directory is special: handle 0, parent 0, and empty path
-	mtpmap[0] = new Tree(0, 0, "");
-	MTPD("MtpStorage::createDB DONE\n");
-	if (use_mutex) {
-		sendEvents = true;
-		MTPD("inotify_init\n");
-		inotify_fd = inotify_init();
-		if (inotify_fd < 0) {
-			MTPE("Can't run inotify_init for mtp server: %s\n", strerror(errno));
-		} else {
-			MTPD("Starting inotify thread\n");
-			inotify_thread = inotify();
-		}
-	} else {
-		MTPD("NOT starting inotify thread\n");
-	}
-	// for debugging and caching purposes, read the root dir already now
-	readDir(mtpstorageparent, mtpmap[0]);
-	// all other dirs are read on demand
-	return 0;
-}
-
-MtpObjectHandleList* MtpStorage::getObjectList(MtpStorageID storageID, MtpObjectHandle parent) {
-	MTPD("MtpStorage::getObjectList, parent: %u\n", parent);
-	//append object id	(numerical #s) of database to int array
-	MtpObjectHandleList* list = new MtpObjectHandleList();
-	if (parent == MTP_PARENT_ROOT) {
-		MTPD("parent == MTP_PARENT_ROOT\n");
-		parent = 0;
-	}
-
-	if (mtpmap.find(parent) == mtpmap.end()) {
-		MTPE("parent handle not found, returning empty list\n");
-		return list;
-	}
-
-	Tree* tree = mtpmap[parent];
-	if (!tree->wasAlreadyRead())
-	{
-		std::string path = getNodePath(tree);
-		MTPD("reading directory on demand for tree %p (%u), path: %s\n", tree, tree->Mtpid(), path.c_str());
-		readDir(path, tree);
-	}
-
-	mtpmap[parent]->getmtpids(list);
-	MTPD("returning %u objects in %s.\n", list->size(), tree->getName().c_str());
-	return list;
-}
-
-int MtpStorage::getObjectInfo(MtpObjectHandle handle, MtpObjectInfo& info) {
-	struct stat st;
-	uint64_t size = 0;
-	MTPD("MtpStorage::getObjectInfo, handle: %u\n", handle);
-	Node* node = findNode(handle);
-	if (!node) {
-		// Item is not on this storage device
-		return -1;
-	}
-	
-	info.mStorageID = getStorageID();
-	MTPD("info.mStorageID: %u\n", info.mStorageID);
-	info.mParent = node->getMtpParentId();
-	MTPD("mParent: %u\n", info.mParent);
-	// TODO: do we want to lstat again here, or read from the node properties?
-	if (lstat(getNodePath(node).c_str(), &st) == 0)
-		size = st.st_size;
-	MTPD("size is: %llu\n", size);
-	info.mCompressedSize = (size > 0xFFFFFFFFLL ? 0xFFFFFFFF : size);
-	info.mDateModified = st.st_mtime;
-	if (S_ISDIR(st.st_mode)) {
-		info.mFormat = MTP_FORMAT_ASSOCIATION;
-	}
-	else {
-		info.mFormat = MTP_FORMAT_UNDEFINED;
-	}
-	info.mName = strdup(node->getName().c_str());
-	MTPD("MtpStorage::getObjectInfo found, Exiting getObjectInfo()\n");
-	return 0;
-}
-
-MtpObjectHandle MtpStorage::beginSendObject(const char* path,
-											MtpObjectFormat format,
-											MtpObjectHandle parent,
-											uint64_t size,
-											time_t modified) {
-	MTPD("MtpStorage::beginSendObject(), path: '%s', parent: %u, format: %04x\n", path, parent, format);
-	iter it = mtpmap.find(parent);
-	if (it == mtpmap.end()) {
-		MTPE("parent node not found, returning error\n");
-		return kInvalidObjectHandle;
-	}
-	Tree* tree = it->second;
-
-	std::string pathstr(path);
-	size_t slashpos = pathstr.find_last_of('/');
-	if (slashpos == std::string::npos) {
-		MTPE("path has no slash, returning error\n");
-		return kInvalidObjectHandle;
-	}
-	std::string parentdir = pathstr.substr(0, slashpos);
-	std::string basename = pathstr.substr(slashpos + 1);
-	if (parent != 0 && parentdir != getNodePath(tree)) {
-		MTPE("beginSendObject into path '%s' but parent tree has path '%s', returning error\n", parentdir.c_str(), getNodePath(tree).c_str());
-		return kInvalidObjectHandle;
-	}
-
-	MTPD("MtpStorage::beginSendObject() parentdir: %s basename: %s\n", parentdir.c_str(), basename.c_str());
-	// note: for directories, the mkdir call is done later in MtpServer, here we just reserve a handle
-	bool isDir = format == MTP_FORMAT_ASSOCIATION;
-	Node* node = addNewNode(isDir, tree, basename);
-	handleCurrentlySending = node->Mtpid();	// suppress inotify for this node while sending
-
-	return node->Mtpid();
-}
-
-void MtpStorage::endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, bool succeeded)
-{
-	Node* node = findNode(handle);
-	if (!node)
-		return;	// just ignore if this is for another storage
-
-	node->addProperties(path, mStorageID);
-	handleCurrentlySending = 0;
-	// TODO: are we supposed to send an event about an upload by the initiator?
-	if (sendEvents)
-		mServer->sendObjectAdded(node->Mtpid());
-}
-
-int MtpStorage::getObjectFilePath(MtpObjectHandle handle, MtpString& outFilePath, int64_t& outFileLength, MtpObjectFormat& outFormat) {
-	MTPD("MtpStorage::getObjectFilePath handle: %u\n", handle);
-	Node* node = findNode(handle);
-	if (!node)
-	{
-		// Item is not on this storage device
-		return -1;
-	}
-	// TODO: do we want to lstat here, or just read the info from the node?
-	struct stat st;
-	if (lstat(getNodePath(node).c_str(), &st) == 0)
-		outFileLength = st.st_size;
-	else
-		outFileLength = 0;
-	outFilePath = getNodePath(node).c_str();
-	MTPD("outFilePath: %s\n", outFilePath.string());
-	outFormat = node->isDir() ? MTP_FORMAT_ASSOCIATION : MTP_FORMAT_UNDEFINED;
-	return 0;
-}
-
-int MtpStorage::readDir(const std::string& path, Tree* tree)
-{
-	struct dirent *de;
-	int storageID = getStorageID();
-	MtpObjectHandle parent = tree->Mtpid();
-
-	DIR *d = opendir(path.c_str());
-	MTPD("reading dir '%s', parent handle %u\n", path.c_str(), parent);
-	if (d == NULL) {
-		MTPE("error opening '%s' -- error: %s\n", path.c_str(), strerror(errno));
-		return -1;
-	}
-	// TODO: for refreshing dirs: capture old entries here
-	while ((de = readdir(d)) != NULL) {
-		// Because exfat-fuse causes issues with dirent, we will use stat
-		// for some things that dirent should be able to do
-		std::string item = path + "/" + de->d_name;
-		struct stat st;
-		if (lstat(item.c_str(), &st)) {
-			MTPE("Error running lstat on '%s'\n", item.c_str());
-			return -1;
-		}
-		// TODO: if we want to use this for refreshing dirs too, first find existing name and overwrite
-		if (strcmp(de->d_name, ".") == 0)
-			continue;
-		if (strcmp(de->d_name, "..") == 0)
-			continue;
-		Node* node = addNewNode(st.st_mode & S_IFDIR, tree, de->d_name);
-		node->addProperties(item, storageID);
-		//if (sendEvents)
-		//	mServer->sendObjectAdded(node->Mtpid());
-		//	sending events here makes simple-mtpfs very slow, and it is probably the wrong thing to do anyway
-	}
-	closedir(d);
-	// TODO: for refreshing dirs: remove entries that no longer exist (with their nodes)
-	tree->setAlreadyRead(true);
-	addInotify(tree);
-	return 0;
-}
-
-int MtpStorage::deleteFile(MtpObjectHandle handle) {
-	MTPD("MtpStorage::deleteFile handle: %u\n", handle);
-	Node* node = findNode(handle);
-	if (!node) {
-		// Item is not on this storage device
-		return -1;
-	}
-	MtpObjectHandle parent = node->getMtpParentId();
-	Tree* tree = mtpmap[parent];
-	if (!tree) {
-		MTPE("parent tree for handle %u not found\n", parent);
-		return -1;
-	}
-	if (node->isDir()) {
-		MTPD("deleting tree from mtpmap: %u\n", handle);
-		mtpmap.erase(handle);
-	}
-
-	MTPD("deleting handle: %u\n", handle);
-	tree->deleteNode(handle);
-	MTPD("deleted\n");
-	return 0;
-}
-
-void MtpStorage::queryNodeProperties(std::vector<MtpStorage::PropEntry>& results, Node* node, uint32_t property, int groupCode, MtpStorageID storageID)
-{
-	MTPD("queryNodeProperties handle %u, path: %s\n", node->Mtpid(), getNodePath(node).c_str());
-	PropEntry pe;
-	pe.handle = node->Mtpid();
-	pe.property = property;
-
-	if (property == 0xffffffff)
-	{
-		// add all properties
-		MTPD("MtpStorage::queryNodeProperties for all properties\n");
-		std::vector<Node::mtpProperty> mtpprop = node->getMtpProps();
-		for (size_t i = 0; i < mtpprop.size(); ++i) {
-			pe.property = mtpprop[i].property;
-			pe.datatype = mtpprop[i].dataType;
-			pe.intvalue = mtpprop[i].valueInt;
-			pe.strvalue = mtpprop[i].valueStr;
-			results.push_back(pe);
-		}
-		return;
-	}
-	else if (property == 0)
-	{
-		// TODO: use groupCode
-	}
-
-	// single property
-	// TODO: this should probably be moved to the Node class and/or merged with getObjectPropertyValue
-	switch (property) {
-//		case MTP_PROPERTY_OBJECT_FORMAT:
-//			pe.datatype = MTP_TYPE_UINT16;
-//			pe.intvalue = node->getIntProperty(MTP_PROPERTY_OBJECT_FORMAT);
-//			break;
-
-		case MTP_PROPERTY_STORAGE_ID:
-			pe.datatype = MTP_TYPE_UINT32;
-			pe.intvalue = storageID;
-			break;
-
-		case MTP_PROPERTY_PROTECTION_STATUS:
-			pe.datatype = MTP_TYPE_UINT16;
-			pe.intvalue = 0;
-			break;
-
-		case MTP_PROPERTY_OBJECT_SIZE:
-		{
-			pe.datatype = MTP_TYPE_UINT64;
-			struct stat st;
-			pe.intvalue = 0;
-			if (lstat(getNodePath(node).c_str(), &st) == 0)
-				pe.intvalue = st.st_size;
-			break;
-		}
-
-		default:
-		{
-			const Node::mtpProperty& prop = node->getProperty(property);
-			if (prop.property != property)
-			{
-				MTPD("queryNodeProperties: unknown property %x\n", property);
-				return;
-			}
-			pe.datatype = prop.dataType;
-			pe.intvalue = prop.valueInt;
-			pe.strvalue = prop.valueStr;
-			// TODO: all the special case stuff in MyMtpDatabase::getObjectPropertyValue is missing here
-		}
-
-	}
-	results.push_back(pe);
-}
-
-int MtpStorage::getObjectPropertyList(MtpObjectHandle handle, uint32_t format, uint32_t property, int groupCode, int depth, MtpDataPacket& packet) {
-	MTPD("MtpStorage::getObjectPropertyList handle: %u, format: %x, property: %x\n", handle, format, property);
-	if (groupCode != 0)
-	{
-		MTPE("getObjectPropertyList: groupCode unsupported\n");
-		return -1; // TODO: RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED
-	}
-	// TODO: support all the special stuff, like:
-	// handle == 0 -> all objects at the root level
-	// handle == 0xffffffff -> all objects (on all storages? how could we support that?)
-	// format == 0 -> all formats, otherwise filter by ObjectFormatCode
-	// property == 0xffffffff -> all properties except those with group code 0xffffffff
-	// if property == 0 then use groupCode
-	//	 groupCode == 0 -> return Specification_By_Group_Unsupported
-	// depth == 0xffffffff -> all objects incl. and below handle
-
-	std::vector<PropEntry> results;
-
-	if (handle == 0xffffffff) {
-		// TODO: all object on all storages (needs a different design, result packet needs to be built by server instead of storage)
-	} else if (handle == 0)	{
-		// all objects at the root level
-		Tree* root = mtpmap[0];
-		MtpObjectHandleList list;
-		root->getmtpids(&list);
-		for (MtpObjectHandleList::iterator it = list.begin(); it != list.end(); ++it) {
-			Node* node = root->findNode(*it);
-			if (!node) {
-				MTPE("BUG: node not found for root entry with handle %u\n", *it);
-				break;
-			}
-			queryNodeProperties(results, node, property, groupCode, mStorageID);
-		}
-	} else {
-		// single object
-		Node* node = findNode(handle);
-		if (!node) {
-			// Item is not on this storage device
-			return -1;
-		}
-		queryNodeProperties(results, node, property, groupCode, mStorageID);
-	}
-
-	MTPD("count: %u\n", results.size());
-	packet.putUInt32(results.size());
-
-	for (size_t i = 0; i < results.size(); ++i) {
-		PropEntry& p = results[i];
-		MTPD("handle: %u, propertyCode: %x = %s, datatype: %x, value: %llu\n",
-				p.handle, p.property, MtpDebug::getObjectPropCodeName(p.property),
-				p.datatype, p.intvalue);
-		packet.putUInt32(p.handle);
-		packet.putUInt16(p.property);
-		packet.putUInt16(p.datatype);
-		switch (p.datatype) {
-			case MTP_TYPE_INT8:
-				MTPD("MTP_TYPE_INT8\n");
-				packet.putInt8(p.intvalue);
-				break;
-			case MTP_TYPE_UINT8:
-				MTPD("MTP_TYPE_UINT8\n");
-				packet.putUInt8(p.intvalue);
-				break;
-			case MTP_TYPE_INT16:
-				MTPD("MTP_TYPE_INT16\n");
-				packet.putInt16(p.intvalue);
-				break;
-			case MTP_TYPE_UINT16:
-				MTPD("MTP_TYPE_UINT16\n");
-				packet.putUInt16(p.intvalue);
-				break;
-			case MTP_TYPE_INT32:
-				MTPD("MTP_TYPE_INT32\n");
-				packet.putInt32(p.intvalue);
-				break;
-			case MTP_TYPE_UINT32:
-				MTPD("MTP_TYPE_UINT32\n");
-				packet.putUInt32(p.intvalue);
-				break;
-			case MTP_TYPE_INT64:
-				MTPD("MTP_TYPE_INT64\n");
-				packet.putInt64(p.intvalue);
-				break;
-			case MTP_TYPE_UINT64:
-				MTPD("MTP_TYPE_UINT64\n");
-				packet.putUInt64(p.intvalue);
-				break;
-			case MTP_TYPE_INT128:
-				MTPD("MTP_TYPE_INT128\n");
-				packet.putInt128(p.intvalue);
-				break;
-			case MTP_TYPE_UINT128:
-				MTPD("MTP_TYPE_UINT128\n");
-				packet.putUInt128(p.intvalue);
-				break;
-			case MTP_TYPE_STR:
-				MTPD("MTP_TYPE_STR: %s\n", p.strvalue.c_str());
-				packet.putString(p.strvalue.c_str());
-				break;
-			default:
-				MTPE("bad or unsupported data type: %x in MyMtpDatabase::getObjectPropertyList", p.datatype);
-				break;
-		}
-	}
-	return 0;
-}
-
-int MtpStorage::renameObject(MtpObjectHandle handle, std::string newName) {
-	MTPD("MtpStorage::renameObject, handle: %u, new name: '%s'\n", handle, newName.c_str());
-	if (handle == MTP_PARENT_ROOT) {
-		MTPE("parent == MTP_PARENT_ROOT, cannot rename root\n");
-		return -1;
-	} else {
-		for (iter i = mtpmap.begin(); i != mtpmap.end(); i++) {
-			Node* node = i->second->findNode(handle);
-			if (node != NULL) {
-				std::string oldName = getNodePath(node);
-				std::string parentdir = oldName.substr(0, oldName.find_last_of('/'));
-				std::string newFullName = parentdir + "/" + newName;
-				MTPD("old: '%s', new: '%s'\n", oldName.c_str(), newFullName.c_str());
-				if (rename(oldName.c_str(), newFullName.c_str()) == 0) {
-					node->rename(newName);
-					return 0;
-				} else {
-					MTPE("MtpStorage::renameObject failed, handle: %u, new name: '%s'\n", handle, newName.c_str());
-					return -1;
-				}
-			}
-		}
-	}
-	// handle not found on this storage
-	return -1;
-}
-
-int MtpStorage::getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpStorage::PropEntry& pe) {
-	Node *node;
-	for (iter i = mtpmap.begin(); i != mtpmap.end(); i++) {
-		node = i->second->findNode(handle);
-		if (node != NULL) {
-			const Node::mtpProperty& prop = node->getProperty(property);
-			if (prop.property != property) {
-				MTPD("getObjectPropertyValue: unknown property %x for handle %u\n", property, handle);
-				return -1;
-			}
-			pe.datatype = prop.dataType;
-			pe.intvalue = prop.valueInt;
-			pe.strvalue = prop.valueStr;
-			pe.handle = handle;
-			pe.property = property;
-			return 0;
-		}
-	}
-	// handle not found on this storage
-	return -1;
-}
-
-pthread_t MtpStorage::inotify(void) {
-	pthread_t thread;
-	pthread_attr_t tattr;
-
-	if (pthread_attr_init(&tattr)) {
-		MTPE("Unable to pthread_attr_init\n");
-		return 0;
-	}
-	if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE)) {
-		MTPE("Error setting pthread_attr_setdetachstate\n");
-		return 0;
-	}
-	ThreadPtr inotifyptr = &MtpStorage::inotify_t;
-	PThreadPtr p = *(PThreadPtr*)&inotifyptr;
-	pthread_create(&thread, &tattr, p, this);
-	if (pthread_attr_destroy(&tattr)) {
-		MTPE("Failed to pthread_attr_destroy\n");
-	}
-	return thread;
-}
-
-int MtpStorage::addInotify(Tree* tree) {
-	if (inotify_fd < 0) {
-		MTPE("inotify_fd not set or error: %i\n", inotify_fd);
-		return -1;
-	}
-	std::string path = getNodePath(tree);
-	MTPD("adding inotify for tree %x, dir: %s\n", tree, path.c_str());
-	int wd = inotify_add_watch(inotify_fd, path.c_str(), WATCH_FLAGS);
-	if (wd < 0) {
-		MTPE("inotify_add_watch failed: %s\n", strerror(errno));
-		return -1;
-	}
-	inotifymap[wd] = tree;
-	return 0;
-}
-
-void MtpStorage::handleInotifyEvent(struct inotify_event* event)
-{
-	std::map<int, Tree*>::iterator it = inotifymap.find(event->wd);
-	if (it == inotifymap.end()) {
-		MTPE("Unable to locate inotify_wd: %i\n", event->wd);
-		return;
-	}
-	Tree* tree = it->second;
-	MTPD("inotify_t tree: %x '%s'\n", tree, tree->getName().c_str());
-	Node* node = tree->findEntryByName(basename(event->name));
-	if (node && node->Mtpid() == handleCurrentlySending) {
-		MTPD("ignoring inotify event for currently uploading file, handle: %u\n", node->Mtpid());
-		return;
-	}
-	if (event->mask & IN_CREATE || event->mask & IN_MOVED_TO) {
-		if (event->mask & IN_ISDIR) {
-			MTPD("inotify_t create is dir\n");
-		} else {
-			MTPD("inotify_t create is file\n");
-		}
-		if (node == NULL) {
-			node = addNewNode(event->mask & IN_ISDIR, tree, event->name);
-			std::string item = getNodePath(tree) + "/" + event->name;
-			node->addProperties(item, getStorageID());
-			mServer->sendObjectAdded(node->Mtpid());
-		} else {
-			MTPD("inotify_t item already exists.\n");
-		}
-		if (event->mask & IN_ISDIR) {
-			// TODO: do we need to do anything here? probably not until someone reads from the dir...
-		}
-	} else if (event->mask & IN_DELETE || event->mask & IN_MOVED_FROM) {
-		if (event->mask & IN_ISDIR) {
-			MTPD("inotify_t Directory %s deleted\n", event->name);
-		} else {
-			MTPD("inotify_t File %s deleted\n", event->name);
-		}
-		if (node)
-		{
-			if (event->mask & IN_ISDIR) {
-				for (std::map<int, Tree*>::iterator it = inotifymap.begin(); it != inotifymap.end(); ++it) {
-					if (it->second == node) {
-						inotify_rm_watch(inotify_fd, it->first);
-						MTPD("inotify_t removing watch on '%s'\n", getNodePath(it->second).c_str());
-						inotifymap.erase(it->first);
-						break;
-					}
-
-				}
-			}
-			MtpObjectHandle handle = node->Mtpid();
-			deleteFile(handle);
-			mServer->sendObjectRemoved(handle);
-		} else {
-			MTPD("inotify_t already removed.\n");
-		}
-	} else if (event->mask & IN_MODIFY) {
-		MTPD("inotify_t item %s modified.\n", event->name);
-		if (node != NULL) {
-			uint64_t orig_size = node->getProperty(MTP_PROPERTY_OBJECT_SIZE).valueInt;
-			struct stat st;
-			uint64_t new_size = 0;
-			if (lstat(getNodePath(node).c_str(), &st) == 0)
-				new_size = (uint64_t)st.st_size;
-			if (orig_size != new_size) {
-				MTPD("size changed from %llu to %llu on mtpid: %u\n", orig_size, new_size, node->Mtpid());
-				node->updateProperty(MTP_PROPERTY_OBJECT_SIZE, new_size, "", MTP_TYPE_UINT64);
-				mServer->sendObjectUpdated(node->Mtpid());
-			}
-		} else {
-			MTPE("inotify_t modified item not found\n");
-		}
-	} else if (event->mask & IN_DELETE_SELF || event->mask & IN_MOVE_SELF) {
-		// TODO: is this always already handled by IN_DELETE for the parent dir?
-	}
-}
-
-int MtpStorage::inotify_t(void) {
-	#define EVENT_SIZE ( sizeof(struct inotify_event) )
-	#define EVENT_BUF_LEN ( 1024 * ( EVENT_SIZE + 16) )
-	char buf[EVENT_BUF_LEN];
-	fd_set fdset;
-	struct timeval seltmout;
-	int sel_ret;
-
-	MTPD("inotify thread starting.\n");
-
-	while (inotify_thread_kill.get_value() == 0) {
-		FD_ZERO(&fdset);
-		FD_SET(inotify_fd, &fdset);
-		seltmout.tv_sec = 0;
-		seltmout.tv_usec = 25000;
-		sel_ret = select(inotify_fd + 1, &fdset, NULL, NULL, &seltmout);
-		if (sel_ret == 0)
-			continue;
-		int i = 0;
-		int len = read(inotify_fd, buf, EVENT_BUF_LEN);
-
-		if (len < 0) {
-			if (errno == EINTR)
-				continue;
-			MTPE("inotify_t Can't read inotify events\n");
-		}
-
-		while (i < len && inotify_thread_kill.get_value() == 0) {
-			struct inotify_event *event = (struct inotify_event *) &buf[i];
-			if (event->len) {
-				MTPD("inotify event: wd: %i, mask: %x, name: %s\n", event->wd, event->mask, event->name);
-				lockMutex(1);
-				handleInotifyEvent(event);
-				unlockMutex(1);
-			}
-			i += EVENT_SIZE + event->len;
-		}
-	}
-	MTPD("inotify_thread_kill received!\n");
-	// This cleanup is handled in the destructor.
-	/*for (std::map<int, Tree*>::iterator i = inotifymap.begin(); i != inotifymap.end(); i++) {
-		inotify_rm_watch(inotify_fd, i->first);
-	}
-	close(inotify_fd);*/
-	return 0;
-}
-
-Node* MtpStorage::findNodeByPath(const std::string& path) {
-	MTPD("findNodeByPath: %s\n", path.c_str());
-	std::string match = path.substr(0, mtpstorageparent.size());
-	if (match != mtpstorageparent) {
-		// not on this device
-		MTPD("no match: %s is not on storage %s\n", match.c_str(), mtpstorageparent.c_str());
-		return NULL;
-	}
-
-	// TODO: fix and test this
-	std::string p = path.substr(mtpstorageparent.size()+1);	// cut off "/" after storage root too
-	Tree* tree = mtpmap[0]; // start at storage root
-
-	Node* node = NULL;
-	while (!p.empty()) {
-		size_t slashpos = p.find('/');
-		std::string e;
-		if (slashpos != std::string::npos) {
-			e = p;
-			p.clear();
-		} else {
-			e = p.substr(0, slashpos);
-			p = p.substr(slashpos + 1);
-		}
-		MTPD("path element: %s, rest: %s\n", e.c_str(), p.c_str());
-		node = tree->findEntryByName(e);
-		if (!node) {
-			MTPE("path element of %s not found: %s\n", path.c_str(), e.c_str());
-			return NULL;
-		}
-		if (node->isDir())
-			tree = static_cast<Tree*>(node);
-		else if (!p.empty()) {
-			MTPE("path element of %s is not a directory: %s node: %p\n", path.c_str(), e.c_str(), node);
-			return NULL;
-		}
-	}
-	MTPD("findNodeByPath: found node %p, handle: %u, name: %s\n", node, node->Mtpid(), node->getName().c_str());
-	return node;
-}
-
-Node* MtpStorage::addNewNode(bool isDir, Tree* tree, const std::string& name)
-{
-	// global counter for new object handles
-	static MtpObjectHandle mtpid = 0;
-
-	++mtpid;
-	MTPD("adding new %s node for %s, new handle: %u\n", isDir ? "dir" : "file", name.c_str(), mtpid);
-	MtpObjectHandle parent = tree->Mtpid();
-	MTPD("parent tree: %x, handle: %u, name: %s\n", tree, parent, tree->getName().c_str());
-	Node* node;
-	if (isDir)
-		node = mtpmap[mtpid] = new Tree(mtpid, parent, name);
-	else
-		node = new Node(mtpid, parent, name);
-	tree->addEntry(node);
-	return node;
-}
-
-Node* MtpStorage::findNode(MtpObjectHandle handle) {
-	for (iter i = mtpmap.begin(); i != mtpmap.end(); i++) {
-		Node* node = i->second->findNode(handle);
-		if (node != NULL) {
-			MTPD("findNode: found node %p for handle %u, name: %s\n", node, handle, node->getName().c_str());
-			if (node->Mtpid() != handle)
-			{
-				MTPE("BUG: entry for handle %u points to node with handle %u\n", handle, node->Mtpid());
-			}
-			return node;
-		}
-	}
-	// Item is not on this storage device
-	MTPD("MtpStorage::findNode: no node found for handle %u on storage %u, searched %u trees\n", handle, mStorageID, mtpmap.size());
-	return NULL;
-}
-
-std::string MtpStorage::getNodePath(Node* node) {
-	std::string path;
-	MTPD("getNodePath: node %p, handle %u\n", node, node->Mtpid());
-	while (node)
-	{
-		path = "/" + node->getName() + path;
-		MtpObjectHandle parent = node->getMtpParentId();
-		if (parent == 0)	// root
-			break;
-		node = findNode(parent);
-	}
-	path = mtpstorageparent + path;
-	MTPD("getNodePath: path %s\n", path.c_str());
-	return path;
-}
-
-void MtpStorage::lockMutex(int thread_type) {
-	if (!use_mutex)
-		return; // mutex is disabled
-	if (thread_type) {
-		// inotify thread
-		pthread_mutex_lock(&inMutex);
-		while (pthread_mutex_trylock(&mtpMutex)) {
-			pthread_mutex_unlock(&inMutex);
-			usleep(32000);
-			pthread_mutex_lock(&inMutex);
-		}
-	} else {
-		// main mtp thread
-		pthread_mutex_lock(&mtpMutex);
-		while (pthread_mutex_trylock(&inMutex)) {
-			pthread_mutex_unlock(&mtpMutex);
-			usleep(13000);
-			pthread_mutex_lock(&mtpMutex);
-		}
-	}
-}
-
-void MtpStorage::unlockMutex(int thread_type) {
-	if (!use_mutex)
-		return; // mutex is disabled
-	pthread_mutex_unlock(&inMutex);
-	pthread_mutex_unlock(&mtpMutex);
-}
diff --git a/mtp/legacy/MtpStorage.h b/mtp/legacy/MtpStorage.h
deleted file mode 100644
index d967b4b..0000000
--- a/mtp/legacy/MtpStorage.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_STORAGE_H
-#define _MTP_STORAGE_H
-
-#include "mtp.h"
-#include "MtpObjectInfo.h"
-#include <string>
-#include <deque>
-#include <map>
-#include <libgen.h>
-#include <pthread.h>
-#include "btree.hpp"
-#include "MtpServer.h"
-#include "../../tw_atomic.hpp"
-
-class MtpDatabase;
-struct inotify_event;
-
-class MtpStorage {
-
-private:
-	MtpStorageID			mStorageID;
-	MtpString				mFilePath;
-	MtpString				mDescription;
-	uint64_t				mMaxCapacity;
-	uint64_t				mMaxFileSize;
-	// amount of free space to leave unallocated
-	uint64_t				mReserveSpace;
-	bool					mRemovable;
-	MtpServer*				mServer;
-	typedef std::map<int, Tree*> maptree;
-	typedef maptree::iterator iter;
-	maptree mtpmap;
-	std::string mtpstorageparent;
-	android::Mutex			 mMutex;
-
-public:
-							MtpStorage(MtpStorageID id, const char* filePath,
-									const char* description, uint64_t reserveSpace,
-									bool removable, uint64_t maxFileSize, MtpServer* refserver);
-	virtual					~MtpStorage();
-
-	inline MtpStorageID		getStorageID() const { return mStorageID; }
-	int						getType() const;
-	int						getFileSystemType() const;
-	int						getAccessCapability() const;
-	uint64_t				getMaxCapacity();
-	uint64_t				getFreeSpace();
-	const char*				getDescription() const;
-	inline const char*		getPath() const { return (const char *)mFilePath; }
-	inline bool				isRemovable() const { return mRemovable; }
-	inline uint64_t			getMaxFileSize() const { return mMaxFileSize; }
-
-	struct PropEntry {
-		MtpObjectHandle handle;
-		uint16_t property;
-		uint16_t datatype;
-		uint64_t intvalue;
-		std::string strvalue;
-	};
-
-	int readDir(const std::string& path, Tree* tree);
-	int createDB();
-	MtpObjectHandleList* getObjectList(MtpStorageID storageID, MtpObjectHandle parent);
-	int getObjectInfo(MtpObjectHandle handle, MtpObjectInfo& info);
-	MtpObjectHandle beginSendObject(const char* path, MtpObjectFormat format, MtpObjectHandle parent, uint64_t size, time_t modified);
-	void endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, bool succeeded);
-	int getObjectPropertyList(MtpObjectHandle handle, uint32_t format, uint32_t property, int groupCode, int depth, MtpDataPacket& packet);
-	int getObjectFilePath(MtpObjectHandle handle, MtpString& outFilePath, int64_t& outFileLength, MtpObjectFormat& outFormat);
-	int deleteFile(MtpObjectHandle handle);
-	int renameObject(MtpObjectHandle handle, std::string newName);
-	int getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, PropEntry& prop);
-	void lockMutex(int thread_type);
-	void unlockMutex(int thread_type);
-
-private:
-	pthread_t inotify();
-	int inotify_t();
-	typedef int (MtpStorage::*ThreadPtr)(void);
-	typedef void* (*PThreadPtr)(void *);
-	std::map<int, Tree*> inotifymap;	// inotify wd -> tree
-	pthread_t inotify_thread;
-	int inotify_fd;
-	int addInotify(Tree* tree);
-	void handleInotifyEvent(struct inotify_event* event);
-
-	bool sendEvents;
-	MtpObjectHandle handleCurrentlySending;
-
-	Node* addNewNode(bool isDir, Tree* tree, const std::string& name);
-	Node* findNode(MtpObjectHandle handle);
-	Node* findNodeByPath(const std::string& path);
-	std::string getNodePath(Node* node);
-
-	void queryNodeProperties(std::vector<PropEntry>& results, Node* node, uint32_t property, int groupCode, MtpStorageID storageID);
-
-	bool use_mutex;
-	pthread_mutex_t inMutex; // inotify mutex
-	pthread_mutex_t mtpMutex; // main mtp mutex
-	TWAtomicInt inotify_thread_kill;
-};
-
-#endif // _MTP_STORAGE_H
diff --git a/mtp/legacy/MtpStorageInfo.cpp b/mtp/legacy/MtpStorageInfo.cpp
deleted file mode 100644
index a2b8ca2..0000000
--- a/mtp/legacy/MtpStorageInfo.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include "MtpDebug.h"
-#include "MtpDataPacket.h"
-#include "MtpStorageInfo.h"
-#include "MtpStringBuffer.h"
-
-MtpStorageInfo::MtpStorageInfo(MtpStorageID id)
-	:	mStorageID(id),
-		mStorageType(0),
-		mFileSystemType(0),
-		mAccessCapability(0),
-		mMaxCapacity(0),
-		mFreeSpaceBytes(0),
-		mFreeSpaceObjects(0),
-		mStorageDescription(NULL),
-		mVolumeIdentifier(NULL)
-{
-}
-
-MtpStorageInfo::~MtpStorageInfo() {
-	if (mStorageDescription)
-		free(mStorageDescription);
-	if (mVolumeIdentifier)
-		free(mVolumeIdentifier);
-}
-
-void MtpStorageInfo::read(MtpDataPacket& packet) {
-	MtpStringBuffer string;
-
-	// read the device info
-	mStorageType = packet.getUInt16();
-	mFileSystemType = packet.getUInt16();
-	mAccessCapability = packet.getUInt16();
-	mMaxCapacity = packet.getUInt64();
-	mFreeSpaceBytes = packet.getUInt64();
-	mFreeSpaceObjects = packet.getUInt32();
-
-	packet.getString(string);
-	mStorageDescription = strdup((const char *)string);
-	packet.getString(string);
-	mVolumeIdentifier = strdup((const char *)string);
-}
-
-void MtpStorageInfo::print() {
-	MTPI("Storage Info %08X:\n\tmStorageType: %d\n\tmFileSystemType: %d\n\tmAccessCapability: %d\n",
-			mStorageID, mStorageType, mFileSystemType, mAccessCapability);
-	MTPI("\tmMaxCapacity: %lld\n\tmFreeSpaceBytes: %lld\n\tmFreeSpaceObjects: %d\n",
-			mMaxCapacity, mFreeSpaceBytes, mFreeSpaceObjects);
-	MTPI("\tmStorageDescription: %s\n\tmVolumeIdentifier: %s\n",
-			mStorageDescription, mVolumeIdentifier);
-}
-
diff --git a/mtp/legacy/MtpStorageInfo.h b/mtp/legacy/MtpStorageInfo.h
deleted file mode 100644
index 80f8752..0000000
--- a/mtp/legacy/MtpStorageInfo.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_STORAGE_INFO_H
-#define _MTP_STORAGE_INFO_H
-
-#include "MtpTypes.h"
-
-
-class MtpDataPacket;
-
-class MtpStorageInfo {
-public:
-	MtpStorageID		mStorageID;
-	uint16_t			mStorageType;
-	uint16_t			mFileSystemType;
-	uint16_t			mAccessCapability;
-	uint64_t			mMaxCapacity;
-	uint64_t			mFreeSpaceBytes;
-	uint32_t			mFreeSpaceObjects;
-	char*				mStorageDescription;
-	char*				mVolumeIdentifier;
-
-public:
-						MtpStorageInfo(MtpStorageID id);
-	virtual				~MtpStorageInfo();
-
-	void				read(MtpDataPacket& packet);
-
-	void				print();
-};
-
-
-#endif // _MTP_STORAGE_INFO_H
diff --git a/mtp/legacy/MtpStringBuffer.cpp b/mtp/legacy/MtpStringBuffer.cpp
deleted file mode 100644
index 8aeb3ca..0000000
--- a/mtp/legacy/MtpStringBuffer.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include <string.h>
-#include "MtpDataPacket.h"
-#include "MtpStringBuffer.h"
-
-MtpStringBuffer::MtpStringBuffer()
-	:	mCharCount(0),
-		mByteCount(1)
-{
-	mBuffer[0] = 0;
-}
-
-MtpStringBuffer::MtpStringBuffer(const char* src)
-	:	mCharCount(0),
-		mByteCount(1)
-{
-	set(src);
-}
-
-MtpStringBuffer::MtpStringBuffer(const uint16_t* src)
-	:	mCharCount(0),
-		mByteCount(1)
-{
-	set(src);
-}
-
-MtpStringBuffer::MtpStringBuffer(const MtpStringBuffer& src)
-	:   mCharCount(src.mCharCount),
-		mByteCount(src.mByteCount)
-{
-	memcpy(mBuffer, src.mBuffer, mByteCount);
-}
-
-
-MtpStringBuffer::~MtpStringBuffer() {
-}
-
-void MtpStringBuffer::set(const char* src) {
-	size_t length = strlen(src);
-	if (length >= sizeof(mBuffer))
-		length = sizeof(mBuffer) - 1;
-	memcpy(mBuffer, src, length);
-
-	// count the characters
-	int count = 0;
-	char ch;
-	while ((ch = *src++) != 0) {
-		if ((ch & 0x80) == 0) {
-			// single byte character
-		} else if ((ch & 0xE0) == 0xC0) {
-			// two byte character
-			if (! *src++) {
-				// last character was truncated, so ignore last byte
-				length--;
-				break;
-			}
-		} else if ((ch & 0xF0) == 0xE0) {
-			// 3 byte char
-			if (! *src++) {
-				// last character was truncated, so ignore last byte
-				length--;
-				break;
-			}
-			if (! *src++) {
-				// last character was truncated, so ignore last two bytes
-				length -= 2;
-				break;
-			}
-		}
-		count++;
-	}
-
-	mByteCount = length + 1;
-	mBuffer[length] = 0;
-	mCharCount = count;
-}
-
-void MtpStringBuffer::set(const uint16_t* src) {
-	int count = 0;
-	uint16_t ch;
-	uint8_t* dest = mBuffer;
-
-	while ((ch = *src++) != 0 && count < 255) {
-		if (ch >= 0x0800) {
-			*dest++ = (uint8_t)(0xE0 | (ch >> 12));
-			*dest++ = (uint8_t)(0x80 | ((ch >> 6) & 0x3F));
-			*dest++ = (uint8_t)(0x80 | (ch & 0x3F));
-		} else if (ch >= 0x80) {
-			*dest++ = (uint8_t)(0xC0 | (ch >> 6));
-			*dest++ = (uint8_t)(0x80 | (ch & 0x3F));
-		} else {
-			*dest++ = ch;
-		}
-		count++;
-	}
-	*dest++ = 0;
-	mCharCount = count;
-	mByteCount = dest - mBuffer;
-}
-
-void MtpStringBuffer::readFromPacket(MtpDataPacket* packet) {
-	int count = packet->getUInt8();
-	uint8_t* dest = mBuffer;
-	for (int i = 0; i < count; i++) {
-		uint16_t ch = packet->getUInt16();
-		if (ch >= 0x0800) {
-			*dest++ = (uint8_t)(0xE0 | (ch >> 12));
-			*dest++ = (uint8_t)(0x80 | ((ch >> 6) & 0x3F));
-			*dest++ = (uint8_t)(0x80 | (ch & 0x3F));
-		} else if (ch >= 0x80) {
-			*dest++ = (uint8_t)(0xC0 | (ch >> 6));
-			*dest++ = (uint8_t)(0x80 | (ch & 0x3F));
-		} else {
-			*dest++ = ch;
-		}
-	}
-	*dest++ = 0;
-	mCharCount = count;
-	mByteCount = dest - mBuffer;
-}
-
-void MtpStringBuffer::writeToPacket(MtpDataPacket* packet) const {
-	int count = mCharCount;
-	const uint8_t* src = mBuffer;
-	packet->putUInt8(count > 0 ? count + 1 : 0);
-
-	// expand utf8 to 16 bit chars
-	for (int i = 0; i < count; i++) {
-		uint16_t ch;
-		uint16_t ch1 = *src++;
-		if ((ch1 & 0x80) == 0) {
-			// single byte character
-			ch = ch1;
-		} else if ((ch1 & 0xE0) == 0xC0) {
-			// two byte character
-			uint16_t ch2 = *src++;
-			ch = ((ch1 & 0x1F) << 6) | (ch2 & 0x3F);
-		} else {
-			// three byte character
-			uint16_t ch2 = *src++;
-			uint16_t ch3 = *src++;
-			ch = ((ch1 & 0x0F) << 12) | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F);
-		}
-		packet->putUInt16(ch);
-	}
-	// only terminate with zero if string is not empty
-	if (count > 0)
-		packet->putUInt16(0);
-}
-
diff --git a/mtp/legacy/MtpStringBuffer.h b/mtp/legacy/MtpStringBuffer.h
deleted file mode 100644
index 68c0a0c..0000000
--- a/mtp/legacy/MtpStringBuffer.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_STRING_BUFFER_H
-#define _MTP_STRING_BUFFER_H
-
-#include <stdint.h>
-
-class MtpDataPacket;
-
-// Represents a utf8 string, with a maximum of 255 characters
-class MtpStringBuffer {
-
-private:
-	// mBuffer contains string in UTF8 format
-	// maximum 3 bytes/character, with 1 extra for zero termination
-	uint8_t			mBuffer[255 * 3 + 1];
-	int				mCharCount;
-	int				mByteCount;
-
-public:
-					MtpStringBuffer();
-					MtpStringBuffer(const char* src);
-					MtpStringBuffer(const uint16_t* src);
-					MtpStringBuffer(const MtpStringBuffer& src);
-	virtual			~MtpStringBuffer();
-
-	void			set(const char* src);
-	void			set(const uint16_t* src);
-
-	void			readFromPacket(MtpDataPacket* packet);
-	void			writeToPacket(MtpDataPacket* packet) const;
-
-	inline int		getCharCount() const { return mCharCount; }
-	inline int		getByteCount() const { return mByteCount; }
-
-	inline operator const char*() const { return (const char *)mBuffer; }
-};
-
-#endif // _MTP_STRING_BUFFER_H
diff --git a/mtp/legacy/MtpTypes.h b/mtp/legacy/MtpTypes.h
deleted file mode 100644
index 64e180c..0000000
--- a/mtp/legacy/MtpTypes.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_TYPES_H
-#define _MTP_TYPES_H
-
-#include <stdint.h>
-#include <vector>
-#include <utils/Vector.h>
-#include <utils/String8.h>
-
-typedef int32_t int128_t[4];
-typedef uint32_t uint128_t[4];
-
-typedef uint16_t MtpOperationCode;
-typedef uint16_t MtpResponseCode;
-typedef uint16_t MtpEventCode;
-typedef uint32_t MtpSessionID;
-typedef uint32_t MtpStorageID;
-typedef uint32_t MtpTransactionID;
-typedef uint16_t MtpPropertyCode;
-typedef uint16_t MtpDataType;
-typedef uint16_t MtpObjectFormat;
-typedef MtpPropertyCode MtpDeviceProperty;
-typedef MtpPropertyCode MtpObjectProperty;
-
-// object handles are unique across all storage but only within a single session.
-// object handles cannot be reused after an object is deleted.
-// values 0x00000000 and 0xFFFFFFFF are reserved for special purposes.
-typedef uint32_t MtpObjectHandle;
-
-// Special values
-#define MTP_PARENT_ROOT         0xFFFFFFFF       // parent is root of the storage
-#define kInvalidObjectHandle    0xFFFFFFFF
-
-class MtpStorage;
-class MtpDevice;
-class MtpProperty;
-
-typedef android::Vector<MtpStorage*> MtpStorageList;
-typedef android::Vector<MtpDevice*> MtpDeviceList;
-typedef android::Vector<MtpProperty*> MtpPropertyList;
-
-typedef android::Vector<uint8_t> UInt8List;
-typedef android::Vector<uint16_t> UInt16List;
-typedef android::Vector<uint32_t> UInt32List;
-typedef android::Vector<uint64_t> UInt64List;
-typedef android::Vector<int8_t> Int8List;
-typedef android::Vector<int16_t> Int16List;
-typedef android::Vector<int32_t> Int32List;
-typedef android::Vector<int64_t> Int64List;
-
-typedef UInt16List MtpObjectPropertyList;
-typedef UInt16List MtpDevicePropertyList;
-typedef UInt16List MtpObjectFormatList;
-typedef UInt32List MtpObjectHandleList;
-typedef UInt16List MtpObjectPropertyList;
-typedef UInt32List MtpStorageIDList;
-
-typedef android::String8    MtpString;
-
-
-#endif // _MTP_TYPES_H
diff --git a/mtp/legacy/MtpUtils.cpp b/mtp/legacy/MtpUtils.cpp
deleted file mode 100644
index 4ad59fd..0000000
--- a/mtp/legacy/MtpUtils.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include <stdio.h>
-#include <time.h>
-// Not available in 5.0
-//#include <cutils/tztime.h>
-#include "MtpUtils.h"
-#include "MtpDebug.h"
-
-
-/*
-DateTime strings follow a compatible subset of the definition found in ISO 8601, and
-take the form of a Unicode string formatted as: "YYYYMMDDThhmmss.s". In this
-representation, YYYY shall be replaced by the year, MM replaced by the month (01-12),
-DD replaced by the day (01-31), T is a constant character 'T' delimiting time from date,
-hh is replaced by the hour (00-23), mm is replaced by the minute (00-59), and ss by the
-second (00-59). The ".s" is optional, and represents tenths of a second.
-*/
-
-bool parseDateTime(const char* dateTime, time_t& outSeconds) {
-	int year, month, day, hour, minute, second;
-	struct tm tm;
-
-	if (sscanf(dateTime, "%04d%02d%02dT%02d%02d%02d",
-			&year, &month, &day, &hour, &minute, &second) != 6)
-		return false;
-	const char* tail = dateTime + 15;
-	// skip optional tenth of second
-	if (tail[0] == '.' && tail[1])
-		tail += 2;
-	//FIXME - support +/-hhmm
-	bool useUTC = (tail[0] == 'Z');
-
-	// hack to compute timezone
-	time_t dummy;
-	localtime_r(&dummy, &tm);
-
-	tm.tm_sec = second;
-	tm.tm_min = minute;
-	tm.tm_hour = hour;
-	tm.tm_mday = day;
-	tm.tm_mon = month - 1;  // mktime uses months in 0 - 11 range
-	tm.tm_year = year - 1900;
-	tm.tm_wday = 0;
-	tm.tm_isdst = -1;
-	//if (useUTC) {
-	outSeconds = mktime(&tm);
-	//}
-	/* mktime_tz is blocking :P
-	else {
-		outSeconds = mktime_tz(&tm, tm.tm_zone);
-	}
-	*/
-
-	return true;
-}
-
-void formatDateTime(time_t seconds, char* buffer, int bufferLength) {
-	struct tm tm;
-
-	localtime_r(&seconds, &tm);
-	snprintf(buffer, bufferLength, "%04d%02d%02dT%02d%02d%02d",
-		tm.tm_year + 1900, 
-		tm.tm_mon + 1, // localtime_r uses months in 0 - 11 range
-		tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
-}
-
diff --git a/mtp/legacy/MtpUtils.h b/mtp/legacy/MtpUtils.h
deleted file mode 100644
index 2bca94b..0000000
--- a/mtp/legacy/MtpUtils.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_UTILS_H
-#define _MTP_UTILS_H
-
-#include <stdint.h>
-
-bool parseDateTime(const char* dateTime, time_t& outSeconds);
-void formatDateTime(time_t seconds, char* buffer, int bufferLength);
-
-#endif // _MTP_UTILS_H
diff --git a/mtp/legacy/btree.cpp b/mtp/legacy/btree.cpp
deleted file mode 100644
index b73789b..0000000
--- a/mtp/legacy/btree.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- *
- * 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.
- */
-
-#include <utils/threads.h>
-#include "btree.hpp"
-#include "MtpDebug.h"
-
-// Constructor
-Tree::Tree(MtpObjectHandle handle, MtpObjectHandle parent, const std::string& name)
-	: Node(handle, parent, name), alreadyRead(false) {
-}
-
-// Destructor
-Tree::~Tree() {
-	for (std::map<MtpObjectHandle, Node*>::iterator it = entries.begin(); it != entries.end(); ++it)
-		delete it->second;
-	entries.clear();
-}
-
-int Tree::getCount(void) {
-	int count = entries.size();
-	MTPD("node count: %d\n", count);
-	return count;
-}
-
-void Tree::addEntry(Node* node) {
-	if (node->Mtpid() == 0) {
-		MTPE("Tree::addEntry: not adding node with 0 handle.\n");
-		return;
-	}
-	if (node->Mtpid() == node->getMtpParentId()) {
-		MTPE("Tree::addEntry: not adding node with handle %u == parent.\n", node->Mtpid());
-		return;
-	}
-	entries[node->Mtpid()] = node;
-}
-
-Node* Tree::findEntryByName(std::string name) {
-	for (std::map<MtpObjectHandle, Node*>::iterator it = entries.begin(); it != entries.end(); ++it)
-	{
-		Node* node = it->second;
-		if (node->getName().compare(name) == 0 && node->Mtpid() > 0)
-			return node;
-	}
-	return NULL;
-}
-
-Node* Tree::findNode(MtpObjectHandle handle) {
-	std::map<MtpObjectHandle, Node*>::iterator it = entries.find(handle);
-	if (it != entries.end())
-		return it->second;
-	return NULL;
-}
-
-void Tree::getmtpids(MtpObjectHandleList* mtpids) {
-	for (std::map<MtpObjectHandle, Node*>::iterator it = entries.begin(); it != entries.end(); ++it)
-		mtpids->push_back(it->second->Mtpid());
-}
-
-void Tree::deleteNode(MtpObjectHandle handle) {
-	std::map<MtpObjectHandle, Node*>::iterator it = entries.find(handle);
-	if (it != entries.end()) {
-		delete it->second;
-		entries.erase(it);
-	}
-}
diff --git a/mtp/legacy/btree.hpp b/mtp/legacy/btree.hpp
deleted file mode 100644
index e1aad36..0000000
--- a/mtp/legacy/btree.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- *
- * 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.
- */
-
-#ifndef BTREE_HPP
-#define BTREE_HPP
-
-#include <vector>
-#include <string>
-#include <map>
-#include "MtpTypes.h"
-
-// A directory entry
-class Node {
-	MtpObjectHandle handle;
-	MtpObjectHandle parent;
-	std::string name;	// name only without path
-
-public:
-	Node();
-	Node(MtpObjectHandle handle, MtpObjectHandle parent, const std::string& name);
-	virtual ~Node() {}
-
-	virtual bool isDir() const { return false; }
-
-	void rename(const std::string& newName);
-	MtpObjectHandle Mtpid() const;
-	MtpObjectHandle getMtpParentId() const;
-	const std::string& getName() const;
-
-	void addProperty(MtpPropertyCode property, uint64_t valueInt, std::string valueStr, MtpDataType dataType);
-	void updateProperty(MtpPropertyCode property, uint64_t valueInt, std::string valueStr, MtpDataType dataType);
-	void addProperties(const std::string& path, int storageID);
-	uint64_t getIntProperty(MtpPropertyCode property);
-	struct mtpProperty {
-		MtpPropertyCode property;
-		MtpDataType dataType;
-		uint64_t valueInt;
-		std::string valueStr;
-		mtpProperty() : property(0), dataType(0), valueInt(0) {}
-	};
-	std::vector<mtpProperty>& getMtpProps();
-	std::vector<mtpProperty> mtpProp;
-	const mtpProperty& getProperty(MtpPropertyCode property);
-};
-
-// A directory
-class Tree : public Node {
-	std::map<MtpObjectHandle, Node*> entries;
-	bool alreadyRead;
-public:
-	Tree(MtpObjectHandle handle, MtpObjectHandle parent, const std::string& name);
-	~Tree();
-
-	virtual bool isDir() const { return true; }
-
-	void addEntry(Node* node);
-	Node* findNode(MtpObjectHandle handle);
-	void getmtpids(MtpObjectHandleList* mtpids);
-	void deleteNode(MtpObjectHandle handle);
-	std::string getPath(Node* node);
-	int getMtpParentId() { return Node::getMtpParentId(); }
-	int getMtpParentId(Node* node);
-	Node* findEntryByName(std::string name);
-	int getCount();
-	bool wasAlreadyRead() const { return alreadyRead; }
-	void setAlreadyRead(bool b) { alreadyRead = b; }
-};
-
-#endif
diff --git a/mtp/legacy/mtp.h b/mtp/legacy/mtp.h
deleted file mode 100644
index c329331..0000000
--- a/mtp/legacy/mtp.h
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef _MTP_H
-#define _MTP_H
-
-#include <stdint.h>
-#include <stdlib.h>
-
-#define MTP_STANDARD_VERSION            100
-
-// Container Types
-#define MTP_CONTAINER_TYPE_UNDEFINED    0
-#define MTP_CONTAINER_TYPE_COMMAND      1
-#define MTP_CONTAINER_TYPE_DATA         2
-#define MTP_CONTAINER_TYPE_RESPONSE     3
-#define MTP_CONTAINER_TYPE_EVENT        4
-
-// Container Offsets
-#define MTP_CONTAINER_LENGTH_OFFSET             0
-#define MTP_CONTAINER_TYPE_OFFSET               4
-#define MTP_CONTAINER_CODE_OFFSET               6
-#define MTP_CONTAINER_TRANSACTION_ID_OFFSET     8
-#define MTP_CONTAINER_PARAMETER_OFFSET          12
-#define MTP_CONTAINER_HEADER_SIZE               12
-
-// MTP Data Types
-#define MTP_TYPE_UNDEFINED      0x0000          // Undefined
-#define MTP_TYPE_INT8           0x0001          // Signed 8-bit integer
-#define MTP_TYPE_UINT8          0x0002          // Unsigned 8-bit integer
-#define MTP_TYPE_INT16          0x0003          // Signed 16-bit integer
-#define MTP_TYPE_UINT16         0x0004          // Unsigned 16-bit integer
-#define MTP_TYPE_INT32          0x0005          // Signed 32-bit integer
-#define MTP_TYPE_UINT32         0x0006          // Unsigned 32-bit integer
-#define MTP_TYPE_INT64          0x0007          // Signed 64-bit integer
-#define MTP_TYPE_UINT64         0x0008          // Unsigned 64-bit integer
-#define MTP_TYPE_INT128         0x0009          // Signed 128-bit integer
-#define MTP_TYPE_UINT128        0x000A          // Unsigned 128-bit integer
-#define MTP_TYPE_AINT8          0x4001          // Array of signed 8-bit integers
-#define MTP_TYPE_AUINT8         0x4002          // Array of unsigned 8-bit integers
-#define MTP_TYPE_AINT16         0x4003          // Array of signed 16-bit integers
-#define MTP_TYPE_AUINT16        0x4004          // Array of unsigned 16-bit integers
-#define MTP_TYPE_AINT32         0x4005          // Array of signed 32-bit integers
-#define MTP_TYPE_AUINT32        0x4006          // Array of unsigned 32-bit integers
-#define MTP_TYPE_AINT64         0x4007          // Array of signed 64-bit integers
-#define MTP_TYPE_AUINT64        0x4008          // Array of unsigned 64-bit integers
-#define MTP_TYPE_AINT128        0x4009          // Array of signed 128-bit integers
-#define MTP_TYPE_AUINT128       0x400A          // Array of unsigned 128-bit integers
-#define MTP_TYPE_STR            0xFFFF          // Variable-length Unicode string
-
-// MTP Format Codes
-#define MTP_FORMAT_UNDEFINED                            0x3000   // Undefined object
-#define MTP_FORMAT_ASSOCIATION                          0x3001   // Association (for example, a folder)
-#define MTP_FORMAT_SCRIPT                               0x3002   // Device model-specific script
-#define MTP_FORMAT_EXECUTABLE                           0x3003   // Device model-specific binary executable
-#define MTP_FORMAT_TEXT                                 0x3004   // Text file
-#define MTP_FORMAT_HTML                                 0x3005   // Hypertext Markup Language file (text)
-#define MTP_FORMAT_DPOF                                 0x3006   // Digital Print Order Format file (text)
-#define MTP_FORMAT_AIFF                                 0x3007   // Audio clip
-#define MTP_FORMAT_WAV                                  0x3008   // Audio clip
-#define MTP_FORMAT_MP3                                  0x3009   // Audio clip
-#define MTP_FORMAT_AVI                                  0x300A   // Video clip
-#define MTP_FORMAT_MPEG                                 0x300B   // Video clip
-#define MTP_FORMAT_ASF                                  0x300C   // Microsoft Advanced Streaming Format (video)
-#define MTP_FORMAT_DEFINED                              0x3800   // Unknown image object
-#define MTP_FORMAT_EXIF_JPEG                            0x3801   // Exchangeable File Format, JEIDA standard
-#define MTP_FORMAT_TIFF_EP                              0x3802   // Tag Image File Format for Electronic Photography
-#define MTP_FORMAT_FLASHPIX                             0x3803   // Structured Storage Image Format
-#define MTP_FORMAT_BMP                                  0x3804   // Microsoft Windows Bitmap file
-#define MTP_FORMAT_CIFF                                 0x3805   // Canon Camera Image File Format
-#define MTP_FORMAT_GIF                                  0x3807   // Graphics Interchange Format
-#define MTP_FORMAT_JFIF                                 0x3808   // JPEG File Interchange Format
-#define MTP_FORMAT_CD                                   0x3809   // PhotoCD Image Pac
-#define MTP_FORMAT_PICT                                 0x380A   // Quickdraw Image Format
-#define MTP_FORMAT_PNG                                  0x380B   // Portable Network Graphics
-#define MTP_FORMAT_TIFF                                 0x380D   // Tag Image File Format
-#define MTP_FORMAT_TIFF_IT                              0x380E   // Tag Image File Format for Information Technology (graphic arts)
-#define MTP_FORMAT_JP2                                  0x380F   // JPEG2000 Baseline File Format
-#define MTP_FORMAT_JPX                                  0x3810   // JPEG2000 Extended File Format
-#define MTP_FORMAT_UNDEFINED_FIRMWARE                   0xB802
-#define MTP_FORMAT_WINDOWS_IMAGE_FORMAT                 0xB881
-#define MTP_FORMAT_UNDEFINED_AUDIO                      0xB900
-#define MTP_FORMAT_WMA                                  0xB901
-#define MTP_FORMAT_OGG                                  0xB902
-#define MTP_FORMAT_AAC                                  0xB903
-#define MTP_FORMAT_AUDIBLE                              0xB904
-#define MTP_FORMAT_FLAC                                 0xB906
-#define MTP_FORMAT_UNDEFINED_VIDEO                      0xB980
-#define MTP_FORMAT_WMV                                  0xB981
-#define MTP_FORMAT_MP4_CONTAINER                        0xB982  // ISO 14496-1
-#define MTP_FORMAT_MP2                                  0xB983
-#define MTP_FORMAT_3GP_CONTAINER                        0xB984  // 3GPP file format. Details: http://www.3gpp.org/ftp/Specs/html-info/26244.htm (page title - \u201cTransparent end-to-end packet switched streaming service, 3GPP file format\u201d).
-#define MTP_FORMAT_UNDEFINED_COLLECTION                 0xBA00
-#define MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM            0xBA01
-#define MTP_FORMAT_ABSTRACT_IMAGE_ALBUM                 0xBA02
-#define MTP_FORMAT_ABSTRACT_AUDIO_ALBUM                 0xBA03
-#define MTP_FORMAT_ABSTRACT_VIDEO_ALBUM                 0xBA04
-#define MTP_FORMAT_ABSTRACT_AV_PLAYLIST                 0xBA05
-#define MTP_FORMAT_ABSTRACT_CONTACT_GROUP               0xBA06
-#define MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER              0xBA07
-#define MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION        0xBA08
-#define MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST              0xBA09
-#define MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST              0xBA0A
-#define MTP_FORMAT_ABSTRACT_MEDIACAST                   0xBA0B // For use with mediacasts; references multimedia enclosures of RSS feeds or episodic content
-#define MTP_FORMAT_WPL_PLAYLIST                         0xBA10
-#define MTP_FORMAT_M3U_PLAYLIST                         0xBA11
-#define MTP_FORMAT_MPL_PLAYLIST                         0xBA12
-#define MTP_FORMAT_ASX_PLAYLIST                         0xBA13
-#define MTP_FORMAT_PLS_PLAYLIST                         0xBA14
-#define MTP_FORMAT_UNDEFINED_DOCUMENT                   0xBA80
-#define MTP_FORMAT_ABSTRACT_DOCUMENT                    0xBA81
-#define MTP_FORMAT_XML_DOCUMENT                         0xBA82
-#define MTP_FORMAT_MS_WORD_DOCUMENT                     0xBA83
-#define MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT           0xBA84
-#define MTP_FORMAT_MS_EXCEL_SPREADSHEET                 0xBA85
-#define MTP_FORMAT_MS_POWERPOINT_PRESENTATION           0xBA86
-#define MTP_FORMAT_UNDEFINED_MESSAGE                    0xBB00
-#define MTP_FORMAT_ABSTRACT_MESSSAGE                    0xBB01
-#define MTP_FORMAT_UNDEFINED_CONTACT                    0xBB80
-#define MTP_FORMAT_ABSTRACT_CONTACT                     0xBB81
-#define MTP_FORMAT_VCARD_2                              0xBB82
-
-// MTP Object Property Codes
-#define MTP_PROPERTY_STORAGE_ID                             0xDC01
-#define MTP_PROPERTY_OBJECT_FORMAT                          0xDC02
-#define MTP_PROPERTY_PROTECTION_STATUS                      0xDC03
-#define MTP_PROPERTY_OBJECT_SIZE                            0xDC04
-#define MTP_PROPERTY_ASSOCIATION_TYPE                       0xDC05
-#define MTP_PROPERTY_ASSOCIATION_DESC                       0xDC06
-#define MTP_PROPERTY_OBJECT_FILE_NAME                       0xDC07
-#define MTP_PROPERTY_DATE_CREATED                           0xDC08
-#define MTP_PROPERTY_DATE_MODIFIED                          0xDC09
-#define MTP_PROPERTY_KEYWORDS                               0xDC0A
-#define MTP_PROPERTY_PARENT_OBJECT                          0xDC0B
-#define MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS                0xDC0C
-#define MTP_PROPERTY_HIDDEN                                 0xDC0D
-#define MTP_PROPERTY_SYSTEM_OBJECT                          0xDC0E
-#define MTP_PROPERTY_PERSISTENT_UID                         0xDC41
-#define MTP_PROPERTY_SYNC_ID                                0xDC42
-#define MTP_PROPERTY_PROPERTY_BAG                           0xDC43
-#define MTP_PROPERTY_NAME                                   0xDC44
-#define MTP_PROPERTY_CREATED_BY                             0xDC45
-#define MTP_PROPERTY_ARTIST                                 0xDC46
-#define MTP_PROPERTY_DATE_AUTHORED                          0xDC47
-#define MTP_PROPERTY_DESCRIPTION                            0xDC48
-#define MTP_PROPERTY_URL_REFERENCE                          0xDC49
-#define MTP_PROPERTY_LANGUAGE_LOCALE                        0xDC4A
-#define MTP_PROPERTY_COPYRIGHT_INFORMATION                  0xDC4B
-#define MTP_PROPERTY_SOURCE                                 0xDC4C
-#define MTP_PROPERTY_ORIGIN_LOCATION                        0xDC4D
-#define MTP_PROPERTY_DATE_ADDED                             0xDC4E
-#define MTP_PROPERTY_NON_CONSUMABLE                         0xDC4F
-#define MTP_PROPERTY_CORRUPT_UNPLAYABLE                     0xDC50
-#define MTP_PROPERTY_PRODUCER_SERIAL_NUMBER                 0xDC51
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT           0xDC81
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE             0xDC82
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT           0xDC83
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH            0xDC84
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION         0xDC85
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA             0xDC86
-#define MTP_PROPERTY_WIDTH                                  0xDC87
-#define MTP_PROPERTY_HEIGHT                                 0xDC88
-#define MTP_PROPERTY_DURATION                               0xDC89
-#define MTP_PROPERTY_RATING                                 0xDC8A
-#define MTP_PROPERTY_TRACK                                  0xDC8B
-#define MTP_PROPERTY_GENRE                                  0xDC8C
-#define MTP_PROPERTY_CREDITS                                0xDC8D
-#define MTP_PROPERTY_LYRICS                                 0xDC8E
-#define MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID                0xDC8F
-#define MTP_PROPERTY_PRODUCED_BY                            0xDC90
-#define MTP_PROPERTY_USE_COUNT                              0xDC91
-#define MTP_PROPERTY_SKIP_COUNT                             0xDC92
-#define MTP_PROPERTY_LAST_ACCESSED                          0xDC93
-#define MTP_PROPERTY_PARENTAL_RATING                        0xDC94
-#define MTP_PROPERTY_META_GENRE                             0xDC95
-#define MTP_PROPERTY_COMPOSER                               0xDC96
-#define MTP_PROPERTY_EFFECTIVE_RATING                       0xDC97
-#define MTP_PROPERTY_SUBTITLE                               0xDC98
-#define MTP_PROPERTY_ORIGINAL_RELEASE_DATE                  0xDC99
-#define MTP_PROPERTY_ALBUM_NAME                             0xDC9A
-#define MTP_PROPERTY_ALBUM_ARTIST                           0xDC9B
-#define MTP_PROPERTY_MOOD                                   0xDC9C
-#define MTP_PROPERTY_DRM_STATUS                             0xDC9D
-#define MTP_PROPERTY_SUB_DESCRIPTION                        0xDC9E
-#define MTP_PROPERTY_IS_CROPPED                             0xDCD1
-#define MTP_PROPERTY_IS_COLOUR_CORRECTED                    0xDCD2
-#define MTP_PROPERTY_IMAGE_BIT_DEPTH                        0xDCD3
-#define MTP_PROPERTY_F_NUMBER                               0xDCD4
-#define MTP_PROPERTY_EXPOSURE_TIME                          0xDCD5
-#define MTP_PROPERTY_EXPOSURE_INDEX                         0xDCD6
-#define MTP_PROPERTY_TOTAL_BITRATE                          0xDE91
-#define MTP_PROPERTY_BITRATE_TYPE                           0xDE92
-#define MTP_PROPERTY_SAMPLE_RATE                            0xDE93
-#define MTP_PROPERTY_NUMBER_OF_CHANNELS                     0xDE94
-#define MTP_PROPERTY_AUDIO_BIT_DEPTH                        0xDE95
-#define MTP_PROPERTY_SCAN_TYPE                              0xDE97
-#define MTP_PROPERTY_AUDIO_WAVE_CODEC                       0xDE99
-#define MTP_PROPERTY_AUDIO_BITRATE                          0xDE9A
-#define MTP_PROPERTY_VIDEO_FOURCC_CODEC                     0xDE9B
-#define MTP_PROPERTY_VIDEO_BITRATE                          0xDE9C
-#define MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS            0xDE9D
-#define MTP_PROPERTY_KEYFRAME_DISTANCE                      0xDE9E
-#define MTP_PROPERTY_BUFFER_SIZE                            0xDE9F
-#define MTP_PROPERTY_ENCODING_QUALITY                       0xDEA0
-#define MTP_PROPERTY_ENCODING_PROFILE                       0xDEA1
-#define MTP_PROPERTY_DISPLAY_NAME                           0xDCE0
-#define MTP_PROPERTY_BODY_TEXT                              0xDCE1
-#define MTP_PROPERTY_SUBJECT                                0xDCE2
-#define MTP_PROPERTY_PRIORITY                               0xDCE3
-#define MTP_PROPERTY_GIVEN_NAME                             0xDD00
-#define MTP_PROPERTY_MIDDLE_NAMES                           0xDD01
-#define MTP_PROPERTY_FAMILY_NAME                            0xDD02
-#define MTP_PROPERTY_PREFIX                                 0xDD03
-#define MTP_PROPERTY_SUFFIX                                 0xDD04
-#define MTP_PROPERTY_PHONETIC_GIVEN_NAME                    0xDD05
-#define MTP_PROPERTY_PHONETIC_FAMILY_NAME                   0xDD06
-#define MTP_PROPERTY_EMAIL_PRIMARY                          0xDD07
-#define MTP_PROPERTY_EMAIL_PERSONAL_1                       0xDD08
-#define MTP_PROPERTY_EMAIL_PERSONAL_2                       0xDD09
-#define MTP_PROPERTY_EMAIL_BUSINESS_1                       0xDD0A
-#define MTP_PROPERTY_EMAIL_BUSINESS_2                       0xDD0B
-#define MTP_PROPERTY_EMAIL_OTHERS                           0xDD0C
-#define MTP_PROPERTY_PHONE_NUMBER_PRIMARY                   0xDD0D
-#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL                  0xDD0E
-#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2                0xDD0F
-#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS                  0xDD10
-#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2                0xDD11
-#define MTP_PROPERTY_PHONE_NUMBER_MOBILE                    0xDD12
-#define MTP_PROPERTY_PHONE_NUMBER_MOBILE_2                  0xDD13
-#define MTP_PROPERTY_FAX_NUMBER_PRIMARY                     0xDD14
-#define MTP_PROPERTY_FAX_NUMBER_PERSONAL                    0xDD15
-#define MTP_PROPERTY_FAX_NUMBER_BUSINESS                    0xDD16
-#define MTP_PROPERTY_PAGER_NUMBER                           0xDD17
-#define MTP_PROPERTY_PHONE_NUMBER_OTHERS                    0xDD18
-#define MTP_PROPERTY_PRIMARY_WEB_ADDRESS                    0xDD19
-#define MTP_PROPERTY_PERSONAL_WEB_ADDRESS                   0xDD1A
-#define MTP_PROPERTY_BUSINESS_WEB_ADDRESS                   0xDD1B
-#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS              0xDD1C
-#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_2            0xDD1D
-#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_3            0xDD1E
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL           0xDD1F
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1         0xDD20
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2         0xDD21
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY           0xDD22
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION         0xDD23
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE    0xDD24
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY        0xDD25
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL           0xDD26
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1         0xDD27
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2         0xDD28
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY           0xDD29
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION         0xDD2A
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE    0xDD2B
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY        0xDD2C
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL              0xDD2D
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1            0xDD2E
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2            0xDD2F
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY              0xDD30
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION            0xDD31
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE       0xDD32
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY           0xDD33
-#define MTP_PROPERTY_ORGANIZATION_NAME                      0xDD34
-#define MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME             0xDD35
-#define MTP_PROPERTY_ROLE                                   0xDD36
-#define MTP_PROPERTY_BIRTHDATE                              0xDD37
-#define MTP_PROPERTY_MESSAGE_TO                             0xDD40
-#define MTP_PROPERTY_MESSAGE_CC                             0xDD41
-#define MTP_PROPERTY_MESSAGE_BCC                            0xDD42
-#define MTP_PROPERTY_MESSAGE_READ                           0xDD43
-#define MTP_PROPERTY_MESSAGE_RECEIVED_TIME                  0xDD44
-#define MTP_PROPERTY_MESSAGE_SENDER                         0xDD45
-#define MTP_PROPERTY_ACTIVITY_BEGIN_TIME                    0xDD50
-#define MTP_PROPERTY_ACTIVITY_END_TIME                      0xDD51
-#define MTP_PROPERTY_ACTIVITY_LOCATION                      0xDD52
-#define MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES            0xDD54
-#define MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES            0xDD55
-#define MTP_PROPERTY_ACTIVITY_RESOURCES                     0xDD56
-#define MTP_PROPERTY_ACTIVITY_ACCEPTED                      0xDD57
-#define MTP_PROPERTY_ACTIVITY_TENTATIVE                     0xDD58
-#define MTP_PROPERTY_ACTIVITY_DECLINED                      0xDD59
-#define MTP_PROPERTY_ACTIVITY_REMAINDER_TIME                0xDD5A
-#define MTP_PROPERTY_ACTIVITY_OWNER                         0xDD5B
-#define MTP_PROPERTY_ACTIVITY_STATUS                        0xDD5C
-#define MTP_PROPERTY_OWNER                                  0xDD5D
-#define MTP_PROPERTY_EDITOR                                 0xDD5E
-#define MTP_PROPERTY_WEBMASTER                              0xDD5F
-#define MTP_PROPERTY_URL_SOURCE                             0xDD60
-#define MTP_PROPERTY_URL_DESTINATION                        0xDD61
-#define MTP_PROPERTY_TIME_BOOKMARK                          0xDD62
-#define MTP_PROPERTY_OBJECT_BOOKMARK                        0xDD63
-#define MTP_PROPERTY_BYTE_BOOKMARK                          0xDD64
-#define MTP_PROPERTY_LAST_BUILD_DATE                        0xDD70
-#define MTP_PROPERTY_TIME_TO_LIVE                           0xDD71
-#define MTP_PROPERTY_MEDIA_GUID                             0xDD72
-
-// MTP Device Property Codes
-#define MTP_DEVICE_PROPERTY_UNDEFINED                       0x5000
-#define MTP_DEVICE_PROPERTY_BATTERY_LEVEL                   0x5001
-#define MTP_DEVICE_PROPERTY_FUNCTIONAL_MODE                 0x5002
-#define MTP_DEVICE_PROPERTY_IMAGE_SIZE                      0x5003
-#define MTP_DEVICE_PROPERTY_COMPRESSION_SETTING             0x5004
-#define MTP_DEVICE_PROPERTY_WHITE_BALANCE                   0x5005
-#define MTP_DEVICE_PROPERTY_RGB_GAIN                        0x5006
-#define MTP_DEVICE_PROPERTY_F_NUMBER                        0x5007
-#define MTP_DEVICE_PROPERTY_FOCAL_LENGTH                    0x5008
-#define MTP_DEVICE_PROPERTY_FOCUS_DISTANCE                  0x5009
-#define MTP_DEVICE_PROPERTY_FOCUS_MODE                      0x500A
-#define MTP_DEVICE_PROPERTY_EXPOSURE_METERING_MODE          0x500B
-#define MTP_DEVICE_PROPERTY_FLASH_MODE                      0x500C
-#define MTP_DEVICE_PROPERTY_EXPOSURE_TIME                   0x500D
-#define MTP_DEVICE_PROPERTY_EXPOSURE_PROGRAM_MODE           0x500E
-#define MTP_DEVICE_PROPERTY_EXPOSURE_INDEX                  0x500F
-#define MTP_DEVICE_PROPERTY_EXPOSURE_BIAS_COMPENSATION      0x5010
-#define MTP_DEVICE_PROPERTY_DATETIME                        0x5011
-#define MTP_DEVICE_PROPERTY_CAPTURE_DELAY                   0x5012
-#define MTP_DEVICE_PROPERTY_STILL_CAPTURE_MODE              0x5013
-#define MTP_DEVICE_PROPERTY_CONTRAST                        0x5014
-#define MTP_DEVICE_PROPERTY_SHARPNESS                       0x5015
-#define MTP_DEVICE_PROPERTY_DIGITAL_ZOOM                    0x5016
-#define MTP_DEVICE_PROPERTY_EFFECT_MODE                     0x5017
-#define MTP_DEVICE_PROPERTY_BURST_NUMBER                    0x5018
-#define MTP_DEVICE_PROPERTY_BURST_INTERVAL                  0x5019
-#define MTP_DEVICE_PROPERTY_TIMELAPSE_NUMBER                0x501A
-#define MTP_DEVICE_PROPERTY_TIMELAPSE_INTERVAL              0x501B
-#define MTP_DEVICE_PROPERTY_FOCUS_METERING_MODE             0x501C
-#define MTP_DEVICE_PROPERTY_UPLOAD_URL                      0x501D
-#define MTP_DEVICE_PROPERTY_ARTIST                          0x501E
-#define MTP_DEVICE_PROPERTY_COPYRIGHT_INFO                  0x501F
-#define MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER         0xD401
-#define MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME            0xD402
-#define MTP_DEVICE_PROPERTY_VOLUME                          0xD403
-#define MTP_DEVICE_PROPERTY_SUPPORTED_FORMATS_ORDERED       0xD404
-#define MTP_DEVICE_PROPERTY_DEVICE_ICON                     0xD405
-#define MTP_DEVICE_PROPERTY_PLAYBACK_RATE                   0xD410
-#define MTP_DEVICE_PROPERTY_PLAYBACK_OBJECT                 0xD411
-#define MTP_DEVICE_PROPERTY_PLAYBACK_CONTAINER_INDEX        0xD412
-#define MTP_DEVICE_PROPERTY_SESSION_INITIATOR_VERSION_INFO  0xD406
-#define MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE           0xD407
-
-// MTP Operation Codes
-#define MTP_OPERATION_GET_DEVICE_INFO                       0x1001
-#define MTP_OPERATION_OPEN_SESSION                          0x1002
-#define MTP_OPERATION_CLOSE_SESSION                         0x1003
-#define MTP_OPERATION_GET_STORAGE_IDS                       0x1004
-#define MTP_OPERATION_GET_STORAGE_INFO                      0x1005
-#define MTP_OPERATION_GET_NUM_OBJECTS                       0x1006
-#define MTP_OPERATION_GET_OBJECT_HANDLES                    0x1007
-#define MTP_OPERATION_GET_OBJECT_INFO                       0x1008
-#define MTP_OPERATION_GET_OBJECT                            0x1009
-#define MTP_OPERATION_GET_THUMB                             0x100A
-#define MTP_OPERATION_DELETE_OBJECT                         0x100B
-#define MTP_OPERATION_SEND_OBJECT_INFO                      0x100C
-#define MTP_OPERATION_SEND_OBJECT                           0x100D
-#define MTP_OPERATION_INITIATE_CAPTURE                      0x100E
-#define MTP_OPERATION_FORMAT_STORE                          0x100F
-#define MTP_OPERATION_RESET_DEVICE                          0x1010
-#define MTP_OPERATION_SELF_TEST                             0x1011
-#define MTP_OPERATION_SET_OBJECT_PROTECTION                 0x1012
-#define MTP_OPERATION_POWER_DOWN                            0x1013
-#define MTP_OPERATION_GET_DEVICE_PROP_DESC                  0x1014
-#define MTP_OPERATION_GET_DEVICE_PROP_VALUE                 0x1015
-#define MTP_OPERATION_SET_DEVICE_PROP_VALUE                 0x1016
-#define MTP_OPERATION_RESET_DEVICE_PROP_VALUE               0x1017
-#define MTP_OPERATION_TERMINATE_OPEN_CAPTURE                0x1018
-#define MTP_OPERATION_MOVE_OBJECT                           0x1019
-#define MTP_OPERATION_COPY_OBJECT                           0x101A
-#define MTP_OPERATION_GET_PARTIAL_OBJECT                    0x101B
-#define MTP_OPERATION_INITIATE_OPEN_CAPTURE                 0x101C
-#define MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED            0x9801
-#define MTP_OPERATION_GET_OBJECT_PROP_DESC                  0x9802
-#define MTP_OPERATION_GET_OBJECT_PROP_VALUE                 0x9803
-#define MTP_OPERATION_SET_OBJECT_PROP_VALUE                 0x9804
-#define MTP_OPERATION_GET_OBJECT_PROP_LIST                  0x9805
-#define MTP_OPERATION_SET_OBJECT_PROP_LIST                  0x9806
-#define MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC          0x9807
-#define MTP_OPERATION_SEND_OBJECT_PROP_LIST                 0x9808
-#define MTP_OPERATION_GET_OBJECT_REFERENCES                 0x9810
-#define MTP_OPERATION_SET_OBJECT_REFERENCES                 0x9811
-#define MTP_OPERATION_SKIP                                  0x9820
-
-// Android extensions for direct file IO
-
-// Same as GetPartialObject, but with 64 bit offset
-#define MTP_OPERATION_GET_PARTIAL_OBJECT_64                 0x95C1
-// Same as GetPartialObject64, but copying host to device
-#define MTP_OPERATION_SEND_PARTIAL_OBJECT                   0x95C2
-// Truncates file to 64 bit length
-#define MTP_OPERATION_TRUNCATE_OBJECT                       0x95C3
-// Must be called before using SendPartialObject and TruncateObject
-#define MTP_OPERATION_BEGIN_EDIT_OBJECT                     0x95C4
-// Called to commit changes made by SendPartialObject and TruncateObject
-#define MTP_OPERATION_END_EDIT_OBJECT                       0x95C5
-
-// MTP Response Codes
-#define MTP_RESPONSE_UNDEFINED                                  0x2000
-#define MTP_RESPONSE_OK                                         0x2001
-#define MTP_RESPONSE_GENERAL_ERROR                              0x2002
-#define MTP_RESPONSE_SESSION_NOT_OPEN                           0x2003
-#define MTP_RESPONSE_INVALID_TRANSACTION_ID                     0x2004
-#define MTP_RESPONSE_OPERATION_NOT_SUPPORTED                    0x2005
-#define MTP_RESPONSE_PARAMETER_NOT_SUPPORTED                    0x2006
-#define MTP_RESPONSE_INCOMPLETE_TRANSFER                        0x2007
-#define MTP_RESPONSE_INVALID_STORAGE_ID                         0x2008
-#define MTP_RESPONSE_INVALID_OBJECT_HANDLE                      0x2009
-#define MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED                  0x200A
-#define MTP_RESPONSE_INVALID_OBJECT_FORMAT_CODE                 0x200B
-#define MTP_RESPONSE_STORAGE_FULL                               0x200C
-#define MTP_RESPONSE_OBJECT_WRITE_PROTECTED                     0x200D
-#define MTP_RESPONSE_STORE_READ_ONLY                            0x200E
-#define MTP_RESPONSE_ACCESS_DENIED                              0x200F
-#define MTP_RESPONSE_NO_THUMBNAIL_PRESENT                       0x2010
-#define MTP_RESPONSE_SELF_TEST_FAILED                           0x2011
-#define MTP_RESPONSE_PARTIAL_DELETION                           0x2012
-#define MTP_RESPONSE_STORE_NOT_AVAILABLE                        0x2013
-#define MTP_RESPONSE_SPECIFICATION_BY_FORMAT_UNSUPPORTED        0x2014
-#define MTP_RESPONSE_NO_VALID_OBJECT_INFO                       0x2015
-#define MTP_RESPONSE_INVALID_CODE_FORMAT                        0x2016
-#define MTP_RESPONSE_UNKNOWN_VENDOR_CODE                        0x2017
-#define MTP_RESPONSE_CAPTURE_ALREADY_TERMINATED                 0x2018
-#define MTP_RESPONSE_DEVICE_BUSY                                0x2019
-#define MTP_RESPONSE_INVALID_PARENT_OBJECT                      0x201A
-#define MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT                 0x201B
-#define MTP_RESPONSE_INVALID_DEVICE_PROP_VALUE                  0x201C
-#define MTP_RESPONSE_INVALID_PARAMETER                          0x201D
-#define MTP_RESPONSE_SESSION_ALREADY_OPEN                       0x201E
-#define MTP_RESPONSE_TRANSACTION_CANCELLED                      0x201F
-#define MTP_RESPONSE_SPECIFICATION_OF_DESTINATION_UNSUPPORTED   0x2020
-#define MTP_RESPONSE_INVALID_OBJECT_PROP_CODE                   0xA801
-#define MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT                 0xA802
-#define MTP_RESPONSE_INVALID_OBJECT_PROP_VALUE                  0xA803
-#define MTP_RESPONSE_INVALID_OBJECT_REFERENCE                   0xA804
-#define MTP_RESPONSE_GROUP_NOT_SUPPORTED                        0xA805
-#define MTP_RESPONSE_INVALID_DATASET                            0xA806
-#define MTP_RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED         0xA807
-#define MTP_RESPONSE_SPECIFICATION_BY_DEPTH_UNSUPPORTED         0xA808
-#define MTP_RESPONSE_OBJECT_TOO_LARGE                           0xA809
-#define MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED                  0xA80A
-
-// MTP Event Codes
-#define MTP_EVENT_UNDEFINED                         0x4000
-#define MTP_EVENT_CANCEL_TRANSACTION                0x4001
-#define MTP_EVENT_OBJECT_ADDED                      0x4002
-#define MTP_EVENT_OBJECT_REMOVED                    0x4003
-#define MTP_EVENT_STORE_ADDED                       0x4004
-#define MTP_EVENT_STORE_REMOVED                     0x4005
-#define MTP_EVENT_DEVICE_PROP_CHANGED               0x4006
-#define MTP_EVENT_OBJECT_INFO_CHANGED               0x4007
-#define MTP_EVENT_DEVICE_INFO_CHANGED               0x4008
-#define MTP_EVENT_REQUEST_OBJECT_TRANSFER           0x4009
-#define MTP_EVENT_STORE_FULL                        0x400A
-#define MTP_EVENT_DEVICE_RESET                      0x400B
-#define MTP_EVENT_STORAGE_INFO_CHANGED              0x400C
-#define MTP_EVENT_CAPTURE_COMPLETE                  0x400D
-#define MTP_EVENT_UNREPORTED_STATUS                 0x400E
-#define MTP_EVENT_OBJECT_PROP_CHANGED               0xC801
-#define MTP_EVENT_OBJECT_PROP_DESC_CHANGED          0xC802
-#define MTP_EVENT_OBJECT_REFERENCES_CHANGED         0xC803
-
-// Storage Type
-#define MTP_STORAGE_FIXED_ROM                       0x0001
-#define MTP_STORAGE_REMOVABLE_ROM                   0x0002
-#define MTP_STORAGE_FIXED_RAM                       0x0003
-#define MTP_STORAGE_REMOVABLE_RAM                   0x0004
-
-// Storage File System
-#define MTP_STORAGE_FILESYSTEM_FLAT                 0x0001
-#define MTP_STORAGE_FILESYSTEM_HIERARCHICAL         0x0002
-#define MTP_STORAGE_FILESYSTEM_DCF                  0x0003
-
-// Storage Access Capability
-#define MTP_STORAGE_READ_WRITE                      0x0000
-#define MTP_STORAGE_READ_ONLY_WITHOUT_DELETE        0x0001
-#define MTP_STORAGE_READ_ONLY_WITH_DELETE           0x0002
-
-// Association Type
-#define MTP_ASSOCIATION_TYPE_UNDEFINED              0x0000
-#define MTP_ASSOCIATION_TYPE_GENERIC_FOLDER         0x0001
-
-// Supported Playback Formats
-#define SUPPORTED_PLAYBACK_FORMAT_UNDEFINED 0x3000
-/** Format code for associations (folders and directories) */
-#define SUPPORTED_PLAYBACK_FORMAT_ASSOCIATION 0x3001
-/** Format code for script files */
-#define SUPPORTED_PLAYBACK_FORMAT_SCRIPT 0x3002
-/** Format code for executable files */
-#define SUPPORTED_PLAYBACK_FORMAT_EXECUTABLE 0x3003
-/** Format code for text files */
-#define SUPPORTED_PLAYBACK_FORMAT_TEXT 0x3004
-/** Format code for HTML files */
-#define SUPPORTED_PLAYBACK_FORMAT_HTML 0x3005
-/** Format code for DPOF files */
-#define SUPPORTED_PLAYBACK_FORMAT_DPOF 0x3006
-/** Format code for AIFF audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_AIFF 0x3007
-/** Format code for WAV audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_WAV 0x3008
-/** Format code for MP3 audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_MP3 0x3009
-/** Format code for AVI video files */
-#define SUPPORTED_PLAYBACK_FORMAT_AVI 0x300A
-/** Format code for MPEG video files */
-#define SUPPORTED_PLAYBACK_FORMAT_MPEG 0x300B
-/** Format code for ASF files */
-#define SUPPORTED_PLAYBACK_FORMAT_ASF 0x300C
-/** Format code for JPEG image files */
-#define SUPPORTED_PLAYBACK_FORMAT_EXIF_JPEG 0x3801
-/** Format code for TIFF EP image files */
-#define SUPPORTED_PLAYBACK_FORMAT_TIFF_EP 0x3802
-/** Format code for BMP image files */
-#define SUPPORTED_PLAYBACK_FORMAT_BMP 0x3804
-/** Format code for GIF image files */
-#define SUPPORTED_PLAYBACK_FORMAT_GIF 0x3807
-/** Format code for JFIF image files */
-#define SUPPORTED_PLAYBACK_FORMAT_JFIF 0x3808
-/** Format code for PICT image files */
-#define SUPPORTED_PLAYBACK_FORMAT_PICT 0x380A
-/** Format code for PNG image files */
-#define SUPPORTED_PLAYBACK_FORMAT_PNG 0x380B
-/** Format code for TIFF image files */
-#define SUPPORTED_PLAYBACK_FORMAT_TIFF 0x380D
-/** Format code for JP2 files */
-#define SUPPORTED_PLAYBACK_FORMAT_JP2 0x380F
-/** Format code for JPX files */
-#define SUPPORTED_PLAYBACK_FORMAT_JPX 0x3810
-/** Format code for firmware files */
-#define SUPPORTED_PLAYBACK_FORMAT_UNDEFINED_FIRMWARE 0xB802
-/** Format code for Windows image files */
-#define SUPPORTED_PLAYBACK_FORMAT_WINDOWS_IMAGE_FORMAT 0xB881
-/** Format code for undefined audio files files */
-#define SUPPORTED_PLAYBACK_FORMAT_UNDEFINED_AUDIO 0xB900
-/** Format code for WMA audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_WMA 0xB901
-/** Format code for OGG audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_OGG 0xB902
-/** Format code for AAC audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_AAC 0xB903
-/** Format code for Audible audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_AUDIBLE 0xB904
-/** Format code for FLAC audio files */
-#define SUPPORTED_PLAYBACK_FORMAT_FLAC 0xB906
-/** Format code for undefined video files */
-#define SUPPORTED_PLAYBACK_FORMAT_UNDEFINED_VIDEO 0xB980
-/** Format code for WMV video files */
-#define SUPPORTED_PLAYBACK_FORMAT_WMV 0xB981
-/** Format code for MP4 files */
-#define SUPPORTED_PLAYBACK_FORMAT_MP4_CONTAINER 0xB982
-/** Format code for MP2 files */
-#define SUPPORTED_PLAYBACK_FORMAT_MP2 0xB983
-/** Format code for 3GP files */
-#define SUPPORTED_PLAYBACK_FORMAT_3GP_CONTAINER 0xB984
-/** Format code for undefined collections */
-#define SUPPORTED_PLAYBACK_FORMAT_UNDEFINED_COLLECTION 0xBA00
-/** Format code for multimedia albums */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM 0xBA01
-/** Format code for image albums */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_IMAGE_ALBUM 0xBA02
-/** Format code for audio albums */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_AUDIO_ALBUM 0xBA03
-/** Format code for video albums */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_VIDEO_ALBUM 0xBA04
-/** Format code for abstract AV playlists */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_AV_PLAYLIST 0xBA05
-/** Format code for abstract audio playlists */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_AUDIO_PLAYLIST 0xBA09
-/** Format code for abstract video playlists */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_VIDEO_PLAYLIST 0xBA0A
-/** Format code for abstract mediacasts */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_MEDIACAST 0xBA0B
-/** Format code for WPL playlist files */
-#define SUPPORTED_PLAYBACK_FORMAT_WPL_PLAYLIST 0xBA10
-/** Format code for M3u playlist files */
-#define SUPPORTED_PLAYBACK_FORMAT_M3U_PLAYLIST 0xBA11
-/** Format code for MPL playlist files */
-#define SUPPORTED_PLAYBACK_FORMAT_MPL_PLAYLIST 0xBA12
-/** Format code for ASX playlist files */
-#define SUPPORTED_PLAYBACK_FORMAT_ASX_PLAYLIST 0xBA13
-/** Format code for PLS playlist files */
-#define SUPPORTED_PLAYBACK_FORMAT_PLS_PLAYLIST 0xBA14
-/** Format code for undefined document files */
-#define SUPPORTED_PLAYBACK_FORMAT_UNDEFINED_DOCUMENT 0xBA80
-/** Format code for abstract documents */
-#define SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_DOCUMENT 0xBA81
-/** Format code for XML documents */
-#define SUPPORTED_PLAYBACK_FORMAT_XML_DOCUMENT 0xBA82
-/** Format code for MS Word documents */
-#define SUPPORTED_PLAYBACK_FORMAT_MS_WORD_DOCUMENT 0xBA83
-/** Format code for MS Excel spreadsheets */
-#define SUPPORTED_PLAYBACK_FORMAT_MS_EXCEL_SPREADSHEET 0xBA85
-/** Format code for MS PowerPoint presentatiosn */
-#define SUPPORTED_PLAYBACK_FORMAT_MS_POWERPOINT_PRESENTATION 0xBA86
-
-#endif // _MTP_H
diff --git a/mtp/legacy/mtp_MtpDatabase.cpp b/mtp/legacy/mtp_MtpDatabase.cpp
deleted file mode 100644
index 5eb7d8e..0000000
--- a/mtp/legacy/mtp_MtpDatabase.cpp
+++ /dev/null
@@ -1,871 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include <utils/Log.h>
-
-#include <stdio.h>
-#include <assert.h>
-#include <limits.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <string>
-#include <map>
-#include <libgen.h>
-#include <cutils/properties.h>
-
-#include "MtpDatabase.h"
-#include "MtpStorage.h"
-#include "MtpDataPacket.h"
-#include "MtpObjectInfo.h"
-#include "MtpProperty.h"
-#include "MtpDebug.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-#include "mtp.h"
-#include "mtp_MtpDatabase.hpp"
-//#include "btree.hpp"
-
-MyMtpDatabase::MyMtpDatabase()
-{
-	storagenum = 0;
-	count = -1;
-}
-
-MyMtpDatabase::~MyMtpDatabase() {
-	std::map<int, MtpStorage*>::iterator i;
-	for (i = storagemap.begin(); i != storagemap.end(); i++) {
-		delete i->second;
-	}
-}
-
-int MyMtpDatabase::DEVICE_PROPERTIES[3] = {
-	MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER,
-	MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME,
-	MTP_DEVICE_PROPERTY_IMAGE_SIZE
-};
-
-int MyMtpDatabase::FILE_PROPERTIES[10] = {
-	// NOTE must match beginning of AUDIO_PROPERTIES, VIDEO_PROPERTIES
-	// and IMAGE_PROPERTIES below
-	MTP_PROPERTY_STORAGE_ID,
-	MTP_PROPERTY_OBJECT_FORMAT,
-	MTP_PROPERTY_PROTECTION_STATUS,
-	MTP_PROPERTY_OBJECT_SIZE,
-	MTP_PROPERTY_OBJECT_FILE_NAME,
-	MTP_PROPERTY_DATE_MODIFIED,
-	MTP_PROPERTY_PARENT_OBJECT,
-	MTP_PROPERTY_PERSISTENT_UID,
-	MTP_PROPERTY_NAME,
-	// TODO: why is DISPLAY_NAME not here?
-	MTP_PROPERTY_DATE_ADDED
-};
-
-int MyMtpDatabase::AUDIO_PROPERTIES[19] = {
-	// NOTE must match FILE_PROPERTIES above
-	MTP_PROPERTY_STORAGE_ID,
-	MTP_PROPERTY_OBJECT_FORMAT,
-	MTP_PROPERTY_PROTECTION_STATUS,
-	MTP_PROPERTY_OBJECT_SIZE,
-	MTP_PROPERTY_OBJECT_FILE_NAME,
-	MTP_PROPERTY_DATE_MODIFIED,
-	MTP_PROPERTY_PARENT_OBJECT,
-	MTP_PROPERTY_PERSISTENT_UID,
-	MTP_PROPERTY_NAME,
-	MTP_PROPERTY_DISPLAY_NAME,
-	MTP_PROPERTY_DATE_ADDED,
-
-	// audio specific properties
-	MTP_PROPERTY_ARTIST,
-	MTP_PROPERTY_ALBUM_NAME,
-	MTP_PROPERTY_ALBUM_ARTIST,
-	MTP_PROPERTY_TRACK,
-	MTP_PROPERTY_ORIGINAL_RELEASE_DATE,
-	MTP_PROPERTY_DURATION,
-	MTP_PROPERTY_GENRE,
-	MTP_PROPERTY_COMPOSER
-};
-
-int MyMtpDatabase::VIDEO_PROPERTIES[15] = {
-	// NOTE must match FILE_PROPERTIES above
-	MTP_PROPERTY_STORAGE_ID,
-	MTP_PROPERTY_OBJECT_FORMAT,
-	MTP_PROPERTY_PROTECTION_STATUS,
-	MTP_PROPERTY_OBJECT_SIZE,
-	MTP_PROPERTY_OBJECT_FILE_NAME,
-	MTP_PROPERTY_DATE_MODIFIED,
-	MTP_PROPERTY_PARENT_OBJECT,
-	MTP_PROPERTY_PERSISTENT_UID,
-	MTP_PROPERTY_NAME,
-	MTP_PROPERTY_DISPLAY_NAME,
-	MTP_PROPERTY_DATE_ADDED,
-
-	// video specific properties
-	MTP_PROPERTY_ARTIST,
-	MTP_PROPERTY_ALBUM_NAME,
-	MTP_PROPERTY_DURATION,
-	MTP_PROPERTY_DESCRIPTION
-};
-
-int MyMtpDatabase::IMAGE_PROPERTIES[12] = {
-	// NOTE must match FILE_PROPERTIES above
-	MTP_PROPERTY_STORAGE_ID,
-	MTP_PROPERTY_OBJECT_FORMAT,
-	MTP_PROPERTY_PROTECTION_STATUS,
-	MTP_PROPERTY_OBJECT_SIZE,
-	MTP_PROPERTY_OBJECT_FILE_NAME,
-	MTP_PROPERTY_DATE_MODIFIED,
-	MTP_PROPERTY_PARENT_OBJECT,
-	MTP_PROPERTY_PERSISTENT_UID,
-	MTP_PROPERTY_NAME,
-	MTP_PROPERTY_DISPLAY_NAME,
-	MTP_PROPERTY_DATE_ADDED,
-
-	// image specific properties
-	MTP_PROPERTY_DESCRIPTION
-};
-
-int MyMtpDatabase::ALL_PROPERTIES[25] = {
-	// NOTE must match FILE_PROPERTIES above
-	MTP_PROPERTY_STORAGE_ID,
-	MTP_PROPERTY_OBJECT_FORMAT,
-	MTP_PROPERTY_PROTECTION_STATUS,
-	MTP_PROPERTY_OBJECT_SIZE,
-	MTP_PROPERTY_OBJECT_FILE_NAME,
-	MTP_PROPERTY_DATE_MODIFIED,
-	MTP_PROPERTY_PARENT_OBJECT,
-	MTP_PROPERTY_PERSISTENT_UID,
-	MTP_PROPERTY_NAME,
-	MTP_PROPERTY_DISPLAY_NAME,
-	MTP_PROPERTY_DATE_ADDED,
-
-	// image specific properties
-	MTP_PROPERTY_DESCRIPTION,
-
-	// audio specific properties
-	MTP_PROPERTY_ARTIST,
-	MTP_PROPERTY_ALBUM_NAME,
-	MTP_PROPERTY_ALBUM_ARTIST,
-	MTP_PROPERTY_TRACK,
-	MTP_PROPERTY_ORIGINAL_RELEASE_DATE,
-	MTP_PROPERTY_DURATION,
-	MTP_PROPERTY_GENRE,
-	MTP_PROPERTY_COMPOSER,
-
-	// video specific properties
-	MTP_PROPERTY_ARTIST,
-	MTP_PROPERTY_ALBUM_NAME,
-	MTP_PROPERTY_DURATION,
-	MTP_PROPERTY_DESCRIPTION,
-
-	// image specific properties
-	MTP_PROPERTY_DESCRIPTION
-};
-
-int MyMtpDatabase::SUPPORTED_PLAYBACK_FORMATS[26] = {
-	SUPPORTED_PLAYBACK_FORMAT_UNDEFINED,
-	SUPPORTED_PLAYBACK_FORMAT_ASSOCIATION,
-	SUPPORTED_PLAYBACK_FORMAT_TEXT,
-	SUPPORTED_PLAYBACK_FORMAT_HTML,
-	SUPPORTED_PLAYBACK_FORMAT_WAV,
-	SUPPORTED_PLAYBACK_FORMAT_MP3,
-	SUPPORTED_PLAYBACK_FORMAT_MPEG,
-	SUPPORTED_PLAYBACK_FORMAT_EXIF_JPEG,
-	SUPPORTED_PLAYBACK_FORMAT_TIFF_EP,
-	SUPPORTED_PLAYBACK_FORMAT_BMP,
-	SUPPORTED_PLAYBACK_FORMAT_GIF,
-	SUPPORTED_PLAYBACK_FORMAT_JFIF,
-	SUPPORTED_PLAYBACK_FORMAT_PNG,
-	SUPPORTED_PLAYBACK_FORMAT_TIFF,
-	SUPPORTED_PLAYBACK_FORMAT_WMA,
-	SUPPORTED_PLAYBACK_FORMAT_OGG,
-	SUPPORTED_PLAYBACK_FORMAT_AAC,
-	SUPPORTED_PLAYBACK_FORMAT_MP4_CONTAINER,
-	SUPPORTED_PLAYBACK_FORMAT_MP2,
-	SUPPORTED_PLAYBACK_FORMAT_3GP_CONTAINER,
-	SUPPORTED_PLAYBACK_FORMAT_ABSTRACT_AV_PLAYLIST,
-	SUPPORTED_PLAYBACK_FORMAT_WPL_PLAYLIST,
-	SUPPORTED_PLAYBACK_FORMAT_M3U_PLAYLIST,
-	SUPPORTED_PLAYBACK_FORMAT_PLS_PLAYLIST,
-	SUPPORTED_PLAYBACK_FORMAT_XML_DOCUMENT,
-	SUPPORTED_PLAYBACK_FORMAT_FLAC
-};
-
-MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path,
-											MtpObjectFormat format,
-											MtpObjectHandle parent,
-											MtpStorageID storage,
-											uint64_t size,
-											time_t modified) {
-	if (storagemap.find(storage) == storagemap.end())
-		return kInvalidObjectHandle;
-	return storagemap[storage]->beginSendObject(path, format, parent, size, modified);
-}
-
-void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle,
-								MtpObjectFormat format, bool succeeded) {
-	MTPD("endSendObject() %s\n", path);
-	if (!succeeded) {
-		MTPE("endSendObject() failed, unlinking %s\n", path);
-		unlink(path);
-	}
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++)
-		storit->second->endSendObject(path, handle, format, succeeded);
-}
-
-void MyMtpDatabase::createDB(MtpStorage* storage, MtpStorageID storageID) {
-	MTPD("MyMtpDatabase::createDB called\n");
-	storagemap[storageID] = storage;
-	storage->createDB();
-}
-
-void MyMtpDatabase::destroyDB(MtpStorageID storageID) {
-	MtpStorage* storage = storagemap[storageID];
-	storagemap.erase(storageID);
-	delete storage;
-}
-
-MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID,
-									MtpObjectFormat format,
-									MtpObjectHandle parent) {
-	MTPD("storageID: %d\n", storageID);
-	MtpObjectHandleList* list = storagemap[storageID]->getObjectList(storageID, parent);
-	MTPD("list: %d\n", list->size());
-	return list;
-}
-
-int MyMtpDatabase::getNumObjects(MtpStorageID storageID,
-									MtpObjectFormat format,
-									MtpObjectHandle parent) {
-	MtpObjectHandleList* list = storagemap[storageID]->getObjectList(storageID, parent);
-	int size = list->size();
-	delete list;
-	return size;
-}
-
-MtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() {
-	// This function tells the host PC which file formats the device supports
-	MtpObjectFormatList* list = new MtpObjectFormatList();
-	int length = sizeof(SUPPORTED_PLAYBACK_FORMATS) / sizeof(SUPPORTED_PLAYBACK_FORMATS[0]);
-	MTPD("MyMtpDatabase::getSupportedPlaybackFormats length: %i\n", length);
-	for (int i = 0; i < length; i++) {
-		MTPD("supported playback format: %x\n", SUPPORTED_PLAYBACK_FORMATS[i]);
-		list->push(SUPPORTED_PLAYBACK_FORMATS[i]);
-	}
-	return list;
-}
-
-MtpObjectFormatList* MyMtpDatabase::getSupportedCaptureFormats() {
-	// Android OS implementation of this function returns NULL
-	// so we are not implementing this function either.
-	MTPD("MyMtpDatabase::getSupportedCaptureFormats returning NULL (This is what Android does as well).\n");
-	return NULL;
-}
-
-MtpObjectPropertyList* MyMtpDatabase::getSupportedObjectProperties(MtpObjectFormat format) {
-	int* properties;
-	MtpObjectPropertyList* list = new MtpObjectPropertyList();
-	int length = 0;
-	switch (format) {
-		case MTP_FORMAT_MP3:
-		case MTP_FORMAT_WAV:
-		case MTP_FORMAT_WMA:
-		case MTP_FORMAT_OGG:
-		case MTP_FORMAT_AAC:
-			properties = AUDIO_PROPERTIES;
-			length = sizeof(AUDIO_PROPERTIES) / sizeof(AUDIO_PROPERTIES[0]);
-			break;
-		case MTP_FORMAT_MPEG:
-		case MTP_FORMAT_3GP_CONTAINER:
-		case MTP_FORMAT_WMV:
-			properties = VIDEO_PROPERTIES;
-			length = sizeof(VIDEO_PROPERTIES) / sizeof(VIDEO_PROPERTIES[0]);
-			break;
-		case MTP_FORMAT_EXIF_JPEG:
-		case MTP_FORMAT_GIF:
-		case MTP_FORMAT_PNG:
-		case MTP_FORMAT_BMP:
-			properties = IMAGE_PROPERTIES;
-			length = sizeof(IMAGE_PROPERTIES) / sizeof(IMAGE_PROPERTIES[0]);
-			break;
-		case 0:
-			properties = ALL_PROPERTIES;
-			length = sizeof(ALL_PROPERTIES) / sizeof(ALL_PROPERTIES[0]);
-			break;
-		default:
-			properties = FILE_PROPERTIES;
-			length = sizeof(FILE_PROPERTIES) / sizeof(FILE_PROPERTIES[0]);
-	}
-	MTPD("MyMtpDatabase::getSupportedObjectProperties length is: %i, format: %x", length, format);
-	for (int i = 0; i < length; i++) {
-		MTPD("supported object property: %x\n", properties[i]);
-		list->push(properties[i]);
-	}
-	return list;
-}
-
-MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() {
-	MtpDevicePropertyList* list = new MtpDevicePropertyList();
-	int length = sizeof(DEVICE_PROPERTIES) / sizeof(DEVICE_PROPERTIES[0]);
-	MTPD("MyMtpDatabase::getSupportedDeviceProperties length was: %i\n", length);
-	for (int i = 0; i < length; i++)
-		list->push(DEVICE_PROPERTIES[i]);
-	return list;
-}
-
-MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle,
-											MtpObjectProperty property,
-											MtpDataPacket& packet) {
-	MTPD("MyMtpDatabase::getObjectPropertyValue mtpid: %u, property: %x\n", handle, property);
-	int type;
-	MtpResponseCode result = MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	MtpStorage::PropEntry prop;
-	if (!getObjectPropertyInfo(property, type)) {
-		MTPE("MyMtpDatabase::getObjectPropertyValue returning MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED\n");
-		return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
-	}
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-		if (storit->second->getObjectPropertyValue(handle, property, prop) == 0) {
-			result = MTP_RESPONSE_OK;
-			break;
-		}
-	}
-
-	if (result != MTP_RESPONSE_OK) {
-		MTPE("MyMtpDatabase::getObjectPropertyValue unable to locate handle: %u\n", handle);
-		return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-	}
-
-	uint64_t longValue = prop.intvalue;
-	// special case date properties, which are strings to MTP
-	// but stored internally as a uint64
-	if (property == MTP_PROPERTY_DATE_MODIFIED || property == MTP_PROPERTY_DATE_ADDED) {
-		char date[20];
-		formatDateTime(longValue, date, sizeof(date));
-		packet.putString(date);
-		goto out;
-	}
-	// release date is stored internally as just the year
-	if (property == MTP_PROPERTY_ORIGINAL_RELEASE_DATE) {
-		char date[20];
-		snprintf(date, sizeof(date), "%04lld0101T000000", longValue);
-		packet.putString(date);
-		goto out;
-	}
-
-	switch (type) {
-		case MTP_TYPE_INT8:
-			packet.putInt8(longValue);
-			break;
-		case MTP_TYPE_UINT8:
-			packet.putUInt8(longValue);
-			break;
-		case MTP_TYPE_INT16:
-			packet.putInt16(longValue);
-			break;
-		case MTP_TYPE_UINT16:
-			packet.putUInt16(longValue);
-			break;
-		case MTP_TYPE_INT32:
-			packet.putInt32(longValue);
-			break;
-		case MTP_TYPE_UINT32:
-			packet.putUInt32(longValue);
-			break;
-		case MTP_TYPE_INT64:
-			packet.putInt64(longValue);
-			break;
-		case MTP_TYPE_UINT64:
-			packet.putUInt64(longValue);
-			break;
-		case MTP_TYPE_INT128:
-			packet.putInt128(longValue);
-			break;
-		case MTP_TYPE_UINT128:
-			packet.putUInt128(longValue);
-			break;
-		case MTP_TYPE_STR:
-			{
-				/*std::string stringValue = (string)stringValuesArray[0];
-				if (stringValue) {
-					const char* str = stringValue.c_str();
-					if (str == NULL) {
-						return MTP_RESPONSE_GENERAL_ERROR;
-					}
-					packet.putString(str);
-				} else {
-					packet.putEmptyString();
-				}*/
-				packet.putString(prop.strvalue.c_str());
-				MTPD("MTP_TYPE_STR: %x = %s\n", prop.property, prop.strvalue.c_str());
-				//MTPE("STRING unsupported type in getObjectPropertyValue\n");
-				//result = MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
-				break;
-			}
-		default:
-			MTPE("unsupported type in getObjectPropertyValue\n");
-			result = MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
-	}
-out:
-	return result;
-}
-
-MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle,
-											MtpObjectProperty property,
-											MtpDataPacket& packet) {
-	int type;
-	MTPD("MyMtpDatabase::setObjectPropertyValue start\n");
-	if (!getObjectPropertyInfo(property, type)) {
-		MTPE("MyMtpDatabase::setObjectPropertyValue returning MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED\n");
-		return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
-	}
-	MTPD("MyMtpDatabase::setObjectPropertyValue continuing\n");
-	long longValue = 0;
-	std::string stringValue;
-
-	switch (type) {
-		case MTP_TYPE_INT8:
-			MTPD("int8\n");
-			longValue = packet.getInt8();
-			break;
-		case MTP_TYPE_UINT8:
-			MTPD("uint8\n");
-			longValue = packet.getUInt8();
-			break;
-		case MTP_TYPE_INT16:
-			MTPD("int16\n");
-			longValue = packet.getInt16();
-			break;
-		case MTP_TYPE_UINT16:
-			MTPD("uint16\n");
-			longValue = packet.getUInt16();
-			break;
-		case MTP_TYPE_INT32:
-			MTPD("int32\n");
-			longValue = packet.getInt32();
-			break;
-		case MTP_TYPE_UINT32:
-			MTPD("uint32\n");
-			longValue = packet.getUInt32();
-			break;
-		case MTP_TYPE_INT64:
-			MTPD("int64\n");
-			longValue = packet.getInt64();
-			break;
-		case MTP_TYPE_UINT64:
-			MTPD("uint64\n");
-			longValue = packet.getUInt64();
-			break;
-		case MTP_TYPE_STR:
-			{
-				MTPD("string\n");
-				MtpStringBuffer buffer;
-				packet.getString(buffer);
-				stringValue = (const char *)buffer;
-				break;
-			 }
-		default:
-			MTPE("MyMtpDatabase::setObjectPropertyValue unsupported type %i in getObjectPropertyValue\n", type);
-			return MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
-	}
-
-	int result = MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
-
-	switch (property) {
-		case MTP_PROPERTY_OBJECT_FILE_NAME:
-			{
-				MTPD("MyMtpDatabase::setObjectPropertyValue renaming file, handle: %d, new name: '%s'\n", handle, stringValue.c_str());
-				std::map<int, MtpStorage*>::iterator storit;
-				for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-					if (storit->second->renameObject(handle, stringValue) == 0) {
-						MTPD("MTP_RESPONSE_OK\n");
-						result = MTP_RESPONSE_OK;
-						break;
-					}
-				}
-			}
-			break;
-
-		default:
-			MTPE("MyMtpDatabase::setObjectPropertyValue property %x not supported.\n", property);
-			result = MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
-	}
-	MTPD("MyMtpDatabase::setObjectPropertyValue returning %d\n", result);
-	return result;
-}
-
-MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property,
-											MtpDataPacket& packet) {
-	int type, result = 0;
-	char prop_value[PROPERTY_VALUE_MAX];
-	MTPD("property %s\n",
-			MtpDebug::getDevicePropCodeName(property));
-	if (!getDevicePropertyInfo(property, type)) {
-		MTPE("MyMtpDatabase::getDevicePropertyValue MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED\n");
-		return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED;
-	}
-	MTPD("property %s\n",
-			MtpDebug::getDevicePropCodeName(property));
-	MTPD("property %x\n", property);
-	MTPD("MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME %x\n", MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME); 
-	switch (property) {
-		case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER:
-		case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME:
-			result =  MTP_RESPONSE_OK;
-			break;
-		default:
-		{
-			MTPE("MyMtpDatabase::getDevicePropertyValue property %x not supported\n", property);
-			result = MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED;
-			break;
-		}
-	}
-
-	if (result != MTP_RESPONSE_OK) {
-		MTPD("MTP_REPONSE_OK NOT OK\n");
-		return result;
-	}
-
-	long longValue = 0;
-	property_get("ro.build.product", prop_value, "unknown manufacturer");
-	switch (type) {
-		case MTP_TYPE_INT8: {
-			MTPD("MTP_TYPE_INT8\n");
-			packet.putInt8(longValue);
-			break;
-		}
-		case MTP_TYPE_UINT8:
-		{
-			MTPD("MTP_TYPE_UINT8\n");
-			packet.putUInt8(longValue);
-			break;
-		}
-		case MTP_TYPE_INT16:
-		{
-			MTPD("MTP_TYPE_INT16\n");
-			packet.putInt16(longValue);
-			break;
-		}
-		case MTP_TYPE_UINT16:
-		{
-			MTPD("MTP_TYPE_UINT16\n");
-			packet.putUInt16(longValue);
-			break;
-		}
-		case MTP_TYPE_INT32:
-		{
-			MTPD("MTP_TYPE_INT32\n");
-			packet.putInt32(longValue);
-			break;
-		}
-		case MTP_TYPE_UINT32:
-		{
-			MTPD("MTP_TYPE_UINT32\n");
-			packet.putUInt32(longValue);
-			break;
-		}
-		case MTP_TYPE_INT64:
-		{
-			MTPD("MTP_TYPE_INT64\n");
-			packet.putInt64(longValue);
-			break;
-		}
-		case MTP_TYPE_UINT64:
-		{
-			MTPD("MTP_TYPE_UINT64\n");
-			packet.putUInt64(longValue);
-			break;
-		}
-		case MTP_TYPE_INT128:
-		{
-			MTPD("MTP_TYPE_INT128\n");
-			packet.putInt128(longValue);
-			break;
-		}
-		case MTP_TYPE_UINT128:
-		{
-			MTPD("MTP_TYPE_UINT128\n");
-			packet.putInt128(longValue);
-			break;
-		}
-		case MTP_TYPE_STR:
-		{
-			MTPD("MTP_TYPE_STR\n");
-			char* str = prop_value;
-			packet.putString(str);
-			break;
-		 }
-		default:
-			MTPE("MyMtpDatabase::getDevicePropertyValue unsupported type %i in getDevicePropertyValue\n", type);
-			return MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT;
-	}
-
-	return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet) {
-   	int type;
-	MTPE("MyMtpDatabase::setDevicePropertyValue not implemented, returning 0\n");
-	return 0;
-}
-
-MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty property) {
-	MTPE("MyMtpDatabase::resetDeviceProperty not implemented, returning -1\n");
-   	return -1;
-}
-
-MtpResponseCode MyMtpDatabase::getObjectPropertyList(MtpObjectHandle handle, uint32_t format, uint32_t property, int groupCode, int depth, MtpDataPacket& packet) {
-	MTPD("getObjectPropertyList()\n");
-	MTPD("property: %x\n", property);
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-		MTPD("MyMtpDatabase::getObjectPropertyList calling getObjectPropertyList\n");
-		if (storit->second->getObjectPropertyList(handle, format, property, groupCode, depth, packet) == 0) {
-			MTPD("MTP_RESPONSE_OK\n");
-   			return MTP_RESPONSE_OK;
-		}
-	}
-	MTPE("MyMtpDatabase::getObjectPropertyList MTP_RESPOSNE_INVALID_OBJECT_HANDLE %i\n", handle);
-	return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-}
-
-MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, MtpObjectInfo& info) {
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-		if (storit->second->getObjectInfo(handle, info) == 0) {
-			MTPD("MTP_RESPONSE_OK\n");
-			return MTP_RESPONSE_OK;
-		}
-	}
-	MTPE("MyMtpDatabase::getObjectInfo MTP_RESPONSE_INVALID_OBJECT_HANDLE %i\n", handle);
-	return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-}
-
-void* MyMtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) {
-	MtpString path;
-	int64_t length;
-	MtpObjectFormat format;
-	void* result = NULL;
-	outThumbSize = 0;
-	MTPE("MyMtpDatabase::getThumbnail not implemented, returning 0\n");
-	return 0;
-}
-
-MtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, MtpString& outFilePath, int64_t& outFileLength, MtpObjectFormat& outFormat) {
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-		MTPD("MyMtpDatabase::getObjectFilePath calling getObjectFilePath\n");
-		if (storit->second->getObjectFilePath(handle, outFilePath, outFileLength, outFormat) == 0) {
-			MTPD("MTP_RESPONSE_OK\n");
-			return MTP_RESPONSE_OK;
-		}
-	}
-	MTPE("MyMtpDatabase::getObjectFilePath MTP_RESPOSNE_INVALID_OBJECT_HANDLE %i\n", handle);
-	return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-}
-
-MtpResponseCode MyMtpDatabase::deleteFile(MtpObjectHandle handle) {
-	MTPD("deleteFile\n");
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-		if (storit->second->deleteFile(handle) == 0) {
-			MTPD("MTP_RESPONSE_OK\n");
-			return MTP_RESPONSE_OK;
-		}
-	}
-	MTPE("MyMtpDatabase::deleteFile MTP_RESPONSE_INVALID_OBJECT_HANDLE %i\n", handle);
-	return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-}
-
-struct PropertyTableEntry {
-	MtpObjectProperty   property;
-	int				 type;
-};
-
-static const PropertyTableEntry   kObjectPropertyTable[] = {
-	{   MTP_PROPERTY_STORAGE_ID,		MTP_TYPE_UINT32	 },
-	{   MTP_PROPERTY_OBJECT_FORMAT,	 MTP_TYPE_UINT16	 },
-	{   MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16	 },
-	{   MTP_PROPERTY_OBJECT_SIZE,	   MTP_TYPE_UINT64	 },
-	{   MTP_PROPERTY_OBJECT_FILE_NAME,  MTP_TYPE_STR		},
-	{   MTP_PROPERTY_DATE_MODIFIED,	 MTP_TYPE_STR		},
-	{   MTP_PROPERTY_PARENT_OBJECT,	 MTP_TYPE_UINT32	 },
-	{   MTP_PROPERTY_PERSISTENT_UID,	MTP_TYPE_UINT128	},
-	{   MTP_PROPERTY_NAME,			  MTP_TYPE_STR		},
-	{   MTP_PROPERTY_DISPLAY_NAME,	  MTP_TYPE_STR		},
-	{   MTP_PROPERTY_DATE_ADDED,		MTP_TYPE_STR		},
-	{   MTP_PROPERTY_ARTIST,			MTP_TYPE_STR		},
-	{   MTP_PROPERTY_ALBUM_NAME,		MTP_TYPE_STR		},
-	{   MTP_PROPERTY_ALBUM_ARTIST,	  MTP_TYPE_STR		},
-	{   MTP_PROPERTY_TRACK,			 MTP_TYPE_UINT16	 },
-	{   MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_TYPE_STR	},
-	{   MTP_PROPERTY_GENRE,			 MTP_TYPE_STR		},
-	{   MTP_PROPERTY_COMPOSER,		  MTP_TYPE_STR		},
-	{   MTP_PROPERTY_DURATION,		  MTP_TYPE_UINT32	 },
-	{   MTP_PROPERTY_DESCRIPTION,	   MTP_TYPE_STR		},
-};
-
-static const PropertyTableEntry   kDevicePropertyTable[] = {
-	{   MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER,	MTP_TYPE_STR },
-	{   MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME,	   MTP_TYPE_STR },
-	{   MTP_DEVICE_PROPERTY_IMAGE_SIZE,				 MTP_TYPE_STR },
-};
-
-bool MyMtpDatabase::getObjectPropertyInfo(MtpObjectProperty property, int& type) {
-	int count = sizeof(kObjectPropertyTable) / sizeof(kObjectPropertyTable[0]);
-	const PropertyTableEntry* entry = kObjectPropertyTable;
-	MTPD("MyMtpDatabase::getObjectPropertyInfo size is: %i\n", count);
-	for (int i = 0; i < count; i++, entry++) {
-		if (entry->property == property) {
-			type = entry->type;
-			return true;
-		}
-	}
-	return false;
-}
-
-bool MyMtpDatabase::getDevicePropertyInfo(MtpDeviceProperty property, int& type) {
-	int count = sizeof(kDevicePropertyTable) / sizeof(kDevicePropertyTable[0]);
-	const PropertyTableEntry* entry = kDevicePropertyTable;
-	MTPD("MyMtpDatabase::getDevicePropertyInfo count is: %i\n", count);
-	for (int i = 0; i < count; i++, entry++) {
-		if (entry->property == property) {
-			type = entry->type;
-			MTPD("type: %x\n", type);
-			return true;
-		}
-	}
-	return false;
-}
-
-MtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) {
-	// call function and place files with associated handles into int array
-	MTPD("MyMtpDatabase::getObjectReferences returning null, this seems to be what Android always does.\n");
-	MTPD("handle: %d\n", handle);
-	// Windows + Android seems to always return a NULL in this function, c == null path
-	// The way that this is handled in Android then is to do this:
-	return NULL;
-}
-
-MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle,
-													MtpObjectHandleList* references) {
-	int count = references->size();
-	MTPE("MyMtpDatabase::setObjectReferences not implemented, returning 0\n");
-	return 0;
-}
-
-MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property,
-											MtpObjectFormat format) {
-	MTPD("MyMtpDatabase::getObjectPropertyDesc start\n");
-	MtpProperty* result = NULL;
-	switch (property) {
-		case MTP_PROPERTY_OBJECT_FORMAT:
-			// use format as default value
-			result = new MtpProperty(property, MTP_TYPE_UINT16, false, format);
-			break;
-		case MTP_PROPERTY_PROTECTION_STATUS:
-		case MTP_PROPERTY_TRACK:
-			result = new MtpProperty(property, MTP_TYPE_UINT16);
-			break;
-		case MTP_PROPERTY_STORAGE_ID:
-		case MTP_PROPERTY_PARENT_OBJECT:
-		case MTP_PROPERTY_DURATION:
-			result = new MtpProperty(property, MTP_TYPE_UINT32);
-			break;
-		case MTP_PROPERTY_OBJECT_SIZE:
-			result = new MtpProperty(property, MTP_TYPE_UINT64);
-			break;
-		case MTP_PROPERTY_PERSISTENT_UID:
-			result = new MtpProperty(property, MTP_TYPE_UINT128);
-			break;
-		case MTP_PROPERTY_NAME:
-		case MTP_PROPERTY_DISPLAY_NAME:
-		case MTP_PROPERTY_ARTIST:
-		case MTP_PROPERTY_ALBUM_NAME:
-		case MTP_PROPERTY_ALBUM_ARTIST:
-		case MTP_PROPERTY_GENRE:
-		case MTP_PROPERTY_COMPOSER:
-		case MTP_PROPERTY_DESCRIPTION:
-			result = new MtpProperty(property, MTP_TYPE_STR);
-			break;
-		case MTP_PROPERTY_DATE_MODIFIED:
-		case MTP_PROPERTY_DATE_ADDED:
-		case MTP_PROPERTY_ORIGINAL_RELEASE_DATE:
-			result = new MtpProperty(property, MTP_TYPE_STR);
-			result->setFormDateTime();
-			break;
-		case MTP_PROPERTY_OBJECT_FILE_NAME:
-			// We allow renaming files and folders
-			result = new MtpProperty(property, MTP_TYPE_STR, true);
-			break;
-	}
-	return result;
-}
-
-MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) {
-	MtpProperty* result = NULL;
-	int ret;
-	bool writable = false;
-	switch (property) {
-		case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER:
-		case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME:
-			writable = true;
-			// fall through
-		case MTP_DEVICE_PROPERTY_IMAGE_SIZE:
-			result = new MtpProperty(property, MTP_TYPE_STR, writable);
-
-			// get current value
-			// TODO: add actual values
-			result->setCurrentValue(0);
-			result->setDefaultValue(0);
-			break;
-		}
-
-	return result;
-}
-
-void MyMtpDatabase::sessionStarted() {
-	MTPD("MyMtpDatabase::sessionStarted not implemented or does nothing, returning\n");
-	return;
-}
-
-void MyMtpDatabase::sessionEnded() {
-	MTPD("MyMtpDatabase::sessionEnded not implemented or does nothing, returning\n");
-	return;
-}
-
-// ----------------------------------------------------------------------------
-
-void MyMtpDatabase::lockMutex(void) {
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-		storit->second->lockMutex(0);
-	}
-}
-
-void MyMtpDatabase::unlockMutex(void) {
-	std::map<int, MtpStorage*>::iterator storit;
-	for (storit = storagemap.begin(); storit != storagemap.end(); storit++) {
-		storit->second->unlockMutex(0);
-	}
-}
diff --git a/mtp/legacy/mtp_MtpDatabase.hpp b/mtp/legacy/mtp_MtpDatabase.hpp
deleted file mode 100644
index 931ba15..0000000
--- a/mtp/legacy/mtp_MtpDatabase.hpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef MTP_MTPDATABASE_HPP
-#define MTP_MTPDATABASE_HPP
-
-#include <utils/Log.h>
-
-#include <stdio.h>
-#include <assert.h>
-#include <limits.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <map>
-#include <string>
-#include <deque>
-
-#include "MtpDatabase.h"
-#include "MtpDataPacket.h"
-#include "MtpObjectInfo.h"
-#include "MtpProperty.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-#include "mtp.h"
-
-class MyMtpDatabase : public MtpDatabase {
-private:
-	int* getSupportedObjectProperties(int format);
-
-	static int FILE_PROPERTIES[10];
-	static int DEVICE_PROPERTIES[3];
-	static int AUDIO_PROPERTIES[19];
-	static int VIDEO_PROPERTIES[15];
-	static int IMAGE_PROPERTIES[12];
-	static int ALL_PROPERTIES[25];
-	static int SUPPORTED_PLAYBACK_FORMATS[26];
-	int storagenum;
-	int count;
-	std::string lastfile;
-	std::map<int, MtpStorage*> storagemap;
-	void countDirs(std::string path);
-	int readParentDirs(std::string path, int storageID);
-
-public:
-									MyMtpDatabase();
-	virtual							~MyMtpDatabase();
-
-	void					createDB(MtpStorage* storage, MtpStorageID storageID);
-	void					destroyDB(MtpStorageID storageID);
-	virtual MtpObjectHandle			beginSendObject(const char* path,
-											MtpObjectFormat format,
-											MtpObjectHandle parent,
-											MtpStorageID storage,
-											uint64_t size,
-											time_t modified);
-
-	virtual void					endSendObject(const char* path,
-											MtpObjectHandle handle,
-											MtpObjectFormat format,
-											bool succeeded);
-
-	virtual MtpObjectHandleList*	getObjectList(MtpStorageID storageID,
-									MtpObjectFormat format,
-									MtpObjectHandle parent);
-
-	virtual int						getNumObjects(MtpStorageID storageID,
-											MtpObjectFormat format,
-											MtpObjectHandle parent);
-
-	// callee should delete[] the results from these
-	// results can be NULL
-	virtual MtpObjectFormatList*	getSupportedPlaybackFormats();
-	virtual MtpObjectFormatList*	getSupportedCaptureFormats();
-	virtual MtpObjectPropertyList*	getSupportedObjectProperties(MtpObjectFormat format);
-	virtual MtpDevicePropertyList*	getSupportedDeviceProperties();
-
-	virtual MtpResponseCode			getObjectPropertyValue(MtpObjectHandle handle,
-											MtpObjectProperty property,
-											MtpDataPacket& packet);
-
-	virtual MtpResponseCode			setObjectPropertyValue(MtpObjectHandle handle,
-											MtpObjectProperty property,
-											MtpDataPacket& packet);
-
-	virtual MtpResponseCode			getDevicePropertyValue(MtpDeviceProperty property,
-											MtpDataPacket& packet);
-
-	virtual MtpResponseCode			setDevicePropertyValue(MtpDeviceProperty property,
-											MtpDataPacket& packet);
-
-	virtual MtpResponseCode			resetDeviceProperty(MtpDeviceProperty property);
-
-	virtual MtpResponseCode			getObjectPropertyList(MtpObjectHandle handle,
-											uint32_t format, uint32_t property,
-											int groupCode, int depth,
-											MtpDataPacket& packet);
-
-	virtual MtpResponseCode			getObjectInfo(MtpObjectHandle handle,
-											MtpObjectInfo& info);
-
-	virtual void*					getThumbnail(MtpObjectHandle handle, size_t& outThumbSize);
-
-	virtual MtpResponseCode			getObjectFilePath(MtpObjectHandle handle,
-											MtpString& outFilePath,
-											int64_t& outFileLength,
-											MtpObjectFormat& outFormat);
-	virtual MtpResponseCode			deleteFile(MtpObjectHandle handle);
-
-	bool							getObjectPropertyInfo(MtpObjectProperty property, int& type);
-	bool							getDevicePropertyInfo(MtpDeviceProperty property, int& type);
-
-	virtual MtpObjectHandleList*	getObjectReferences(MtpObjectHandle handle);
-
-	virtual MtpResponseCode			setObjectReferences(MtpObjectHandle handle,
-											MtpObjectHandleList* references);
-
-	virtual MtpProperty*			getObjectPropertyDesc(MtpObjectProperty property,
-											MtpObjectFormat format);
-
-	virtual MtpProperty*			getDevicePropertyDesc(MtpDeviceProperty property);
-
-	virtual void					sessionStarted();
-
-	virtual void					sessionEnded();
-	virtual void					lockMutex();
-	virtual void					unlockMutex();
-};
-#endif
diff --git a/mtp/legacy/mtp_MtpServer.cpp b/mtp/legacy/mtp_MtpServer.cpp
deleted file mode 100644
index 1ebe5f5..0000000
--- a/mtp/legacy/mtp_MtpServer.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#include <utils/Log.h>
-
-#include <stdio.h>
-#include <assert.h>
-#include <limits.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <vector>
-#include <utils/threads.h>
-#include <pthread.h>
-
-#include "mtp_MtpServer.hpp"
-#include "MtpServer.h"
-#include "MtpStorage.h"
-#include "MtpDebug.h"
-#include "MtpMessage.hpp"
-
-#include <string>
-
-void twmtp_MtpServer::start()
-{
-	usePtp =  false;
-	MyMtpDatabase* mtpdb = new MyMtpDatabase();
-	/* Sleep for a bit before we open the MTP USB device because some
-	 * devices are not ready due to the kernel not responding to our
-	 * sysfs requests right away.
-	 */
-	usleep(800000);
-#ifdef USB_MTP_DEVICE
-#define STRINGIFY(x) #x
-#define EXPAND(x) STRINGIFY(x)
-	const char* mtp_device = EXPAND(USB_MTP_DEVICE);
-	MTPI("Using '%s' for MTP device.\n", EXPAND(USB_MTP_DEVICE));
-#else
-	const char* mtp_device = "/dev/mtp_usb";
-#endif
-	int fd = open(mtp_device, O_RDWR);
-	if (fd < 0) {
-		MTPE("could not open MTP driver, errno: %d\n", errno);
-		return;
-	}
-	MTPD("fd: %d\n", fd);
-	server = new MtpServer(mtpdb, usePtp, 0, 0664, 0775);
-	refserver = server;
-	MTPI("created new mtpserver object\n");
-	add_storage();
-	MTPD("Starting add / remove mtppipe monitor thread\n");
-	pthread_t thread;
-	ThreadPtr mtpptr = &twmtp_MtpServer::mtppipe_thread;
-	PThreadPtr p = *(PThreadPtr*)&mtpptr;
-	pthread_create(&thread, NULL, p, this);
-	// This loop restarts the MTP process if the device is unplugged and replugged in
-	while (true) {
-		server->run(fd);
-		fd = open(mtp_device, O_RDWR);
-		usleep(800000);
-	}
-}
-
-void twmtp_MtpServer::set_storages(storages* mtpstorages) {
-	stores = mtpstorages;
-}
-
-void twmtp_MtpServer::cleanup()
-{
-	android::Mutex sMutex;
-	android::Mutex::Autolock autoLock(sMutex);
-
-	if (server) {
-		delete server;
-	} else {
-		MTPD("server is null in cleanup");
-	}
-}
-
-void twmtp_MtpServer::send_object_added(int handle)
-{
-	android::Mutex sMutex;
-	android::Mutex::Autolock autoLock(sMutex);
-
-	if (server)
-		server->sendObjectAdded(handle);
-	else
-		MTPD("server is null in send_object_added");
-}
-
-void twmtp_MtpServer::send_object_removed(int handle)
-{
-	android::Mutex sMutex;
-	android::Mutex::Autolock autoLock(sMutex);
-
-	if (server)
-		server->sendObjectRemoved(handle);
-	else
-		MTPD("server is null in send_object_removed");
-}
-
-void twmtp_MtpServer::add_storage()
-{
-	android::Mutex sMutex;
-	android::Mutex::Autolock autoLock(sMutex);
-
-	MTPD("twmtp_MtpServer::add_storage count of storage devices: %i\n", stores->size());
-	for (unsigned int i = 0; i < stores->size(); ++i) {
-			std::string pathStr = stores->at(i)->mount;
-
-			if (!pathStr.empty()) {
-				std::string descriptionStr = stores->at(i)->display;
-				int storageID = stores->at(i)->mtpid;
-				long reserveSpace = 1;
-				bool removable = false;
-				uint64_t maxFileSize = stores->at(i)->maxFileSize;
-				if (descriptionStr != "") {
-					MtpStorage* storage = new MtpStorage(storageID, &pathStr[0], &descriptionStr[0], reserveSpace, removable, maxFileSize, refserver);
-					server->addStorage(storage);
-				}
-		}
-	}
-}
-
-void twmtp_MtpServer::remove_storage(int storageId)
-{
-	android::Mutex sMutex;
-	android::Mutex::Autolock autoLock(sMutex);
-
-	if (server) {
-		MtpStorage* storage = server->getStorage(storageId);
-		if (storage) {
-			MTPD("twmtp_MtpServer::remove_storage calling removeStorage\n");
-			server->removeStorage(storage);
-		}
-	} else
-		MTPD("server is null in remove_storage");
-	MTPD("twmtp_MtpServer::remove_storage DONE\n");
-}
-
-int twmtp_MtpServer::mtppipe_thread(void)
-{
-	if (mtp_read_pipe == -1) {
-		MTPD("mtppipe_thread exiting because mtp_read_pipe not set\n");
-		return 0;
-	}
-	MTPD("Starting twmtp_MtpServer::mtppipe_thread\n");
-	int read_count;
-	struct mtpmsg mtp_message;
-	while (1) {
-		read_count = ::read(mtp_read_pipe, &mtp_message, sizeof(mtp_message));
-		MTPD("read %i from mtppipe\n", read_count);
-		if (read_count == sizeof(mtp_message)) {
-			if (mtp_message.message_type == MTP_MESSAGE_ADD_STORAGE) {
-				MTPI("mtppipe add storage %i '%s'\n", mtp_message.storage_id, mtp_message.path);
-				if (mtp_message.storage_id) {
-					long reserveSpace = 1;
-					bool removable = false;
-					MtpStorage* storage = new MtpStorage(mtp_message.storage_id, &mtp_message.path[0], &mtp_message.display[0], reserveSpace, removable, mtp_message.maxFileSize, refserver);
-					server->addStorage(storage);
-					MTPD("mtppipe done adding storage\n");
-				} else {
-					MTPE("Invalid storage ID %i specified\n", mtp_message.storage_id);
-				}
-			} else if (mtp_message.message_type == MTP_MESSAGE_REMOVE_STORAGE) {
-				MTPI("mtppipe remove storage %i\n", mtp_message.storage_id);
-				remove_storage(mtp_message.storage_id);
-				MTPD("mtppipe done removing storage\n");
-			} else {
-				MTPE("Unknown mtppipe message value: %i\n", mtp_message.message_type);
-			}
-		} else {
-			MTPE("twmtp_MtpServer::mtppipe_thread unexpected read_count %i\n", read_count);
-			close(mtp_read_pipe);
-			break;
-		}
-	}
-	MTPD("twmtp_MtpServer::mtppipe_thread closing\n");
-	return 0;
-}
-
-void twmtp_MtpServer::set_read_pipe(int pipe)
-{
-	mtp_read_pipe = pipe;
-}
diff --git a/mtp/legacy/mtp_MtpServer.hpp b/mtp/legacy/mtp_MtpServer.hpp
deleted file mode 100644
index 99f63d5..0000000
--- a/mtp/legacy/mtp_MtpServer.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- *
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- */
-
-#ifndef MTP_MTPSERVER_HPP
-#define MTP_MTPSERVER_HPP
-#include <utils/Log.h>
-
-#include <string>
-#include <stdio.h>
-#include <assert.h>
-#include <limits.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <utils/threads.h>
-
-#include "MtpServer.h"
-#include "MtpStorage.h"
-#include "mtp_MtpDatabase.hpp"
-
-typedef struct Storage {
-	std::string display;
-	std::string mount;
-	int mtpid;
-	uint64_t maxFileSize;
-} storage;
-
-typedef std::vector<storage*> storages;
-
-class twmtp_MtpServer {
-	public:
-		void start();
-		void cleanup();
-		void send_object_added(int handle);
-		void send_object_removed(int handle);
-		void add_storage();
-		void remove_storage(int storageId);
-		void set_storages(storages* mtpstorages);
-		void set_read_pipe(int pipe);
-		storages *stores;
-	private:
-		typedef int (twmtp_MtpServer::*ThreadPtr)(void);
-		typedef void* (*PThreadPtr)(void *);
-		int mtppipe_thread(void);
-		bool usePtp;
-		MtpServer* server;
-		MtpServer* refserver;
-		int mtp_read_pipe;
-
-};
-#endif
diff --git a/mtp/legacy/node.cpp b/mtp/legacy/node.cpp
deleted file mode 100644
index 207a37a..0000000
--- a/mtp/legacy/node.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- *
- * 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.
- */
-
-#include <vector>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <limits.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <libgen.h>
-
-#include "btree.hpp"
-#include "mtp.h"
-#include "MtpDebug.h"
-
-
-Node::Node()
-	: handle(-1), parent(0), name("")
-{
-}
-
-Node::Node(MtpObjectHandle handle, MtpObjectHandle parent, const std::string& name)
-	: handle(handle), parent(parent), name(name)
-{
-}
-
-void Node::rename(const std::string& newName) {
-	name = newName;
-	updateProperty(MTP_PROPERTY_OBJECT_FILE_NAME, 0, name.c_str(), MTP_TYPE_STR);
-	updateProperty(MTP_PROPERTY_NAME, 0, name.c_str(), MTP_TYPE_STR);
-	updateProperty(MTP_PROPERTY_DISPLAY_NAME, 0, name.c_str(), MTP_TYPE_STR);
-}
-
-MtpObjectHandle Node::Mtpid() const { return handle; }
-MtpObjectHandle Node::getMtpParentId() const { return parent; }
-const std::string& Node::getName() const { return name; }
-
-uint64_t Node::getIntProperty(MtpPropertyCode property) {
-	for (unsigned index = 0; index < mtpProp.size(); ++index) {
-		if (mtpProp[index].property == property)
-			return mtpProp[index].valueInt;
-	}
-	MTPE("Node::getIntProperty failed to find property %x, returning -1\n", (unsigned)property);
-	return -1;
-}
-
-const Node::mtpProperty& Node::getProperty(MtpPropertyCode property) {
-	static const mtpProperty dummyProp;
-	for (size_t i = 0; i < mtpProp.size(); ++i) {
-		if (mtpProp[i].property == property)
-			return mtpProp[i];
-	}
-	MTPE("Node::getProperty failed to find property %x, returning dummy property\n", (unsigned)property);
-	return dummyProp;
-}
-
-void Node::addProperty(MtpPropertyCode property, uint64_t valueInt, std::string valueStr, MtpDataType dataType) {
-//	MTPD("adding property: %lld, valueInt: %lld, valueStr: %s, dataType: %d\n", property, valueInt, valueStr.c_str(), dataType);
-	struct mtpProperty prop;
-	prop.property = property;
-	prop.valueInt = valueInt;
-	prop.valueStr = valueStr;
-	prop.dataType = dataType;
-	mtpProp.push_back(prop);
-}
-
-void Node::updateProperty(MtpPropertyCode property, uint64_t valueInt, std::string valueStr, MtpDataType dataType) {
-	for (unsigned i = 0; i < mtpProp.size(); i++) {
-		if (mtpProp[i].property == property) {
-			mtpProp[i].valueInt = valueInt;
-			mtpProp[i].valueStr = valueStr;
-			mtpProp[i].dataType = dataType;
-			return;
-		}
-	}
-	addProperty(property, valueInt, valueStr, dataType);
-}
-
-std::vector<Node::mtpProperty>& Node::getMtpProps() {
-	return mtpProp;
-}
-
-void Node::addProperties(const std::string& path, int storageID) {
-	MTPD("addProperties: handle: %u, filename: '%s'\n", handle, getName().c_str());
-	struct stat st;
-	int mFormat = 0;
-	uint64_t puid = ((uint64_t)storageID << 32) + handle;
-	off_t file_size = 0;
-
-	mFormat = MTP_FORMAT_UNDEFINED;   // file
-	if (lstat(path.c_str(), &st) == 0) {
-		file_size = st.st_size;
-		if (S_ISDIR(st.st_mode))
-			mFormat = MTP_FORMAT_ASSOCIATION; // folder
-	}
-
-	// TODO: don't store properties with constant values at all, add them at query time instead
-	addProperty(MTP_PROPERTY_STORAGE_ID, storageID, "", MTP_TYPE_UINT32);
-	addProperty(MTP_PROPERTY_OBJECT_FORMAT, mFormat, "", MTP_TYPE_UINT16);
-	addProperty(MTP_PROPERTY_PROTECTION_STATUS, 0, "", MTP_TYPE_UINT16);
-	addProperty(MTP_PROPERTY_OBJECT_SIZE, file_size, "", MTP_TYPE_UINT64);
-	addProperty(MTP_PROPERTY_OBJECT_FILE_NAME, 0, getName().c_str(), MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_DATE_MODIFIED, st.st_mtime, "", MTP_TYPE_UINT64);
-	addProperty(MTP_PROPERTY_PARENT_OBJECT, parent, "", MTP_TYPE_UINT32);
-	addProperty(MTP_PROPERTY_PERSISTENT_UID, puid, "", MTP_TYPE_UINT128);
-		// TODO: we can't really support persistent UIDs without a persistent DB.
-		// probably a combination of volume UUID + st_ino would come close.
-		// doesn't help for fs with no native inodes numbers like fat though...
-		// however, Microsoft's own impl (Zune, etc.) does not support persistent UIDs either
-	addProperty(MTP_PROPERTY_NAME, 0, getName().c_str(), MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_DISPLAY_NAME, 0, getName().c_str(), MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_DATE_ADDED, st.st_mtime, "", MTP_TYPE_UINT64);
-	addProperty(MTP_PROPERTY_DESCRIPTION, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_ARTIST, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_ALBUM_NAME, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_ALBUM_ARTIST, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_TRACK, 0, "", MTP_TYPE_UINT16);
-	addProperty(MTP_PROPERTY_ORIGINAL_RELEASE_DATE, 2014, "", MTP_TYPE_UINT64);	// TODO: extract year from st.st_mtime?
-	addProperty(MTP_PROPERTY_DURATION, 0, "", MTP_TYPE_UINT32);
-	addProperty(MTP_PROPERTY_GENRE, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_COMPOSER, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_ARTIST, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_ALBUM_NAME, 0, "", MTP_TYPE_STR);
-	addProperty(MTP_PROPERTY_DURATION, 0, "", MTP_TYPE_UINT32);
-	addProperty(MTP_PROPERTY_DESCRIPTION, 0, "", MTP_TYPE_STR);
-}
diff --git a/mtp/legacy/twrpMtp.cpp b/mtp/legacy/twrpMtp.cpp
deleted file mode 100644
index 2b2de01..0000000
--- a/mtp/legacy/twrpMtp.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- *
- * 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.
- */
-
-
-#include <string>
-#include <fcntl.h>
-#include <sys/wait.h>
-#include <pthread.h>
-#include <utils/Errors.h>
-#include <utils/threads.h>
-#include "MtpTypes.h"
-#include "MtpPacket.h"
-#include "MtpDataPacket.h"
-#include "MtpDatabase.h"
-#include "MtpRequestPacket.h"
-#include "MtpResponsePacket.h"
-#include "mtp_MtpDatabase.hpp"
-#include "mtp_MtpServer.hpp"
-#include "twrpMtp.hpp"
-#include "MtpDebug.h"
-
-#ifdef TWRPMTP
-static void usage(std::string prg) {
-	printf("Usage: %s <OPTIONS>\n", prg.c_str());
-	printf("Options:\n");
-	printf("\t-h, --help\t\tShow Usage\n");
-	printf("\t-s1, --storage1 /path/to/dir\t\tDestination to first storage directory\n");
-	printf("\t-s2, --storage2 /path/to/dir\t\tDestination to first storage directory\n");
-	printf("\t-sN, --storageN /path/to/dir\t\tDestination to first storage directory\n");
-}
-
-int main(int argc, char* argv[]) {
-	printf("argc: %d\n", argc);
-	if (argc < 2) {
-		usage(argv[0]);
-		return 1;
-	}
-
-	std::vector <std::string> storages;
-
-	for (int i = 1; i < argc; ++i) {
-		std::string arg = argv[i];
-		if ((arg == "-h") || (arg == "--help")) {
-			usage(argv[0]);
-		}
-		else {
-			storages.push_back(arg);
-		}
-	}
-	printf("starting\n");
-	twmtp_MtpServer* mtp = new twmtp_MtpServer();
-	mtp->set_storages(storages);
-	mtp->start();
-	return 0;
-}
-#endif //def TWRPMTP
-
-twrpMtp::twrpMtp(int debug_enabled) {
-	if (debug_enabled)
-		MtpDebug::enableDebug();
-	mtpstorages = new storages;
-	mtp_read_pipe = -1;
-}
-
-int twrpMtp::start(void) {
-	MTPI("Starting MTP\n");
-	twmtp_MtpServer *mtp = new twmtp_MtpServer();
-	mtp->set_storages(mtpstorages);
-	mtp->set_read_pipe(mtp_read_pipe);
-	mtp->start();
-	return 0;
-}
-
-pthread_t twrpMtp::threadserver(void) {
-	pthread_t thread;
-	ThreadPtr mtpptr = &twrpMtp::start;
-	PThreadPtr p = *(PThreadPtr*)&mtpptr;
-	pthread_create(&thread, NULL, p, this);
-	return thread;
-}
-
-pid_t twrpMtp::forkserver(int mtppipe[2]) {
-	pid_t pid;
-	if ((pid = fork()) == -1) {
-		MTPE("MTP fork failed.\n");
-		return 0;
-	}
-	if (pid == 0) {
-		// Child process
-		close(mtppipe[1]); // Child closes write side
-		mtp_read_pipe = mtppipe[0];
-		start();
-		MTPD("MTP child process exited.\n");
-		close(mtppipe[0]);
-		_exit(0);
-	} else {
-		return pid;
-	}
-	return 0;
-}
-
-void twrpMtp::addStorage(std::string display, std::string path, int mtpid, uint64_t maxFileSize) {
-	s = new storage;
-	s->display = display;
-	s->mount = path;
-	s->mtpid = mtpid;
-	s->maxFileSize = maxFileSize;
-	MTPD("twrpMtp mtpid: %d\n", s->mtpid);
-	mtpstorages->push_back(s);
-}
diff --git a/mtp/legacy/twrpMtp.hpp b/mtp/legacy/twrpMtp.hpp
deleted file mode 100644
index 9ad270c..0000000
--- a/mtp/legacy/twrpMtp.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++
- *
- * 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.
- */
-
-#ifndef TWRPMTP_HPP
-#define TWRPMTP_HPP
-
-#include <fcntl.h>
-#include <utils/Errors.h>
-#include <utils/threads.h>
-#include <string>
-#include <vector>
-#include <pthread.h>
-#include "MtpTypes.h"
-#include "MtpPacket.h"
-#include "MtpDataPacket.h"
-#include "MtpDatabase.h"
-#include "MtpRequestPacket.h"
-#include "MtpResponsePacket.h"
-#include "mtp_MtpDatabase.hpp"
-
-class twrpMtp {
-	public:
-		twrpMtp(int debug_enabled = 0);
-		pthread_t threadserver(void);
-		pid_t forkserver(int mtppipe[2]);
-		void addStorage(std::string display, std::string path, int mtpid, uint64_t maxFileSize);
-	private:
-		int start(void);
-		typedef int (twrpMtp::*ThreadPtr)(void);
-		typedef void* (*PThreadPtr)(void *);
-		storages *mtpstorages;
-		storage *s;
-		int mtp_read_pipe;
-};
-#endif
diff --git a/openaes/Android.mk b/openaes/Android.mk
old mode 100644
new mode 100755
index a628784..d74ea3b
--- a/openaes/Android.mk
+++ b/openaes/Android.mk
@@ -11,7 +11,7 @@
 	LOCAL_MODULE:=openaes
 	LOCAL_MODULE_TAGS:= optional
 	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 	LOCAL_SHARED_LIBRARIES = libopenaes libc
 	include $(BUILD_EXECUTABLE)
 
diff --git a/orscmd/Android.mk b/orscmd/Android.mk
old mode 100644
new mode 100755
index ad7c67b..42f918a
--- a/orscmd/Android.mk
+++ b/orscmd/Android.mk
@@ -15,5 +15,5 @@
 LOCAL_MODULE_TAGS:= optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
 LOCAL_PACK_MODULE_RELOCATIONS := false
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 include $(BUILD_EXECUTABLE)
diff --git a/orscmd/orscmd.h b/orscmd/orscmd.h
old mode 100644
new mode 100755
index f186add..e88d9a5
--- a/orscmd/orscmd.h
+++ b/orscmd/orscmd.h
@@ -16,7 +16,7 @@
 #ifndef __ORSCMD_H
 #define __ORSCMD_H
 
-#define ORS_INPUT_FILE "/sbin/orsin"
-#define ORS_OUTPUT_FILE "/sbin/orsout"
+#define ORS_INPUT_FILE "/system/bin/orsin"
+#define ORS_OUTPUT_FILE "/system/bin/orsout"
 
 #endif //__ORSCMD_H
diff --git a/ozip_decrypt/Android.mk b/ozip_decrypt/Android.mk
old mode 100644
new mode 100755
index 161cae8..8d5da48
--- a/ozip_decrypt/Android.mk
+++ b/ozip_decrypt/Android.mk
@@ -2,7 +2,7 @@
 
 include $(CLEAR_VARS)
 LOCAL_MODULE := ozip_decrypt
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_MODULE_TAGS := optional
 
 LOCAL_SRC_FILES := ozip_decrypt.cpp
diff --git a/partition.cpp b/partition.cpp
index e76e955..a8a8e45 100755
--- a/partition.cpp
+++ b/partition.cpp
@@ -1460,11 +1460,11 @@
 
 	// Check the current file system before mounting
 	Check_FS_Type();
-	if (Current_File_System == "exfat" && TWFunc::Path_Exists("/sbin/exfat-fuse")) {
-		string cmd = "/sbin/exfat-fuse -o big_writes,max_read=131072,max_write=131072 " + Actual_Block_Device + " " + Mount_Point;
+	if (Current_File_System == "exfat" && TWFunc::Path_Exists("/system/bin/exfat-fuse")) {
+		string cmd = "/system/bin/exfat-fuse -o big_writes,max_read=131072,max_write=131072 " + Actual_Block_Device + " " + Mount_Point;
 		LOGINFO("cmd: %s\n", cmd.c_str());
 		string result;
-		if (TWFunc::Exec_Cmd(cmd, result) != 0) {
+		if (TWFunc::Exec_Cmd(cmd, result, false) != 0) {
 			LOGINFO("exfat-fuse failed to mount with result '%s', trying vfat\n", result.c_str());
 			Current_File_System = "vfat";
 		} else {
@@ -1478,19 +1478,19 @@
 		}
 	}
 
-	if (Current_File_System == "ntfs" && (TWFunc::Path_Exists("/sbin/ntfs-3g") || TWFunc::Path_Exists("/sbin/mount.ntfs"))) {
+	if (Current_File_System == "ntfs" && (TWFunc::Path_Exists("/system/bin/ntfs-3g") || TWFunc::Path_Exists("/system/bin/mount.ntfs"))) {
 		string cmd;
 		string Ntfsmount_Binary = "";
 
-		if (TWFunc::Path_Exists("/sbin/ntfs-3g"))
+		if (TWFunc::Path_Exists("/system/bin/ntfs-3g"))
 			Ntfsmount_Binary = "ntfs-3g";
-		else if (TWFunc::Path_Exists("/sbin/mount.ntfs"))
+		else if (TWFunc::Path_Exists("/system/bin/mount.ntfs"))
 			Ntfsmount_Binary = "mount.ntfs";
 
 		if (Mount_Read_Only)
-			cmd = "/sbin/" + Ntfsmount_Binary + " -o ro " + Actual_Block_Device + " " + Mount_Point;
+			cmd = "/system/bin/" + Ntfsmount_Binary + " -o ro " + Actual_Block_Device + " " + Mount_Point;
 		else
-			cmd = "/sbin/" + Ntfsmount_Binary + " " + Actual_Block_Device + " " + Mount_Point;
+			cmd = "/system/bin/" + Ntfsmount_Binary + " " + Actual_Block_Device + " " + Mount_Point;
 		LOGINFO("cmd: '%s'\n", cmd.c_str());
 
 		if (TWFunc::Exec_Cmd(cmd) == 0) {
@@ -1579,7 +1579,7 @@
 		Update_Size(Display_Error);
 
 	if (!Symlink_Mount_Point.empty() && TWFunc::Path_Exists(Symlink_Path)) {
-		string Command = "mount -o bind '" + Symlink_Path + "' '" + Symlink_Mount_Point + "'";
+		string Command = "/system/bin/mount -o bind '" + Symlink_Path + "' '" + Symlink_Mount_Point + "'";
 		TWFunc::Exec_Cmd(Command);
 	}
 
@@ -1747,15 +1747,15 @@
 bool TWPartition::Can_Repair() {
 	if (Mount_Read_Only)
 		return false;
-	if (Current_File_System == "vfat" && TWFunc::Path_Exists("/sbin/fsck.fat"))
+	if (Current_File_System == "vfat" && TWFunc::Path_Exists("/system/bin/fsck.fat"))
 		return true;
-	else if ((Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") && TWFunc::Path_Exists("/sbin/e2fsck"))
+	else if ((Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") && TWFunc::Path_Exists("/system/bin/e2fsck"))
 		return true;
-	else if (Current_File_System == "exfat" && TWFunc::Path_Exists("/sbin/fsck.exfat"))
+	else if (Current_File_System == "exfat" && TWFunc::Path_Exists("/system/bin/fsck.exfat"))
 		return true;
-	else if (Current_File_System == "f2fs" && TWFunc::Path_Exists("/sbin/fsck.f2fs"))
+	else if (Current_File_System == "f2fs" && TWFunc::Path_Exists("/system/bin/fsck.f2fs"))
 		return true;
-	else if (Current_File_System == "ntfs" && (TWFunc::Path_Exists("/sbin/ntfsfix") || TWFunc::Path_Exists("/sbin/fsck.ntfs")))
+	else if (Current_File_System == "ntfs" && (TWFunc::Path_Exists("/system/bin/ntfsfix") || TWFunc::Path_Exists("/system/bin/fsck.ntfs")))
 		return true;
 	return false;
 }
@@ -1764,7 +1764,7 @@
 	string command;
 
 	if (Current_File_System == "vfat") {
-		if (!TWFunc::Path_Exists("/sbin/fsck.fat")) {
+		if (!TWFunc::Path_Exists("/system/bin/fsck.fat")) {
 			gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("fsck.fat"));
 			return false;
 		}
@@ -1772,7 +1772,7 @@
 			return false;
 		gui_msg(Msg("repairing_using=Repairing {1} using {2}...")(Display_Name)("fsck.fat"));
 		Find_Actual_Block_Device();
-		command = "/sbin/fsck.fat -y " + Actual_Block_Device;
+		command = "/system/bin/fsck.fat -y " + Actual_Block_Device;
 		LOGINFO("Repair command: %s\n", command.c_str());
 		if (TWFunc::Exec_Cmd(command) == 0) {
 			gui_msg("done=Done.");
@@ -1783,7 +1783,7 @@
 		}
 	}
 	if (Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") {
-		if (!TWFunc::Path_Exists("/sbin/e2fsck")) {
+		if (!TWFunc::Path_Exists("/system/bin/e2fsck")) {
 			gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("e2fsck"));
 			return false;
 		}
@@ -1791,7 +1791,7 @@
 			return false;
 		gui_msg(Msg("repairing_using=Repairing {1} using {2}...")(Display_Name)("e2fsck"));
 		Find_Actual_Block_Device();
-		command = "/sbin/e2fsck -fp " + Actual_Block_Device;
+		command = "/system/bin/e2fsck -fp " + Actual_Block_Device;
 		LOGINFO("Repair command: %s\n", command.c_str());
 		if (TWFunc::Exec_Cmd(command) == 0) {
 			gui_msg("done=Done.");
@@ -1802,7 +1802,7 @@
 		}
 	}
 	if (Current_File_System == "exfat") {
-		if (!TWFunc::Path_Exists("/sbin/fsck.exfat")) {
+		if (!TWFunc::Path_Exists("/system/bin/fsck.exfat")) {
 			gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("fsck.exfat"));
 			return false;
 		}
@@ -1810,7 +1810,7 @@
 			return false;
 		gui_msg(Msg("repairing_using=Repairing {1} using {2}...")(Display_Name)("fsck.exfat"));
 		Find_Actual_Block_Device();
-		command = "/sbin/fsck.exfat " + Actual_Block_Device;
+		command = "/system/bin/fsck.exfat " + Actual_Block_Device;
 		LOGINFO("Repair command: %s\n", command.c_str());
 		if (TWFunc::Exec_Cmd(command) == 0) {
 			gui_msg("done=Done.");
@@ -1821,7 +1821,7 @@
 		}
 	}
 	if (Current_File_System == "f2fs") {
-		if (!TWFunc::Path_Exists("/sbin/fsck.f2fs")) {
+		if (!TWFunc::Path_Exists("/system/bin/fsck.f2fs")) {
 			gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("fsck.f2fs"));
 			return false;
 		}
@@ -1829,7 +1829,7 @@
 			return false;
 		gui_msg(Msg("repairing_using=Repairing {1} using {2}...")(Display_Name)("fsck.f2fs"));
 		Find_Actual_Block_Device();
-		command = "/sbin/fsck.f2fs " + Actual_Block_Device;
+		command = "/system/bin/fsck.f2fs " + Actual_Block_Device;
 		LOGINFO("Repair command: %s\n", command.c_str());
 		if (TWFunc::Exec_Cmd(command) == 0) {
 			gui_msg("done=Done.");
@@ -1841,9 +1841,9 @@
 	}
 	if (Current_File_System == "ntfs") {
 		string Ntfsfix_Binary;
-		if (TWFunc::Path_Exists("/sbin/ntfsfix"))
+		if (TWFunc::Path_Exists("/system/bin/ntfsfix"))
 			Ntfsfix_Binary = "ntfsfix";
-		else if (TWFunc::Path_Exists("/sbin/fsck.ntfs"))
+		else if (TWFunc::Path_Exists("/system/bin/fsck.ntfs"))
 			Ntfsfix_Binary = "fsck.ntfs";
 		else {
 			gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("ntfsfix"));
@@ -1853,7 +1853,7 @@
 			return false;
 		gui_msg(Msg("repairing_using=Repairing {1} using {2}...")(Display_Name)(Ntfsfix_Binary));
 		Find_Actual_Block_Device();
-		command = "/sbin/" + Ntfsfix_Binary + " " + Actual_Block_Device;
+		command = "/system/bin/" + Ntfsfix_Binary + " " + Actual_Block_Device;
 		LOGINFO("Repair command: %s\n", command.c_str());
 		if (TWFunc::Exec_Cmd(command) == 0) {
 			gui_msg("done=Done.");
@@ -1869,7 +1869,7 @@
 bool TWPartition::Can_Resize() {
 	if (Mount_Read_Only)
 		return false;
-	if ((Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") && TWFunc::Path_Exists("/sbin/resize2fs"))
+	if ((Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") && TWFunc::Path_Exists("/system/bin/resize2fs"))
 		return true;
 	return false;
 }
@@ -1883,7 +1883,7 @@
 			gui_msg(Msg(msg::kError, "cannot_resize=Cannot resize {1}.")(Display_Name));
 			return false;
 		}
-		if (!TWFunc::Path_Exists("/sbin/resize2fs")) {
+		if (!TWFunc::Path_Exists("/system/bin/resize2fs")) {
 			LOGINFO("resize2fs does not exist! Cannot resize!\n");
 			gui_msg(Msg(msg::kError, "cannot_resize=Cannot resize {1}.")(Display_Name));
 			return false;
@@ -1894,7 +1894,7 @@
 			return false;
 		gui_msg(Msg("resizing=Resizing {1} using {2}...")(Display_Name)("resize2fs"));
 		Find_Actual_Block_Device();
-		command = "/sbin/resize2fs " + Actual_Block_Device;
+		command = "/system/bin/resize2fs " + Actual_Block_Device;
 		if (Length != 0) {
 			unsigned long long Actual_Size = IOCTL_Get_Block_Size();
 			if (Actual_Size == 0)
@@ -2101,9 +2101,9 @@
 		return false;
 
 #if PLATFORM_SDK_VERSION < 28
-	if (!TWFunc::Path_Exists("/sbin/mke2fs"))
+	if (!TWFunc::Path_Exists("/system/bin/mke2fs"))
 #else
-	if (!TWFunc::Path_Exists("/sbin/mke2fs") || !TWFunc::Path_Exists("/sbin/e2fsdroid"))
+	if (!TWFunc::Path_Exists("/system/bin/mke2fs") || !TWFunc::Path_Exists("/system/bin/e2fsdroid"))
 #endif
 		return Wipe_RMRF();
 
@@ -2151,7 +2151,7 @@
 		return false;
 	}
 
-	if (TWFunc::Path_Exists("/sbin/e2fsdroid")) {
+	if (TWFunc::Path_Exists("/system/bin/e2fsdroid")) {
 		const string& File_Contexts_Entry = (Mount_Point == "/system_root" ? "/" : Mount_Point);
 		char *secontext = NULL;
 		if (!selinux_handle || selabel_lookup(selinux_handle, &secontext, File_Contexts_Entry.c_str(), S_IFDIR) < 0) {
@@ -2247,7 +2247,7 @@
 	if (!UnMount(true))
 		return false;
 
-	if (TWFunc::Path_Exists("/sbin/mkfs.fat")) {
+	if (TWFunc::Path_Exists("/system/bin/mkfs.fat")) {
 		gui_msg(Msg("formatting_using=Formatting {1} using {2}...")(Display_Name)("mkfs.fat"));
 		Find_Actual_Block_Device();
 		command = "mkfs.fat " + Actual_Block_Device;
@@ -2273,7 +2273,7 @@
 
 	if (!UnMount(true))
 		return false;
-	if (TWFunc::Path_Exists("/sbin/mkexfatfs")) {
+	if (TWFunc::Path_Exists("/system/bin/mkexfatfs")) {
 		gui_msg(Msg("formatting_using=Formatting {1} using {2}...")(Display_Name)("mkexfatfs"));
 		Find_Actual_Block_Device();
 		command = "mkexfatfs " + Actual_Block_Device;
@@ -2345,10 +2345,10 @@
 	if (!UnMount(true))
 		return false;
 
-	if (TWFunc::Path_Exists("/sbin/mkfs.f2fs"))
-		f2fs_bin = "/sbin/mkfs.f2fs";
-	else if (TWFunc::Path_Exists("/sbin/make_f2fs"))
-		f2fs_bin = "/sbin/make_f2fs";
+	if (TWFunc::Path_Exists("/system/bin/mkfs.f2fs"))
+		f2fs_bin = "/system/bin/mkfs.f2fs";
+	else if (TWFunc::Path_Exists("/system/bin/make_f2fs"))
+		f2fs_bin = "/system/bin/make_f2fs";
 	else {
 		LOGINFO("mkfs.f2fs binary not found, using rm -rf to wipe.\n");
 		return Wipe_RMRF();
@@ -2373,7 +2373,7 @@
 	char dev_sz_str[48];
 	sprintf(dev_sz_str, "%llu", (dev_sz / 4096));
 	command = f2fs_bin + " -d1 -f -O encrypt -O quota -O verity -w 4096 " + Actual_Block_Device + " " + dev_sz_str;
-	if (TWFunc::Path_Exists("/sbin/sload.f2fs")) {
+	if (TWFunc::Path_Exists("/system/bin/sload.f2fs")) {
 		command += " && sload.f2fs -t /data " + Actual_Block_Device;
 	}
 
@@ -2406,16 +2406,16 @@
 	if (!UnMount(true))
 		return false;
 
-	if (TWFunc::Path_Exists("/sbin/mkntfs"))
+	if (TWFunc::Path_Exists("/system/bin/mkntfs"))
 		Ntfsmake_Binary = "mkntfs";
-	else if (TWFunc::Path_Exists("/sbin/mkfs.ntfs"))
+	else if (TWFunc::Path_Exists("/system/bin/mkfs.ntfs"))
 		Ntfsmake_Binary = "mkfs.ntfs";
 	else
 		return false;
 
 	gui_msg(Msg("formatting_using=Formatting {1} using {2}...")(Display_Name)(Ntfsmake_Binary));
 	Find_Actual_Block_Device();
-	command = "/sbin/" + Ntfsmake_Binary + " " + Actual_Block_Device;
+	command = "/system/bin/" + Ntfsmake_Binary + " " + Actual_Block_Device;
 	if (TWFunc::Exec_Cmd(command) == 0) {
 		Recreate_AndSec_Folder();
 		gui_msg("done=Done.");
@@ -3398,4 +3398,16 @@
 void TWPartition::Set_Can_Be_Wiped(bool val) {
 	Can_Be_Wiped = val;
 	Wipe_Available_in_GUI = val;
+}
+
+std::string TWPartition::Get_Backup_FileName() {
+	return Backup_FileName;
+}
+
+std::string TWPartition::Get_Display_Name() {
+	return Display_Name;
+}
+
+bool TWPartition::Is_SlotSelect() {
+	return SlotSelect;
 }
\ No newline at end of file
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index efcaed8..7cc126f 100755
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -67,6 +67,7 @@
 #include "gui/gui.hpp"
 #include "progresstracking.hpp"
 #include "twrpDigestDriver.hpp"
+#include "twrpRepacker.hpp"
 #include "adbbu/libtwadbbu.hpp"
 
 #ifdef TW_HAS_MTP
@@ -1420,7 +1421,7 @@
 				ret = false;
 		}
 	}
-	TWFunc::check_and_run_script("/sbin/factoryreset.sh", "Factory Reset Script");
+	TWFunc::check_and_run_script("/system/bin/factoryreset.sh", "Factory Reset Script");
 	return ret;
 }
 
@@ -2584,6 +2585,7 @@
 }
 
 bool TWPartitionManager::Flash_Image(string& path, string& filename) {
+	twrpRepacker repacker;
 	int partition_count = 0;
 	TWPartition* flash_part = NULL;
 	string Flash_List, flash_path, full_filename;
@@ -2617,7 +2619,7 @@
 		Repack_Options.Disable_Verity = false;
 		Repack_Options.Disable_Force_Encrypt = false;
 		Repack_Options.Backup_First = DataManager::GetIntValue("tw_repack_backup_first") != 0;
-		return Repack_Images(full_filename, Repack_Options);
+		return repacker.Repack_Image_And_Flash(full_filename, Repack_Options);
 	}
 	PartitionSettings part_settings;
 	part_settings.Backup_Folder = path;
@@ -3108,162 +3110,6 @@
 	return TWFunc::Recursive_Mkdir(Folder);
 }
 
-bool TWPartitionManager::Prepare_Repack(TWPartition* Part, const std::string& Temp_Folder_Destination, const bool Create_Backup, const std::string& Backup_Name) {
-	if (!Part) {
-		LOGERR("Partition was null!\n");
-		return false;
-	}
-	if (!Prepare_Empty_Folder(Temp_Folder_Destination))
-		return false;
-	std::string target_image = Temp_Folder_Destination + "boot.img";
-	PartitionSettings part_settings;
-	part_settings.Part = Part;
-	if (Create_Backup) {
-		if (Check_Backup_Name(Backup_Name, true, false) != 0)
-			return false;
-		DataManager::GetValue(TW_BACKUPS_FOLDER_VAR, part_settings.Backup_Folder);
-		part_settings.Backup_Folder = part_settings.Backup_Folder + "/" + TWFunc::Get_Current_Date() + " " + Backup_Name + "/";
-		if (!TWFunc::Recursive_Mkdir(part_settings.Backup_Folder))
-			return false;
-	} else
-		part_settings.Backup_Folder = Temp_Folder_Destination;
-	part_settings.adbbackup = false;
-	part_settings.generate_digest = false;
-	part_settings.generate_md5 = false;
-	part_settings.PM_Method = PM_BACKUP;
-	part_settings.progress = NULL;
-	pid_t not_a_pid = 0;
-	if (!Part->Backup(&part_settings, &not_a_pid))
-		return false;
-	std::string backed_up_image = part_settings.Backup_Folder;
-	backed_up_image += Part->Backup_FileName;
-	target_image = Temp_Folder_Destination + "boot.img";
-	if (Create_Backup) {
-		std::string source = part_settings.Backup_Folder + Part->Backup_FileName;
-		if (TWFunc::copy_file(source, target_image, 0644) != 0) {
-			LOGERR("Failed to copy backup file '%s' to temp folder target '%s'\n", source.c_str(), target_image.c_str());
-			return false;
-		}
-	} else {
-		if (rename(backed_up_image.c_str(), target_image.c_str()) != 0) {
-			LOGERR("Failed to rename '%s' to '%s'\n", backed_up_image.c_str(), target_image.c_str());
-			return false;
-		}
-	}
-	return Prepare_Repack(target_image, Temp_Folder_Destination, false, false);
-}
-
-bool TWPartitionManager::Prepare_Repack(const std::string& Source_Path, const std::string& Temp_Folder_Destination, const bool Copy_Source, const bool Create_Destination) {
-	if (Create_Destination) {
-		if (!Prepare_Empty_Folder(Temp_Folder_Destination))
-			return false;
-	}
-	if (Copy_Source) {
-		std::string destination = Temp_Folder_Destination + "/boot.img";
-		if (TWFunc::copy_file(Source_Path, destination, 0644))
-			return false;
-	}
-	std::string command = "cd " + Temp_Folder_Destination + " && /sbin/magiskboot unpack -h '" + Source_Path +"'";
-	if (TWFunc::Exec_Cmd(command) != 0) {
-		LOGINFO("Error unpacking %s!\n", Source_Path.c_str());
-		gui_msg(Msg(msg::kError, "unpack_error=Error unpacking image."));
-		return false;
-	}
-	return true;
-}
-
-bool TWPartitionManager::Repack_Images(const std::string& Target_Image, const struct Repack_Options_struct& Repack_Options) {
-	if (!TWFunc::Path_Exists("/sbin/magiskboot")) {
-		LOGERR("Image repacking tool not present in this TWRP build!");
-		return false;
-	}
-	DataManager::SetProgress(0);
-	TWPartition* part = PartitionManager.Find_Partition_By_Path("/boot");
-	if (part)
-		gui_msg(Msg("unpacking_image=Unpacking {1}...")(part->Display_Name));
-	else {
-		gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1}.")("/boot"));
-		return false;
-	}
-	if (!PartitionManager.Prepare_Repack(part, REPACK_ORIG_DIR, Repack_Options.Backup_First, gui_lookup("repack", "Repack")))
-		return false;
-	DataManager::SetProgress(.25);
-	gui_msg(Msg("unpacking_image=Unpacking {1}...")(Target_Image));
-	if (!PartitionManager.Prepare_Repack(Target_Image, REPACK_NEW_DIR, true))
-		return false;
-	DataManager::SetProgress(.5);
-	gui_msg(Msg("repacking_image=Repacking {1}...")(part->Display_Name));
-	std::string path = REPACK_NEW_DIR;
-	if (Repack_Options.Type == REPLACE_KERNEL) {
-		// When we replace the kernel, what we really do is copy the boot partition ramdisk into the new image's folder
-		if (TWFunc::copy_file(REPACK_ORIG_DIR "ramdisk.cpio", REPACK_NEW_DIR "ramdisk.cpio", 0644)) {
-			LOGERR("Failed to copy ramdisk\n");
-			return false;
-		}
-	} else if (Repack_Options.Type == REPLACE_RAMDISK) {
-		// Repack the ramdisk
-		if (TWFunc::copy_file(REPACK_NEW_DIR "ramdisk.cpio", REPACK_ORIG_DIR "ramdisk.cpio", 0644)) {
-			LOGERR("Failed to copy ramdisk\n");
-			return false;
-		}
-		path = REPACK_ORIG_DIR;
-	} else {
-		LOGERR("Invalid repacking options specified\n");
-		return false;
-	}
-	if (Repack_Options.Disable_Verity)
-		LOGERR("Disabling verity is not implemented yet\n");
-	if (Repack_Options.Disable_Force_Encrypt)
-		LOGERR("Disabling force encrypt is not implemented yet\n");
-	std::string command = "cd " + path + " && /sbin/magiskboot repack " + path + "boot.img";
-	if (TWFunc::Exec_Cmd(command) != 0) {
-		gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
-		return false;
-	}
-	DataManager::SetProgress(.75);
-	std::string file = "new-boot.img";
-	DataManager::SetValue("tw_flash_partition", "/boot;");
-	if (!PartitionManager.Flash_Image(path, file)) {
-		LOGINFO("Error flashing new image\n");
-		return false;
-	}
-	DataManager::SetProgress(1);
-	TWFunc::removeDir(REPACK_ORIG_DIR, false);
-	if (part->SlotSelect && Repack_Options.Type == REPLACE_RAMDISK) {
-		LOGINFO("Switching slots to flash ramdisk to both partitions\n");
-		string Current_Slot = Get_Active_Slot_Display();
-		if (Current_Slot == "A")
-			Set_Active_Slot("B");
-		else
-			Set_Active_Slot("A");
-		DataManager::SetProgress(.25);
-		if (!PartitionManager.Prepare_Repack(part, REPACK_ORIG_DIR, Repack_Options.Backup_First, gui_lookup("repack", "Repack")))
-			return false;
-		if (TWFunc::copy_file(REPACK_NEW_DIR "ramdisk.cpio", REPACK_ORIG_DIR "ramdisk.cpio", 0644)) {
-			LOGERR("Failed to copy ramdisk\n");
-			return false;
-		}
-		path = REPACK_ORIG_DIR;
-		command = "cd " + path + " && /sbin/magiskboot repack " + path + "boot.img";
-		if (TWFunc::Exec_Cmd(command) != 0) {
-			gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
-			return false;
-		}
-		DataManager::SetProgress(.75);
-		std::string file = "new-boot.img";
-		DataManager::SetValue("tw_flash_partition", "/boot;");
-		if (!PartitionManager.Flash_Image(path, file)) {
-			LOGINFO("Error flashing new image\n");
-			return false;
-		}
-		DataManager::SetProgress(1);
-		TWFunc::removeDir(REPACK_ORIG_DIR, false);
-		Set_Active_Slot(Current_Slot);
-	}
-	TWFunc::removeDir(REPACK_NEW_DIR, false);
-	return true;
-}
-
 bool TWPartitionManager::Prepare_Super_Volume(TWPartition* twrpPart) {
     Fstab fstab;
 	std::string bare_partition_name;
diff --git a/partitions.hpp b/partitions.hpp
index 53d40ac..55a0ac1 100755
--- a/partitions.hpp
+++ b/partitions.hpp
@@ -76,19 +76,6 @@
 	char* fstab_line;
 };
 
-enum Repack_Type {
-	REPLACE_NONE = 0,
-	REPLACE_RAMDISK = 1,
-	REPLACE_KERNEL = 2,
-};
-
-struct Repack_Options_struct {
-	Repack_Type Type;
-	bool Backup_First;
-	bool Disable_Verity;
-	bool Disable_Force_Encrypt;
-};
-
 enum PartitionManager_Op {                                                    // PartitionManager Restore Mode for Raw_Read_Write()
 	PM_BACKUP = 0,
 	PM_RESTORE = 1,
@@ -160,13 +147,16 @@
 	int Decrypt_Adopted();
 	void Revert_Adopted();
 	void Partition_Post_Processing(bool Display_Error);                       // Apply partition specific settings after fstab processed
-	void Set_Backup_FileName(string fname);                                   // Set Backup_FileName for partition
+	void Set_Backup_FileName(string fname);                                   // Set backup filename for partition
+	std::string Get_Backup_FileName();                                        // Get the backup filename for the partition
 	string Get_Backup_Name();                                                 // Get Backup_Name for partition
 	bool Decrypt_FBE_DE();                                                    // If FBE is present, backup exclusions are set up and DE decrypt is attempted
 	string Get_Mount_Point();												  // Return Mount_Point or directory the current partition is mounted on
 	bool Get_Super_Status();												  // Returns true if partition is a super volume mounted partitions
 	void Set_Can_Be_Backed_Up(bool val);									  // Update whether the partition can be backed up or not
 	void Set_Can_Be_Wiped(bool val);										  // Update whether the partition can be wiped or not
+	std::string Get_Display_Name();                                           // Get the display name in the gui for the partition
+	bool Is_SlotSelect();                                                     // Return whether the partition is a slot partition or not
 
 public:
 	string Current_File_System;                                               // Current file system
@@ -384,9 +374,6 @@
 	void read_uevent();                                                       // Reads uevent data into a buffer
 	void close_uevent();                                                      // Closes the uevent netlink socket
 	void Add_Partition(TWPartition* Part);                                    // Adds a new partition to the Partitions vector
-	bool Prepare_Repack(TWPartition* Part, const std::string& Temp_Folder_Destination, const bool Create_Backup, const std::string& Backup_Name); // Prepares an image for repacking by unpacking it to the temp folder destination
-	bool Prepare_Repack(const std::string& Source_Path, const std::string& Temp_Folder_Destination, const bool Copy_Source, const bool Create_Destination = true); // Prepares an image for repacking by unpacking it to the temp folder destination
-	bool Repack_Images(const std::string& Target_Image, const struct Repack_Options_struct& Repack_Options); // Repacks the boot image with a new kernel or a new ramdisk
     bool Prepare_Super_Volume(TWPartition* twrpPart);					  	  // Prepare logical super partition volume for mounting
 	std::string Get_Super_Partition();										  // Get Super Partition block device path
 	void Setup_Super_Devices();												  // Setup logical dm devices on super partition
@@ -411,6 +398,8 @@
 	int mtp_write_fd;
 	pid_t tar_fork_pid;                                                       // PID of twrpTar fork
 	Backup_Method_enum Backup_Method;                                         // Method used for backup
+	std::string original_ramdisk_format;                                      // Ramdisk format of boot partition
+	std::string repacked_ramdisk_format;                                      // Ramdisk format of boot image to repack from
 
 private:
 	std::vector<TWPartition*> Partitions;                                     // Vector list of all partitions
diff --git a/pigz/Android.mk b/pigz/Android.mk
old mode 100644
new mode 100755
index ad7f39d..2875fd1
--- a/pigz/Android.mk
+++ b/pigz/Android.mk
@@ -5,7 +5,7 @@
 LOCAL_MODULE := pigz
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_CFLAGS :=
 LOCAL_SRC_FILES = pigz.c yarn.c
 LOCAL_C_INCLUDES += $(LOCAL_PATH) \
@@ -13,9 +13,9 @@
 LOCAL_SHARED_LIBRARIES += libz libc
 
 LOCAL_POST_INSTALL_CMD := \
-    $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/sbin && \
-    ln -sf pigz $(TARGET_RECOVERY_ROOT_OUT)/sbin/gunzip && \
-    ln -sf pigz $(TARGET_RECOVERY_ROOT_OUT)/sbin/gzip && \
-    ln -sf pigz $(TARGET_RECOVERY_ROOT_OUT)/sbin/unpigz
+    $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system/bin && \
+    ln -sf pigz $(TARGET_RECOVERY_ROOT_OUT)/system/bin/gunzip && \
+    ln -sf pigz $(TARGET_RECOVERY_ROOT_OUT)/system/bin/gzip && \
+    ln -sf pigz $(TARGET_RECOVERY_ROOT_OUT)/system/bin/unpigz
 
 include $(BUILD_EXECUTABLE)
diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk
index b81c32b..acb5b78 100755
--- a/prebuilt/Android.mk
+++ b/prebuilt/Android.mk
@@ -8,672 +8,436 @@
 LOCAL_MODULE := teamwin
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
 
 # Manage list
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dump_image
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/flash_image
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/erase_image
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/bu
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/dump_image
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/flash_image
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/erase_image
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/bu
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/sh
-else
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sh
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/sh
+
+LOCAL_POST_INSTALL_CMD += $(hide) if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/system/bin/egrep" ]; then \
+							rm $(TARGET_RECOVERY_ROOT_OUT)/system/bin/egrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/system/bin/grep $(TARGET_RECOVERY_ROOT_OUT)/system/bin/egrep; \
+							if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/system/bin/fgrep" ]; then \
+							rm $(TARGET_RECOVERY_ROOT_OUT)/system/bin/fgrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/system/bin/grep $(TARGET_RECOVERY_ROOT_OUT)/system/bin/fgrep;
+
+ifneq ($(wildcard external/zip/Android.mk),)
+	RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/zip
 endif
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 23; echo $$?),0)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/grep
-    else
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/grep
-    endif
-    LOCAL_POST_INSTALL_CMD += $(hide) if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep" ]; then \
-                                rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; \
-                                if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep" ]; then \
-                                rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep;
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dd
-        endif
-    endif
-    ifneq ($(wildcard external/zip/Android.mk),)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/zip
-    endif
-    ifneq ($(wildcard external/unzip/Android.mk),)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/unzip
-    endif
-    ifneq ($(wildcard system/core/libziparchive/Android.bp),)
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/unzip
-        else
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/unzip
-        endif
-    endif
-    ifneq ($(wildcard external/one-true-awk/Android.bp),)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/awk
-    endif
+ifneq ($(wildcard external/unzip/Android.mk),)
+	RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/unzip
+endif
+ifneq ($(wildcard system/core/libziparchive/Android.bp),)
+	RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/unzip
+endif
+ifneq ($(wildcard external/one-true-awk/Android.bp),)
+	RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/awk
 endif
 
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/pigz
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fsck.fat
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fatlabel
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.fat
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 27; echo $$?),0)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 28; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/adbd
-    else
-        RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/adbd
-        RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/fastbootd
-    endif
-endif
-RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsck
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsdroid
-endif
-RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mke2fs
-RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/tune2fs
-RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/resize2fs
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/simg2img
-ifneq ($(TW_OZIP_DECRYPT_KEY),)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/ozip_decrypt
-endif
-ifneq ($(TARGET_ARCH), x86_64)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker
-endif
-ifeq ($(TARGET_ARCH), x86_64)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker64
-endif
-ifeq ($(TARGET_ARCH), arm64)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/linker64
-    else
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker64
-    endif
-endif
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/adbd
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/fastbootd
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsck
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsdroid
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mke2fs
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/tune2fs
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/resize2fs
+
 #RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/twrpmtp
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libc.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libdl.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libm.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libbootloader_message.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libfs_mgr.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libfscrypt.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libgsi.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libkeyutils.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/liblogwrap.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/liblp.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libprocessgroup.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libprocessgroup_setup.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libadbd.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libadbd_services.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libcap.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libminijail.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libunwindstack.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libasyncio.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libcgrouprc.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libbinderthreadstate.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libsquashfs_utils.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libjsoncpp.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libmdnssd.so
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libfec.so
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libinit.so
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libdl_android.so
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libprotobuf-cpp-lite.so
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libbinder.so
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libchrome.so
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libevent.so
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/keystore
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/keystore_cli_v2
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/hwservicemanager
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/servicemanager
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/vold_prepare_subdirs
-    RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../vendor/bin/vndservicemanager
-    RELINK_SOURCE_FILES +=   $(TARGET_RECOVERY_ROOT_OUT)/system/bin/toybox
-else
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libc.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libdl.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libm.so
-endif
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcutils.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrecovery.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libusbhost.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libutils.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_com_err.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_e2p.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2fs.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_profile.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_uuid.so
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 27; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_misc.so
-endif
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/android.hardware.fastboot@1.0.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/android.hardware.health@1.0.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/android.hardware.health@2.0.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/ld-android.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libc.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libdl.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libm.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libfs_mgr.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libfscrypt.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libgsi.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libkeyutils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/liblogwrap.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/liblp.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libprocessgroup.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libprocessgroup_setup.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libadbd.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libadbd_services.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libcap.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libminijail.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libunwindstack.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libasyncio.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libbinderthreadstate.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libmdnssd.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libinit.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libdl_android.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libprotobuf-cpp-lite.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libbinder.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libchrome.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libevent.so
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/keystore
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/keystore_cli_v2
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/hwservicemanager
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/servicemanager
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/vold_prepare_subdirs
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../vendor/bin/vndservicemanager
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/toybox
+# RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/charger
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/ueventd
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/watchdogd
+
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcutils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrecovery.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libusbhost.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libutils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_com_err.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_e2p.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2fs.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_profile.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_uuid.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_misc.so
 ifneq ($(wildcard external/e2fsprogs/lib/quota/Android.mk),)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_quota.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_quota.so
 endif
 ifneq ($(wildcard external/e2fsprogs/lib/ext2fs/Android.*),)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2fs.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2fs.so
 endif
 ifneq ($(wildcard external/e2fsprogs/lib/blkid/Android.*),)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_blkid.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_blkid.so
 endif
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpng.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblog.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libstdc++.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libz.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminuitwrp.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminadbd.so
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminzip.so
-endif
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libmtdutils.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtar.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwadbbu.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwrpdigest.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libutil-linux.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libblkid.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libmmcutils.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbmlutils.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libflashutils.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libfusesideload.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbootloader_message_twrp.so
-ifeq ($(PLATFORM_SDK_VERSION), 22)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libc++.so
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
-    # These libraries are no longer present in M
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libstlport.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libgccdemangle.so
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpng.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblog.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libstdc++.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminuitwrp.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminadbd.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libz.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libmtdutils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtar.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwadbbu.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwrpdigest.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libutil-linux.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libblkid.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libmmcutils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbmlutils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libflashutils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libfusesideload.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbootloader_message_twrp.so
 
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so \
-    $(if $(WITH_CRYPTO_UTILS),$(TARGET_OUT_SHARED_LIBRARIES)/libcrypto_utils.so)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpackagelistparser.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblzma.so
-endif
-ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
-    # libraries from lollipop
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbacktrace.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libunwind.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libunwind-ptrace.so
-    # Dynamically loaded by lollipop libc and may prevent unmounting system if it is not present in sbin
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libnetd_client.so
-else
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 23; echo $$?),0)
-        # Android M libraries
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libbacktrace.so
-        else
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbacktrace.so
-        endif
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libunwind.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbase.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libc++.so
-        # Dynamically loaded by libc and may prevent unmounting system if it is not present in sbin
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libnetd_client.so
-    else
-        # Not available in lollipop
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcorkscrew.so
-    endif
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libmincrypttwrp.so
-endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/toolbox
-else
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toolbox
-endif
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so \
+$(if $(WITH_CRYPTO_UTILS),$(TARGET_OUT_SHARED_LIBRARIES)/libcrypto_utils.so)
+  
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libbacktrace.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libunwind.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbase.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libc++.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libnetd_client.so
+
+RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/toolbox
+
 
 ifneq ($(TW_OEM_BUILD),true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/twrp
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/twrp
 else
     TW_EXCLUDE_MTP := true
 endif
 
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-ifneq ($(TW_EXCLUDE_MTP), true)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwrpmtp-ffs.so
-endif
-else
-ifneq ($(TW_EXCLUDE_MTP), true)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwrpmtp-legacy.so
-endif
-endif
-
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext4_utils.so
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libaosprecovery.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwrpmtp-ffs.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext4_utils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libaosprecovery.so
 ifneq ($(TW_INCLUDE_JPEG),)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libjpeg.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libjpeg.so
 endif
-RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libselinux.so
-ifeq ($(BUILD_ID), GINGERBREAD)
-    TW_NO_EXFAT := true
-endif
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libselinux.so
+
 ifneq ($(TW_NO_EXFAT), true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkexfatfs
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fsck.exfat
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libexfat_twrp.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libexfat_twrp.so
 else
     TW_NO_EXFAT_FUSE := true
 endif
-ifneq ($(TW_NO_EXFAT_FUSE), true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/exfat-fuse
-endif
-ifeq ($(TW_INCLUDE_BLOBPACK), true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/blobpack
-endif
-ifeq ($(TW_INCLUDE_INJECTTWRP), true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/injecttwrp
-endif
-ifeq ($(TW_INCLUDE_DUMLOCK), true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/htcdumlock
-endif
+
 ifeq ($(TW_INCLUDE_CRYPTO), true)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libcryptfsfde.so
-        RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libdexfile_support.so
-        RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libf2fs_sparseblock.so
-        RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../vendor/lib64/libnos_transport.so
-        RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../vendor/lib64/libnos_datagram.so
-    else
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcryptfsfde.so
-    endif
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhardware.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libgpt_twrp.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libcryptfsfde.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libdexfile_support.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libf2fs_sparseblock.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libhardware.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/android.hardware.authsecret@1.0.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/android.hardware.oemlock@1.0.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../vendor/lib64/libnos_transport.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../vendor/lib64/libnos_datagram.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.keymaster@3.0.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libgpt_twrp.so
     ifeq ($(TARGET_HW_DISK_ENCRYPTION),true)
         ifeq ($(TARGET_CRYPTFS_HW_PATH),)
-            RELINK_SOURCE_FILES += $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)/libcryptfs_hw.so
+            RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)/libcryptfs_hw.so
         else
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcryptfs_hw.so
+            RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcryptfs_hw.so
         endif
     endif
     # FBE files
     ifeq ($(TW_INCLUDE_CRYPTO_FBE), true)
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libtwrpfscrypt.so
-        else
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libe4crypt.so
-        endif
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libgatekeeper.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_messages.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeystore_binder.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbinder.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libprotobuf-cpp-lite.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsoftkeymasterdevice.so
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.gatekeeper@1.0.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/hwservicemanager
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/avbctl
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/keystore
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/keystore_cli
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/servicemanager
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.system.wifi.keystore@1.0.so
-            ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.vibrator@1.0.so
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.vibrator@1.1.so
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.vibrator@1.2.so
-            endif
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libtwrpfscrypt.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libgatekeeper.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_messages.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeystore_binder.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libbinder.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libprotobuf-cpp-lite.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsoftkeymasterdevice.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.gatekeeper@1.0.so
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/hwservicemanager
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/avbctl
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/keystore
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/keystore_cli
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/servicemanager
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.system.wifi.keystore@1.0.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.vibrator@1.0.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.vibrator@1.1.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.vibrator@1.2.so
 
-            ifneq ($(wildcard system/keymaster/keymaster_stl.cpp),)
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_portable.so
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_staging.so
-            endif
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libwifikeystorehal.so
-            ifneq ($(wildcard hardware/interfaces/weaver/Android.bp),)
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.weaver@1.0.so
-            endif
-            ifneq ($(wildcard hardware/interfaces/weaver/1.0/Android.bp),)
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.weaver@1.0.so
-            endif
-            ifneq ($(wildcard hardware/interfaces/confirmationui/1.0/Android.bp),)
-                RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.confirmationui@1.0.so
-            endif
-
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhardware_legacy.so
-        else
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster1.so
+        ifneq ($(wildcard system/keymaster/keymaster_stl.cpp),)
+            RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_portable.so
+            RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_staging.so
         endif
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 28; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsoftkeymaster.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libwifikeystorehal.so
+        ifneq ($(wildcard hardware/interfaces/weaver/Android.bp),)
+            RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.weaver@1.0.so
         endif
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.keymaster@4.0.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster4support.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeystore_aidl.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeystore_parcelables.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libutilscallstack.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libunwindstack.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libdexfile.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libservices.so
-            RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_portable.so
-         endif
+        ifneq ($(wildcard hardware/interfaces/weaver/1.0/Android.bp),)
+            RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.weaver@1.0.so
+        endif
+        ifneq ($(wildcard hardware/interfaces/confirmationui/1.0/Android.bp),)
+            RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.confirmationui@1.0.so
+        endif
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsoftkeymaster.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.keymaster@4.0.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster4support.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeystore_aidl.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeystore_parcelables.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libutilscallstack.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libdexfile.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libservices.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeymaster_portable.so
          # lshal can be useful for seeing if you have things like the keymaster working properly, but it isn't needed for TWRP to work
-         #RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/lshal
-         #RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblshal.so
-         #RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libssl.so
-         #RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidl-gen-hash.so
+         #RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/lshal
+         #RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblshal.so
+         #RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libssl.so
+         #RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidl-gen-hash.so
     endif
 endif
 ifeq ($(AB_OTA_UPDATER), true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/update_engine_sideload
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.boot@1.0.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/bootctl
-    ifneq ($(TW_INCLUDE_CRYPTO), true)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhardware.so
-    endif
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/update_engine_sideload
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.boot@1.0.so
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/bootctl
 endif
-ifeq ($(TARGET_USERIMAGES_USE_EXT4), true)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 28; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/make_ext4fs
-    endif
-endif
+
 ifneq ($(wildcard system/core/libsparse/Android.*),)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsparse.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsparse.so
 endif
 ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true)
-    RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/openaes
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libopenaes.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libopenaes.so
 endif
 ifeq ($(TARGET_USERIMAGES_USE_F2FS), true)
-    ifeq ($(shell test $(CM_PLATFORM_SDK_VERSION) -ge 4; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.f2fs
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libf2fs.so
-    else ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0)
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/make_f2fs
-        else
-            RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.f2fs
-        endif
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-            ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-                RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sload_f2fs
-            else
-                RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/sload.f2fs
-            endif
-        endif
-    else ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.f2fs
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libf2fs.so
-    else ifeq ($(shell test $(PLATFORM_SDK_VERSION) -eq 23; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.f2fs
-    else ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
-        RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT_SBIN)/mkfs.f2fs
-    else
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.f2fs
-    endif
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/fsck.f2fs
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/make_f2fs
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sload_f2fs
 endif
 ifneq ($(wildcard system/core/reboot/Android.*),)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/reboot
-    else
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/reboot
-    endif
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/reboot
 endif
 ifneq ($(TW_DISABLE_TTF), true)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libft2.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libft2.so
 endif
-ifneq ($(TW_RECOVERY_ADDITIONAL_RELINK_FILES),)
-    RELINK_SOURCE_FILES += $(TW_RECOVERY_ADDITIONAL_RELINK_FILES)
+ifneq ($(TW_RECOVERY_ADDITIONAL_RELINK_BINARY_FILES),)
+    RECOVERY_BINARY_SOURCE_FILES += $(TW_RECOVERY_ADDITIONAL_RELINK_BINARY_FILES)
+endif
+ifneq ($(TW_RECOVERY_ADDITIONAL_RELINK_LIBRARY_FILES),)
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TW_RECOVERY_ADDITIONAL_RELINK_LIBRARY_FILES)
 endif
 ifneq ($(wildcard external/pcre/Android.mk),)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpcre.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpcre.so
 endif
 ifeq ($(TW_INCLUDE_NTFS_3G),true)
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mount.ntfs
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/fsck.ntfs
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.ntfs
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libntfs-3g.so
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libfuse-lite.so
-    else
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libfuse.so
-    endif
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mount.ntfs
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/fsck.ntfs
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.ntfs
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libntfs-3g.so
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libfuse-lite.so
 else
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/ntfs-3g
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/ntfsfix
-    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkntfs
-endif
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/ntfs-3g
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/ntfsfix
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkntfs
 endif
 ifeq ($(BOARD_HAS_NO_REAL_SDCARD),)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sgdisk
-    endif
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sgdisk
 endif
 ifeq ($(TWRP_INCLUDE_LOGCAT), true)
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/logcat
-    else
-        RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/logcat
-    endif
+    RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/logcat
     ifeq ($(TARGET_USES_LOGD), true)
-        ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
-            RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/logd
-        else
-            RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/logd
-        endif
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsysutils.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libnl.so
+        RECOVERY_BINARY_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/bin/logd
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libsysutils.so
+        RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libnl.so
     endif
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpcrecpp.so
-    endif
-    ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblogcat.so
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcap.so
-    endif
+    RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpcrecpp.so
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblogcat.so
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcap.so
 endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0)
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpcre2.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libvndksupport.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhwbinder.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidlbase.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidltransport.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hardware.keymaster@3.0.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libziparchive.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_blkid.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_quota.so
-
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidl-gen-utils.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libvintf.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtinyxml2.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hidl.token@1.0.so
-    ifneq ($(wildcard system/core/libkeyutils/Android.bp),)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeyutils.so
-    endif
-    ifeq ($(wildcard system/libhidl/transport/HidlTransportUtils.cpp),)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hidl.base@1.0.so
-    endif
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libvndksupport.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidlbase.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidltransport.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.frameworks.stats@1.0.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libziparchive.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_blkid.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_quota.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libhidl-gen-utils.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libvintf.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtinyxml2.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hidl.token@1.0.so
+ifneq ($(wildcard system/core/libkeyutils/Android.bp),)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libkeyutils.so
 endif
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
-    ifeq ($(TARGET_ARCH), arm64)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-aarch64-android.so
-    endif
-    ifeq ($(TARGET_ARCH), arm)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-arm-android.so
-    endif
-    ifeq ($(TARGET_ARCH), x86_64)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-x86_64-android.so
-    endif
-    ifeq ($(TARGET_ARCH), x86)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-i686-android.so
-    endif
-    ifeq ($(TARGET_ARCH), mips)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-mips-android.so
-    endif
-    ifeq ($(TARGET_ARCH), mips64)
-        RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-mips64-android.so
-    endif
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblogwrap.so
-    RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_misc.so
+ifeq ($(wildcard system/libhidl/transport/HidlTransportUtils.cpp),)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/android.hidl.base@1.0.so
 endif
+ifeq ($(TARGET_ARCH), arm64)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-aarch64-android.so
+endif
+ifeq ($(TARGET_ARCH), arm)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-arm-android.so
+endif
+ifeq ($(TARGET_ARCH), x86_64)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-x86_64-android.so
+endif
+ifeq ($(TARGET_ARCH), x86)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-i686-android.so
+endif
+ifeq ($(TARGET_ARCH), mips)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-mips-android.so
+endif
+ifeq ($(TARGET_ARCH), mips64)
+	RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libclang_rt.ubsan_standalone-mips64-android.so
+endif
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblogwrap.so
+RECOVERY_LIBRARY_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_misc.so
 
-#toybox links
-toybox_links := acpi base64 basename bc blockdev cal cat chcon chgrp chmod chown chroot chrt cksum clear \
-    cmp comm cp cpio cut date dd devmem df diff dirname dmesg dos2unix du echo env expand expr fallocate \
-    false file find flock fmt free fsync getconf getenforce getprop groups gunzip gzip head hostname hwclock i2cdetect \
-    i2cdump i2cget i2cset iconv id ifconfig inotifyd insmod install ionice iorenice kill killall ln load_policy \
-    log logname losetup ls lsmod lsof lspci lsusb md5sum microcom mkdir mkfifo mknod mkswap mktemp modinfo modprobe \
-    more mount mountpoint mv nc netcat netstat nice nl nohup nproc nsenter od paste patch pgrep pidof pkill pmap \
-    printenv printf ps pwd readlink realpath renice restorecon rm rmdir rmmod runcon sed sendevent seq setenforce \
-    setprop setsid sha1sum sha224sum sha256sum sha384sum sha512sum sleep sort split start stat stop strings stty \
-    swapoff swapon sync sysctl tac tail tar taskset tee time timeout top touch tr true truncate tty ulimit \
-    umount uname uniq unix2dos unlink unshare uptime usleep uudecode uuencode uuidgen vmstat watch wc which whoami \
-    xargs xxd yes zcat
-TOYBOX_LINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/system/bin/, $(toybox_links))
-
-#relink recovery executables linker to /sbin and move symlinks
 include $(CLEAR_VARS)
-LOCAL_MODULE := relink
+LOCAL_MODULE := relink_libraries
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
-LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/sbin $(RELINK_SOURCE_FILES) && \
-    cp $(TOYBOX_LINKS) $(TARGET_RECOVERY_ROOT_OUT)/sbin/
-TARGET_RELINK_FILES := $(notdir $(RELINK_SOURCE_FILES))
-TARGET_BASE_RELINK_MODULES := $(basename $(TARGET_RELINK_FILES))
-TARGET_RELINK_MODULES :=  $(filter-out libdexfile, $(TARGET_BASE_RELINK_MODULES))
-LOCAL_REQUIRED_MODULES += $(TARGET_RELINK_MODULES)
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
+LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/system/lib64 $(RECOVERY_LIBRARY_SOURCE_FILES)
+TARGET_LIBRARY_RELINK_FILES := $(notdir $(RECOVERY_LIBRARY_SOURCE_FILES))
+TARGET_BASE_LIBRARY_RELINK_MODULES := $(basename $(TARGET_LIBRARY_RELINK_FILES))
+TARGET_RELINK_LIBRARY_MODULES :=  $(filter-out libdexfile, $(TARGET_BASE_LIBRARY_RELINK_MODULES))
+LOCAL_REQUIRED_MODULES += $(TARGET_RELINK_LIBRARY_MODULES)
 include $(BUILD_PHONY_PACKAGE)
 
-#relink init
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := relink_binaries
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/
+LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/system/bin $(RECOVERY_BINARY_SOURCE_FILES)
+TARGET_BINARY_RELINK_FILES := $(notdir $(RECOVERY_BINARY_SOURCE_FILES))
+LOCAL_REQUIRED_MODULES += $(TARGET_BINARY_RELINK_FILES)
+include $(BUILD_PHONY_PACKAGE)
+
+#build out TWRP ramdisk
 include $(CLEAR_VARS)
 LOCAL_MODULE := twrp_ramdisk
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
 LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)
-RELINK_INIT := $(TARGET_RECOVERY_ROOT_OUT)/system/bin/init
-LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/ $(RELINK_INIT) && \
-    cp $(TARGET_RECOVERY_ROOT_OUT)/system/bin/ueventd $(TARGET_RECOVERY_ROOT_OUT)/sbin/ && \
-    ln -sf /init $(TARGET_RECOVERY_ROOT_OUT)/sbin/init && \
-    ln -sf /init $(TARGET_RECOVERY_ROOT_OUT)/system/bin/init && \
+LOCAL_POST_INSTALL_CMD += \
+    mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/sbin; ln -sf /system/bin/sh $(TARGET_RECOVERY_ROOT_OUT)/sbin/sh && \
     mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system/etc/selinux/ && \
     cp $(TARGET_ROOT_OUT)/../system/etc/selinux/plat_service_contexts $(TARGET_RECOVERY_ROOT_OUT)/system/etc/selinux/plat_service_contexts && \
     cp $(TARGET_ROOT_OUT)/../system/etc/selinux/plat_hwservice_contexts $(TARGET_RECOVERY_ROOT_OUT)/system/etc/selinux/plat_hwservice_contexts && \
     cp $(TARGET_ROOT_OUT)/../vendor/etc/selinux/vndservice_contexts $(TARGET_RECOVERY_ROOT_OUT)/system/etc/selinux/vndservice_contexts && \
     cp $(TARGET_ROOT_OUT)/../vendor/etc/selinux/vendor_hwservice_contexts $(TARGET_RECOVERY_ROOT_OUT)/system/etc/selinux/vendor_hwservice_contexts
-LOCAL_REQUIRED_MODULES := init_second_stage.recovery reboot.recovery plat_service_contexts plat_hardware_contexts vndservice_contexts
+LOCAL_REQUIRED_MODULES += init_second_stage.recovery reboot.recovery plat_service_contexts plat_hardware_contexts vndservice_contexts
 include $(BUILD_PHONY_PACKAGE)
 
-#mke2fs.conf
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 26; echo $$?),0)
-    include $(CLEAR_VARS)
-    LOCAL_MODULE := mke2fs.conf
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/etc
-    LOCAL_SRC_FILES := $(LOCAL_MODULE)
-    include $(BUILD_PREBUILT)
-endif
-
-ifeq ($(BOARD_HAS_NO_REAL_SDCARD),)
-	ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
-	    #prebuilt, static sgdisk
-	    include $(CLEAR_VARS)
-	    LOCAL_MODULE := sgdisk_static
-	    LOCAL_MODULE_STEM := sgdisk
-	    LOCAL_MODULE_TAGS := optional
-	    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
-	    LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	    include $(BUILD_PREBUILT)
-	endif
-	#parted
-	#include $(CLEAR_VARS)
-	#LOCAL_MODULE := parted
-	#LOCAL_MODULE_TAGS := optional
-	#LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	#LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
-	#LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	#include $(BUILD_PREBUILT)
-endif
-
 # copy license file for OpenAES
 ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true)
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := openaes_license
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/license/openaes
-	LOCAL_SRC_FILES := ../openaes/LICENSE
-	include $(BUILD_PREBUILT)
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := openaes_license
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/license/openaes
+    LOCAL_SRC_FILES := ../openaes/LICENSE
+    include $(BUILD_PREBUILT)
 endif
 
 ifeq ($(TW_INCLUDE_DUMLOCK), true)
-	#htcdumlock for /system for dumlock
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := htcdumlocksys
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #htcdumlock for /system for dumlock
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := htcdumlocksys
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 
-	#flash_image for /system for dumlock
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := flash_imagesys
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #flash_image for /system for dumlock
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := flash_imagesys
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 
-	#dump_image for /system for dumlock
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := dump_imagesys
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #dump_image for /system for dumlock
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := dump_imagesys
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 
-	#libbmlutils for /system for dumlock
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := libbmlutils.so
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #libbmlutils for /system for dumlock
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := libbmlutils.so
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 
-	#libflashutils for /system for dumlock
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := libflashutils.so
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #libflashutils for /system for dumlock
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := libflashutils.so
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 
-	#libmmcutils for /system for dumlock
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := libmmcutils.so
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #libmmcutils for /system for dumlock
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := libmmcutils.so
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 
-	#libmtdutils for /system for dumlock
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := libmtdutils.so
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #libmtdutils for /system for dumlock
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := libmtdutils.so
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 
-	#HTCDumlock.apk
-	include $(CLEAR_VARS)
-	LOCAL_MODULE := HTCDumlock.apk
-	LOCAL_MODULE_TAGS := optional
-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
-	LOCAL_SRC_FILES := $(LOCAL_MODULE)
-	include $(BUILD_PREBUILT)
+    #HTCDumlock.apk
+    include $(CLEAR_VARS)
+    LOCAL_MODULE := HTCDumlock.apk
+    LOCAL_MODULE_TAGS := optional
+    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWHTCD_PATH)
+    LOCAL_SRC_FILES := $(LOCAL_MODULE)
+    include $(BUILD_PREBUILT)
 endif
 
 ifeq ($(TW_USE_TOOLBOX), true)
@@ -682,7 +446,7 @@
    LOCAL_MODULE_STEM := mkshrc
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_CLASS := ETC
-   LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/etc
+   LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/etc
    LOCAL_SRC_FILES := $(LOCAL_MODULE)
    include $(BUILD_PREBUILT)
 endif
@@ -692,7 +456,7 @@
 LOCAL_MODULE := me.twrp.twrpapp.apk
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := $(LOCAL_MODULE)
 include $(BUILD_PREBUILT)
 
@@ -701,22 +465,20 @@
 LOCAL_MODULE := privapp-permissions-twrpapp.xml
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_SRC_FILES := $(LOCAL_MODULE)
 include $(BUILD_PREBUILT)
 
 ifeq ($(TW_INCLUDE_CRYPTO), true)
     ifneq ($(TW_CRYPTO_USE_SYSTEM_VOLD),)
-        ifneq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
-            # Prebuilt vdc_pie for pre-Pie SDK Platforms
-            include $(CLEAR_VARS)
-            LOCAL_MODULE := vdc_pie
-            LOCAL_MODULE_TAGS := optional
-            LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-            LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
-            LOCAL_SRC_FILES := vdc_pie-$(TARGET_ARCH)
-            include $(BUILD_PREBUILT)
-        endif
+        # Prebuilt vdc_pie for pre-Pie SDK Platforms
+        include $(CLEAR_VARS)
+        LOCAL_MODULE := vdc_pie
+        LOCAL_MODULE_TAGS := optional
+        LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+        LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
+        LOCAL_SRC_FILES := vdc_pie-$(TARGET_ARCH)
+        include $(BUILD_PREBUILT)
     endif
 endif
 
diff --git a/prebuilt/relink.sh b/prebuilt/relink.sh
index 783e052..063f445 100755
--- a/prebuilt/relink.sh
+++ b/prebuilt/relink.sh
@@ -5,20 +5,15 @@
     dst=$1/$(basename $2)
     src=$2
 
-    if [ ! -e $src ]; then
-      return
-    fi
+    [[ -e $src ]] || return 0
 
     if [ $dst == $src ]; then
       cp -f -p $src $src.tmp
       src=$2.tmp
-    else
-      cp -f -p --remove-destination $src $dst
     fi
 
-    sed "s|/system/bin/linker64\x0|/sbin/linker64\x0\x0\x0\x0\x0\x0\x0|g" $src | sed "s|/system/bin/linker\x0|/sbin/linker\x0\x0\x0\x0\x0\x0\x0|g" | sed "s|/system/bin/sh\x0|/sbin/sh\x0\x0\x0\x0\x0\x0\x0|g" > $dst
-    #rm -f $src
-    [ -e $2.tmp ] && rm $2.tmp || echo
+    cp $src $dst
+    if [[ -e $2.tmp ]]; then rm -f $2.tmp; fi
 }
 
 
diff --git a/simg2img/Android.mk b/simg2img/Android.mk
old mode 100644
new mode 100755
index b0bb4f1..6b4c9a2
--- a/simg2img/Android.mk
+++ b/simg2img/Android.mk
@@ -5,7 +5,7 @@
 	sparse_crc32.cpp
 LOCAL_MODULE := simg2img_twrp
 LOCAL_MODULE_STEM := simg2img
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin
 LOCAL_MODULE_TAGS := optional
 LOCAL_SHARED_LIBRARIES := \
     libsparse \
diff --git a/twinstall.cpp b/twinstall.cpp
index 7b1ca0c..fd33828 100755
--- a/twinstall.cpp
+++ b/twinstall.cpp
@@ -451,7 +451,7 @@
 			bool vendor_mount_state = PartitionManager.Is_Mounted_By_Path("/vendor");
 			PartitionManager.Mount_By_Path(PartitionManager.Get_Android_Root_Path(), true);
 			PartitionManager.Mount_By_Path("/vendor", true);
-			TWFunc::Exec_Cmd("cp -f /sbin/sh /tmp/sh");
+			TWFunc::Exec_Cmd("cp -f /system/bin/sh /tmp/sh");
 			mount("/tmp/sh", "/system/bin/sh", "auto", MS_BIND, NULL);
 			ret_val = Run_Update_Binary(path, &Zip, wipe_cache, AB_OTA_ZIP_TYPE);
 			umount("/system/bin/sh");
diff --git a/twinstallorig.cpp b/twinstallorig.cpp
deleted file mode 100644
index 60d76a5..0000000
--- a/twinstallorig.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
-	Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin
-	This file is part of TWRP/TeamWin Recovery Project.
-
-	TWRP 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.
-
-	TWRP 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 TWRP.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#include <string.h>
-#include <stdio.h>
-
-#include "twcommon.h"
-#include "mtdutils/mounts.h"
-#include "mtdutils/mtdutils.h"
-#include "minzip/SysUtil.h"
-#include "minzip/Zip.h"
-#ifdef USE_OLD_VERIFIER
-#include "verifier24/verifier.h"
-#else
-#include "verifier.h"
-#endif
-#include "variables.h"
-#include "data.hpp"
-#include "partitions.hpp"
-#include "twrpDigestDriver.hpp"
-#include "twrpDigest/twrpDigest.hpp"
-#include "twrpDigest/twrpMD5.hpp"
-#include "twrp-functions.hpp"
-#include "gui/gui.hpp"
-#include "gui/pages.hpp"
-#include "legacy_property_service.h"
-#include "twinstall.h"
-#include "installcommand.h"
-extern "C" {
-	#include "gui/gui.h"
-}
-
-#define AB_OTA "payload_properties.txt"
-
-static const char* properties_path = "/dev/__properties__";
-static const char* properties_path_renamed = "/dev/__properties_kk__";
-static bool legacy_props_env_initd = false;
-static bool legacy_props_path_modified = false;
-
-enum zip_type {
-	UNKNOWN_ZIP_TYPE = 0,
-	UPDATE_BINARY_ZIP_TYPE,
-	AB_OTA_ZIP_TYPE,
-	TWRP_THEME_ZIP_TYPE
-};
-
-// to support pre-KitKat update-binaries that expect properties in the legacy format
-static int switch_to_legacy_properties()
-{
-	if (!legacy_props_env_initd) {
-		if (legacy_properties_init() != 0)
-			return -1;
-
-		char tmp[32];
-		int propfd, propsz;
-		legacy_get_property_workspace(&propfd, &propsz);
-		sprintf(tmp, "%d,%d", dup(propfd), propsz);
-		setenv("ANDROID_PROPERTY_WORKSPACE", tmp, 1);
-		legacy_props_env_initd = true;
-	}
-
-	if (TWFunc::Path_Exists(properties_path)) {
-		// hide real properties so that the updater uses the envvar to find the legacy format properties
-		if (rename(properties_path, properties_path_renamed) != 0) {
-			LOGERR("Renaming %s failed: %s\n", properties_path, strerror(errno));
-			return -1;
-		} else {
-			legacy_props_path_modified = true;
-		}
-	}
-
-	return 0;
-}
-
-static int switch_to_new_properties()
-{
-	if (TWFunc::Path_Exists(properties_path_renamed)) {
-		if (rename(properties_path_renamed, properties_path) != 0) {
-			LOGERR("Renaming %s failed: %s\n", properties_path_renamed, strerror(errno));
-			return -1;
-		} else {
-			legacy_props_path_modified = false;
-		}
-	}
-
-	return 0;
-}
-
-static int Install_Theme(const char* path, ZipArchive *Zip) {
-#ifdef TW_OEM_BUILD // We don't do custom themes in OEM builds
-	mzCloseZipArchive(Zip);
-	return INSTALL_CORRUPT;
-#else
-	const ZipEntry* xml_location = mzFindZipEntry(Zip, "ui.xml");
-
-	mzCloseZipArchive(Zip);
-	if (xml_location == NULL) {
-		return INSTALL_CORRUPT;
-	}
-	if (!PartitionManager.Mount_Settings_Storage(true))
-		return INSTALL_ERROR;
-	string theme_path = DataManager::GetSettingsStoragePath();
-	theme_path += "/TWRP/theme";
-	if (!TWFunc::Path_Exists(theme_path)) {
-		if (!TWFunc::Recursive_Mkdir(theme_path)) {
-			return INSTALL_ERROR;
-		}
-	}
-	theme_path += "/ui.zip";
-	if (TWFunc::copy_file(path, theme_path, 0644) != 0) {
-		return INSTALL_ERROR;
-	}
-	LOGINFO("Installing custom theme '%s' to '%s'\n", path, theme_path.c_str());
-	PageManager::RequestReload();
-	return INSTALL_SUCCESS;
-#endif
-}
-
-static int Prepare_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) {
-	const ZipEntry* binary_location = mzFindZipEntry(Zip, ASSUMED_UPDATE_BINARY_NAME);
-	int binary_fd, ret_val;
-
-	if (binary_location == NULL) {
-		return INSTALL_CORRUPT;
-	}
-
-	// Delete any existing updater
-	if (TWFunc::Path_Exists(TMP_UPDATER_BINARY_PATH) && unlink(TMP_UPDATER_BINARY_PATH) != 0) {
-		LOGINFO("Unable to unlink '%s': %s\n", TMP_UPDATER_BINARY_PATH, strerror(errno));
-	}
-
-	binary_fd = creat(TMP_UPDATER_BINARY_PATH, 0755);
-	if (binary_fd < 0) {
-		LOGERR("Could not create file for updater extract in '%s': %s\n", TMP_UPDATER_BINARY_PATH, strerror(errno));
-		mzCloseZipArchive(Zip);
-		return INSTALL_ERROR;
-	}
-
-	ret_val = mzExtractZipEntryToFile(Zip, binary_location, binary_fd);
-	close(binary_fd);
-
-	if (!ret_val) {
-		mzCloseZipArchive(Zip);
-		LOGERR("Could not extract '%s'\n", ASSUMED_UPDATE_BINARY_NAME);
-		return INSTALL_ERROR;
-	}
-
-	// If exists, extract file_contexts from the zip file
-	const ZipEntry* selinx_contexts = mzFindZipEntry(Zip, "file_contexts");
-	if (selinx_contexts == NULL) {
-		mzCloseZipArchive(Zip);
-		LOGINFO("Zip does not contain SELinux file_contexts file in its root.\n");
-	} else {
-		string output_filename = "/file_contexts";
-		LOGINFO("Zip contains SELinux file_contexts file in its root. Extracting to %s\n", output_filename.c_str());
-		// Delete any file_contexts
-		if (TWFunc::Path_Exists(output_filename) && unlink(output_filename.c_str()) != 0) {
-			LOGINFO("Unable to unlink '%s': %s\n", output_filename.c_str(), strerror(errno));
-		}
-
-		int file_contexts_fd = creat(output_filename.c_str(), 0644);
-		if (file_contexts_fd < 0) {
-			LOGERR("Could not extract to '%s': %s\n", output_filename.c_str(), strerror(errno));
-			mzCloseZipArchive(Zip);
-			return INSTALL_ERROR;
-		}
-
-		ret_val = mzExtractZipEntryToFile(Zip, selinx_contexts, file_contexts_fd);
-		close(file_contexts_fd);
-
-		if (!ret_val) {
-			mzCloseZipArchive(Zip);
-			LOGERR("Could not extract '%s'\n", output_filename.c_str());
-			return INSTALL_ERROR;
-		}
-	}
-	mzCloseZipArchive(Zip);
-	return INSTALL_SUCCESS;
-}
-
-static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache, zip_type ztype) {
-	int ret_val, pipe_fd[2], status, zip_verify;
-	char buffer[1024];
-	FILE* child_data;
-
-#ifndef TW_NO_LEGACY_PROPS
-	/* Set legacy properties */
-	if (switch_to_legacy_properties() != 0) {
-		LOGERR("Legacy property environment did not initialize successfully. Properties may not be detected.\n");
-	} else {
-		LOGINFO("Legacy property environment initialized.\n");
-	}
-#endif
-
-	pipe(pipe_fd);
-
-	std::vector<std::string> args;
-    if (ztype == UPDATE_BINARY_ZIP_TYPE) {
-		ret_val = update_binary_command(path, Zip, 0, pipe_fd[1], &args);
-    } else if (ztype == AB_OTA_ZIP_TYPE) {
-		ret_val = abupdate_binary_command(path, Zip, 0, pipe_fd[1], &args);
-	} else {
-		LOGERR("Unknown zip type %i\n", ztype);
-		ret_val = INSTALL_CORRUPT;
-	}
-    if (ret_val) {
-        close(pipe_fd[0]);
-        close(pipe_fd[1]);
-        return ret_val;
-    }
-
-	// Convert the vector to a NULL-terminated char* array suitable for execv.
-	const char* chr_args[args.size() + 1];
-	chr_args[args.size()] = NULL;
-	for (size_t i = 0; i < args.size(); i++)
-		chr_args[i] = args[i].c_str();
-
-	pid_t pid = fork();
-	if (pid == 0) {
-		close(pipe_fd[0]);
-		execve(chr_args[0], const_cast<char**>(chr_args), environ);
-		printf("E:Can't execute '%s': %s\n", chr_args[0], strerror(errno));
-		_exit(-1);
-	}
-	close(pipe_fd[1]);
-
-	*wipe_cache = 0;
-
-	DataManager::GetValue(TW_SIGNED_ZIP_VERIFY_VAR, zip_verify);
-	child_data = fdopen(pipe_fd[0], "r");
-	while (fgets(buffer, sizeof(buffer), child_data) != NULL) {
-		char* command = strtok(buffer, " \n");
-		if (command == NULL) {
-			continue;
-		} else if (strcmp(command, "progress") == 0) {
-			char* fraction_char = strtok(NULL, " \n");
-			char* seconds_char = strtok(NULL, " \n");
-
-			float fraction_float = strtof(fraction_char, NULL);
-			int seconds_float = strtol(seconds_char, NULL, 10);
-
-			if (zip_verify)
-				DataManager::ShowProgress(fraction_float * (1 - VERIFICATION_PROGRESS_FRACTION), seconds_float);
-			else
-				DataManager::ShowProgress(fraction_float, seconds_float);
-		} else if (strcmp(command, "set_progress") == 0) {
-			char* fraction_char = strtok(NULL, " \n");
-			float fraction_float = strtof(fraction_char, NULL);
-			DataManager::SetProgress(fraction_float);
-		} else if (strcmp(command, "ui_print") == 0) {
-			char* display_value = strtok(NULL, "\n");
-			if (display_value) {
-				gui_print("%s", display_value);
-			} else {
-				gui_print("\n");
-			}
-		} else if (strcmp(command, "wipe_cache") == 0) {
-			*wipe_cache = 1;
-		} else if (strcmp(command, "clear_display") == 0) {
-			// Do nothing, not supported by TWRP
-		} else if (strcmp(command, "log") == 0) {
-			printf("%s\n", strtok(NULL, "\n"));
-		} else {
-			LOGERR("unknown command [%s]\n", command);
-		}
-	}
-	fclose(child_data);
-
-	int waitrc = TWFunc::Wait_For_Child(pid, &status, "Updater");
-
-#ifndef TW_NO_LEGACY_PROPS
-	/* Unset legacy properties */
-	if (legacy_props_path_modified) {
-		if (switch_to_new_properties() != 0) {
-			LOGERR("Legacy property environment did not disable successfully. Legacy properties may still be in use.\n");
-		} else {
-			LOGINFO("Legacy property environment disabled.\n");
-		}
-	}
-#endif
-
-	if (waitrc != 0)
-		return INSTALL_ERROR;
-
-	return INSTALL_SUCCESS;
-}
-
-extern "C" int TWinstall_zip(const char* path, int* wipe_cache) {
-	int ret_val, zip_verify = 1;
-	ZipArchive Zip;
-
-	if (strcmp(path, "error") == 0) {
-		LOGERR("Failed to get adb sideload file: '%s'\n", path);
-		return INSTALL_CORRUPT;
-	}
-
-	gui_msg(Msg("installing_zip=Installing zip file '{1}'")(path));
-	if (strlen(path) < 9 || strncmp(path, "/sideload", 9) != 0) {
-		string digest_str;
-		string Full_Filename = path;
-		string digest_file = path;
-		digest_file += ".md5";
-
-		gui_msg("check_for_digest=Checking for Digest file...");
-		if (!TWFunc::Path_Exists(digest_file)) {
-			gui_msg("no_digest=Skipping Digest check: no Digest file found");
-		}
-		else {
-			if (TWFunc::read_file(digest_file, digest_str) != 0) {
-				LOGERR("Skipping MD5 check: MD5 file unreadable\n");
-			}
-			else {
-				twrpDigest *digest = new twrpMD5();
-				if (!twrpDigestDriver::stream_file_to_digest(Full_Filename, digest)) {
-					delete digest;
-					return INSTALL_CORRUPT;
-				}
-				string digest_check = digest->return_digest_string();
-				if (digest_str == digest_check) {
-					gui_msg(Msg("digest_matched=Digest matched for '{1}'.")(path));
-				}
-				else {
-					LOGERR("Aborting zip install: Digest verification failed\n");
-					delete digest;
-					return INSTALL_CORRUPT;
-				}
-				delete digest;
-			}
-		}
-	}
-
-#ifndef TW_OEM_BUILD
-	DataManager::GetValue(TW_SIGNED_ZIP_VERIFY_VAR, zip_verify);
-#endif
-	DataManager::SetProgress(0);
-
-	MemMapping map;
-	if (sysMapFile(path, &map) != 0) {
-		gui_msg(Msg(msg::kError, "fail_sysmap=Failed to map file '{1}'")(path));
-		return -1;
-	}
-
-	if (zip_verify) {
-		gui_msg("verify_zip_sig=Verifying zip signature...");
-		std::vector<Certificate> loadedKeys;
-		if (!load_keys("/res/keys", loadedKeys)) {
-			LOGINFO("Failed to load keys");
-			gui_err("verify_zip_fail=Zip signature verification failed!");
-			return -1;
-		}
-		ret_val = verify_file(map.addr, map.length, loadedKeys, NULL);
-		if (ret_val != VERIFY_SUCCESS) {
-			LOGINFO("Zip signature verification failed: %i\n", ret_val);
-			gui_err("verify_zip_fail=Zip signature verification failed!");
-			sysReleaseMap(&map);
-			return -1;
-		} else {
-			gui_msg("verify_zip_done=Zip signature verified successfully.");
-		}
-	}
-	ret_val = mzOpenZipArchive(map.addr, map.length, &Zip);
-	if (ret_val != 0) {
-		gui_err("zip_corrupt=Zip file is corrupt!");
-		sysReleaseMap(&map);
-		return INSTALL_CORRUPT;
-	}
-
-	time_t start, stop;
-	time(&start);
-	const ZipEntry* file_location = mzFindZipEntry(&Zip, ASSUMED_UPDATE_BINARY_NAME);
-	if (file_location != NULL) {
-		LOGINFO("Update binary zip\n");
-		ret_val = Prepare_Update_Binary(path, &Zip, wipe_cache);
-		if (ret_val == INSTALL_SUCCESS)
-			ret_val = Run_Update_Binary(path, &Zip, wipe_cache, UPDATE_BINARY_ZIP_TYPE);
-	} else {
-		file_location = mzFindZipEntry(&Zip, AB_OTA);
-		if (file_location != NULL) {
-			LOGINFO("AB zip\n");
-			ret_val = Run_Update_Binary(path, &Zip, wipe_cache, AB_OTA_ZIP_TYPE);
-		} else {
-			file_location = mzFindZipEntry(&Zip, "ui.xml");
-			if (file_location != NULL) {
-				LOGINFO("TWRP theme zip\n");
-				ret_val = Install_Theme(path, &Zip);
-			} else {
-				mzCloseZipArchive(&Zip);
-				ret_val = INSTALL_CORRUPT;
-			}
-		}
-	}
-	time(&stop);
-	int total_time = (int) difftime(stop, start);
-	if (ret_val == INSTALL_CORRUPT) {
-		gui_err("invalid_zip_format=Invalid zip file format!");
-	} else {
-		LOGINFO("Install took %i second(s).\n", total_time);
-	}
-	sysReleaseMap(&map);
-	return ret_val;
-}
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 9f13fe2..aeb2f7e 100755
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -66,12 +66,15 @@
 struct selabel_handle *selinux_handle;
 
 /* Execute a command */
-int TWFunc::Exec_Cmd(const string& cmd, string &result) {
+int TWFunc::Exec_Cmd(const string& cmd, string &result, bool combine_stderr) {
 	FILE* exec;
 	char buffer[130];
 	int ret = 0;
-	exec = __popen(cmd.c_str(), "r");
-	if (!exec) return -1;
+	std::string popen_cmd = cmd;
+	if (combine_stderr)
+		popen_cmd = cmd + " 2>&1";
+	exec = __popen(popen_cmd.c_str(), "r");
+
 	while (!feof(exec)) {
 		if (fgets(buffer, 128, exec) != NULL) {
 			result += buffer;
@@ -90,7 +93,7 @@
 			LOGERR("Exec_Cmd(): vfork failed: %d!\n", errno);
 			return -1;
 		case 0: // child
-			execl("/sbin/sh", "sh", "-c", cmd.c_str(), NULL);
+			execl("/system/bin/sh", "sh", "-c", cmd.c_str(), NULL);
 			_exit(127);
 			break;
 		default:
@@ -530,7 +533,7 @@
 		if (type == COMPRESSED) {
 			std::string destFileBuffer;
 			std::string getCompressedContents = "pigz -c -d " + Destination;
-			if (Exec_Cmd(getCompressedContents, destFileBuffer) < 0) {
+			if (Exec_Cmd(getCompressedContents, destFileBuffer, false) < 0) {
 				LOGINFO("Unable to get destination logfile contents.\n");
 				return;
 			}
@@ -659,7 +662,7 @@
 		case rb_system:
 			Update_Intent_File("s");
 			sync();
-			check_and_run_script("/sbin/rebootsystem.sh", "reboot system");
+			check_and_run_script("/system/bin/rebootsystem.sh", "reboot system");
 #ifdef ANDROID_RB_PROPERTY
 			return property_set(ANDROID_RB_PROPERTY, "reboot,");
 #elif defined(ANDROID_RB_RESTART)
@@ -668,21 +671,21 @@
 			return reboot(RB_AUTOBOOT);
 #endif
 		case rb_recovery:
-			check_and_run_script("/sbin/rebootrecovery.sh", "reboot recovery");
+			check_and_run_script("/system/bin/rebootrecovery.sh", "reboot recovery");
 #ifdef ANDROID_RB_PROPERTY
 			return property_set(ANDROID_RB_PROPERTY, "reboot,recovery");
 #else
 			return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "recovery");
 #endif
 		case rb_bootloader:
-			check_and_run_script("/sbin/rebootbootloader.sh", "reboot bootloader");
+			check_and_run_script("/system/bin/rebootbootloader.sh", "reboot bootloader");
 #ifdef ANDROID_RB_PROPERTY
 			return property_set(ANDROID_RB_PROPERTY, "reboot,bootloader");
 #else
 			return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "bootloader");
 #endif
 		case rb_poweroff:
-			check_and_run_script("/sbin/poweroff.sh", "power off");
+			check_and_run_script("/system/bin/poweroff.sh", "power off");
 #ifdef ANDROID_RB_PROPERTY
 			return property_set(ANDROID_RB_PROPERTY, "shutdown,");
 #elif defined(ANDROID_RB_POWEROFF)
@@ -691,14 +694,14 @@
 			return reboot(RB_POWER_OFF);
 #endif
 		case rb_download:
-			check_and_run_script("/sbin/rebootdownload.sh", "reboot download");
+			check_and_run_script("/system/bin/rebootdownload.sh", "reboot download");
 #ifdef ANDROID_RB_PROPERTY
 			return property_set(ANDROID_RB_PROPERTY, "reboot,download");
 #else
 			return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "download");
 #endif
 		case rb_edl:
-			check_and_run_script("/sbin/rebootedl.sh", "reboot edl");
+			check_and_run_script("/system/bin/rebootedl.sh", "reboot edl");
 #ifdef ANDROID_RB_PROPERTY
 			return property_set(ANDROID_RB_PROPERTY, "reboot,edl");
 #else
@@ -1228,10 +1231,10 @@
 
 void TWFunc::copy_kernel_log(string curr_storage) {
 	std::string dmesgDst = curr_storage + "/dmesg.log";
-	std::string dmesgCmd = "/sbin/dmesg";
+	std::string dmesgCmd = "/system/bin/dmesg";
 
 	std::string result;
-	Exec_Cmd(dmesgCmd, result);
+	Exec_Cmd(dmesgCmd, result, false);
 	write_to_file(dmesgDst, result);
 	gui_msg(Msg("copy_kernel_log=Copied kernel log to {1}")(dmesgDst));
 	tw_set_default_metadata(dmesgDst.c_str());
@@ -1248,7 +1251,7 @@
 }
 
 int TWFunc::stream_adb_backup(string &Restore_Name) {
-	string cmd = "/sbin/bu --twrp stream " + Restore_Name;
+	string cmd = "/system/bin/bu --twrp stream " + Restore_Name;
 	LOGINFO("stream_adb_backup: %s\n", cmd.c_str());
 	int ret = TWFunc::Exec_Cmd(cmd);
 	if (ret != 0)
@@ -1299,8 +1302,8 @@
 		if (TWFunc::Path_Exists(se_context_check)) {
 			ret = lgetfilecon(se_context_check.c_str(), &contexts);
 			if (ret < 0) {
-				LOGINFO("Could not check %s SELinux contexts, using /sbin/teamwin instead which may be inaccurate.\n", se_context_check.c_str());
-				lgetfilecon("/sbin/teamwin", &contexts);
+				LOGINFO("Could not check %s SELinux contexts, using /system/bin/teamwin instead which may be inaccurate.\n", se_context_check.c_str());
+				lgetfilecon("/system/bin/teamwin", &contexts);
 			}
 		}
 		if (ret < 0) {
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index 80cb80e..2686734 100755
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -59,15 +59,15 @@
 	static string Get_Path(const string& Path);                                 // Trims everything after the last / in the string
 	static string Get_Filename(const string& Path);                             // Trims the path off of a filename
 
-	static int Exec_Cmd(const string& cmd, string &result);                     //execute a command and return the result as a string by reference
-	static int Exec_Cmd(const string& cmd, bool Show_Errors = true);                   //execute a command, displays an error to the GUI if Show_Errors is true, Show_Errors is true by default
+	static int Exec_Cmd(const string& cmd, string &result, bool combine_stderr);     //execute a command and return the result as a string by reference, set combined_stderror to add stderr
+	static int Exec_Cmd(const string& cmd, bool Show_Errors = true);            //execute a command, displays an error to the GUI if Show_Errors is true, Show_Errors is true by default
 	static int Wait_For_Child(pid_t pid, int *status, string Child_Name, bool Show_Errors = true); // Waits for pid to exit and checks exit status, displays an error to the GUI if Show_Errors is true which is the default
 	static int Wait_For_Child_Timeout(pid_t pid, int *status, const string& Child_Name, int timeout); // Waits for a pid to exit until the timeout is hit. If timeout is hit, kill the chilld.
 	static bool Path_Exists(string Path);                                       // Returns true if the path exists
 	static Archive_Type Get_File_Type(string fn);                               // Determines file type, 0 for unknown, 1 for gzip, 2 for OAES encrypted
 	static int Try_Decrypting_File(string fn, string password); // -1 for some error, 0 for failed to decrypt, 1 for decrypted, 3 for decrypted and found gzip format
 	static unsigned long Get_File_Size(const string& Path);                     // Returns the size of a file
-	static std::string Remove_Beginning_Slash(const std::string& path);        // Remove the beginning slash of a path
+	static std::string Remove_Beginning_Slash(const std::string& path);         // Remove the beginning slash of a path
 	static std::string Remove_Trailing_Slashes(const std::string& path, bool leaveLast = false); // Normalizes the path, e.g /data//media/ -> /data/media
 	static void Strip_Quotes(char* &str);                                       // Remove leading & trailing double-quotes from a string
 	static vector<string> split_string(const string &in, char del, bool skip_empty);
diff --git a/twrp.cpp b/twrp.cpp
index 24cd9ad..a187486 100755
--- a/twrp.cpp
+++ b/twrp.cpp
@@ -187,7 +187,7 @@
 
 		rmdir("/s");
 
-		TWFunc::check_and_run_script("/sbin/sarsetup.sh", "boot");
+		TWFunc::check_and_run_script("/system/bin/sarsetup.sh", "boot");
 	}
 	// End SAR detection
 
@@ -302,8 +302,8 @@
 	}
 
 	// Check for and run startup script if script exists
-	TWFunc::check_and_run_script("/sbin/runatboot.sh", "boot");
-	TWFunc::check_and_run_script("/sbin/postrecoveryboot.sh", "boot");
+	TWFunc::check_and_run_script("/system/bin/runatboot.sh", "boot");
+	TWFunc::check_and_run_script("/system/bin/postrecoveryboot.sh", "boot");
 
 #ifdef TW_INCLUDE_INJECTTWRP
 	// Back up TWRP Ramdisk if needed:
diff --git a/twrpApex.cpp b/twrpApex.cpp
index 33ec4dc..e41dc23 100755
--- a/twrpApex.cpp
+++ b/twrpApex.cpp
@@ -46,7 +46,8 @@
 	}

 

 	std::string baseFile = basename(file.c_str());

-	std::string path = "/sbin/" + baseFile;

+	std::string path(APEX_BASE);

+	path = path + baseFile;

 	int fd = open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666);

 	ret = ExtractEntryToFile(handle, &entry, fd);

 	if (ret != 0) {

diff --git a/twrpApex.hpp b/twrpApex.hpp
index fb91675..b00b9ae 100755
--- a/twrpApex.hpp
+++ b/twrpApex.hpp
@@ -22,6 +22,7 @@
 #define APEX_DIR "/system_root/system/apex"
 #define APEX_PAYLOAD "apex_payload.img"
 #define LOOP_BLOCK_DEVICE_DIR "/dev/block/"
+#define APEX_BASE "/apex/"
 
 class twrpApex {
 public:
diff --git a/twrpRepacker.cpp b/twrpRepacker.cpp
new file mode 100755
index 0000000..5663890
--- /dev/null
+++ b/twrpRepacker.cpp
@@ -0,0 +1,249 @@
+/*
+	Copyright 2013 to 2020 TeamWin
+	This file is part of TWRP/TeamWin Recovery Project.
+
+	TWRP 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.
+
+	TWRP 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 TWRP.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <string>
+
+#include "data.hpp"
+#include "partitions.hpp"
+#include "twrp-functions.hpp"
+#include "twrpRepacker.hpp"
+#include "twcommon.h"
+#include "variables.h"
+#include "gui/gui.hpp"
+
+bool twrpRepacker::Prepare_Empty_Folder(const std::string& Folder) {
+	if (TWFunc::Path_Exists(Folder))
+		TWFunc::removeDir(Folder, false);
+	return TWFunc::Recursive_Mkdir(Folder);
+}
+
+bool twrpRepacker::Backup_Image_For_Repack(TWPartition* Part, const std::string& Temp_Folder_Destination,
+										 const bool Create_Backup, const std::string& Backup_Name) {
+	if (!Part) {
+		LOGERR("Partition was null!\n");
+		return false;
+	}
+	if (!Prepare_Empty_Folder(Temp_Folder_Destination))
+		return false;
+	std::string target_image = Temp_Folder_Destination + "boot.img";
+	PartitionSettings part_settings;
+	part_settings.Part = Part;
+	if (Create_Backup) {
+		if (PartitionManager.Check_Backup_Name(Backup_Name, true, false) != 0)
+			return false;
+		DataManager::GetValue(TW_BACKUPS_FOLDER_VAR, part_settings.Backup_Folder);
+		part_settings.Backup_Folder = part_settings.Backup_Folder + "/" + TWFunc::Get_Current_Date() + " " + Backup_Name + "/";
+		if (!TWFunc::Recursive_Mkdir(part_settings.Backup_Folder))
+			return false;
+	} else
+		part_settings.Backup_Folder = Temp_Folder_Destination;
+	part_settings.adbbackup = false;
+	part_settings.generate_digest = false;
+	part_settings.generate_md5 = false;
+	part_settings.PM_Method = PM_BACKUP;
+	part_settings.progress = NULL;
+	pid_t not_a_pid = 0;
+	if (!Part->Backup(&part_settings, &not_a_pid))
+		return false;
+	std::string backed_up_image = part_settings.Backup_Folder;
+	backed_up_image += Part->Get_Backup_FileName();
+	target_image = Temp_Folder_Destination + "boot.img";
+	if (Create_Backup) {
+		std::string source = part_settings.Backup_Folder + Part->Get_Backup_FileName();
+		if (TWFunc::copy_file(source, target_image, 0644) != 0) {
+			LOGERR("Failed to copy backup file '%s' to temp folder target '%s'\n", source.c_str(), target_image.c_str());
+			return false;
+		}
+	} else {
+		if (rename(backed_up_image.c_str(), target_image.c_str()) != 0) {
+			LOGERR("Failed to rename '%s' to '%s'\n", backed_up_image.c_str(), target_image.c_str());
+			return false;
+		}
+	}
+	original_ramdisk_format = Unpack_Image(target_image, Temp_Folder_Destination, false, false);
+	return !original_ramdisk_format.empty();
+}
+
+std::string twrpRepacker::Unpack_Image(const std::string& Source_Path, const std::string& Temp_Folder_Destination,
+										const bool Copy_Source, const bool Create_Destination) {
+	std::string txt_to_find = "RAMDISK_FMT";
+	if (Create_Destination) {
+		if (!Prepare_Empty_Folder(Temp_Folder_Destination))
+			return std::string();
+	}
+	if (Copy_Source) {
+		std::string destination = Temp_Folder_Destination + "/boot.img";
+		if (TWFunc::copy_file(Source_Path, destination, 0644))
+			return std::string();
+	}
+	std::string command = "cd " + Temp_Folder_Destination + " && /system/bin/magiskboot unpack -h ";
+	command = command + "'" + Source_Path +"'";
+
+	std::string magisk_unpack_output;
+	int ret;
+	if ((ret = TWFunc::Exec_Cmd(command, magisk_unpack_output, true)) != 0) {
+		LOGINFO("Error unpacking %s, ret: %d!\n", Source_Path.c_str(), ret);
+		gui_msg(Msg(msg::kError, "unpack_error=Error unpacking image."));
+		return std::string();
+	}
+	size_t pos = magisk_unpack_output.find(txt_to_find) + txt_to_find.size();
+	std::string ramdisk_format = magisk_unpack_output.substr(pos, magisk_unpack_output.size() - 1);
+	ramdisk_format.erase(std::remove(ramdisk_format.begin(), ramdisk_format.end(), '['), ramdisk_format.end());
+	ramdisk_format.erase(std::remove(ramdisk_format.begin(), ramdisk_format.end(), ']'), ramdisk_format.end());
+	ramdisk_format.erase(std::remove(ramdisk_format.begin(), ramdisk_format.end(), ' '), ramdisk_format.end());
+	ramdisk_format.erase(std::remove(ramdisk_format.begin(), ramdisk_format.end(), '\n'), ramdisk_format.end());
+	return ramdisk_format;
+}
+
+bool twrpRepacker::Repack_Image_And_Flash(const std::string& Target_Image, const struct Repack_Options_struct& Repack_Options) {
+	bool recompress = false;
+
+	if (!TWFunc::Path_Exists("/system/bin/magiskboot")) {
+		LOGERR("Image repacking tool not present in this TWRP build!");
+		return false;
+	}
+	DataManager::SetProgress(0);
+	TWPartition* part = PartitionManager.Find_Partition_By_Path("/boot");
+	if (part)
+		gui_msg(Msg("unpacking_image=Unpacking {1}...")(part->Get_Display_Name()));
+	else {
+		gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1}.")("/boot"));
+		return false;
+	}
+	if (!Backup_Image_For_Repack(part, REPACK_ORIG_DIR, Repack_Options.Backup_First, gui_lookup("repack", "Repack")))
+		return false;
+	DataManager::SetProgress(.25);
+	gui_msg(Msg("unpacking_image=Unpacking {1}...")(Target_Image));
+	image_ramdisk_format = Unpack_Image(Target_Image, REPACK_NEW_DIR, true);
+	if (image_ramdisk_format.empty())
+		return false;
+	DataManager::SetProgress(.5);
+	gui_msg(Msg("repacking_image=Repacking {1}...")(part->Get_Display_Name()));
+	std::string path = REPACK_NEW_DIR;
+	if (Repack_Options.Type == REPLACE_KERNEL) {
+		// When we replace the kernel, what we really do is copy the boot partition ramdisk into the new image's folder
+		if (TWFunc::copy_file(REPACK_ORIG_DIR "ramdisk.cpio", REPACK_NEW_DIR "ramdisk.cpio", 0644)) {
+			LOGERR("Failed to copy ramdisk\n");
+			return false;
+		}
+	} else if (Repack_Options.Type == REPLACE_RAMDISK) {
+		// Repack the ramdisk
+		if (TWFunc::copy_file(REPACK_NEW_DIR "ramdisk.cpio", REPACK_ORIG_DIR "ramdisk.cpio", 0644)) {
+			LOGERR("Failed to copy ramdisk\n");
+			return false;
+		}
+		path = REPACK_ORIG_DIR;
+	} else {
+		LOGERR("Invalid repacking options specified\n");
+		return false;
+	}
+	if (Repack_Options.Disable_Verity)
+		LOGERR("Disabling verity is not implemented yet\n");
+	if (Repack_Options.Disable_Force_Encrypt)
+		LOGERR("Disabling force encrypt is not implemented yet\n");
+	std::string command = "cd " + path + " && /system/bin/magiskboot repack ";
+	if (original_ramdisk_format != image_ramdisk_format) {
+		command = command + "-n ";
+		recompress = true;
+	}
+
+	command += path + "boot.img";
+
+	std::string orig_compressed_image(REPACK_ORIG_DIR);
+	orig_compressed_image += "ramdisk.cpio";
+	std::string copy_compressed_image(REPACK_ORIG_DIR);
+	copy_compressed_image += "ramdisk-1.cpio";
+
+	if (recompress) {
+		std::string compress_cmd = "/system/bin/magiskboot compress=" + image_ramdisk_format + " " + orig_compressed_image + " " + copy_compressed_image;
+		if (TWFunc::Exec_Cmd(compress_cmd) != 0) {
+			gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
+			return false;
+		}
+		std::rename(copy_compressed_image.c_str(), orig_compressed_image.c_str());
+	}
+
+	if (TWFunc::Exec_Cmd(command) != 0) {
+		gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
+		return false;
+	}
+
+	DataManager::SetProgress(.75);
+	std::string file = "new-boot.img";
+	DataManager::SetValue("tw_flash_partition", "/boot;");
+	if (!PartitionManager.Flash_Image(path, file)) {
+		LOGINFO("Error flashing new image\n");
+		return false;
+	}
+	DataManager::SetProgress(1);
+	TWFunc::removeDir(REPACK_ORIG_DIR, false);
+	if (part->Is_SlotSelect() && Repack_Options.Type == REPLACE_RAMDISK) {
+		LOGINFO("Switching slots to flash ramdisk to both partitions\n");
+		string Current_Slot = PartitionManager.Get_Active_Slot_Display();
+		if (Current_Slot == "A")
+			PartitionManager.Set_Active_Slot("B");
+		else
+			PartitionManager.Set_Active_Slot("A");
+		DataManager::SetProgress(.25);
+		if (!Backup_Image_For_Repack(part, REPACK_ORIG_DIR, Repack_Options.Backup_First, gui_lookup("repack", "Repack")))
+			return false;
+		if (TWFunc::copy_file(REPACK_NEW_DIR "ramdisk.cpio", REPACK_ORIG_DIR "ramdisk.cpio", 0644)) {
+			LOGERR("Failed to copy ramdisk\n");
+			return false;
+		}
+		path = REPACK_ORIG_DIR;
+		std::string command = "cd " + path + " && /system/bin/magiskboot repack ";
+
+		if (original_ramdisk_format != image_ramdisk_format) {
+			command = command + "-n ";
+			recompress = true;
+		}
+		command += path + "boot.img";
+
+		if (recompress) {
+			std::string compress_cmd = "/system/bin/magiskboot compress=" + image_ramdisk_format + " " + orig_compressed_image + " " + copy_compressed_image;
+			if (TWFunc::Exec_Cmd(compress_cmd) != 0) {
+				gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
+				return false;
+			}
+			std::rename(copy_compressed_image.c_str(), orig_compressed_image.c_str());
+		}
+
+		if (TWFunc::Exec_Cmd(command) != 0) {
+			gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
+			return false;
+		}
+
+		if (TWFunc::Exec_Cmd(command) != 0) {
+			gui_msg(Msg(msg::kError, "repack_error=Error repacking image."));
+			return false;
+		}
+		DataManager::SetProgress(.75);
+		std::string file = "new-boot.img";
+		DataManager::SetValue("tw_flash_partition", "/boot;");
+		if (!PartitionManager.Flash_Image(path, file)) {
+			LOGINFO("Error flashing new image\n");
+			return false;
+		}
+		DataManager::SetProgress(1);
+		TWFunc::removeDir(REPACK_ORIG_DIR, false);
+		PartitionManager.Set_Active_Slot(Current_Slot);
+	}
+	TWFunc::removeDir(REPACK_NEW_DIR, false);
+	return true;
+}
diff --git a/twrpRepacker.hpp b/twrpRepacker.hpp
new file mode 100755
index 0000000..346229b
--- /dev/null
+++ b/twrpRepacker.hpp
@@ -0,0 +1,48 @@
+/*

+	Copyright 2014 to 2020 TeamWin

+	This file is part of TWRP/TeamWin Recovery Project.

+

+	TWRP 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.

+

+	TWRP 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 TWRP.  If not, see <http://www.gnu.org/licenses/>.

+*/

+

+#include <string>

+#include "partitions.hpp"

+

+#ifndef TWRP_REPACKER

+#define TWRP_REPACKER

+

+enum Repack_Type {

+	REPLACE_NONE = 0,

+	REPLACE_RAMDISK = 1,

+	REPLACE_KERNEL = 2,

+};

+

+struct Repack_Options_struct {

+	Repack_Type Type;

+	bool Backup_First;

+	bool Disable_Verity;

+	bool Disable_Force_Encrypt;

+};

+

+class twrpRepacker {

+    public:

+        bool Backup_Image_For_Repack(TWPartition* Part, const std::string& Temp_Folder_Destination, const bool Create_Backup, const std::string& Backup_Name); // Prepares an image for repacking by unpacking it to the temp folder destination

+        std::string Unpack_Image(const std::string& Source_Path, const std::string& Temp_Folder_Destination, const bool Copy_Source, const bool Create_Destination = true); // Prepares an image for repacking by unpacking it to the temp folder destination and return the ramdisk format

+        bool Repack_Image_And_Flash(const std::string& Target_Image, const struct Repack_Options_struct& Repack_Options); // Repacks the boot image with a new kernel or a new ramdisk

+    private:

+    	bool Prepare_Empty_Folder(const std::string& Folder); // Creates an empty folder at Folder. If the folder already exists, the folder is deleted, then created

+    	std::string original_ramdisk_format;                  // Ramdisk format of boot partition

+	    std::string image_ramdisk_format;                     // Ramdisk format of boot image to repack from

+};

+#endif // TWRP_REPACKER
\ No newline at end of file
diff --git a/twrpTar.cpp b/twrpTar.cpp
index c4a7156..6c9e758 100755
--- a/twrpTar.cpp
+++ b/twrpTar.cpp
@@ -1487,7 +1487,7 @@
 		Command = "pigz -l '" + filename + "'";
 		/* if we set Command = "pigz -l " + tarfn + " | sed '1d' | cut -f5 -d' '";
 		we get the uncompressed size at once. */
-		TWFunc::Exec_Cmd(Command, result);
+		TWFunc::Exec_Cmd(Command, result, false);
 		if (!result.empty()) {
 			/* Expected output:
 			compressed original  reduced name
@@ -1512,7 +1512,7 @@
 			Command = "openaes dec --key \"" + password + "\" --in '" + filename + "' | pigz -l";
 			/* if we set Command = "pigz -l " + tarfn + " | sed '1d' | cut -f5 -d' '";
 			we get the uncompressed size at once. */
-			TWFunc::Exec_Cmd(Command, result);
+			TWFunc::Exec_Cmd(Command, result, false);
 			if (!result.empty()) {
 				LOGINFO("result was: '%s'\n", result.c_str());
 				/* Expected output:
diff --git a/twrpTarMain/twrpTarMain.cpp b/twrpTarMain/twrpTarMain.cpp
old mode 100644
new mode 100755
index df40426..2607a85
--- a/twrpTarMain/twrpTarMain.cpp
+++ b/twrpTarMain/twrpTarMain.cpp
@@ -71,9 +71,9 @@
 	printf(" -d    target directory\n");
 	printf(" -t    output file\n");
 	printf(" -m    skip media subfolder (has data media)\n");
-	printf(" -z    compress backup (/sbin/pigz must be present)\n");
+	printf(" -z    compress backup (/system/bin/pigz must be present)\n");
 #ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS
-	printf(" -e    encrypt/decrypt backup followed by password (/sbin/openaes must be present)\n");
+	printf(" -e    encrypt/decrypt backup followed by password (/system/bin/openaes must be present)\n");
 	printf(" -u    encrypt using userdata encryption (must be used with -e)\n");
 #endif
 	printf("\n\n");
diff --git a/verifier24/README b/verifier24/README
deleted file mode 100644
index 44d9422..0000000
--- a/verifier24/README
+++ /dev/null
@@ -1,2 +0,0 @@
-This is older code from Android 5.1 Marshmallow (SDK ver 24) and older
-that still used mincrypt instead of libcrypto.
diff --git a/verifier24/asn1_decoder.cpp b/verifier24/asn1_decoder.cpp
deleted file mode 100644
index e7aef78..0000000
--- a/verifier24/asn1_decoder.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include <malloc.h>
-#include <stdint.h>
-#include <string.h>
-
-#include "asn1_decoder.h"
-
-
-typedef struct asn1_context {
-    size_t length;
-    uint8_t* p;
-    int app_type;
-} asn1_context_t;
-
-
-static const int kMaskConstructed = 0xE0;
-static const int kMaskTag = 0x7F;
-static const int kMaskAppType = 0x1F;
-
-static const int kTagOctetString = 0x04;
-static const int kTagOid = 0x06;
-static const int kTagSequence = 0x30;
-static const int kTagSet = 0x31;
-static const int kTagConstructed = 0xA0;
-
-asn1_context_t* asn1_context_new(uint8_t* buffer, size_t length) {
-    asn1_context_t* ctx = (asn1_context_t*) calloc(1, sizeof(asn1_context_t));
-    if (ctx == NULL) {
-        return NULL;
-    }
-    ctx->p = buffer;
-    ctx->length = length;
-    return ctx;
-}
-
-void asn1_context_free(asn1_context_t* ctx) {
-    free(ctx);
-}
-
-static inline int peek_byte(asn1_context_t* ctx) {
-    if (ctx->length <= 0) {
-        return -1;
-    }
-    return *ctx->p;
-}
-
-static inline int get_byte(asn1_context_t* ctx) {
-    if (ctx->length <= 0) {
-        return -1;
-    }
-    int byte = *ctx->p;
-    ctx->p++;
-    ctx->length--;
-    return byte;
-}
-
-static inline bool skip_bytes(asn1_context_t* ctx, size_t num_skip) {
-    if (ctx->length < num_skip) {
-        return false;
-    }
-    ctx->p += num_skip;
-    ctx->length -= num_skip;
-    return true;
-}
-
-static bool decode_length(asn1_context_t* ctx, size_t* out_len) {
-    int num_octets = get_byte(ctx);
-    if (num_octets == -1) {
-        return false;
-    }
-    if ((num_octets & 0x80) == 0x00) {
-        *out_len = num_octets;
-        return 1;
-    }
-    num_octets &= kMaskTag;
-    if ((size_t)num_octets >= sizeof(size_t)) {
-        return false;
-    }
-    size_t length = 0;
-    for (int i = 0; i < num_octets; ++i) {
-        int byte = get_byte(ctx);
-        if (byte == -1) {
-            return false;
-        }
-        length <<= 8;
-        length += byte;
-    }
-    *out_len = length;
-    return true;
-}
-
-/**
- * Returns the constructed type and advances the pointer. E.g. A0 -> 0
- */
-asn1_context_t* asn1_constructed_get(asn1_context_t* ctx) {
-    int type = get_byte(ctx);
-    if (type == -1 || (type & kMaskConstructed) != kTagConstructed) {
-        return NULL;
-    }
-    size_t length;
-    if (!decode_length(ctx, &length) || length > ctx->length) {
-        return NULL;
-    }
-    asn1_context_t* app_ctx = asn1_context_new(ctx->p, length);
-    app_ctx->app_type = type & kMaskAppType;
-    return app_ctx;
-}
-
-bool asn1_constructed_skip_all(asn1_context_t* ctx) {
-    int byte = peek_byte(ctx);
-    while (byte != -1 && (byte & kMaskConstructed) == kTagConstructed) {
-        skip_bytes(ctx, 1);
-        size_t length;
-        if (!decode_length(ctx, &length) || !skip_bytes(ctx, length)) {
-            return false;
-        }
-        byte = peek_byte(ctx);
-    }
-    return byte != -1;
-}
-
-int asn1_constructed_type(asn1_context_t* ctx) {
-    return ctx->app_type;
-}
-
-asn1_context_t* asn1_sequence_get(asn1_context_t* ctx) {
-    if ((get_byte(ctx) & kMaskTag) != kTagSequence) {
-        return NULL;
-    }
-    size_t length;
-    if (!decode_length(ctx, &length) || length > ctx->length) {
-        return NULL;
-    }
-    return asn1_context_new(ctx->p, length);
-}
-
-asn1_context_t* asn1_set_get(asn1_context_t* ctx) {
-    if ((get_byte(ctx) & kMaskTag) != kTagSet) {
-        return NULL;
-    }
-    size_t length;
-    if (!decode_length(ctx, &length) || length > ctx->length) {
-        return NULL;
-    }
-    return asn1_context_new(ctx->p, length);
-}
-
-bool asn1_sequence_next(asn1_context_t* ctx) {
-    size_t length;
-    if (get_byte(ctx) == -1 || !decode_length(ctx, &length) || !skip_bytes(ctx, length)) {
-        return false;
-    }
-    return true;
-}
-
-bool asn1_oid_get(asn1_context_t* ctx, uint8_t** oid, size_t* length) {
-    if (get_byte(ctx) != kTagOid) {
-        return false;
-    }
-    if (!decode_length(ctx, length) || *length == 0 || *length > ctx->length) {
-        return false;
-    }
-    *oid = ctx->p;
-    return true;
-}
-
-bool asn1_octet_string_get(asn1_context_t* ctx, uint8_t** octet_string, size_t* length) {
-    if (get_byte(ctx) != kTagOctetString) {
-        return false;
-    }
-    if (!decode_length(ctx, length) || *length == 0 || *length > ctx->length) {
-        return false;
-    }
-    *octet_string = ctx->p;
-    return true;
-}
diff --git a/verifier24/asn1_decoder.h b/verifier24/asn1_decoder.h
deleted file mode 100644
index b17141c..0000000
--- a/verifier24/asn1_decoder.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-
-#ifndef ASN1_DECODER_H_
-#define ASN1_DECODER_H_
-
-#include <stdint.h>
-
-typedef struct asn1_context asn1_context_t;
-
-asn1_context_t* asn1_context_new(uint8_t* buffer, size_t length);
-void asn1_context_free(asn1_context_t* ctx);
-asn1_context_t* asn1_constructed_get(asn1_context_t* ctx);
-bool asn1_constructed_skip_all(asn1_context_t* ctx);
-int asn1_constructed_type(asn1_context_t* ctx);
-asn1_context_t* asn1_sequence_get(asn1_context_t* ctx);
-asn1_context_t* asn1_set_get(asn1_context_t* ctx);
-bool asn1_sequence_next(asn1_context_t* seq);
-bool asn1_oid_get(asn1_context_t* ctx, uint8_t** oid, size_t* length);
-bool asn1_octet_string_get(asn1_context_t* ctx, uint8_t** octet_string, size_t* length);
-
-#endif /* ASN1_DECODER_H_ */
diff --git a/verifier24/verifier.cpp b/verifier24/verifier.cpp
deleted file mode 100644
index ae8647a..0000000
--- a/verifier24/verifier.cpp
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
- * Copyright (C) 2008 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.
- */
-
-#include "asn1_decoder.h"
-#include "../common.h"
-//#include "ui.h"
-#include "verifier.h"
-
-#include "mincrypt/dsa_sig.h"
-#include "mincrypt/p256.h"
-#include "mincrypt/p256_ecdsa.h"
-#include "mincrypt/rsa.h"
-#include "mincrypt/sha.h"
-#include "mincrypt/sha256.h"
-
-#include <errno.h>
-#include <malloc.h>
-#include <stdio.h>
-#include <string.h>
-
-//extern RecoveryUI* ui;
-
-#define PUBLIC_KEYS_FILE "/res/keys"
-
-/*
- * Simple version of PKCS#7 SignedData extraction. This extracts the
- * signature OCTET STRING to be used for signature verification.
- *
- * For full details, see http://www.ietf.org/rfc/rfc3852.txt
- *
- * The PKCS#7 structure looks like:
- *
- *   SEQUENCE (ContentInfo)
- *     OID (ContentType)
- *     [0] (content)
- *       SEQUENCE (SignedData)
- *         INTEGER (version CMSVersion)
- *         SET (DigestAlgorithmIdentifiers)
- *         SEQUENCE (EncapsulatedContentInfo)
- *         [0] (CertificateSet OPTIONAL)
- *         [1] (RevocationInfoChoices OPTIONAL)
- *         SET (SignerInfos)
- *           SEQUENCE (SignerInfo)
- *             INTEGER (CMSVersion)
- *             SEQUENCE (SignerIdentifier)
- *             SEQUENCE (DigestAlgorithmIdentifier)
- *             SEQUENCE (SignatureAlgorithmIdentifier)
- *             OCTET STRING (SignatureValue)
- */
-static bool read_pkcs7(uint8_t* pkcs7_der, size_t pkcs7_der_len, uint8_t** sig_der,
-        size_t* sig_der_length) {
-    asn1_context_t* ctx = asn1_context_new(pkcs7_der, pkcs7_der_len);
-    if (ctx == NULL) {
-        return false;
-    }
-
-    asn1_context_t* pkcs7_seq = asn1_sequence_get(ctx);
-    if (pkcs7_seq != NULL && asn1_sequence_next(pkcs7_seq)) {
-        asn1_context_t *signed_data_app = asn1_constructed_get(pkcs7_seq);
-        if (signed_data_app != NULL) {
-            asn1_context_t* signed_data_seq = asn1_sequence_get(signed_data_app);
-            if (signed_data_seq != NULL
-                    && asn1_sequence_next(signed_data_seq)
-                    && asn1_sequence_next(signed_data_seq)
-                    && asn1_sequence_next(signed_data_seq)
-                    && asn1_constructed_skip_all(signed_data_seq)) {
-                asn1_context_t *sig_set = asn1_set_get(signed_data_seq);
-                if (sig_set != NULL) {
-                    asn1_context_t* sig_seq = asn1_sequence_get(sig_set);
-                    if (sig_seq != NULL
-                            && asn1_sequence_next(sig_seq)
-                            && asn1_sequence_next(sig_seq)
-                            && asn1_sequence_next(sig_seq)
-                            && asn1_sequence_next(sig_seq)) {
-                        uint8_t* sig_der_ptr;
-                        if (asn1_octet_string_get(sig_seq, &sig_der_ptr, sig_der_length)) {
-                            *sig_der = (uint8_t*) malloc(*sig_der_length);
-                            if (*sig_der != NULL) {
-                                memcpy(*sig_der, sig_der_ptr, *sig_der_length);
-                            }
-                        }
-                        asn1_context_free(sig_seq);
-                    }
-                    asn1_context_free(sig_set);
-                }
-                asn1_context_free(signed_data_seq);
-            }
-            asn1_context_free(signed_data_app);
-        }
-        asn1_context_free(pkcs7_seq);
-    }
-    asn1_context_free(ctx);
-
-    return *sig_der != NULL;
-}
-
-// Look for an RSA signature embedded in the .ZIP file comment given
-// the path to the zip.  Verify it matches one of the given public
-// keys.
-//
-// Return VERIFY_SUCCESS, VERIFY_FAILURE (if any error is encountered
-// or no key matches the signature).
-int verify_file(unsigned char* addr, size_t length) {
-    //ui->SetProgress(0.0);
-
-    int numKeys;
-    Certificate* pKeys = load_keys(PUBLIC_KEYS_FILE, &numKeys);
-    if (pKeys == NULL) {
-        LOGE("Failed to load keys\n");
-        return INSTALL_CORRUPT;
-    }
-    LOGI("%d key(s) loaded from %s\n", numKeys, PUBLIC_KEYS_FILE);
-
-    // An archive with a whole-file signature will end in six bytes:
-    //
-    //   (2-byte signature start) $ff $ff (2-byte comment size)
-    //
-    // (As far as the ZIP format is concerned, these are part of the
-    // archive comment.)  We start by reading this footer, this tells
-    // us how far back from the end we have to start reading to find
-    // the whole comment.
-
-#define FOOTER_SIZE 6
-
-    if (length < FOOTER_SIZE) {
-        LOGE("not big enough to contain footer\n");
-        return VERIFY_FAILURE;
-    }
-
-    unsigned char* footer = addr + length - FOOTER_SIZE;
-
-    if (footer[2] != 0xff || footer[3] != 0xff) {
-        LOGE("footer is wrong\n");
-        return VERIFY_FAILURE;
-    }
-
-    size_t comment_size = footer[4] + (footer[5] << 8);
-    size_t signature_start = footer[0] + (footer[1] << 8);
-    LOGI("comment is %zu bytes; signature %zu bytes from end\n",
-         comment_size, signature_start);
-
-    if (signature_start <= FOOTER_SIZE) {
-        LOGE("Signature start is in the footer");
-        return VERIFY_FAILURE;
-    }
-
-#define EOCD_HEADER_SIZE 22
-
-    // The end-of-central-directory record is 22 bytes plus any
-    // comment length.
-    size_t eocd_size = comment_size + EOCD_HEADER_SIZE;
-
-    if (length < eocd_size) {
-        LOGE("not big enough to contain EOCD\n");
-        return VERIFY_FAILURE;
-    }
-
-    // Determine how much of the file is covered by the signature.
-    // This is everything except the signature data and length, which
-    // includes all of the EOCD except for the comment length field (2
-    // bytes) and the comment data.
-    size_t signed_len = length - eocd_size + EOCD_HEADER_SIZE - 2;
-
-    unsigned char* eocd = addr + length - eocd_size;
-
-    // If this is really is the EOCD record, it will begin with the
-    // magic number $50 $4b $05 $06.
-    if (eocd[0] != 0x50 || eocd[1] != 0x4b ||
-        eocd[2] != 0x05 || eocd[3] != 0x06) {
-        LOGE("signature length doesn't match EOCD marker\n");
-        return VERIFY_FAILURE;
-    }
-
-    size_t i;
-    for (i = 4; i < eocd_size-3; ++i) {
-        if (eocd[i  ] == 0x50 && eocd[i+1] == 0x4b &&
-            eocd[i+2] == 0x05 && eocd[i+3] == 0x06) {
-            // if the sequence $50 $4b $05 $06 appears anywhere after
-            // the real one, minzip will find the later (wrong) one,
-            // which could be exploitable.  Fail verification if
-            // this sequence occurs anywhere after the real one.
-            LOGE("EOCD marker occurs after start of EOCD\n");
-            return VERIFY_FAILURE;
-        }
-    }
-
-#define BUFFER_SIZE 4096
-
-    bool need_sha1 = false;
-    bool need_sha256 = false;
-    for (i = 0; i < numKeys; ++i) {
-        switch (pKeys[i].hash_len) {
-            case SHA_DIGEST_SIZE: need_sha1 = true; break;
-            case SHA256_DIGEST_SIZE: need_sha256 = true; break;
-        }
-    }
-
-    SHA_CTX sha1_ctx;
-    SHA256_CTX sha256_ctx;
-    SHA_init(&sha1_ctx);
-    SHA256_init(&sha256_ctx);
-
-    double frac = -1.0;
-    size_t so_far = 0;
-    while (so_far < signed_len) {
-        size_t size = signed_len - so_far;
-        if (size > BUFFER_SIZE) size = BUFFER_SIZE;
-
-        if (need_sha1) SHA_update(&sha1_ctx, addr + so_far, size);
-        if (need_sha256) SHA256_update(&sha256_ctx, addr + so_far, size);
-        so_far += size;
-
-        double f = so_far / (double)signed_len;
-        if (f > frac + 0.02 || size == so_far) {
-            //ui->SetProgress(f);
-            frac = f;
-        }
-    }
-
-    const uint8_t* sha1 = SHA_final(&sha1_ctx);
-    const uint8_t* sha256 = SHA256_final(&sha256_ctx);
-
-    uint8_t* sig_der = NULL;
-    size_t sig_der_length = 0;
-
-    size_t signature_size = signature_start - FOOTER_SIZE;
-    if (!read_pkcs7(eocd + eocd_size - signature_start, signature_size, &sig_der,
-            &sig_der_length)) {
-        LOGE("Could not find signature DER block\n");
-        return VERIFY_FAILURE;
-    }
-
-    /*
-     * Check to make sure at least one of the keys matches the signature. Since
-     * any key can match, we need to try each before determining a verification
-     * failure has happened.
-     */
-    for (i = 0; i < numKeys; ++i) {
-        const uint8_t* hash;
-        switch (pKeys[i].hash_len) {
-            case SHA_DIGEST_SIZE: hash = sha1; break;
-            case SHA256_DIGEST_SIZE: hash = sha256; break;
-            default: continue;
-        }
-
-        // The 6 bytes is the "(signature_start) $ff $ff (comment_size)" that
-        // the signing tool appends after the signature itself.
-        if (pKeys[i].key_type == Certificate::RSA) {
-            if (sig_der_length < RSANUMBYTES) {
-                // "signature" block isn't big enough to contain an RSA block.
-                LOGI("signature is too short for RSA key %zu\n", i);
-                continue;
-            }
-
-            if (!RSA_verify(pKeys[i].rsa, sig_der, RSANUMBYTES,
-                            hash, pKeys[i].hash_len)) {
-                LOGI("failed to verify against RSA key %zu\n", i);
-                continue;
-            }
-
-            LOGI("whole-file signature verified against RSA key %zu\n", i);
-            free(sig_der);
-            return VERIFY_SUCCESS;
-        } else if (pKeys[i].key_type == Certificate::EC
-                && pKeys[i].hash_len == SHA256_DIGEST_SIZE) {
-            p256_int r, s;
-            if (!dsa_sig_unpack(sig_der, sig_der_length, &r, &s)) {
-                LOGI("Not a DSA signature block for EC key %zu\n", i);
-                continue;
-            }
-
-            p256_int p256_hash;
-            p256_from_bin(hash, &p256_hash);
-            if (!p256_ecdsa_verify(&(pKeys[i].ec->x), &(pKeys[i].ec->y),
-                                   &p256_hash, &r, &s)) {
-                LOGI("failed to verify against EC key %zu\n", i);
-                continue;
-            }
-
-            LOGI("whole-file signature verified against EC key %zu\n", i);
-            free(sig_der);
-            return VERIFY_SUCCESS;
-        } else {
-            LOGI("Unknown key type %d\n", pKeys[i].key_type);
-        }
-		LOGI("i: %i, eocd_size: %i, RSANUMBYTES: %i\n", i, eocd_size, RSANUMBYTES);
-    }
-    free(sig_der);
-    LOGE("failed to verify whole-file signature\n");
-    return VERIFY_FAILURE;
-}
-
-// Reads a file containing one or more public keys as produced by
-// DumpPublicKey:  this is an RSAPublicKey struct as it would appear
-// as a C source literal, eg:
-//
-//  "{64,0xc926ad21,{1795090719,...,-695002876},{-857949815,...,1175080310}}"
-//
-// For key versions newer than the original 2048-bit e=3 keys
-// supported by Android, the string is preceded by a version
-// identifier, eg:
-//
-//  "v2 {64,0xc926ad21,{1795090719,...,-695002876},{-857949815,...,1175080310}}"
-//
-// (Note that the braces and commas in this example are actual
-// characters the parser expects to find in the file; the ellipses
-// indicate more numbers omitted from this example.)
-//
-// The file may contain multiple keys in this format, separated by
-// commas.  The last key must not be followed by a comma.
-//
-// A Certificate is a pair of an RSAPublicKey and a particular hash
-// (we support SHA-1 and SHA-256; we store the hash length to signify
-// which is being used).  The hash used is implied by the version number.
-//
-//       1: 2048-bit RSA key with e=3 and SHA-1 hash
-//       2: 2048-bit RSA key with e=65537 and SHA-1 hash
-//       3: 2048-bit RSA key with e=3 and SHA-256 hash
-//       4: 2048-bit RSA key with e=65537 and SHA-256 hash
-//       5: 256-bit EC key using the NIST P-256 curve parameters and SHA-256 hash
-//
-// Returns NULL if the file failed to parse, or if it contain zero keys.
-Certificate*
-load_keys(const char* filename, int* numKeys) {
-    Certificate* out = NULL;
-    *numKeys = 0;
-
-    FILE* f = fopen(filename, "r");
-    if (f == NULL) {
-        LOGE("opening %s: %s\n", filename, strerror(errno));
-        goto exit;
-    }
-
-    {
-        int i;
-        bool done = false;
-        while (!done) {
-            ++*numKeys;
-            out = (Certificate*)realloc(out, *numKeys * sizeof(Certificate));
-            Certificate* cert = out + (*numKeys - 1);
-            memset(cert, '\0', sizeof(Certificate));
-
-            char start_char;
-            if (fscanf(f, " %c", &start_char) != 1) goto exit;
-            if (start_char == '{') {
-                // a version 1 key has no version specifier.
-                cert->key_type = Certificate::RSA;
-                cert->rsa = (RSAPublicKey*)malloc(sizeof(RSAPublicKey));
-                cert->rsa->exponent = 3;
-                cert->hash_len = SHA_DIGEST_SIZE;
-            } else if (start_char == 'v') {
-                int version;
-                if (fscanf(f, "%d {", &version) != 1) goto exit;
-                switch (version) {
-                    case 2:
-                        cert->key_type = Certificate::RSA;
-                        cert->rsa = (RSAPublicKey*)malloc(sizeof(RSAPublicKey));
-                        cert->rsa->exponent = 65537;
-                        cert->hash_len = SHA_DIGEST_SIZE;
-                        break;
-                    case 3:
-                        cert->key_type = Certificate::RSA;
-                        cert->rsa = (RSAPublicKey*)malloc(sizeof(RSAPublicKey));
-                        cert->rsa->exponent = 3;
-                        cert->hash_len = SHA256_DIGEST_SIZE;
-                        break;
-                    case 4:
-                        cert->key_type = Certificate::RSA;
-                        cert->rsa = (RSAPublicKey*)malloc(sizeof(RSAPublicKey));
-                        cert->rsa->exponent = 65537;
-                        cert->hash_len = SHA256_DIGEST_SIZE;
-                        break;
-                    case 5:
-                        cert->key_type = Certificate::EC;
-                        cert->ec = (ECPublicKey*)calloc(1, sizeof(ECPublicKey));
-                        cert->hash_len = SHA256_DIGEST_SIZE;
-                        break;
-                    default:
-                        goto exit;
-                }
-            }
-
-            if (cert->key_type == Certificate::RSA) {
-                RSAPublicKey* key = cert->rsa;
-                if (fscanf(f, " %i , 0x%x , { %u",
-                           &(key->len), &(key->n0inv), &(key->n[0])) != 3) {
-                    goto exit;
-                }
-                if (key->len != RSANUMWORDS) {
-                    LOGE("key length (%d) does not match expected size\n", key->len);
-                    goto exit;
-                }
-                for (i = 1; i < key->len; ++i) {
-                    if (fscanf(f, " , %u", &(key->n[i])) != 1) goto exit;
-                }
-                if (fscanf(f, " } , { %u", &(key->rr[0])) != 1) goto exit;
-                for (i = 1; i < key->len; ++i) {
-                    if (fscanf(f, " , %u", &(key->rr[i])) != 1) goto exit;
-                }
-                fscanf(f, " } } ");
-
-                LOGI("read key e=%d hash=%d\n", key->exponent, cert->hash_len);
-            } else if (cert->key_type == Certificate::EC) {
-                ECPublicKey* key = cert->ec;
-                int key_len;
-                unsigned int byte;
-                uint8_t x_bytes[P256_NBYTES];
-                uint8_t y_bytes[P256_NBYTES];
-                if (fscanf(f, " %i , { %u", &key_len, &byte) != 2) goto exit;
-                if (key_len != P256_NBYTES) {
-                    LOGE("Key length (%d) does not match expected size %d\n", key_len, P256_NBYTES);
-                    goto exit;
-                }
-                x_bytes[P256_NBYTES - 1] = byte;
-                for (i = P256_NBYTES - 2; i >= 0; --i) {
-                    if (fscanf(f, " , %u", &byte) != 1) goto exit;
-                    x_bytes[i] = byte;
-                }
-                if (fscanf(f, " } , { %u", &byte) != 1) goto exit;
-                y_bytes[P256_NBYTES - 1] = byte;
-                for (i = P256_NBYTES - 2; i >= 0; --i) {
-                    if (fscanf(f, " , %u", &byte) != 1) goto exit;
-                    y_bytes[i] = byte;
-                }
-                fscanf(f, " } } ");
-                p256_from_bin(x_bytes, &key->x);
-                p256_from_bin(y_bytes, &key->y);
-            } else {
-                LOGE("Unknown key type %d\n", cert->key_type);
-                goto exit;
-            }
-
-            // if the line ends in a comma, this file has more keys.
-            switch (fgetc(f)) {
-            case ',':
-                // more keys to come.
-                break;
-
-            case EOF:
-                done = true;
-                break;
-
-            default:
-                LOGE("unexpected character between keys\n");
-                goto exit;
-            }
-        }
-    }
-
-    fclose(f);
-    return out;
-
-exit:
-    if (f) fclose(f);
-    free(out);
-    *numKeys = 0;
-    return NULL;
-}
diff --git a/verifier24/verifier.h b/verifier24/verifier.h
deleted file mode 100644
index fe01e36..0000000
--- a/verifier24/verifier.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2008 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.
- */
-
-#ifndef _RECOVERY_VERIFIER_H
-#define _RECOVERY_VERIFIER_H
-
-#include "mincrypt/p256.h"
-#include "mincrypt/rsa.h"
-
-#define ASSUMED_UPDATE_BINARY_NAME  "META-INF/com/google/android/update-binary"
-
-enum { INSTALL_SUCCESS, INSTALL_ERROR, INSTALL_CORRUPT };
-
-static const float VERIFICATION_PROGRESS_FRAC = 0.25;
-
-typedef struct {
-    p256_int x;
-    p256_int y;
-} ECPublicKey;
-
-typedef struct {
-    typedef enum {
-        RSA,
-        EC,
-    } KeyType;
-
-    int hash_len;  // SHA_DIGEST_SIZE (SHA-1) or SHA256_DIGEST_SIZE (SHA-256)
-    KeyType key_type;
-    RSAPublicKey* rsa;
-    ECPublicKey* ec;
-} Certificate;
-
-/* addr and length define a an update package file that has been
- * loaded (or mmap'ed, or whatever) into memory.  Verify that the file
- * is signed and the signature matches one of the given keys.  Return
- * one of the constants below.
- */
-int verify_file(unsigned char* addr, size_t length);
-
-Certificate* load_keys(const char* filename, int* numKeys);
-
-#define VERIFY_SUCCESS        0
-#define VERIFY_FAILURE        1
-
-#endif  /* _RECOVERY_VERIFIER_H */