Merge "Remove references to non-existent directories"
diff --git a/apicheck.mk b/apicheck.mk
index df9af7c..ccf1d65 100644
--- a/apicheck.mk
+++ b/apicheck.mk
@@ -18,6 +18,7 @@
 # $(car_module) - name of the car library module
 # $(car_module_api_dir) - dir to store API files
 # $(car_module_include_systemapi) - if systemApi file should be generated
+# $(car_module_proguard_file) - where to output the proguard file, if empty no file will be produced
 # $(car_module_java_libraries) - dependent libraries
 # $(car_module_java_packages) - list of package names containing public classes
 # $(car_module_src_files) - list of source files
@@ -103,6 +104,42 @@
 
 #($(car_module_include_systemapi), true)
 endif
+
+
+ifneq ($(strip $(car_module_proguard_file)),)
+#
+# Generate a proguard files
+# ---------------------------------------------
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := $(car_module)-proguard
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(car_module_src_files)
+LOCAL_JAVA_LIBRARIES := $(car_module_java_libraries) $(car_module)
+LOCAL_ADDITIONAL_JAVA_DIR := \
+    $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(car_module),,COMMON)/src
+LOCAL_SDK_VERSION := $(CAR_CURRENT_SDK_VERSION)
+
+docs_proguard_intermediates_output := $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),,COMMON)/keep_list.proguard
+LOCAL_DROIDDOC_OPTIONS := -proguard $(docs_proguard_intermediates_output)
+
+include $(BUILD_DROIDDOC)
+
+update-car-api: PRIVATE_PROGUARD_INTERMEDIATES_OUTPUT := $(docs_proguard_intermediates_output)
+update-car-api: PRIVATE_PROGUARD_OUTPUT_FILE := $(car_module_proguard_file)
+update-car-api: PRIVATE_CAR_MODULE := $(car_module)
+update-car-api: $(car_module)-proguard-docs | $(ACP)
+	@echo $(PRIVATE_CAR_MODULE) copying $(PRIVATE_PROGUARD_INTERMEDIATES_OUTPUT) to $(PRIVATE_PROGUARD_OUTPUT_FILE)
+	$(hide) $(ACP) $(PRIVATE_PROGUARD_INTERMEDIATES_OUTPUT) $(PRIVATE_PROGUARD_OUTPUT_FILE)
+
+# cleanup vars
+docs_proguard_output :=
+# ($(strip $(car_module_proguard_file)),)
+endif
+
+
 #
 # Check public API
 # ---------------------------------------------
@@ -151,6 +188,7 @@
 update-$(car_module)-api: PRIVATE_API_DIR := $(car_module_api_dir)
 update-$(car_module)-api: PRIVATE_MODULE := $(car_module)
 update-$(car_module)-api: PRIVATE_REMOVED_API_FILE := $(car_module_removed_file)
+update-$(car_module)-api: PRIVATE_PROGUARD_FILE := $(car_module_proguard_file)
 update-$(car_module)-api: $(car_module_api_file) | $(ACP)
 	@echo Copying $(PRIVATE_MODULE) current.txt
 	$(hide) $(ACP) $< $(PRIVATE_API_DIR)/current.txt
@@ -210,6 +248,7 @@
 update-$(car_module)-system-api: PRIVATE_API_DIR := $(car_module_api_dir)
 update-$(car_module)-system-api: PRIVATE_MODULE := $(car_module)
 update-$(car_module)-system-api: PRIVATE_REMOVED_API_FILE := $(car_module_system_removed_file)
+update-$(car_module)-system-api: PRIVATE_PROGUARD_FILE := $(car_module_proguard_file)
 update-$(car_module)-system-api: $(car_module_system_api_file) | $(ACP)
 	@echo Copying $(PRIVATE_MODULE) system-current.txt
 	$(hide) $(ACP) $< $(PRIVATE_API_DIR)/system-current.txt
@@ -219,6 +258,8 @@
 # Run this update API task on the update-car-api task
 update-car-api: update-$(car_module)-system-api
 
+
+
 #($(car_module_include_systemapi), true)
 endif
 
@@ -242,3 +283,4 @@
 car_stub_stamp :=
 car_system_stub_stamp :=
 car_module_include_systemapi :=
+car_module_proguard_file :=
diff --git a/car-support-lib/Android.mk b/car-support-lib/Android.mk
index 3760ba4..9876b45 100644
--- a/car-support-lib/Android.mk
+++ b/car-support-lib/Android.mk
@@ -22,12 +22,9 @@
 #Build prebuilt android.support.car library
 include $(CLEAR_VARS)
 
-LOCAL_AAPT_FLAGS := --auto-add-overlay \
-    --extra-packages android.support.v7.appcompat \
-    --extra-packages android.support.v7.recyclerview \
-    --extra-packages android.support.v7.cardview
-
+LOCAL_AAPT_FLAGS := --auto-add-overlay
 LOCAL_MODULE := android.support.car-prebuilt
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
@@ -38,22 +35,24 @@
 LOCAL_MANIFEST_FILE := AndroidManifest.xml
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
-
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 \
-                               android-support-v7-appcompat \
-                               android-support-v7-recyclerview \
-                               android-support-v7-cardview \
-                               android-support-annotations
-
-LOCAL_JAVA_LIBRARIES += android.car
-# Specify 1.7 for backwards compatibility.  
+LOCAL_JAVA_LIBRARIES += android.car\
+						android-support-v4 \
+                        android-support-v7-appcompat \
+                        android-support-v7-recyclerview \
+                        android-support-v7-cardview \
+                        android-support-annotations
+# Specify 1.7 for backwards compatibility.
 # Otherwise the lib won't be usable on pre-N devices
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7 
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+
+LOCAL_PROGUARD_ENABLED := custom optimization obfuscation
+LOCAL_PROGUARD_FLAGS := -dontwarn
+LOCAL_PROGUARD_FLAG_FILES := proguard-release.flags proguard-extra-keeps.flags
 
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
 ifeq ($(BOARD_IS_AUTOMOTIVE), true)
-$(call dist-for-goals,dist_files,$(built_aar):android.support.car.aar)
+ $(call dist-for-goals,dist_files,$(built_aar):android.support.car.aar)
 endif
 
 # Build the resources.
@@ -102,11 +101,14 @@
 # ---------------------------------------------
 car_module := $(LOCAL_MODULE)
 car_module_src_files := $(LOCAL_SRC_FILES)
+car_module_proguard_file := $(LOCAL_PATH)/proguard-release.flags
 car_module_api_dir := $(LOCAL_PATH)/api
 car_module_java_libraries := $(LOCAL_JAVA_LIBRARIES) $(LOCAL_STATIC_JAVA_LIBRARIES) framework
 car_module_java_packages := android.support.car*
+car_module_include_proguard := true
 include $(CAR_API_CHECK)
 
+
 # Generate offline docs
 #---------------------------------------------
 include $(CLEAR_VARS)
diff --git a/car-support-lib/api/current.txt b/car-support-lib/api/current.txt
index deee527..6954760 100644
--- a/car-support-lib/api/current.txt
+++ b/car-support-lib/api/current.txt
@@ -94,14 +94,10 @@
 package android.support.car.hardware {
 
   public class CarSensorEvent {
-    method public android.support.car.hardware.CarSensorEvent.AccelerometerData getAccelerometerData();
     method public android.support.car.hardware.CarSensorEvent.CompassData getCompassData();
     method public android.support.car.hardware.CarSensorEvent.DrivingStatusData getDrivingStatusData();
-    method public android.support.car.hardware.CarSensorEvent.FuelLevelData getFuelLevelData();
-    method public android.support.car.hardware.CarSensorEvent.GyroscopeData getGyroscopeData();
     method public android.support.car.hardware.CarSensorEvent.NightData getNightData();
     method public android.support.car.hardware.CarSensorEvent.ParkingBrakeData getParkingBrakeData();
-    method public android.support.car.hardware.CarSensorEvent.RpmData getRpmData();
     field public static final int DRIVE_STATUS_FULLY_RESTRICTED = 31; // 0x1f
     field public static final int DRIVE_STATUS_LIMIT_MESSAGE_LEN = 16; // 0x10
     field public static final int DRIVE_STATUS_NO_CONFIG = 8; // 0x8
@@ -118,13 +114,6 @@
     field public final long timestamp;
   }
 
-  public static class CarSensorEvent.AccelerometerData {
-    field public final long timestamp;
-    field public final float x;
-    field public final float y;
-    field public final float z;
-  }
-
   public static class CarSensorEvent.CompassData {
     field public final float bearing;
     field public final float pitch;
@@ -143,20 +132,6 @@
     field public final long timestamp;
   }
 
-  public static class CarSensorEvent.FuelLevelData {
-    field public final int level;
-    field public final boolean lowFuelWarning;
-    field public final float range;
-    field public final long timestamp;
-  }
-
-  public static class CarSensorEvent.GyroscopeData {
-    field public final long timestamp;
-    field public final float x;
-    field public final float y;
-    field public final float z;
-  }
-
   public static class CarSensorEvent.NightData {
     field public final boolean isNightMode;
     field public final long timestamp;
@@ -167,11 +142,6 @@
     field public final long timestamp;
   }
 
-  public static class CarSensorEvent.RpmData {
-    field public final float rpm;
-    field public final long timestamp;
-  }
-
   public abstract class CarSensorManager {
     ctor public CarSensorManager();
     method public abstract boolean addListener(android.support.car.hardware.CarSensorManager.OnSensorChangedListener, int, int) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
diff --git a/car-support-lib/proguard-extra-keeps.flags b/car-support-lib/proguard-extra-keeps.flags
new file mode 100644
index 0000000..3d03655
--- /dev/null
+++ b/car-support-lib/proguard-extra-keeps.flags
@@ -0,0 +1,10 @@
+-keepattributes *Annotation*,InnerClasses,Exceptions
+
+-keep class android.support.car.CarServiceLoader {
+    public protected *;
+    class CarConnectionCallbackProxy;
+}
+
+-keep class android.support.car.CarServiceLoader$CarConnectionCallbackProxy {
+    *;
+}
diff --git a/car-support-lib/proguard-release.flags b/car-support-lib/proguard-release.flags
new file mode 100644
index 0000000..0014945
--- /dev/null
+++ b/car-support-lib/proguard-release.flags
@@ -0,0 +1,9934 @@
+-keep class android.accounts.Account {
+    <init>(java.lang.String, java.lang.String);
+    <init>(android.os.Parcel);
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public java.lang.String name;
+    public java.lang.String type;
+}
+
+-keep class android.app.PendingIntent {
+
+    public void cancel();
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int);
+    public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int, android.os.Bundle);
+    public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int);
+    public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle);
+    public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
+    public java.lang.String getCreatorPackage();
+    public int getCreatorUid();
+    public android.os.UserHandle getCreatorUserHandle();
+    public android.content.IntentSender getIntentSender();
+    public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
+    public java.lang.String getTargetPackage();
+    public int hashCode();
+    public static android.app.PendingIntent readPendingIntentOrNullFromParcel(android.os.Parcel);
+    public void send();
+    public void send(int);
+    public void send(android.content.Context, int, android.content.Intent);
+    public void send(int, android.app.PendingIntent$OnFinished, android.os.Handler);
+    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler);
+    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String);
+    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String, android.os.Bundle);
+    public java.lang.String toString();
+    public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_CANCEL_CURRENT;
+    public static int FLAG_IMMUTABLE;
+    public static int FLAG_NO_CREATE;
+    public static int FLAG_ONE_SHOT;
+    public static int FLAG_UPDATE_CURRENT;
+}
+
+-keep class android.app.PendingIntent$CanceledException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.Exception);
+
+
+
+}
+
+-keep class android.app.PendingIntent$OnFinished {
+
+    public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
+
+
+}
+
+-keep class android.content.BroadcastReceiver {
+    <init>();
+
+    public void abortBroadcast();
+    public void clearAbortBroadcast();
+    public boolean getAbortBroadcast();
+    public boolean getDebugUnregister();
+    public int getResultCode();
+    public java.lang.String getResultData();
+    public android.os.Bundle getResultExtras(boolean);
+    public android.content.BroadcastReceiver$PendingResult goAsync();
+    public boolean isInitialStickyBroadcast();
+    public boolean isOrderedBroadcast();
+    public abstract void onReceive(android.content.Context, android.content.Intent);
+    public android.os.IBinder peekService(android.content.Context, android.content.Intent);
+    public void setDebugUnregister(boolean);
+    public void setOrderedHint(boolean);
+    public void setResult(int, java.lang.String, android.os.Bundle);
+    public void setResultCode(int);
+    public void setResultData(java.lang.String);
+    public void setResultExtras(android.os.Bundle);
+
+
+}
+
+-keep class android.content.BroadcastReceiver$PendingResult {
+
+    public void abortBroadcast();
+    public void clearAbortBroadcast();
+    public void finish();
+    public boolean getAbortBroadcast();
+    public int getResultCode();
+    public java.lang.String getResultData();
+    public android.os.Bundle getResultExtras(boolean);
+    public void setResult(int, java.lang.String, android.os.Bundle);
+    public void setResultCode(int);
+    public void setResultData(java.lang.String);
+    public void setResultExtras(android.os.Bundle);
+
+
+}
+
+-keep class android.content.ClipData {
+    <init>(java.lang.CharSequence, java.lang.String[], android.content.ClipData$Item);
+    <init>(android.content.ClipDescription, android.content.ClipData$Item);
+    <init>(android.content.ClipData);
+
+    public void addItem(android.content.ClipData$Item);
+    public int describeContents();
+    public android.content.ClipDescription getDescription();
+    public android.content.ClipData$Item getItemAt(int);
+    public int getItemCount();
+    public static android.content.ClipData newHtmlText(java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
+    public static android.content.ClipData newIntent(java.lang.CharSequence, android.content.Intent);
+    public static android.content.ClipData newPlainText(java.lang.CharSequence, java.lang.CharSequence);
+    public static android.content.ClipData newRawUri(java.lang.CharSequence, android.net.Uri);
+    public static android.content.ClipData newUri(android.content.ContentResolver, java.lang.CharSequence, android.net.Uri);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.ClipData$Item {
+    <init>(java.lang.CharSequence);
+    <init>(java.lang.CharSequence, java.lang.String);
+    <init>(android.content.Intent);
+    <init>(android.net.Uri);
+    <init>(java.lang.CharSequence, android.content.Intent, android.net.Uri);
+    <init>(java.lang.CharSequence, java.lang.String, android.content.Intent, android.net.Uri);
+
+    public java.lang.String coerceToHtmlText(android.content.Context);
+    public java.lang.CharSequence coerceToStyledText(android.content.Context);
+    public java.lang.CharSequence coerceToText(android.content.Context);
+    public java.lang.String getHtmlText();
+    public android.content.Intent getIntent();
+    public java.lang.CharSequence getText();
+    public android.net.Uri getUri();
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.content.ClipDescription {
+    <init>(java.lang.CharSequence, java.lang.String[]);
+    <init>(android.content.ClipDescription);
+
+    public static boolean compareMimeTypes(java.lang.String, java.lang.String);
+    public int describeContents();
+    public java.lang.String[] filterMimeTypes(java.lang.String);
+    public java.lang.CharSequence getLabel();
+    public java.lang.String getMimeType(int);
+    public int getMimeTypeCount();
+    public boolean hasMimeType(java.lang.String);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static java.lang.String MIMETYPE_TEXT_HTML;
+    public static java.lang.String MIMETYPE_TEXT_INTENT;
+    public static java.lang.String MIMETYPE_TEXT_PLAIN;
+    public static java.lang.String MIMETYPE_TEXT_URILIST;
+}
+
+-keep class android.content.ComponentCallbacks {
+
+    public abstract void onConfigurationChanged(android.content.res.Configuration);
+    public abstract void onLowMemory();
+
+
+}
+
+-keep class android.content.ComponentName {
+    <init>(java.lang.String, java.lang.String);
+    <init>(android.content.Context, java.lang.String);
+    <init>(android.content.Context, java.lang.Class);
+    <init>(android.os.Parcel);
+
+    public android.content.ComponentName clone();
+    public java.lang.Object clone();
+    public int compareTo(android.content.ComponentName);
+    public int compareTo(java.lang.Object);
+    public static android.content.ComponentName createRelative(java.lang.String, java.lang.String);
+    public static android.content.ComponentName createRelative(android.content.Context, java.lang.String);
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public java.lang.String flattenToShortString();
+    public java.lang.String flattenToString();
+    public java.lang.String getClassName();
+    public java.lang.String getPackageName();
+    public java.lang.String getShortClassName();
+    public int hashCode();
+    public static android.content.ComponentName readFromParcel(android.os.Parcel);
+    public java.lang.String toShortString();
+    public java.lang.String toString();
+    public static android.content.ComponentName unflattenFromString(java.lang.String);
+    public void writeToParcel(android.os.Parcel, int);
+    public static void writeToParcel(android.content.ComponentName, android.os.Parcel);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.ContentProvider {
+    <init>();
+
+    public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
+    public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
+    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
+    public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
+    public android.net.Uri canonicalize(android.net.Uri);
+    public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    public java.lang.String getCallingPackage();
+    public android.content.Context getContext();
+    public android.content.pm.PathPermission[] getPathPermissions();
+    public java.lang.String getReadPermission();
+    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
+    public abstract java.lang.String getType(android.net.Uri);
+    public java.lang.String getWritePermission();
+    public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    protected boolean isTemporary();
+    public void onConfigurationChanged(android.content.res.Configuration);
+    public abstract boolean onCreate();
+    public void onLowMemory();
+    public void onTrimMemory(int);
+    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
+    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
+    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
+    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
+    protected android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String);
+    public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object, android.content.ContentProvider$PipeDataWriter);
+    public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
+    public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
+    public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
+    protected void setPathPermissions(android.content.pm.PathPermission[]);
+    protected void setReadPermission(java.lang.String);
+    protected void setWritePermission(java.lang.String);
+    public void shutdown();
+    public android.net.Uri uncanonicalize(android.net.Uri);
+    public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+
+
+}
+
+-keep class android.content.ContentProvider$PipeDataWriter {
+
+    public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object);
+
+
+}
+
+-keep class android.content.ContentProviderClient {
+
+    public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
+    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
+    public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
+    public android.net.Uri canonicalize(android.net.Uri);
+    public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    protected void finalize();
+    public android.content.ContentProvider getLocalContentProvider();
+    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
+    public java.lang.String getType(android.net.Uri);
+    public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
+    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
+    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
+    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
+    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
+    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
+    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
+    public boolean release();
+    public android.net.Uri uncanonicalize(android.net.Uri);
+    public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+
+
+}
+
+-keep class android.content.ContentProviderOperation {
+
+    public android.content.ContentProviderResult apply(android.content.ContentProvider, android.content.ContentProviderResult[], int);
+    public int describeContents();
+    public android.net.Uri getUri();
+    public boolean isAssertQuery();
+    public boolean isDelete();
+    public boolean isInsert();
+    public boolean isReadOperation();
+    public boolean isUpdate();
+    public boolean isWriteOperation();
+    public boolean isYieldAllowed();
+    public static android.content.ContentProviderOperation$Builder newAssertQuery(android.net.Uri);
+    public static android.content.ContentProviderOperation$Builder newDelete(android.net.Uri);
+    public static android.content.ContentProviderOperation$Builder newInsert(android.net.Uri);
+    public static android.content.ContentProviderOperation$Builder newUpdate(android.net.Uri);
+    public java.lang.String[] resolveSelectionArgsBackReferences(android.content.ContentProviderResult[], int);
+    public android.content.ContentValues resolveValueBackReferences(android.content.ContentProviderResult[], int);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.ContentProviderOperation$Builder {
+
+    public android.content.ContentProviderOperation build();
+    public android.content.ContentProviderOperation$Builder withExpectedCount(int);
+    public android.content.ContentProviderOperation$Builder withSelection(java.lang.String, java.lang.String[]);
+    public android.content.ContentProviderOperation$Builder withSelectionBackReference(int, int);
+    public android.content.ContentProviderOperation$Builder withValue(java.lang.String, java.lang.Object);
+    public android.content.ContentProviderOperation$Builder withValueBackReference(java.lang.String, int);
+    public android.content.ContentProviderOperation$Builder withValueBackReferences(android.content.ContentValues);
+    public android.content.ContentProviderOperation$Builder withValues(android.content.ContentValues);
+    public android.content.ContentProviderOperation$Builder withYieldAllowed(boolean);
+
+
+}
+
+-keep class android.content.ContentProviderResult {
+    <init>(android.net.Uri);
+    <init>(int);
+    <init>(android.os.Parcel);
+
+    public int describeContents();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public java.lang.Integer count;
+    public android.net.Uri uri;
+}
+
+-keep class android.content.ContentResolver {
+    <init>(android.content.Context);
+
+    public android.content.ContentProviderClient acquireContentProviderClient(android.net.Uri);
+    public android.content.ContentProviderClient acquireContentProviderClient(java.lang.String);
+    public android.content.ContentProviderClient acquireUnstableContentProviderClient(android.net.Uri);
+    public android.content.ContentProviderClient acquireUnstableContentProviderClient(java.lang.String);
+    public static void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
+    public static java.lang.Object addStatusChangeListener(int, android.content.SyncStatusObserver);
+    public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList);
+    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
+    public android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
+    public void cancelSync(android.net.Uri);
+    public static void cancelSync(android.accounts.Account, java.lang.String);
+    public static void cancelSync(android.content.SyncRequest);
+    public android.net.Uri canonicalize(android.net.Uri);
+    public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    public static android.content.SyncInfo getCurrentSync();
+    public static java.util.List getCurrentSyncs();
+    public static int getIsSyncable(android.accounts.Account, java.lang.String);
+    public static boolean getMasterSyncAutomatically();
+    public java.util.List getOutgoingPersistedUriPermissions();
+    public static java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String);
+    public java.util.List getPersistedUriPermissions();
+    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
+    public static android.content.SyncAdapterType[] getSyncAdapterTypes();
+    public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
+    public java.lang.String getType(android.net.Uri);
+    public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    public static boolean isSyncActive(android.accounts.Account, java.lang.String);
+    public static boolean isSyncPending(android.accounts.Account, java.lang.String);
+    public void notifyChange(android.net.Uri, android.database.ContentObserver);
+    public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
+    public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String);
+    public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
+    public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String);
+    public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
+    public java.io.InputStream openInputStream(android.net.Uri);
+    public java.io.OutputStream openOutputStream(android.net.Uri);
+    public java.io.OutputStream openOutputStream(android.net.Uri, java.lang.String);
+    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
+    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
+    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
+    public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
+    public void releasePersistableUriPermission(android.net.Uri, int);
+    public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
+    public static void removeStatusChangeListener(java.lang.Object);
+    public static void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
+    public static void requestSync(android.content.SyncRequest);
+    public static void setIsSyncable(android.accounts.Account, java.lang.String, int);
+    public static void setMasterSyncAutomatically(boolean);
+    public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
+    public void startSync(android.net.Uri, android.os.Bundle);
+    public void takePersistableUriPermission(android.net.Uri, int);
+    public android.net.Uri uncanonicalize(android.net.Uri);
+    public void unregisterContentObserver(android.database.ContentObserver);
+    public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+    public static void validateSyncExtrasBundle(android.os.Bundle);
+
+
+    public static java.lang.String ANY_CURSOR_ITEM_TYPE;
+    public static java.lang.String CURSOR_DIR_BASE_TYPE;
+    public static java.lang.String CURSOR_ITEM_BASE_TYPE;
+    public static java.lang.String EXTRA_SIZE;
+    public static java.lang.String SCHEME_ANDROID_RESOURCE;
+    public static java.lang.String SCHEME_CONTENT;
+    public static java.lang.String SCHEME_FILE;
+    public static java.lang.String SYNC_EXTRAS_ACCOUNT;
+    public static java.lang.String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS;
+    public static java.lang.String SYNC_EXTRAS_DO_NOT_RETRY;
+    public static java.lang.String SYNC_EXTRAS_EXPEDITED;
+    public static java.lang.String SYNC_EXTRAS_FORCE;
+    public static java.lang.String SYNC_EXTRAS_IGNORE_BACKOFF;
+    public static java.lang.String SYNC_EXTRAS_IGNORE_SETTINGS;
+    public static java.lang.String SYNC_EXTRAS_INITIALIZE;
+    public static java.lang.String SYNC_EXTRAS_MANUAL;
+    public static java.lang.String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS;
+    public static java.lang.String SYNC_EXTRAS_UPLOAD;
+    public static int SYNC_OBSERVER_TYPE_ACTIVE;
+    public static int SYNC_OBSERVER_TYPE_PENDING;
+    public static int SYNC_OBSERVER_TYPE_SETTINGS;
+}
+
+-keep class android.content.ContentValues {
+    <init>();
+    <init>(int);
+    <init>(android.content.ContentValues);
+
+    public void clear();
+    public boolean containsKey(java.lang.String);
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public java.lang.Object get(java.lang.String);
+    public java.lang.Boolean getAsBoolean(java.lang.String);
+    public java.lang.Byte getAsByte(java.lang.String);
+    public byte[] getAsByteArray(java.lang.String);
+    public java.lang.Double getAsDouble(java.lang.String);
+    public java.lang.Float getAsFloat(java.lang.String);
+    public java.lang.Integer getAsInteger(java.lang.String);
+    public java.lang.Long getAsLong(java.lang.String);
+    public java.lang.Short getAsShort(java.lang.String);
+    public java.lang.String getAsString(java.lang.String);
+    public int hashCode();
+    public java.util.Set keySet();
+    public void put(java.lang.String, java.lang.String);
+    public void put(java.lang.String, java.lang.Byte);
+    public void put(java.lang.String, java.lang.Short);
+    public void put(java.lang.String, java.lang.Integer);
+    public void put(java.lang.String, java.lang.Long);
+    public void put(java.lang.String, java.lang.Float);
+    public void put(java.lang.String, java.lang.Double);
+    public void put(java.lang.String, java.lang.Boolean);
+    public void put(java.lang.String, byte[]);
+    public void putAll(android.content.ContentValues);
+    public void putNull(java.lang.String);
+    public void remove(java.lang.String);
+    public int size();
+    public java.lang.String toString();
+    public java.util.Set valueSet();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static java.lang.String TAG;
+}
+
+-keep class android.content.Context {
+    <init>();
+
+    public abstract boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
+    public abstract int checkCallingOrSelfPermission(java.lang.String);
+    public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
+    public abstract int checkCallingPermission(java.lang.String);
+    public abstract int checkCallingUriPermission(android.net.Uri, int);
+    public abstract int checkPermission(java.lang.String, int, int);
+    public abstract int checkSelfPermission(java.lang.String);
+    public abstract int checkUriPermission(android.net.Uri, int, int, int);
+    public abstract int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
+    public abstract void clearWallpaper();
+    public abstract android.content.Context createConfigurationContext(android.content.res.Configuration);
+    public abstract android.content.Context createDisplayContext(android.view.Display);
+    public abstract android.content.Context createPackageContext(java.lang.String, int);
+    public abstract java.lang.String[] databaseList();
+    public abstract boolean deleteDatabase(java.lang.String);
+    public abstract boolean deleteFile(java.lang.String);
+    public abstract void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
+    public abstract void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
+    public abstract void enforceCallingPermission(java.lang.String, java.lang.String);
+    public abstract void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
+    public abstract void enforcePermission(java.lang.String, int, int, java.lang.String);
+    public abstract void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
+    public abstract void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
+    public abstract java.lang.String[] fileList();
+    public abstract android.content.Context getApplicationContext();
+    public abstract android.content.pm.ApplicationInfo getApplicationInfo();
+    public abstract android.content.res.AssetManager getAssets();
+    public abstract java.io.File getCacheDir();
+    public abstract java.lang.ClassLoader getClassLoader();
+    public abstract java.io.File getCodeCacheDir();
+    public int getColor(int);
+    public android.content.res.ColorStateList getColorStateList(int);
+    public abstract android.content.ContentResolver getContentResolver();
+    public abstract java.io.File getDatabasePath(java.lang.String);
+    public abstract java.io.File getDir(java.lang.String, int);
+    public android.graphics.drawable.Drawable getDrawable(int);
+    public abstract java.io.File getExternalCacheDir();
+    public abstract java.io.File[] getExternalCacheDirs();
+    public abstract java.io.File getExternalFilesDir(java.lang.String);
+    public abstract java.io.File[] getExternalFilesDirs(java.lang.String);
+    public abstract java.io.File[] getExternalMediaDirs();
+    public abstract java.io.File getFileStreamPath(java.lang.String);
+    public abstract java.io.File getFilesDir();
+    public abstract android.os.Looper getMainLooper();
+    public abstract java.io.File getNoBackupFilesDir();
+    public abstract java.io.File getObbDir();
+    public abstract java.io.File[] getObbDirs();
+    public abstract java.lang.String getPackageCodePath();
+    public abstract android.content.pm.PackageManager getPackageManager();
+    public abstract java.lang.String getPackageName();
+    public abstract java.lang.String getPackageResourcePath();
+    public abstract android.content.res.Resources getResources();
+    public abstract android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
+    public java.lang.String getString(int);
+    public java.lang.String getString(int, java.lang.Object[]);
+    public abstract java.lang.Object getSystemService(java.lang.String);
+    public java.lang.Object getSystemService(java.lang.Class);
+    public abstract java.lang.String getSystemServiceName(java.lang.Class);
+    public java.lang.CharSequence getText(int);
+    public abstract android.content.res.Resources$Theme getTheme();
+    public abstract android.graphics.drawable.Drawable getWallpaper();
+    public abstract int getWallpaperDesiredMinimumHeight();
+    public abstract int getWallpaperDesiredMinimumWidth();
+    public abstract void grantUriPermission(java.lang.String, android.net.Uri, int);
+    public boolean isRestricted();
+    public android.content.res.TypedArray obtainStyledAttributes(int[]);
+    public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
+    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[]);
+    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
+    public abstract java.io.FileInputStream openFileInput(java.lang.String);
+    public abstract java.io.FileOutputStream openFileOutput(java.lang.String, int);
+    public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
+    public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
+    public abstract android.graphics.drawable.Drawable peekWallpaper();
+    public void registerComponentCallbacks(android.content.ComponentCallbacks);
+    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+    public abstract void removeStickyBroadcast(android.content.Intent);
+    public abstract void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+    public abstract void revokeUriPermission(android.net.Uri, int);
+    public abstract void sendBroadcast(android.content.Intent);
+    public abstract void sendBroadcast(android.content.Intent, java.lang.String);
+    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
+    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String);
+    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+    public abstract void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+    public abstract void sendStickyBroadcast(android.content.Intent);
+    public abstract void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+    public abstract void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+    public abstract void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+    public abstract void setTheme(int);
+    public abstract void setWallpaper(android.graphics.Bitmap);
+    public abstract void setWallpaper(java.io.InputStream);
+    public abstract void startActivities(android.content.Intent[]);
+    public abstract void startActivities(android.content.Intent[], android.os.Bundle);
+    public abstract void startActivity(android.content.Intent);
+    public abstract void startActivity(android.content.Intent, android.os.Bundle);
+    public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
+    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
+    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
+    public abstract android.content.ComponentName startService(android.content.Intent);
+    public abstract boolean stopService(android.content.Intent);
+    public abstract void unbindService(android.content.ServiceConnection);
+    public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
+    public abstract void unregisterReceiver(android.content.BroadcastReceiver);
+
+
+    public static java.lang.String ACCESSIBILITY_SERVICE;
+    public static java.lang.String ACCOUNT_SERVICE;
+    public static java.lang.String ACTIVITY_SERVICE;
+    public static java.lang.String ALARM_SERVICE;
+    public static java.lang.String APPWIDGET_SERVICE;
+    public static java.lang.String APP_OPS_SERVICE;
+    public static java.lang.String AUDIO_SERVICE;
+    public static java.lang.String BATTERY_SERVICE;
+    public static int BIND_ABOVE_CLIENT;
+    public static int BIND_ADJUST_WITH_ACTIVITY;
+    public static int BIND_ALLOW_OOM_MANAGEMENT;
+    public static int BIND_AUTO_CREATE;
+    public static int BIND_DEBUG_UNBIND;
+    public static int BIND_IMPORTANT;
+    public static int BIND_NOT_FOREGROUND;
+    public static int BIND_WAIVE_PRIORITY;
+    public static java.lang.String BLUETOOTH_SERVICE;
+    public static java.lang.String CAMERA_SERVICE;
+    public static java.lang.String CAPTIONING_SERVICE;
+    public static java.lang.String CARRIER_CONFIG_SERVICE;
+    public static java.lang.String CLIPBOARD_SERVICE;
+    public static java.lang.String CONNECTIVITY_SERVICE;
+    public static java.lang.String CONSUMER_IR_SERVICE;
+    public static int CONTEXT_IGNORE_SECURITY;
+    public static int CONTEXT_INCLUDE_CODE;
+    public static int CONTEXT_RESTRICTED;
+    public static java.lang.String DEVICE_POLICY_SERVICE;
+    public static java.lang.String DISPLAY_SERVICE;
+    public static java.lang.String DOWNLOAD_SERVICE;
+    public static java.lang.String DROPBOX_SERVICE;
+    public static java.lang.String FINGERPRINT_SERVICE;
+    public static java.lang.String INPUT_METHOD_SERVICE;
+    public static java.lang.String INPUT_SERVICE;
+    public static java.lang.String JOB_SCHEDULER_SERVICE;
+    public static java.lang.String KEYGUARD_SERVICE;
+    public static java.lang.String LAUNCHER_APPS_SERVICE;
+    public static java.lang.String LAYOUT_INFLATER_SERVICE;
+    public static java.lang.String LOCATION_SERVICE;
+    public static java.lang.String MEDIA_PROJECTION_SERVICE;
+    public static java.lang.String MEDIA_ROUTER_SERVICE;
+    public static java.lang.String MEDIA_SESSION_SERVICE;
+    public static java.lang.String MIDI_SERVICE;
+    public static int MODE_APPEND;
+    public static int MODE_ENABLE_WRITE_AHEAD_LOGGING;
+    public static int MODE_MULTI_PROCESS;
+    public static int MODE_PRIVATE;
+    public static int MODE_WORLD_READABLE;
+    public static int MODE_WORLD_WRITEABLE;
+    public static java.lang.String NETWORK_STATS_SERVICE;
+    public static java.lang.String NFC_SERVICE;
+    public static java.lang.String NOTIFICATION_SERVICE;
+    public static java.lang.String NSD_SERVICE;
+    public static java.lang.String POWER_SERVICE;
+    public static java.lang.String PRINT_SERVICE;
+    public static java.lang.String RESTRICTIONS_SERVICE;
+    public static java.lang.String SEARCH_SERVICE;
+    public static java.lang.String SENSOR_SERVICE;
+    public static java.lang.String STORAGE_SERVICE;
+    public static java.lang.String TELECOM_SERVICE;
+    public static java.lang.String TELEPHONY_SERVICE;
+    public static java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE;
+    public static java.lang.String TEXT_SERVICES_MANAGER_SERVICE;
+    public static java.lang.String TV_INPUT_SERVICE;
+    public static java.lang.String UI_MODE_SERVICE;
+    public static java.lang.String USAGE_STATS_SERVICE;
+    public static java.lang.String USB_SERVICE;
+    public static java.lang.String USER_SERVICE;
+    public static java.lang.String VIBRATOR_SERVICE;
+    public static java.lang.String WALLPAPER_SERVICE;
+    public static java.lang.String WIFI_P2P_SERVICE;
+    public static java.lang.String WIFI_SERVICE;
+    public static java.lang.String WINDOW_SERVICE;
+}
+
+-keep class android.content.Intent {
+    <init>();
+    <init>(android.content.Intent);
+    <init>(java.lang.String);
+    <init>(java.lang.String, android.net.Uri);
+    <init>(android.content.Context, java.lang.Class);
+    <init>(java.lang.String, android.net.Uri, android.content.Context, java.lang.Class);
+
+    public android.content.Intent addCategory(java.lang.String);
+    public android.content.Intent addFlags(int);
+    public java.lang.Object clone();
+    public android.content.Intent cloneFilter();
+    public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence);
+    public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence, android.content.IntentSender);
+    public int describeContents();
+    public int fillIn(android.content.Intent, int);
+    public boolean filterEquals(android.content.Intent);
+    public int filterHashCode();
+    public java.lang.String getAction();
+    public boolean[] getBooleanArrayExtra(java.lang.String);
+    public boolean getBooleanExtra(java.lang.String, boolean);
+    public android.os.Bundle getBundleExtra(java.lang.String);
+    public byte[] getByteArrayExtra(java.lang.String);
+    public byte getByteExtra(java.lang.String, byte);
+    public java.util.Set getCategories();
+    public char[] getCharArrayExtra(java.lang.String);
+    public char getCharExtra(java.lang.String, char);
+    public java.lang.CharSequence[] getCharSequenceArrayExtra(java.lang.String);
+    public java.util.ArrayList getCharSequenceArrayListExtra(java.lang.String);
+    public java.lang.CharSequence getCharSequenceExtra(java.lang.String);
+    public android.content.ClipData getClipData();
+    public android.content.ComponentName getComponent();
+    public android.net.Uri getData();
+    public java.lang.String getDataString();
+    public double[] getDoubleArrayExtra(java.lang.String);
+    public double getDoubleExtra(java.lang.String, double);
+    public android.os.Bundle getExtras();
+    public int getFlags();
+    public float[] getFloatArrayExtra(java.lang.String);
+    public float getFloatExtra(java.lang.String, float);
+    public int[] getIntArrayExtra(java.lang.String);
+    public int getIntExtra(java.lang.String, int);
+    public java.util.ArrayList getIntegerArrayListExtra(java.lang.String);
+    public static android.content.Intent getIntent(java.lang.String);
+    public static android.content.Intent getIntentOld(java.lang.String);
+    public long[] getLongArrayExtra(java.lang.String);
+    public long getLongExtra(java.lang.String, long);
+    public java.lang.String getPackage();
+    public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
+    public java.util.ArrayList getParcelableArrayListExtra(java.lang.String);
+    public android.os.Parcelable getParcelableExtra(java.lang.String);
+    public java.lang.String getScheme();
+    public android.content.Intent getSelector();
+    public java.io.Serializable getSerializableExtra(java.lang.String);
+    public short[] getShortArrayExtra(java.lang.String);
+    public short getShortExtra(java.lang.String, short);
+    public android.graphics.Rect getSourceBounds();
+    public java.lang.String[] getStringArrayExtra(java.lang.String);
+    public java.util.ArrayList getStringArrayListExtra(java.lang.String);
+    public java.lang.String getStringExtra(java.lang.String);
+    public java.lang.String getType();
+    public boolean hasCategory(java.lang.String);
+    public boolean hasExtra(java.lang.String);
+    public boolean hasFileDescriptors();
+    public static android.content.Intent makeMainActivity(android.content.ComponentName);
+    public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
+    public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
+    public static java.lang.String normalizeMimeType(java.lang.String);
+    public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
+    public static android.content.Intent parseUri(java.lang.String, int);
+    public android.content.Intent putCharSequenceArrayListExtra(java.lang.String, java.util.ArrayList);
+    public android.content.Intent putExtra(java.lang.String, boolean);
+    public android.content.Intent putExtra(java.lang.String, byte);
+    public android.content.Intent putExtra(java.lang.String, char);
+    public android.content.Intent putExtra(java.lang.String, short);
+    public android.content.Intent putExtra(java.lang.String, int);
+    public android.content.Intent putExtra(java.lang.String, long);
+    public android.content.Intent putExtra(java.lang.String, float);
+    public android.content.Intent putExtra(java.lang.String, double);
+    public android.content.Intent putExtra(java.lang.String, java.lang.String);
+    public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence);
+    public android.content.Intent putExtra(java.lang.String, android.os.Parcelable);
+    public android.content.Intent putExtra(java.lang.String, android.os.Parcelable[]);
+    public android.content.Intent putExtra(java.lang.String, java.io.Serializable);
+    public android.content.Intent putExtra(java.lang.String, boolean[]);
+    public android.content.Intent putExtra(java.lang.String, byte[]);
+    public android.content.Intent putExtra(java.lang.String, short[]);
+    public android.content.Intent putExtra(java.lang.String, char[]);
+    public android.content.Intent putExtra(java.lang.String, int[]);
+    public android.content.Intent putExtra(java.lang.String, long[]);
+    public android.content.Intent putExtra(java.lang.String, float[]);
+    public android.content.Intent putExtra(java.lang.String, double[]);
+    public android.content.Intent putExtra(java.lang.String, java.lang.String[]);
+    public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence[]);
+    public android.content.Intent putExtra(java.lang.String, android.os.Bundle);
+    public android.content.Intent putExtras(android.content.Intent);
+    public android.content.Intent putExtras(android.os.Bundle);
+    public android.content.Intent putIntegerArrayListExtra(java.lang.String, java.util.ArrayList);
+    public android.content.Intent putParcelableArrayListExtra(java.lang.String, java.util.ArrayList);
+    public android.content.Intent putStringArrayListExtra(java.lang.String, java.util.ArrayList);
+    public void readFromParcel(android.os.Parcel);
+    public void removeCategory(java.lang.String);
+    public void removeExtra(java.lang.String);
+    public android.content.Intent replaceExtras(android.content.Intent);
+    public android.content.Intent replaceExtras(android.os.Bundle);
+    public android.content.ComponentName resolveActivity(android.content.pm.PackageManager);
+    public android.content.pm.ActivityInfo resolveActivityInfo(android.content.pm.PackageManager, int);
+    public java.lang.String resolveType(android.content.Context);
+    public java.lang.String resolveType(android.content.ContentResolver);
+    public java.lang.String resolveTypeIfNeeded(android.content.ContentResolver);
+    public android.content.Intent setAction(java.lang.String);
+    public android.content.Intent setClass(android.content.Context, java.lang.Class);
+    public android.content.Intent setClassName(android.content.Context, java.lang.String);
+    public android.content.Intent setClassName(java.lang.String, java.lang.String);
+    public void setClipData(android.content.ClipData);
+    public android.content.Intent setComponent(android.content.ComponentName);
+    public android.content.Intent setData(android.net.Uri);
+    public android.content.Intent setDataAndNormalize(android.net.Uri);
+    public android.content.Intent setDataAndType(android.net.Uri, java.lang.String);
+    public android.content.Intent setDataAndTypeAndNormalize(android.net.Uri, java.lang.String);
+    public void setExtrasClassLoader(java.lang.ClassLoader);
+    public android.content.Intent setFlags(int);
+    public android.content.Intent setPackage(java.lang.String);
+    public void setSelector(android.content.Intent);
+    public void setSourceBounds(android.graphics.Rect);
+    public android.content.Intent setType(java.lang.String);
+    public android.content.Intent setTypeAndNormalize(java.lang.String);
+    public java.lang.String toString();
+    public java.lang.String toURI();
+    public java.lang.String toUri(int);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static java.lang.String ACTION_AIRPLANE_MODE_CHANGED;
+    public static java.lang.String ACTION_ALL_APPS;
+    public static java.lang.String ACTION_ANSWER;
+    public static java.lang.String ACTION_APPLICATION_RESTRICTIONS_CHANGED;
+    public static java.lang.String ACTION_APP_ERROR;
+    public static java.lang.String ACTION_ASSIST;
+    public static java.lang.String ACTION_ATTACH_DATA;
+    public static java.lang.String ACTION_BATTERY_CHANGED;
+    public static java.lang.String ACTION_BATTERY_LOW;
+    public static java.lang.String ACTION_BATTERY_OKAY;
+    public static java.lang.String ACTION_BOOT_COMPLETED;
+    public static java.lang.String ACTION_BUG_REPORT;
+    public static java.lang.String ACTION_CALL;
+    public static java.lang.String ACTION_CALL_BUTTON;
+    public static java.lang.String ACTION_CAMERA_BUTTON;
+    public static java.lang.String ACTION_CHOOSER;
+    public static java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS;
+    public static java.lang.String ACTION_CONFIGURATION_CHANGED;
+    public static java.lang.String ACTION_CREATE_DOCUMENT;
+    public static java.lang.String ACTION_CREATE_SHORTCUT;
+    public static java.lang.String ACTION_DATE_CHANGED;
+    public static java.lang.String ACTION_DEFAULT;
+    public static java.lang.String ACTION_DELETE;
+    public static java.lang.String ACTION_DEVICE_STORAGE_LOW;
+    public static java.lang.String ACTION_DEVICE_STORAGE_OK;
+    public static java.lang.String ACTION_DIAL;
+    public static java.lang.String ACTION_DOCK_EVENT;
+    public static java.lang.String ACTION_DREAMING_STARTED;
+    public static java.lang.String ACTION_DREAMING_STOPPED;
+    public static java.lang.String ACTION_EDIT;
+    public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
+    public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
+    public static java.lang.String ACTION_FACTORY_TEST;
+    public static java.lang.String ACTION_GET_CONTENT;
+    public static java.lang.String ACTION_GET_RESTRICTION_ENTRIES;
+    public static java.lang.String ACTION_GTALK_SERVICE_CONNECTED;
+    public static java.lang.String ACTION_GTALK_SERVICE_DISCONNECTED;
+    public static java.lang.String ACTION_HEADSET_PLUG;
+    public static java.lang.String ACTION_INPUT_METHOD_CHANGED;
+    public static java.lang.String ACTION_INSERT;
+    public static java.lang.String ACTION_INSERT_OR_EDIT;
+    public static java.lang.String ACTION_INSTALL_PACKAGE;
+    public static java.lang.String ACTION_LOCALE_CHANGED;
+    public static java.lang.String ACTION_MAIN;
+    public static java.lang.String ACTION_MANAGED_PROFILE_ADDED;
+    public static java.lang.String ACTION_MANAGED_PROFILE_REMOVED;
+    public static java.lang.String ACTION_MANAGE_NETWORK_USAGE;
+    public static java.lang.String ACTION_MANAGE_PACKAGE_STORAGE;
+    public static java.lang.String ACTION_MEDIA_BAD_REMOVAL;
+    public static java.lang.String ACTION_MEDIA_BUTTON;
+    public static java.lang.String ACTION_MEDIA_CHECKING;
+    public static java.lang.String ACTION_MEDIA_EJECT;
+    public static java.lang.String ACTION_MEDIA_MOUNTED;
+    public static java.lang.String ACTION_MEDIA_NOFS;
+    public static java.lang.String ACTION_MEDIA_REMOVED;
+    public static java.lang.String ACTION_MEDIA_SCANNER_FINISHED;
+    public static java.lang.String ACTION_MEDIA_SCANNER_SCAN_FILE;
+    public static java.lang.String ACTION_MEDIA_SCANNER_STARTED;
+    public static java.lang.String ACTION_MEDIA_SHARED;
+    public static java.lang.String ACTION_MEDIA_UNMOUNTABLE;
+    public static java.lang.String ACTION_MEDIA_UNMOUNTED;
+    public static java.lang.String ACTION_MY_PACKAGE_REPLACED;
+    public static java.lang.String ACTION_NEW_OUTGOING_CALL;
+    public static java.lang.String ACTION_OPEN_DOCUMENT;
+    public static java.lang.String ACTION_OPEN_DOCUMENT_TREE;
+    public static java.lang.String ACTION_PACKAGE_ADDED;
+    public static java.lang.String ACTION_PACKAGE_CHANGED;
+    public static java.lang.String ACTION_PACKAGE_DATA_CLEARED;
+    public static java.lang.String ACTION_PACKAGE_FIRST_LAUNCH;
+    public static java.lang.String ACTION_PACKAGE_FULLY_REMOVED;
+    public static java.lang.String ACTION_PACKAGE_INSTALL;
+    public static java.lang.String ACTION_PACKAGE_NEEDS_VERIFICATION;
+    public static java.lang.String ACTION_PACKAGE_REMOVED;
+    public static java.lang.String ACTION_PACKAGE_REPLACED;
+    public static java.lang.String ACTION_PACKAGE_RESTARTED;
+    public static java.lang.String ACTION_PACKAGE_VERIFIED;
+    public static java.lang.String ACTION_PASTE;
+    public static java.lang.String ACTION_PICK;
+    public static java.lang.String ACTION_PICK_ACTIVITY;
+    public static java.lang.String ACTION_POWER_CONNECTED;
+    public static java.lang.String ACTION_POWER_DISCONNECTED;
+    public static java.lang.String ACTION_POWER_USAGE_SUMMARY;
+    public static java.lang.String ACTION_PROCESS_TEXT;
+    public static java.lang.String ACTION_PROVIDER_CHANGED;
+    public static java.lang.String ACTION_QUICK_CLOCK;
+    public static java.lang.String ACTION_REBOOT;
+    public static java.lang.String ACTION_RUN;
+    public static java.lang.String ACTION_SCREEN_OFF;
+    public static java.lang.String ACTION_SCREEN_ON;
+    public static java.lang.String ACTION_SEARCH;
+    public static java.lang.String ACTION_SEARCH_LONG_PRESS;
+    public static java.lang.String ACTION_SEND;
+    public static java.lang.String ACTION_SENDTO;
+    public static java.lang.String ACTION_SEND_MULTIPLE;
+    public static java.lang.String ACTION_SET_WALLPAPER;
+    public static java.lang.String ACTION_SHUTDOWN;
+    public static java.lang.String ACTION_SYNC;
+    public static java.lang.String ACTION_SYSTEM_TUTORIAL;
+    public static java.lang.String ACTION_TIMEZONE_CHANGED;
+    public static java.lang.String ACTION_TIME_CHANGED;
+    public static java.lang.String ACTION_TIME_TICK;
+    public static java.lang.String ACTION_UID_REMOVED;
+    public static java.lang.String ACTION_UMS_CONNECTED;
+    public static java.lang.String ACTION_UMS_DISCONNECTED;
+    public static java.lang.String ACTION_UNINSTALL_PACKAGE;
+    public static java.lang.String ACTION_USER_BACKGROUND;
+    public static java.lang.String ACTION_USER_FOREGROUND;
+    public static java.lang.String ACTION_USER_INITIALIZE;
+    public static java.lang.String ACTION_USER_PRESENT;
+    public static java.lang.String ACTION_VIEW;
+    public static java.lang.String ACTION_VOICE_COMMAND;
+    public static java.lang.String ACTION_WALLPAPER_CHANGED;
+    public static java.lang.String ACTION_WEB_SEARCH;
+    public static java.lang.String CATEGORY_ALTERNATIVE;
+    public static java.lang.String CATEGORY_APP_BROWSER;
+    public static java.lang.String CATEGORY_APP_CALCULATOR;
+    public static java.lang.String CATEGORY_APP_CALENDAR;
+    public static java.lang.String CATEGORY_APP_CONTACTS;
+    public static java.lang.String CATEGORY_APP_EMAIL;
+    public static java.lang.String CATEGORY_APP_GALLERY;
+    public static java.lang.String CATEGORY_APP_MAPS;
+    public static java.lang.String CATEGORY_APP_MARKET;
+    public static java.lang.String CATEGORY_APP_MESSAGING;
+    public static java.lang.String CATEGORY_APP_MUSIC;
+    public static java.lang.String CATEGORY_BROWSABLE;
+    public static java.lang.String CATEGORY_CAR_DOCK;
+    public static java.lang.String CATEGORY_CAR_MODE;
+    public static java.lang.String CATEGORY_DEFAULT;
+    public static java.lang.String CATEGORY_DESK_DOCK;
+    public static java.lang.String CATEGORY_DEVELOPMENT_PREFERENCE;
+    public static java.lang.String CATEGORY_EMBED;
+    public static java.lang.String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST;
+    public static java.lang.String CATEGORY_HE_DESK_DOCK;
+    public static java.lang.String CATEGORY_HOME;
+    public static java.lang.String CATEGORY_INFO;
+    public static java.lang.String CATEGORY_LAUNCHER;
+    public static java.lang.String CATEGORY_LEANBACK_LAUNCHER;
+    public static java.lang.String CATEGORY_LE_DESK_DOCK;
+    public static java.lang.String CATEGORY_MONKEY;
+    public static java.lang.String CATEGORY_OPENABLE;
+    public static java.lang.String CATEGORY_PREFERENCE;
+    public static java.lang.String CATEGORY_SAMPLE_CODE;
+    public static java.lang.String CATEGORY_SELECTED_ALTERNATIVE;
+    public static java.lang.String CATEGORY_TAB;
+    public static java.lang.String CATEGORY_TEST;
+    public static java.lang.String CATEGORY_UNIT_TEST;
+    public static java.lang.String CATEGORY_VOICE;
+    public static android.os.Parcelable$Creator CREATOR;
+    public static java.lang.String EXTRA_ALARM_COUNT;
+    public static java.lang.String EXTRA_ALLOW_MULTIPLE;
+    public static java.lang.String EXTRA_ALLOW_REPLACE;
+    public static java.lang.String EXTRA_ALTERNATE_INTENTS;
+    public static java.lang.String EXTRA_ASSIST_CONTEXT;
+    public static java.lang.String EXTRA_ASSIST_INPUT_DEVICE_ID;
+    public static java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD;
+    public static java.lang.String EXTRA_ASSIST_PACKAGE;
+    public static java.lang.String EXTRA_ASSIST_UID;
+    public static java.lang.String EXTRA_BCC;
+    public static java.lang.String EXTRA_BUG_REPORT;
+    public static java.lang.String EXTRA_CC;
+    public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME;
+    public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME_LIST;
+    public static java.lang.String EXTRA_CHANGED_PACKAGE_LIST;
+    public static java.lang.String EXTRA_CHANGED_UID_LIST;
+    public static java.lang.String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER;
+    public static java.lang.String EXTRA_CHOSEN_COMPONENT;
+    public static java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER;
+    public static java.lang.String EXTRA_DATA_REMOVED;
+    public static java.lang.String EXTRA_DOCK_STATE;
+    public static int EXTRA_DOCK_STATE_CAR;
+    public static int EXTRA_DOCK_STATE_DESK;
+    public static int EXTRA_DOCK_STATE_HE_DESK;
+    public static int EXTRA_DOCK_STATE_LE_DESK;
+    public static int EXTRA_DOCK_STATE_UNDOCKED;
+    public static java.lang.String EXTRA_DONT_KILL_APP;
+    public static java.lang.String EXTRA_EMAIL;
+    public static java.lang.String EXTRA_HTML_TEXT;
+    public static java.lang.String EXTRA_INITIAL_INTENTS;
+    public static java.lang.String EXTRA_INSTALLER_PACKAGE_NAME;
+    public static java.lang.String EXTRA_INTENT;
+    public static java.lang.String EXTRA_KEY_EVENT;
+    public static java.lang.String EXTRA_LOCAL_ONLY;
+    public static java.lang.String EXTRA_MIME_TYPES;
+    public static java.lang.String EXTRA_NOT_UNKNOWN_SOURCE;
+    public static java.lang.String EXTRA_ORIGINATING_URI;
+    public static java.lang.String EXTRA_PHONE_NUMBER;
+    public static java.lang.String EXTRA_PROCESS_TEXT;
+    public static java.lang.String EXTRA_PROCESS_TEXT_READONLY;
+    public static java.lang.String EXTRA_REFERRER;
+    public static java.lang.String EXTRA_REFERRER_NAME;
+    public static java.lang.String EXTRA_REMOTE_INTENT_TOKEN;
+    public static java.lang.String EXTRA_REPLACEMENT_EXTRAS;
+    public static java.lang.String EXTRA_REPLACING;
+    public static java.lang.String EXTRA_RESTRICTIONS_BUNDLE;
+    public static java.lang.String EXTRA_RESTRICTIONS_INTENT;
+    public static java.lang.String EXTRA_RESTRICTIONS_LIST;
+    public static java.lang.String EXTRA_RESULT_RECEIVER;
+    public static java.lang.String EXTRA_RETURN_RESULT;
+    public static java.lang.String EXTRA_SHORTCUT_ICON;
+    public static java.lang.String EXTRA_SHORTCUT_ICON_RESOURCE;
+    public static java.lang.String EXTRA_SHORTCUT_INTENT;
+    public static java.lang.String EXTRA_SHORTCUT_NAME;
+    public static java.lang.String EXTRA_SHUTDOWN_USERSPACE_ONLY;
+    public static java.lang.String EXTRA_STREAM;
+    public static java.lang.String EXTRA_SUBJECT;
+    public static java.lang.String EXTRA_TEMPLATE;
+    public static java.lang.String EXTRA_TEXT;
+    public static java.lang.String EXTRA_TITLE;
+    public static java.lang.String EXTRA_UID;
+    public static java.lang.String EXTRA_USER;
+    public static int FILL_IN_ACTION;
+    public static int FILL_IN_CATEGORIES;
+    public static int FILL_IN_CLIP_DATA;
+    public static int FILL_IN_COMPONENT;
+    public static int FILL_IN_DATA;
+    public static int FILL_IN_PACKAGE;
+    public static int FILL_IN_SELECTOR;
+    public static int FILL_IN_SOURCE_BOUNDS;
+    public static int FLAG_ACTIVITY_BROUGHT_TO_FRONT;
+    public static int FLAG_ACTIVITY_CLEAR_TASK;
+    public static int FLAG_ACTIVITY_CLEAR_TOP;
+    public static int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
+    public static int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+    public static int FLAG_ACTIVITY_FORWARD_RESULT;
+    public static int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;
+    public static int FLAG_ACTIVITY_MULTIPLE_TASK;
+    public static int FLAG_ACTIVITY_NEW_DOCUMENT;
+    public static int FLAG_ACTIVITY_NEW_TASK;
+    public static int FLAG_ACTIVITY_NO_ANIMATION;
+    public static int FLAG_ACTIVITY_NO_HISTORY;
+    public static int FLAG_ACTIVITY_NO_USER_ACTION;
+    public static int FLAG_ACTIVITY_PREVIOUS_IS_TOP;
+    public static int FLAG_ACTIVITY_REORDER_TO_FRONT;
+    public static int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
+    public static int FLAG_ACTIVITY_RETAIN_IN_RECENTS;
+    public static int FLAG_ACTIVITY_SINGLE_TOP;
+    public static int FLAG_ACTIVITY_TASK_ON_HOME;
+    public static int FLAG_DEBUG_LOG_RESOLUTION;
+    public static int FLAG_EXCLUDE_STOPPED_PACKAGES;
+    public static int FLAG_FROM_BACKGROUND;
+    public static int FLAG_GRANT_PERSISTABLE_URI_PERMISSION;
+    public static int FLAG_GRANT_PREFIX_URI_PERMISSION;
+    public static int FLAG_GRANT_READ_URI_PERMISSION;
+    public static int FLAG_GRANT_WRITE_URI_PERMISSION;
+    public static int FLAG_INCLUDE_STOPPED_PACKAGES;
+    public static int FLAG_RECEIVER_FOREGROUND;
+    public static int FLAG_RECEIVER_NO_ABORT;
+    public static int FLAG_RECEIVER_REGISTERED_ONLY;
+    public static int FLAG_RECEIVER_REPLACE_PENDING;
+    public static java.lang.String METADATA_DOCK_HOME;
+    public static int URI_ALLOW_UNSAFE;
+    public static int URI_ANDROID_APP_SCHEME;
+    public static int URI_INTENT_SCHEME;
+}
+
+-keep class android.content.IntentFilter {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.String);
+    <init>(android.content.IntentFilter);
+
+    public java.util.Iterator actionsIterator();
+    public void addAction(java.lang.String);
+    public void addCategory(java.lang.String);
+    public void addDataAuthority(java.lang.String, java.lang.String);
+    public void addDataPath(java.lang.String, int);
+    public void addDataScheme(java.lang.String);
+    public void addDataSchemeSpecificPart(java.lang.String, int);
+    public void addDataType(java.lang.String);
+    public java.util.Iterator authoritiesIterator();
+    public java.util.Iterator categoriesIterator();
+    public int countActions();
+    public int countCategories();
+    public int countDataAuthorities();
+    public int countDataPaths();
+    public int countDataSchemeSpecificParts();
+    public int countDataSchemes();
+    public int countDataTypes();
+    public static android.content.IntentFilter create(java.lang.String, java.lang.String);
+    public int describeContents();
+    public void dump(android.util.Printer, java.lang.String);
+    public java.lang.String getAction(int);
+    public java.lang.String getCategory(int);
+    public android.content.IntentFilter$AuthorityEntry getDataAuthority(int);
+    public android.os.PatternMatcher getDataPath(int);
+    public java.lang.String getDataScheme(int);
+    public android.os.PatternMatcher getDataSchemeSpecificPart(int);
+    public java.lang.String getDataType(int);
+    public int getPriority();
+    public boolean hasAction(java.lang.String);
+    public boolean hasCategory(java.lang.String);
+    public boolean hasDataAuthority(android.net.Uri);
+    public boolean hasDataPath(java.lang.String);
+    public boolean hasDataScheme(java.lang.String);
+    public boolean hasDataSchemeSpecificPart(java.lang.String);
+    public boolean hasDataType(java.lang.String);
+    public int match(android.content.ContentResolver, android.content.Intent, boolean, java.lang.String);
+    public int match(java.lang.String, java.lang.String, java.lang.String, android.net.Uri, java.util.Set, java.lang.String);
+    public boolean matchAction(java.lang.String);
+    public java.lang.String matchCategories(java.util.Set);
+    public int matchData(java.lang.String, java.lang.String, android.net.Uri);
+    public int matchDataAuthority(android.net.Uri);
+    public java.util.Iterator pathsIterator();
+    public void readFromXml(org.xmlpull.v1.XmlPullParser);
+    public java.util.Iterator schemeSpecificPartsIterator();
+    public java.util.Iterator schemesIterator();
+    public void setPriority(int);
+    public java.util.Iterator typesIterator();
+    public void writeToParcel(android.os.Parcel, int);
+    public void writeToXml(org.xmlpull.v1.XmlSerializer);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int MATCH_ADJUSTMENT_MASK;
+    public static int MATCH_ADJUSTMENT_NORMAL;
+    public static int MATCH_CATEGORY_EMPTY;
+    public static int MATCH_CATEGORY_HOST;
+    public static int MATCH_CATEGORY_MASK;
+    public static int MATCH_CATEGORY_PATH;
+    public static int MATCH_CATEGORY_PORT;
+    public static int MATCH_CATEGORY_SCHEME;
+    public static int MATCH_CATEGORY_SCHEME_SPECIFIC_PART;
+    public static int MATCH_CATEGORY_TYPE;
+    public static int NO_MATCH_ACTION;
+    public static int NO_MATCH_CATEGORY;
+    public static int NO_MATCH_DATA;
+    public static int NO_MATCH_TYPE;
+    public static int SYSTEM_HIGH_PRIORITY;
+    public static int SYSTEM_LOW_PRIORITY;
+}
+
+-keep class android.content.IntentFilter$AuthorityEntry {
+    <init>(java.lang.String, java.lang.String);
+
+    public java.lang.String getHost();
+    public int getPort();
+    public int match(android.net.Uri);
+
+
+}
+
+-keep class android.content.IntentFilter$MalformedMimeTypeException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class android.content.IntentSender {
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public java.lang.String getCreatorPackage();
+    public int getCreatorUid();
+    public android.os.UserHandle getCreatorUserHandle();
+    public java.lang.String getTargetPackage();
+    public int hashCode();
+    public static android.content.IntentSender readIntentSenderOrNullFromParcel(android.os.Parcel);
+    public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler);
+    public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler, java.lang.String);
+    public java.lang.String toString();
+    public static void writeIntentSenderOrNullToParcel(android.content.IntentSender, android.os.Parcel);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.IntentSender$OnFinished {
+
+    public abstract void onSendFinished(android.content.IntentSender, android.content.Intent, int, java.lang.String, android.os.Bundle);
+
+
+}
+
+-keep class android.content.IntentSender$SendIntentException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.Exception);
+
+
+
+}
+
+-keep class android.content.OperationApplicationException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+    <init>(int);
+    <init>(java.lang.String, int);
+
+    public int getNumSuccessfulYieldPoints();
+
+
+}
+
+-keep class android.content.PeriodicSync {
+    <init>(android.accounts.Account, java.lang.String, android.os.Bundle, long);
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public android.accounts.Account account;
+    public java.lang.String authority;
+    public android.os.Bundle extras;
+    public long period;
+}
+
+-keep class android.content.ServiceConnection {
+
+    public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+    public abstract void onServiceDisconnected(android.content.ComponentName);
+
+
+}
+
+-keep class android.content.SharedPreferences {
+
+    public abstract boolean contains(java.lang.String);
+    public abstract android.content.SharedPreferences$Editor edit();
+    public abstract java.util.Map getAll();
+    public abstract boolean getBoolean(java.lang.String, boolean);
+    public abstract float getFloat(java.lang.String, float);
+    public abstract int getInt(java.lang.String, int);
+    public abstract long getLong(java.lang.String, long);
+    public abstract java.lang.String getString(java.lang.String, java.lang.String);
+    public abstract java.util.Set getStringSet(java.lang.String, java.util.Set);
+    public abstract void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);
+    public abstract void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);
+
+
+}
+
+-keep class android.content.SharedPreferences$Editor {
+
+    public abstract void apply();
+    public abstract android.content.SharedPreferences$Editor clear();
+    public abstract boolean commit();
+    public abstract android.content.SharedPreferences$Editor putBoolean(java.lang.String, boolean);
+    public abstract android.content.SharedPreferences$Editor putFloat(java.lang.String, float);
+    public abstract android.content.SharedPreferences$Editor putInt(java.lang.String, int);
+    public abstract android.content.SharedPreferences$Editor putLong(java.lang.String, long);
+    public abstract android.content.SharedPreferences$Editor putString(java.lang.String, java.lang.String);
+    public abstract android.content.SharedPreferences$Editor putStringSet(java.lang.String, java.util.Set);
+    public abstract android.content.SharedPreferences$Editor remove(java.lang.String);
+
+
+}
+
+-keep class android.content.SharedPreferences$OnSharedPreferenceChangeListener {
+
+    public abstract void onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String);
+
+
+}
+
+-keep class android.content.SyncAdapterType {
+    <init>(java.lang.String, java.lang.String, boolean, boolean);
+    <init>(android.os.Parcel);
+
+    public boolean allowParallelSyncs();
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public java.lang.String getSettingsActivity();
+    public int hashCode();
+    public boolean isAlwaysSyncable();
+    public boolean isUserVisible();
+    public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String);
+    public boolean supportsUploading();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public java.lang.String accountType;
+    public java.lang.String authority;
+    public boolean isKey;
+}
+
+-keep class android.content.SyncInfo {
+
+    public int describeContents();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public android.accounts.Account account;
+    public java.lang.String authority;
+    public long startTime;
+}
+
+-keep class android.content.SyncRequest {
+
+    public int describeContents();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.SyncStatusObserver {
+
+    public abstract void onStatusChanged(int);
+
+
+}
+
+-keep class android.content.UriPermission {
+
+    public int describeContents();
+    public long getPersistedTime();
+    public android.net.Uri getUri();
+    public boolean isReadPermission();
+    public boolean isWritePermission();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static long INVALID_TIME;
+}
+
+-keep class android.content.pm.ActivityInfo {
+    <init>();
+    <init>(android.content.pm.ActivityInfo);
+
+    public int describeContents();
+    public void dump(android.util.Printer, java.lang.String);
+    public int getThemeResource();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static int CONFIG_DENSITY;
+    public static int CONFIG_FONT_SCALE;
+    public static int CONFIG_KEYBOARD;
+    public static int CONFIG_KEYBOARD_HIDDEN;
+    public static int CONFIG_LAYOUT_DIRECTION;
+    public static int CONFIG_LOCALE;
+    public static int CONFIG_MCC;
+    public static int CONFIG_MNC;
+    public static int CONFIG_NAVIGATION;
+    public static int CONFIG_ORIENTATION;
+    public static int CONFIG_SCREEN_LAYOUT;
+    public static int CONFIG_SCREEN_SIZE;
+    public static int CONFIG_SMALLEST_SCREEN_SIZE;
+    public static int CONFIG_TOUCHSCREEN;
+    public static int CONFIG_UI_MODE;
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int DOCUMENT_LAUNCH_ALWAYS;
+    public static int DOCUMENT_LAUNCH_INTO_EXISTING;
+    public static int DOCUMENT_LAUNCH_NEVER;
+    public static int DOCUMENT_LAUNCH_NONE;
+    public static int FLAG_ALLOW_TASK_REPARENTING;
+    public static int FLAG_ALWAYS_RETAIN_TASK_STATE;
+    public static int FLAG_AUTO_REMOVE_FROM_RECENTS;
+    public static int FLAG_CLEAR_TASK_ON_LAUNCH;
+    public static int FLAG_EXCLUDE_FROM_RECENTS;
+    public static int FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
+    public static int FLAG_FINISH_ON_TASK_LAUNCH;
+    public static int FLAG_HARDWARE_ACCELERATED;
+    public static int FLAG_IMMERSIVE;
+    public static int FLAG_MULTIPROCESS;
+    public static int FLAG_NO_HISTORY;
+    public static int FLAG_RELINQUISH_TASK_IDENTITY;
+    public static int FLAG_RESUME_WHILE_PAUSING;
+    public static int FLAG_SINGLE_USER;
+    public static int FLAG_STATE_NOT_NEEDED;
+    public static int LAUNCH_MULTIPLE;
+    public static int LAUNCH_SINGLE_INSTANCE;
+    public static int LAUNCH_SINGLE_TASK;
+    public static int LAUNCH_SINGLE_TOP;
+    public static int PERSIST_ACROSS_REBOOTS;
+    public static int PERSIST_NEVER;
+    public static int PERSIST_ROOT_ONLY;
+    public static int SCREEN_ORIENTATION_BEHIND;
+    public static int SCREEN_ORIENTATION_FULL_SENSOR;
+    public static int SCREEN_ORIENTATION_FULL_USER;
+    public static int SCREEN_ORIENTATION_LANDSCAPE;
+    public static int SCREEN_ORIENTATION_LOCKED;
+    public static int SCREEN_ORIENTATION_NOSENSOR;
+    public static int SCREEN_ORIENTATION_PORTRAIT;
+    public static int SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
+    public static int SCREEN_ORIENTATION_REVERSE_PORTRAIT;
+    public static int SCREEN_ORIENTATION_SENSOR;
+    public static int SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
+    public static int SCREEN_ORIENTATION_SENSOR_PORTRAIT;
+    public static int SCREEN_ORIENTATION_UNSPECIFIED;
+    public static int SCREEN_ORIENTATION_USER;
+    public static int SCREEN_ORIENTATION_USER_LANDSCAPE;
+    public static int SCREEN_ORIENTATION_USER_PORTRAIT;
+    public static int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW;
+    public int configChanges;
+    public int documentLaunchMode;
+    public int flags;
+    public int launchMode;
+    public int maxRecents;
+    public java.lang.String parentActivityName;
+    public java.lang.String permission;
+    public int persistableMode;
+    public int screenOrientation;
+    public int softInputMode;
+    public java.lang.String targetActivity;
+    public java.lang.String taskAffinity;
+    public int theme;
+    public int uiOptions;
+}
+
+-keep class android.content.pm.ApplicationInfo {
+    <init>();
+    <init>(android.content.pm.ApplicationInfo);
+
+    public int describeContents();
+    public void dump(android.util.Printer, java.lang.String);
+    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_ALLOW_BACKUP;
+    public static int FLAG_ALLOW_CLEAR_USER_DATA;
+    public static int FLAG_ALLOW_TASK_REPARENTING;
+    public static int FLAG_DEBUGGABLE;
+    public static int FLAG_EXTERNAL_STORAGE;
+    public static int FLAG_EXTRACT_NATIVE_LIBS;
+    public static int FLAG_FACTORY_TEST;
+    public static int FLAG_FULL_BACKUP_ONLY;
+    public static int FLAG_HARDWARE_ACCELERATED;
+    public static int FLAG_HAS_CODE;
+    public static int FLAG_INSTALLED;
+    public static int FLAG_IS_DATA_ONLY;
+    public static int FLAG_IS_GAME;
+    public static int FLAG_KILL_AFTER_RESTORE;
+    public static int FLAG_LARGE_HEAP;
+    public static int FLAG_MULTIARCH;
+    public static int FLAG_PERSISTENT;
+    public static int FLAG_RESIZEABLE_FOR_SCREENS;
+    public static int FLAG_RESTORE_ANY_VERSION;
+    public static int FLAG_STOPPED;
+    public static int FLAG_SUPPORTS_LARGE_SCREENS;
+    public static int FLAG_SUPPORTS_NORMAL_SCREENS;
+    public static int FLAG_SUPPORTS_RTL;
+    public static int FLAG_SUPPORTS_SCREEN_DENSITIES;
+    public static int FLAG_SUPPORTS_SMALL_SCREENS;
+    public static int FLAG_SUPPORTS_XLARGE_SCREENS;
+    public static int FLAG_SYSTEM;
+    public static int FLAG_TEST_ONLY;
+    public static int FLAG_UPDATED_SYSTEM_APP;
+    public static int FLAG_USES_CLEARTEXT_TRAFFIC;
+    public static int FLAG_VM_SAFE_MODE;
+    public java.lang.String backupAgentName;
+    public java.lang.String className;
+    public int compatibleWidthLimitDp;
+    public java.lang.String dataDir;
+    public int descriptionRes;
+    public boolean enabled;
+    public int flags;
+    public int largestWidthLimitDp;
+    public java.lang.String manageSpaceActivityName;
+    public java.lang.String nativeLibraryDir;
+    public java.lang.String permission;
+    public java.lang.String processName;
+    public java.lang.String publicSourceDir;
+    public int requiresSmallestWidthDp;
+    public java.lang.String[] sharedLibraryFiles;
+    public java.lang.String sourceDir;
+    public java.lang.String[] splitPublicSourceDirs;
+    public java.lang.String[] splitSourceDirs;
+    public int targetSdkVersion;
+    public java.lang.String taskAffinity;
+    public int theme;
+    public int uiOptions;
+    public int uid;
+}
+
+-keep class android.content.pm.ComponentInfo {
+    <init>();
+    <init>(android.content.pm.ComponentInfo);
+    <init>(android.os.Parcel);
+
+    protected void dumpBack(android.util.Printer, java.lang.String);
+    protected void dumpFront(android.util.Printer, java.lang.String);
+    public int getBannerResource();
+    public int getIconResource();
+    public int getLogoResource();
+    public boolean isEnabled();
+    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public android.content.pm.ApplicationInfo applicationInfo;
+    public int descriptionRes;
+    public boolean enabled;
+    public boolean exported;
+    public java.lang.String processName;
+}
+
+-keep class android.content.pm.ConfigurationInfo {
+    <init>();
+    <init>(android.content.pm.ConfigurationInfo);
+
+    public int describeContents();
+    public java.lang.String getGlEsVersion();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int GL_ES_VERSION_UNDEFINED;
+    public static int INPUT_FEATURE_FIVE_WAY_NAV;
+    public static int INPUT_FEATURE_HARD_KEYBOARD;
+    public int reqGlEsVersion;
+    public int reqInputFeatures;
+    public int reqKeyboardType;
+    public int reqNavigation;
+    public int reqTouchScreen;
+}
+
+-keep class android.content.pm.FeatureGroupInfo {
+    <init>();
+    <init>(android.content.pm.FeatureGroupInfo);
+
+    public int describeContents();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public android.content.pm.FeatureInfo[] features;
+}
+
+-keep class android.content.pm.FeatureInfo {
+    <init>();
+    <init>(android.content.pm.FeatureInfo);
+
+    public int describeContents();
+    public java.lang.String getGlEsVersion();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_REQUIRED;
+    public static int GL_ES_VERSION_UNDEFINED;
+    public int flags;
+    public java.lang.String name;
+    public int reqGlEsVersion;
+}
+
+-keep class android.content.pm.InstrumentationInfo {
+    <init>();
+    <init>(android.content.pm.InstrumentationInfo);
+
+    public int describeContents();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public java.lang.String dataDir;
+    public boolean functionalTest;
+    public boolean handleProfiling;
+    public java.lang.String publicSourceDir;
+    public java.lang.String sourceDir;
+    public java.lang.String[] splitPublicSourceDirs;
+    public java.lang.String[] splitSourceDirs;
+    public java.lang.String targetPackage;
+}
+
+-keep class android.content.pm.PackageInfo {
+    <init>();
+
+    public int describeContents();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int INSTALL_LOCATION_AUTO;
+    public static int INSTALL_LOCATION_INTERNAL_ONLY;
+    public static int INSTALL_LOCATION_PREFER_EXTERNAL;
+    public static int REQUESTED_PERMISSION_GRANTED;
+    public android.content.pm.ActivityInfo[] activities;
+    public android.content.pm.ApplicationInfo applicationInfo;
+    public int baseRevisionCode;
+    public android.content.pm.ConfigurationInfo[] configPreferences;
+    public android.content.pm.FeatureGroupInfo[] featureGroups;
+    public long firstInstallTime;
+    public int[] gids;
+    public int installLocation;
+    public android.content.pm.InstrumentationInfo[] instrumentation;
+    public long lastUpdateTime;
+    public java.lang.String packageName;
+    public android.content.pm.PermissionInfo[] permissions;
+    public android.content.pm.ProviderInfo[] providers;
+    public android.content.pm.ActivityInfo[] receivers;
+    public android.content.pm.FeatureInfo[] reqFeatures;
+    public java.lang.String[] requestedPermissions;
+    public int[] requestedPermissionsFlags;
+    public android.content.pm.ServiceInfo[] services;
+    public java.lang.String sharedUserId;
+    public int sharedUserLabel;
+    public android.content.pm.Signature[] signatures;
+    public java.lang.String[] splitNames;
+    public int[] splitRevisionCodes;
+    public int versionCode;
+    public java.lang.String versionName;
+}
+
+-keep class android.content.pm.PackageInstaller {
+
+    public void abandonSession(int);
+    public int createSession(android.content.pm.PackageInstaller$SessionParams);
+    public java.util.List getAllSessions();
+    public java.util.List getMySessions();
+    public android.content.pm.PackageInstaller$SessionInfo getSessionInfo(int);
+    public android.content.pm.PackageInstaller$Session openSession(int);
+    public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
+    public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback, android.os.Handler);
+    public void uninstall(java.lang.String, android.content.IntentSender);
+    public void unregisterSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
+    public void updateSessionAppIcon(int, android.graphics.Bitmap);
+    public void updateSessionAppLabel(int, java.lang.CharSequence);
+
+
+    public static java.lang.String ACTION_SESSION_DETAILS;
+    public static java.lang.String EXTRA_OTHER_PACKAGE_NAME;
+    public static java.lang.String EXTRA_PACKAGE_NAME;
+    public static java.lang.String EXTRA_SESSION_ID;
+    public static java.lang.String EXTRA_STATUS;
+    public static java.lang.String EXTRA_STATUS_MESSAGE;
+    public static java.lang.String EXTRA_STORAGE_PATH;
+    public static int STATUS_FAILURE;
+    public static int STATUS_FAILURE_ABORTED;
+    public static int STATUS_FAILURE_BLOCKED;
+    public static int STATUS_FAILURE_CONFLICT;
+    public static int STATUS_FAILURE_INCOMPATIBLE;
+    public static int STATUS_FAILURE_INVALID;
+    public static int STATUS_FAILURE_STORAGE;
+    public static int STATUS_PENDING_USER_ACTION;
+    public static int STATUS_SUCCESS;
+}
+
+-keep class android.content.pm.PackageInstaller$Session {
+
+    public void abandon();
+    public void close();
+    public void commit(android.content.IntentSender);
+    public void fsync(java.io.OutputStream);
+    public java.lang.String[] getNames();
+    public java.io.InputStream openRead(java.lang.String);
+    public java.io.OutputStream openWrite(java.lang.String, long, long);
+    public void setStagingProgress(float);
+
+
+}
+
+-keep class android.content.pm.PackageInstaller$SessionCallback {
+    <init>();
+
+    public abstract void onActiveChanged(int, boolean);
+    public abstract void onBadgingChanged(int);
+    public abstract void onCreated(int);
+    public abstract void onFinished(int, boolean);
+    public abstract void onProgressChanged(int, float);
+
+
+}
+
+-keep class android.content.pm.PackageInstaller$SessionInfo {
+
+    public android.content.Intent createDetailsIntent();
+    public int describeContents();
+    public android.graphics.Bitmap getAppIcon();
+    public java.lang.CharSequence getAppLabel();
+    public java.lang.String getAppPackageName();
+    public java.lang.String getInstallerPackageName();
+    public float getProgress();
+    public int getSessionId();
+    public boolean isActive();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.pm.PackageInstaller$SessionParams {
+    <init>(int);
+
+    public int describeContents();
+    public void setAppIcon(android.graphics.Bitmap);
+    public void setAppLabel(java.lang.CharSequence);
+    public void setAppPackageName(java.lang.String);
+    public void setInstallLocation(int);
+    public void setOriginatingUri(android.net.Uri);
+    public void setReferrerUri(android.net.Uri);
+    public void setSize(long);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int MODE_FULL_INSTALL;
+    public static int MODE_INHERIT_EXISTING;
+}
+
+-keep class android.content.pm.PackageItemInfo {
+    <init>();
+    <init>(android.content.pm.PackageItemInfo);
+    <init>(android.os.Parcel);
+
+    protected void dumpBack(android.util.Printer, java.lang.String);
+    protected void dumpFront(android.util.Printer, java.lang.String);
+    public android.graphics.drawable.Drawable loadBanner(android.content.pm.PackageManager);
+    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
+    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+    public android.graphics.drawable.Drawable loadLogo(android.content.pm.PackageManager);
+    public android.graphics.drawable.Drawable loadUnbadgedIcon(android.content.pm.PackageManager);
+    public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, java.lang.String);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public int banner;
+    public int icon;
+    public int labelRes;
+    public int logo;
+    public android.os.Bundle metaData;
+    public java.lang.String name;
+    public java.lang.CharSequence nonLocalizedLabel;
+    public java.lang.String packageName;
+}
+
+-keep class android.content.pm.PackageManager {
+    <init>();
+
+    public abstract void addPackageToPreferred(java.lang.String);
+    public abstract boolean addPermission(android.content.pm.PermissionInfo);
+    public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
+    public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
+    public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
+    public abstract int checkPermission(java.lang.String, java.lang.String);
+    public abstract int checkSignatures(java.lang.String, java.lang.String);
+    public abstract int checkSignatures(int, int);
+    public abstract void clearPackagePreferredActivities(java.lang.String);
+    public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
+    public abstract void extendVerificationTimeout(int, int, long);
+    public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName);
+    public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.Intent);
+    public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName);
+    public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.Intent);
+    public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int);
+    public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.ComponentName);
+    public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.Intent);
+    public abstract java.util.List getAllPermissionGroups(int);
+    public abstract android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
+    public abstract android.graphics.drawable.Drawable getApplicationBanner(java.lang.String);
+    public abstract int getApplicationEnabledSetting(java.lang.String);
+    public abstract android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
+    public abstract android.graphics.drawable.Drawable getApplicationIcon(java.lang.String);
+    public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int);
+    public abstract java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
+    public abstract android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
+    public abstract android.graphics.drawable.Drawable getApplicationLogo(java.lang.String);
+    public abstract int getComponentEnabledSetting(android.content.ComponentName);
+    public abstract android.graphics.drawable.Drawable getDefaultActivityIcon();
+    public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
+    public abstract java.util.List getInstalledApplications(int);
+    public abstract java.util.List getInstalledPackages(int);
+    public abstract java.lang.String getInstallerPackageName(java.lang.String);
+    public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
+    public abstract android.content.Intent getLaunchIntentForPackage(java.lang.String);
+    public abstract android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
+    public abstract java.lang.String getNameForUid(int);
+    public android.content.pm.PackageInfo getPackageArchiveInfo(java.lang.String, int);
+    public abstract int[] getPackageGids(java.lang.String);
+    public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int);
+    public abstract android.content.pm.PackageInstaller getPackageInstaller();
+    public abstract java.lang.String[] getPackagesForUid(int);
+    public abstract java.util.List getPackagesHoldingPermissions(java.lang.String[], int);
+    public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int);
+    public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int);
+    public abstract int getPreferredActivities(java.util.List, java.util.List, java.lang.String);
+    public abstract java.util.List getPreferredPackages(int);
+    public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int);
+    public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int);
+    public abstract android.content.res.Resources getResourcesForActivity(android.content.ComponentName);
+    public abstract android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
+    public abstract android.content.res.Resources getResourcesForApplication(java.lang.String);
+    public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int);
+    public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
+    public abstract java.lang.String[] getSystemSharedLibraryNames();
+    public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
+    public abstract android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
+    public abstract android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
+    public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
+    public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
+    public abstract boolean hasSystemFeature(java.lang.String);
+    public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
+    public abstract boolean isSafeMode();
+    public abstract java.util.List queryBroadcastReceivers(android.content.Intent, int);
+    public abstract java.util.List queryContentProviders(java.lang.String, int, int);
+    public abstract java.util.List queryInstrumentation(java.lang.String, int);
+    public abstract java.util.List queryIntentActivities(android.content.Intent, int);
+    public abstract java.util.List queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
+    public abstract java.util.List queryIntentContentProviders(android.content.Intent, int);
+    public abstract java.util.List queryIntentServices(android.content.Intent, int);
+    public abstract java.util.List queryPermissionsByGroup(java.lang.String, int);
+    public abstract void removePackageFromPreferred(java.lang.String);
+    public abstract void removePermission(java.lang.String);
+    public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
+    public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
+    public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
+    public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
+    public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
+    public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
+    public abstract void verifyPendingInstall(int, int);
+
+
+    public static int COMPONENT_ENABLED_STATE_DEFAULT;
+    public static int COMPONENT_ENABLED_STATE_DISABLED;
+    public static int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
+    public static int COMPONENT_ENABLED_STATE_DISABLED_USER;
+    public static int COMPONENT_ENABLED_STATE_ENABLED;
+    public static int DONT_KILL_APP;
+    public static java.lang.String EXTRA_VERIFICATION_ID;
+    public static java.lang.String EXTRA_VERIFICATION_RESULT;
+    public static java.lang.String FEATURE_APP_WIDGETS;
+    public static java.lang.String FEATURE_AUDIO_LOW_LATENCY;
+    public static java.lang.String FEATURE_AUDIO_OUTPUT;
+    public static java.lang.String FEATURE_AUDIO_PRO;
+    public static java.lang.String FEATURE_AUTOMOTIVE;
+    public static java.lang.String FEATURE_BACKUP;
+    public static java.lang.String FEATURE_BLUETOOTH;
+    public static java.lang.String FEATURE_BLUETOOTH_LE;
+    public static java.lang.String FEATURE_CAMERA;
+    public static java.lang.String FEATURE_CAMERA_ANY;
+    public static java.lang.String FEATURE_CAMERA_AUTOFOCUS;
+    public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING;
+    public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR;
+    public static java.lang.String FEATURE_CAMERA_CAPABILITY_RAW;
+    public static java.lang.String FEATURE_CAMERA_EXTERNAL;
+    public static java.lang.String FEATURE_CAMERA_FLASH;
+    public static java.lang.String FEATURE_CAMERA_FRONT;
+    public static java.lang.String FEATURE_CAMERA_LEVEL_FULL;
+    public static java.lang.String FEATURE_CONNECTION_SERVICE;
+    public static java.lang.String FEATURE_CONSUMER_IR;
+    public static java.lang.String FEATURE_DEVICE_ADMIN;
+    public static java.lang.String FEATURE_FAKETOUCH;
+    public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT;
+    public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND;
+    public static java.lang.String FEATURE_FINGERPRINT;
+    public static java.lang.String FEATURE_GAMEPAD;
+    public static java.lang.String FEATURE_HIFI_SENSORS;
+    public static java.lang.String FEATURE_HOME_SCREEN;
+    public static java.lang.String FEATURE_INPUT_METHODS;
+    public static java.lang.String FEATURE_LEANBACK;
+    public static java.lang.String FEATURE_LIVE_TV;
+    public static java.lang.String FEATURE_LIVE_WALLPAPER;
+    public static java.lang.String FEATURE_LOCATION;
+    public static java.lang.String FEATURE_LOCATION_GPS;
+    public static java.lang.String FEATURE_LOCATION_NETWORK;
+    public static java.lang.String FEATURE_MANAGED_USERS;
+    public static java.lang.String FEATURE_MICROPHONE;
+    public static java.lang.String FEATURE_MIDI;
+    public static java.lang.String FEATURE_NFC;
+    public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION;
+    public static java.lang.String FEATURE_OPENGLES_EXTENSION_PACK;
+    public static java.lang.String FEATURE_PRINTING;
+    public static java.lang.String FEATURE_SCREEN_LANDSCAPE;
+    public static java.lang.String FEATURE_SCREEN_PORTRAIT;
+    public static java.lang.String FEATURE_SECURELY_REMOVES_USERS;
+    public static java.lang.String FEATURE_SENSOR_ACCELEROMETER;
+    public static java.lang.String FEATURE_SENSOR_AMBIENT_TEMPERATURE;
+    public static java.lang.String FEATURE_SENSOR_BAROMETER;
+    public static java.lang.String FEATURE_SENSOR_COMPASS;
+    public static java.lang.String FEATURE_SENSOR_GYROSCOPE;
+    public static java.lang.String FEATURE_SENSOR_HEART_RATE;
+    public static java.lang.String FEATURE_SENSOR_HEART_RATE_ECG;
+    public static java.lang.String FEATURE_SENSOR_LIGHT;
+    public static java.lang.String FEATURE_SENSOR_PROXIMITY;
+    public static java.lang.String FEATURE_SENSOR_RELATIVE_HUMIDITY;
+    public static java.lang.String FEATURE_SENSOR_STEP_COUNTER;
+    public static java.lang.String FEATURE_SENSOR_STEP_DETECTOR;
+    public static java.lang.String FEATURE_SIP;
+    public static java.lang.String FEATURE_SIP_VOIP;
+    public static java.lang.String FEATURE_TELEPHONY;
+    public static java.lang.String FEATURE_TELEPHONY_CDMA;
+    public static java.lang.String FEATURE_TELEPHONY_GSM;
+    public static java.lang.String FEATURE_TELEVISION;
+    public static java.lang.String FEATURE_TOUCHSCREEN;
+    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH;
+    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT;
+    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND;
+    public static java.lang.String FEATURE_USB_ACCESSORY;
+    public static java.lang.String FEATURE_USB_HOST;
+    public static java.lang.String FEATURE_VERIFIED_BOOT;
+    public static java.lang.String FEATURE_WATCH;
+    public static java.lang.String FEATURE_WEBVIEW;
+    public static java.lang.String FEATURE_WIFI;
+    public static java.lang.String FEATURE_WIFI_DIRECT;
+    public static int GET_ACTIVITIES;
+    public static int GET_CONFIGURATIONS;
+    public static int GET_DISABLED_COMPONENTS;
+    public static int GET_DISABLED_UNTIL_USED_COMPONENTS;
+    public static int GET_GIDS;
+    public static int GET_INSTRUMENTATION;
+    public static int GET_INTENT_FILTERS;
+    public static int GET_META_DATA;
+    public static int GET_PERMISSIONS;
+    public static int GET_PROVIDERS;
+    public static int GET_RECEIVERS;
+    public static int GET_RESOLVED_FILTER;
+    public static int GET_SERVICES;
+    public static int GET_SHARED_LIBRARY_FILES;
+    public static int GET_SIGNATURES;
+    public static int GET_UNINSTALLED_PACKAGES;
+    public static int GET_URI_PERMISSION_PATTERNS;
+    public static int MATCH_ALL;
+    public static int MATCH_DEFAULT_ONLY;
+    public static long MAXIMUM_VERIFICATION_TIMEOUT;
+    public static int PERMISSION_DENIED;
+    public static int PERMISSION_GRANTED;
+    public static int SIGNATURE_FIRST_NOT_SIGNED;
+    public static int SIGNATURE_MATCH;
+    public static int SIGNATURE_NEITHER_SIGNED;
+    public static int SIGNATURE_NO_MATCH;
+    public static int SIGNATURE_SECOND_NOT_SIGNED;
+    public static int SIGNATURE_UNKNOWN_PACKAGE;
+    public static int VERIFICATION_ALLOW;
+    public static int VERIFICATION_REJECT;
+}
+
+-keep class android.content.pm.PackageManager$NameNotFoundException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class android.content.pm.PathPermission {
+    <init>(java.lang.String, int, java.lang.String, java.lang.String);
+    <init>(android.os.Parcel);
+
+    public java.lang.String getReadPermission();
+    public java.lang.String getWritePermission();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.pm.PermissionGroupInfo {
+    <init>();
+    <init>(android.content.pm.PermissionGroupInfo);
+
+    public int describeContents();
+    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_PERSONAL_INFO;
+    public int descriptionRes;
+    public int flags;
+    public java.lang.CharSequence nonLocalizedDescription;
+    public int priority;
+}
+
+-keep class android.content.pm.PermissionInfo {
+    <init>();
+    <init>(android.content.pm.PermissionInfo);
+
+    public int describeContents();
+    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_COSTS_MONEY;
+    public static int FLAG_INSTALLED;
+    public static int PROTECTION_DANGEROUS;
+    public static int PROTECTION_FLAG_APPOP;
+    public static int PROTECTION_FLAG_DEVELOPMENT;
+    public static int PROTECTION_FLAG_INSTALLER;
+    public static int PROTECTION_FLAG_PRE23;
+    public static int PROTECTION_FLAG_PREINSTALLED;
+    public static int PROTECTION_FLAG_PRIVILEGED;
+    public static int PROTECTION_FLAG_SYSTEM;
+    public static int PROTECTION_FLAG_VERIFIER;
+    public static int PROTECTION_MASK_BASE;
+    public static int PROTECTION_MASK_FLAGS;
+    public static int PROTECTION_NORMAL;
+    public static int PROTECTION_SIGNATURE;
+    public static int PROTECTION_SIGNATURE_OR_SYSTEM;
+    public int descriptionRes;
+    public int flags;
+    public java.lang.String group;
+    public java.lang.CharSequence nonLocalizedDescription;
+    public int protectionLevel;
+}
+
+-keep class android.content.pm.ProviderInfo {
+    <init>();
+    <init>(android.content.pm.ProviderInfo);
+
+    public int describeContents();
+    public void dump(android.util.Printer, java.lang.String);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_SINGLE_USER;
+    public java.lang.String authority;
+    public int flags;
+    public boolean grantUriPermissions;
+    public int initOrder;
+    public boolean isSyncable;
+    public boolean multiprocess;
+    public android.content.pm.PathPermission[] pathPermissions;
+    public java.lang.String readPermission;
+    public android.os.PatternMatcher[] uriPermissionPatterns;
+    public java.lang.String writePermission;
+}
+
+-keep class android.content.pm.ResolveInfo {
+    <init>();
+    <init>(android.content.pm.ResolveInfo);
+
+    public int describeContents();
+    public void dump(android.util.Printer, java.lang.String);
+    public int getIconResource();
+    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
+    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public android.content.pm.ActivityInfo activityInfo;
+    public android.content.IntentFilter filter;
+    public int icon;
+    public boolean isDefault;
+    public int labelRes;
+    public int match;
+    public java.lang.CharSequence nonLocalizedLabel;
+    public int preferredOrder;
+    public int priority;
+    public android.content.pm.ProviderInfo providerInfo;
+    public java.lang.String resolvePackageName;
+    public android.content.pm.ServiceInfo serviceInfo;
+    public int specificIndex;
+}
+
+-keep class android.content.pm.ServiceInfo {
+    <init>();
+    <init>(android.content.pm.ServiceInfo);
+
+    public int describeContents();
+    public void dump(android.util.Printer, java.lang.String);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_ISOLATED_PROCESS;
+    public static int FLAG_SINGLE_USER;
+    public static int FLAG_STOP_WITH_TASK;
+    public int flags;
+    public java.lang.String permission;
+}
+
+-keep class android.content.pm.Signature {
+    <init>(byte[]);
+    <init>(java.lang.String);
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+    public byte[] toByteArray();
+    public char[] toChars();
+    public char[] toChars(char[], int[]);
+    public java.lang.String toCharsString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.res.AssetFileDescriptor {
+    <init>(android.os.ParcelFileDescriptor, long, long);
+    <init>(android.os.ParcelFileDescriptor, long, long, android.os.Bundle);
+
+    public void close();
+    public java.io.FileInputStream createInputStream();
+    public java.io.FileOutputStream createOutputStream();
+    public int describeContents();
+    public long getDeclaredLength();
+    public android.os.Bundle getExtras();
+    public java.io.FileDescriptor getFileDescriptor();
+    public long getLength();
+    public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+    public long getStartOffset();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static long UNKNOWN_LENGTH;
+}
+
+-keep class android.content.res.AssetManager {
+
+    public void close();
+    protected void finalize();
+    public java.lang.String[] getLocales();
+    public java.lang.String[] list(java.lang.String);
+    public java.io.InputStream open(java.lang.String);
+    public java.io.InputStream open(java.lang.String, int);
+    public android.content.res.AssetFileDescriptor openFd(java.lang.String);
+    public android.content.res.AssetFileDescriptor openNonAssetFd(java.lang.String);
+    public android.content.res.AssetFileDescriptor openNonAssetFd(int, java.lang.String);
+    public android.content.res.XmlResourceParser openXmlResourceParser(java.lang.String);
+    public android.content.res.XmlResourceParser openXmlResourceParser(int, java.lang.String);
+
+
+    public static int ACCESS_BUFFER;
+    public static int ACCESS_RANDOM;
+    public static int ACCESS_STREAMING;
+    public static int ACCESS_UNKNOWN;
+}
+
+-keep class android.content.res.ColorStateList {
+    <init>(int[][], int[]);
+
+    public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
+    public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
+    public int describeContents();
+    public int getChangingConfigurations();
+    public int getColorForState(int[], int);
+    public int getDefaultColor();
+    public boolean isOpaque();
+    public boolean isStateful();
+    public java.lang.String toString();
+    public static android.content.res.ColorStateList valueOf(int);
+    public android.content.res.ColorStateList withAlpha(int);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.content.res.Configuration {
+    <init>();
+    <init>(android.content.res.Configuration);
+
+    public int compareTo(android.content.res.Configuration);
+    public int compareTo(java.lang.Object);
+    public int describeContents();
+    public int diff(android.content.res.Configuration);
+    public boolean equals(android.content.res.Configuration);
+    public boolean equals(java.lang.Object);
+    public int getLayoutDirection();
+    public int hashCode();
+    public boolean isLayoutSizeAtLeast(int);
+    public boolean isScreenRound();
+    public static boolean needNewResources(int, int);
+    public void readFromParcel(android.os.Parcel);
+    public void setLayoutDirection(java.util.Locale);
+    public void setLocale(java.util.Locale);
+    public void setTo(android.content.res.Configuration);
+    public void setToDefaults();
+    public java.lang.String toString();
+    public int updateFrom(android.content.res.Configuration);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int DENSITY_DPI_UNDEFINED;
+    public static int HARDKEYBOARDHIDDEN_NO;
+    public static int HARDKEYBOARDHIDDEN_UNDEFINED;
+    public static int HARDKEYBOARDHIDDEN_YES;
+    public static int KEYBOARDHIDDEN_NO;
+    public static int KEYBOARDHIDDEN_UNDEFINED;
+    public static int KEYBOARDHIDDEN_YES;
+    public static int KEYBOARD_12KEY;
+    public static int KEYBOARD_NOKEYS;
+    public static int KEYBOARD_QWERTY;
+    public static int KEYBOARD_UNDEFINED;
+    public static int MNC_ZERO;
+    public static int NAVIGATIONHIDDEN_NO;
+    public static int NAVIGATIONHIDDEN_UNDEFINED;
+    public static int NAVIGATIONHIDDEN_YES;
+    public static int NAVIGATION_DPAD;
+    public static int NAVIGATION_NONAV;
+    public static int NAVIGATION_TRACKBALL;
+    public static int NAVIGATION_UNDEFINED;
+    public static int NAVIGATION_WHEEL;
+    public static int ORIENTATION_LANDSCAPE;
+    public static int ORIENTATION_PORTRAIT;
+    public static int ORIENTATION_SQUARE;
+    public static int ORIENTATION_UNDEFINED;
+    public static int SCREENLAYOUT_LAYOUTDIR_LTR;
+    public static int SCREENLAYOUT_LAYOUTDIR_MASK;
+    public static int SCREENLAYOUT_LAYOUTDIR_RTL;
+    public static int SCREENLAYOUT_LAYOUTDIR_SHIFT;
+    public static int SCREENLAYOUT_LAYOUTDIR_UNDEFINED;
+    public static int SCREENLAYOUT_LONG_MASK;
+    public static int SCREENLAYOUT_LONG_NO;
+    public static int SCREENLAYOUT_LONG_UNDEFINED;
+    public static int SCREENLAYOUT_LONG_YES;
+    public static int SCREENLAYOUT_ROUND_MASK;
+    public static int SCREENLAYOUT_ROUND_NO;
+    public static int SCREENLAYOUT_ROUND_UNDEFINED;
+    public static int SCREENLAYOUT_ROUND_YES;
+    public static int SCREENLAYOUT_SIZE_LARGE;
+    public static int SCREENLAYOUT_SIZE_MASK;
+    public static int SCREENLAYOUT_SIZE_NORMAL;
+    public static int SCREENLAYOUT_SIZE_SMALL;
+    public static int SCREENLAYOUT_SIZE_UNDEFINED;
+    public static int SCREENLAYOUT_SIZE_XLARGE;
+    public static int SCREENLAYOUT_UNDEFINED;
+    public static int SCREEN_HEIGHT_DP_UNDEFINED;
+    public static int SCREEN_WIDTH_DP_UNDEFINED;
+    public static int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
+    public static int TOUCHSCREEN_FINGER;
+    public static int TOUCHSCREEN_NOTOUCH;
+    public static int TOUCHSCREEN_STYLUS;
+    public static int TOUCHSCREEN_UNDEFINED;
+    public static int UI_MODE_NIGHT_MASK;
+    public static int UI_MODE_NIGHT_NO;
+    public static int UI_MODE_NIGHT_UNDEFINED;
+    public static int UI_MODE_NIGHT_YES;
+    public static int UI_MODE_TYPE_APPLIANCE;
+    public static int UI_MODE_TYPE_CAR;
+    public static int UI_MODE_TYPE_DESK;
+    public static int UI_MODE_TYPE_MASK;
+    public static int UI_MODE_TYPE_NORMAL;
+    public static int UI_MODE_TYPE_TELEVISION;
+    public static int UI_MODE_TYPE_UNDEFINED;
+    public static int UI_MODE_TYPE_WATCH;
+    public int densityDpi;
+    public float fontScale;
+    public int hardKeyboardHidden;
+    public int keyboard;
+    public int keyboardHidden;
+    public java.util.Locale locale;
+    public int mcc;
+    public int mnc;
+    public int navigation;
+    public int navigationHidden;
+    public int orientation;
+    public int screenHeightDp;
+    public int screenLayout;
+    public int screenWidthDp;
+    public int smallestScreenWidthDp;
+    public int touchscreen;
+    public int uiMode;
+}
+
+-keep class android.content.res.Resources {
+    <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
+
+    public void finishPreloading();
+    public void flushLayoutCache();
+    public android.content.res.XmlResourceParser getAnimation(int);
+    public android.content.res.AssetManager getAssets();
+    public boolean getBoolean(int);
+    public int getColor(int);
+    public int getColor(int, android.content.res.Resources$Theme);
+    public android.content.res.ColorStateList getColorStateList(int);
+    public android.content.res.ColorStateList getColorStateList(int, android.content.res.Resources$Theme);
+    public android.content.res.Configuration getConfiguration();
+    public float getDimension(int);
+    public int getDimensionPixelOffset(int);
+    public int getDimensionPixelSize(int);
+    public android.util.DisplayMetrics getDisplayMetrics();
+    public android.graphics.drawable.Drawable getDrawable(int);
+    public android.graphics.drawable.Drawable getDrawable(int, android.content.res.Resources$Theme);
+    public android.graphics.drawable.Drawable getDrawableForDensity(int, int);
+    public android.graphics.drawable.Drawable getDrawableForDensity(int, int, android.content.res.Resources$Theme);
+    public float getFraction(int, int, int);
+    public int getIdentifier(java.lang.String, java.lang.String, java.lang.String);
+    public int[] getIntArray(int);
+    public int getInteger(int);
+    public android.content.res.XmlResourceParser getLayout(int);
+    public android.graphics.Movie getMovie(int);
+    public java.lang.String getQuantityString(int, int, java.lang.Object[]);
+    public java.lang.String getQuantityString(int, int);
+    public java.lang.CharSequence getQuantityText(int, int);
+    public java.lang.String getResourceEntryName(int);
+    public java.lang.String getResourceName(int);
+    public java.lang.String getResourcePackageName(int);
+    public java.lang.String getResourceTypeName(int);
+    public java.lang.String getString(int);
+    public java.lang.String getString(int, java.lang.Object[]);
+    public java.lang.String[] getStringArray(int);
+    public static android.content.res.Resources getSystem();
+    public java.lang.CharSequence getText(int);
+    public java.lang.CharSequence getText(int, java.lang.CharSequence);
+    public java.lang.CharSequence[] getTextArray(int);
+    public void getValue(int, android.util.TypedValue, boolean);
+    public void getValue(java.lang.String, android.util.TypedValue, boolean);
+    public void getValueForDensity(int, int, android.util.TypedValue, boolean);
+    public android.content.res.XmlResourceParser getXml(int);
+    public android.content.res.Resources$Theme newTheme();
+    public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
+    public android.content.res.TypedArray obtainTypedArray(int);
+    public java.io.InputStream openRawResource(int);
+    public java.io.InputStream openRawResource(int, android.util.TypedValue);
+    public android.content.res.AssetFileDescriptor openRawResourceFd(int);
+    public void parseBundleExtra(java.lang.String, android.util.AttributeSet, android.os.Bundle);
+    public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle);
+    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
+
+
+}
+
+-keep class android.content.res.Resources$NotFoundException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class android.content.res.Resources$Theme {
+
+    public void applyStyle(int, boolean);
+    public void dump(int, java.lang.String, java.lang.String);
+    protected void finalize();
+    public int getChangingConfigurations();
+    public android.graphics.drawable.Drawable getDrawable(int);
+    public android.content.res.Resources getResources();
+    public android.content.res.TypedArray obtainStyledAttributes(int[]);
+    public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
+    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
+    public boolean resolveAttribute(int, android.util.TypedValue, boolean);
+    public void setTo(android.content.res.Resources$Theme);
+
+
+}
+
+-keep class android.content.res.TypedArray {
+
+    public boolean getBoolean(int, boolean);
+    public int getChangingConfigurations();
+    public int getColor(int, int);
+    public android.content.res.ColorStateList getColorStateList(int);
+    public float getDimension(int, float);
+    public int getDimensionPixelOffset(int, int);
+    public int getDimensionPixelSize(int, int);
+    public android.graphics.drawable.Drawable getDrawable(int);
+    public float getFloat(int, float);
+    public float getFraction(int, int, int, float);
+    public int getIndex(int);
+    public int getIndexCount();
+    public int getInt(int, int);
+    public int getInteger(int, int);
+    public int getLayoutDimension(int, java.lang.String);
+    public int getLayoutDimension(int, int);
+    public java.lang.String getNonResourceString(int);
+    public java.lang.String getPositionDescription();
+    public int getResourceId(int, int);
+    public android.content.res.Resources getResources();
+    public java.lang.String getString(int);
+    public java.lang.CharSequence getText(int);
+    public java.lang.CharSequence[] getTextArray(int);
+    public int getType(int);
+    public boolean getValue(int, android.util.TypedValue);
+    public boolean hasValue(int);
+    public boolean hasValueOrEmpty(int);
+    public int length();
+    public android.util.TypedValue peekValue(int);
+    public void recycle();
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.content.res.XmlResourceParser {
+
+    public abstract void close();
+
+
+}
+
+-keep class android.database.CharArrayBuffer {
+    <init>(int);
+    <init>(char[]);
+
+
+
+    public char[] data;
+    public int sizeCopied;
+}
+
+-keep class android.database.ContentObserver {
+    <init>(android.os.Handler);
+
+    public boolean deliverSelfNotifications();
+    public void dispatchChange(boolean);
+    public void dispatchChange(boolean, android.net.Uri);
+    public void onChange(boolean);
+    public void onChange(boolean, android.net.Uri);
+
+
+}
+
+-keep class android.database.Cursor {
+
+    public abstract void close();
+    public abstract void copyStringToBuffer(int, android.database.CharArrayBuffer);
+    public abstract void deactivate();
+    public abstract byte[] getBlob(int);
+    public abstract int getColumnCount();
+    public abstract int getColumnIndex(java.lang.String);
+    public abstract int getColumnIndexOrThrow(java.lang.String);
+    public abstract java.lang.String getColumnName(int);
+    public abstract java.lang.String[] getColumnNames();
+    public abstract int getCount();
+    public abstract double getDouble(int);
+    public abstract android.os.Bundle getExtras();
+    public abstract float getFloat(int);
+    public abstract int getInt(int);
+    public abstract long getLong(int);
+    public abstract android.net.Uri getNotificationUri();
+    public abstract int getPosition();
+    public abstract short getShort(int);
+    public abstract java.lang.String getString(int);
+    public abstract int getType(int);
+    public abstract boolean getWantsAllOnMoveCalls();
+    public abstract boolean isAfterLast();
+    public abstract boolean isBeforeFirst();
+    public abstract boolean isClosed();
+    public abstract boolean isFirst();
+    public abstract boolean isLast();
+    public abstract boolean isNull(int);
+    public abstract boolean move(int);
+    public abstract boolean moveToFirst();
+    public abstract boolean moveToLast();
+    public abstract boolean moveToNext();
+    public abstract boolean moveToPosition(int);
+    public abstract boolean moveToPrevious();
+    public abstract void registerContentObserver(android.database.ContentObserver);
+    public abstract void registerDataSetObserver(android.database.DataSetObserver);
+    public abstract boolean requery();
+    public abstract android.os.Bundle respond(android.os.Bundle);
+    public abstract void setExtras(android.os.Bundle);
+    public abstract void setNotificationUri(android.content.ContentResolver, android.net.Uri);
+    public abstract void unregisterContentObserver(android.database.ContentObserver);
+    public abstract void unregisterDataSetObserver(android.database.DataSetObserver);
+
+
+    public static int FIELD_TYPE_BLOB;
+    public static int FIELD_TYPE_FLOAT;
+    public static int FIELD_TYPE_INTEGER;
+    public static int FIELD_TYPE_NULL;
+    public static int FIELD_TYPE_STRING;
+}
+
+-keep class android.database.DataSetObserver {
+    <init>();
+
+    public void onChanged();
+    public void onInvalidated();
+
+
+}
+
+-keep class android.database.DatabaseErrorHandler {
+
+    public abstract void onCorruption(android.database.sqlite.SQLiteDatabase);
+
+
+}
+
+-keep class android.database.SQLException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+
+
+
+}
+
+-keep class android.database.sqlite.SQLiteClosable {
+    <init>();
+
+    public void acquireReference();
+    public void close();
+    protected abstract void onAllReferencesReleased();
+    protected void onAllReferencesReleasedFromContainer();
+    public void releaseReference();
+    public void releaseReferenceFromContainer();
+
+
+}
+
+-keep class android.database.sqlite.SQLiteCursorDriver {
+
+    public abstract void cursorClosed();
+    public abstract void cursorDeactivated();
+    public abstract void cursorRequeried(android.database.Cursor);
+    public abstract android.database.Cursor query(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String[]);
+    public abstract void setBindArguments(java.lang.String[]);
+
+
+}
+
+-keep class android.database.sqlite.SQLiteDatabase {
+
+    public void beginTransaction();
+    public void beginTransactionNonExclusive();
+    public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener);
+    public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
+    public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String);
+    public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase$CursorFactory);
+    public int delete(java.lang.String, java.lang.String, java.lang.String[]);
+    public static boolean deleteDatabase(java.io.File);
+    public void disableWriteAheadLogging();
+    public boolean enableWriteAheadLogging();
+    public void endTransaction();
+    public void execSQL(java.lang.String);
+    public void execSQL(java.lang.String, java.lang.Object[]);
+    protected void finalize();
+    public static java.lang.String findEditTable(java.lang.String);
+    public java.util.List getAttachedDbs();
+    public long getMaximumSize();
+    public long getPageSize();
+    public java.lang.String getPath();
+    public java.util.Map getSyncedTables();
+    public int getVersion();
+    public boolean inTransaction();
+    public long insert(java.lang.String, java.lang.String, android.content.ContentValues);
+    public long insertOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
+    public long insertWithOnConflict(java.lang.String, java.lang.String, android.content.ContentValues, int);
+    public boolean isDatabaseIntegrityOk();
+    public boolean isDbLockedByCurrentThread();
+    public boolean isDbLockedByOtherThreads();
+    public boolean isOpen();
+    public boolean isReadOnly();
+    public boolean isWriteAheadLoggingEnabled();
+    public void markTableSyncable(java.lang.String, java.lang.String);
+    public void markTableSyncable(java.lang.String, java.lang.String, java.lang.String);
+    public boolean needUpgrade(int);
+    protected void onAllReferencesReleased();
+    public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int);
+    public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int, android.database.DatabaseErrorHandler);
+    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase$CursorFactory);
+    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory);
+    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
+    public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
+    public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
+    public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
+    public android.database.Cursor rawQuery(java.lang.String, java.lang.String[]);
+    public android.database.Cursor rawQuery(java.lang.String, java.lang.String[], android.os.CancellationSignal);
+    public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String);
+    public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
+    public static int releaseMemory();
+    public long replace(java.lang.String, java.lang.String, android.content.ContentValues);
+    public long replaceOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
+    public void setForeignKeyConstraintsEnabled(boolean);
+    public void setLocale(java.util.Locale);
+    public void setLockingEnabled(boolean);
+    public void setMaxSqlCacheSize(int);
+    public long setMaximumSize(long);
+    public void setPageSize(long);
+    public void setTransactionSuccessful();
+    public void setVersion(int);
+    public java.lang.String toString();
+    public int update(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[]);
+    public int updateWithOnConflict(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[], int);
+    public boolean yieldIfContended();
+    public boolean yieldIfContendedSafely();
+    public boolean yieldIfContendedSafely(long);
+
+
+    public static int CONFLICT_ABORT;
+    public static int CONFLICT_FAIL;
+    public static int CONFLICT_IGNORE;
+    public static int CONFLICT_NONE;
+    public static int CONFLICT_REPLACE;
+    public static int CONFLICT_ROLLBACK;
+    public static int CREATE_IF_NECESSARY;
+    public static int ENABLE_WRITE_AHEAD_LOGGING;
+    public static int MAX_SQL_CACHE_SIZE;
+    public static int NO_LOCALIZED_COLLATORS;
+    public static int OPEN_READONLY;
+    public static int OPEN_READWRITE;
+    public static int SQLITE_MAX_LIKE_PATTERN_LENGTH;
+}
+
+-keep class android.database.sqlite.SQLiteDatabase$CursorFactory {
+
+    public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
+
+
+}
+
+-keep class android.database.sqlite.SQLiteProgram {
+
+    public void bindAllArgsAsStrings(java.lang.String[]);
+    public void bindBlob(int, byte[]);
+    public void bindDouble(int, double);
+    public void bindLong(int, long);
+    public void bindNull(int);
+    public void bindString(int, java.lang.String);
+    public void clearBindings();
+    public int getUniqueId();
+    protected void onAllReferencesReleased();
+
+
+}
+
+-keep class android.database.sqlite.SQLiteQuery {
+
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.database.sqlite.SQLiteStatement {
+
+    public void execute();
+    public long executeInsert();
+    public int executeUpdateDelete();
+    public android.os.ParcelFileDescriptor simpleQueryForBlobFileDescriptor();
+    public long simpleQueryForLong();
+    public java.lang.String simpleQueryForString();
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.database.sqlite.SQLiteTransactionListener {
+
+    public abstract void onBegin();
+    public abstract void onCommit();
+    public abstract void onRollback();
+
+
+}
+
+-keep class android.graphics.Bitmap {
+
+    public boolean compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream);
+    public android.graphics.Bitmap copy(android.graphics.Bitmap$Config, boolean);
+    public void copyPixelsFromBuffer(java.nio.Buffer);
+    public void copyPixelsToBuffer(java.nio.Buffer);
+    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap);
+    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int);
+    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int, android.graphics.Matrix, boolean);
+    public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config);
+    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config);
+    public static android.graphics.Bitmap createBitmap(int[], int, int, int, int, android.graphics.Bitmap$Config);
+    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, int, int, android.graphics.Bitmap$Config);
+    public static android.graphics.Bitmap createBitmap(int[], int, int, android.graphics.Bitmap$Config);
+    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, android.graphics.Bitmap$Config);
+    public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, boolean);
+    public int describeContents();
+    public void eraseColor(int);
+    public android.graphics.Bitmap extractAlpha();
+    public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
+    public int getAllocationByteCount();
+    public int getByteCount();
+    public android.graphics.Bitmap$Config getConfig();
+    public int getDensity();
+    public int getGenerationId();
+    public int getHeight();
+    public byte[] getNinePatchChunk();
+    public int getPixel(int, int);
+    public void getPixels(int[], int, int, int, int, int, int);
+    public int getRowBytes();
+    public int getScaledHeight(android.graphics.Canvas);
+    public int getScaledHeight(android.util.DisplayMetrics);
+    public int getScaledHeight(int);
+    public int getScaledWidth(android.graphics.Canvas);
+    public int getScaledWidth(android.util.DisplayMetrics);
+    public int getScaledWidth(int);
+    public int getWidth();
+    public boolean hasAlpha();
+    public boolean hasMipMap();
+    public boolean isMutable();
+    public boolean isPremultiplied();
+    public boolean isRecycled();
+    public void prepareToDraw();
+    public void reconfigure(int, int, android.graphics.Bitmap$Config);
+    public void recycle();
+    public boolean sameAs(android.graphics.Bitmap);
+    public void setConfig(android.graphics.Bitmap$Config);
+    public void setDensity(int);
+    public void setHasAlpha(boolean);
+    public void setHasMipMap(boolean);
+    public void setHeight(int);
+    public void setPixel(int, int, int);
+    public void setPixels(int[], int, int, int, int, int, int);
+    public void setPremultiplied(boolean);
+    public void setWidth(int);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int DENSITY_NONE;
+}
+
+-keep class android.graphics.Bitmap$CompressFormat {
+
+    public static android.graphics.Bitmap$CompressFormat valueOf(java.lang.String);
+    public static android.graphics.Bitmap$CompressFormat[] values();
+
+    public static android.graphics.Bitmap$CompressFormat JPEG;
+    public static android.graphics.Bitmap$CompressFormat PNG;
+    public static android.graphics.Bitmap$CompressFormat WEBP;
+
+}
+
+-keep class android.graphics.Bitmap$Config {
+
+    public static android.graphics.Bitmap$Config valueOf(java.lang.String);
+    public static android.graphics.Bitmap$Config[] values();
+
+    public static android.graphics.Bitmap$Config ALPHA_8;
+    public static android.graphics.Bitmap$Config ARGB_4444;
+    public static android.graphics.Bitmap$Config ARGB_8888;
+    public static android.graphics.Bitmap$Config RGB_565;
+
+}
+
+-keep class android.graphics.BitmapFactory {
+    <init>();
+
+    public static android.graphics.Bitmap decodeByteArray(byte[], int, int, android.graphics.BitmapFactory$Options);
+    public static android.graphics.Bitmap decodeByteArray(byte[], int, int);
+    public static android.graphics.Bitmap decodeFile(java.lang.String, android.graphics.BitmapFactory$Options);
+    public static android.graphics.Bitmap decodeFile(java.lang.String);
+    public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor, android.graphics.Rect, android.graphics.BitmapFactory$Options);
+    public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor);
+    public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int, android.graphics.BitmapFactory$Options);
+    public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int);
+    public static android.graphics.Bitmap decodeResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
+    public static android.graphics.Bitmap decodeStream(java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
+    public static android.graphics.Bitmap decodeStream(java.io.InputStream);
+
+
+}
+
+-keep class android.graphics.BitmapFactory$Options {
+    <init>();
+
+    public void requestCancelDecode();
+
+
+    public android.graphics.Bitmap inBitmap;
+    public int inDensity;
+    public boolean inDither;
+    public boolean inInputShareable;
+    public boolean inJustDecodeBounds;
+    public boolean inMutable;
+    public boolean inPreferQualityOverSpeed;
+    public android.graphics.Bitmap$Config inPreferredConfig;
+    public boolean inPremultiplied;
+    public boolean inPurgeable;
+    public int inSampleSize;
+    public boolean inScaled;
+    public int inScreenDensity;
+    public int inTargetDensity;
+    public byte[] inTempStorage;
+    public boolean mCancel;
+    public int outHeight;
+    public java.lang.String outMimeType;
+    public int outWidth;
+}
+
+-keep class android.graphics.Canvas {
+    <init>();
+    <init>(android.graphics.Bitmap);
+
+    public boolean clipPath(android.graphics.Path, android.graphics.Region$Op);
+    public boolean clipPath(android.graphics.Path);
+    public boolean clipRect(android.graphics.RectF, android.graphics.Region$Op);
+    public boolean clipRect(android.graphics.Rect, android.graphics.Region$Op);
+    public boolean clipRect(android.graphics.RectF);
+    public boolean clipRect(android.graphics.Rect);
+    public boolean clipRect(float, float, float, float, android.graphics.Region$Op);
+    public boolean clipRect(float, float, float, float);
+    public boolean clipRect(int, int, int, int);
+    public boolean clipRegion(android.graphics.Region, android.graphics.Region$Op);
+    public boolean clipRegion(android.graphics.Region);
+    public void concat(android.graphics.Matrix);
+    public void drawARGB(int, int, int, int);
+    public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
+    public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
+    public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
+    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
+    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
+    public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
+    public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
+    public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
+    public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
+    public void drawCircle(float, float, float, android.graphics.Paint);
+    public void drawColor(int);
+    public void drawColor(int, android.graphics.PorterDuff$Mode);
+    public void drawLine(float, float, float, float, android.graphics.Paint);
+    public void drawLines(float[], int, int, android.graphics.Paint);
+    public void drawLines(float[], android.graphics.Paint);
+    public void drawOval(android.graphics.RectF, android.graphics.Paint);
+    public void drawOval(float, float, float, float, android.graphics.Paint);
+    public void drawPaint(android.graphics.Paint);
+    public void drawPath(android.graphics.Path, android.graphics.Paint);
+    public void drawPicture(android.graphics.Picture);
+    public void drawPicture(android.graphics.Picture, android.graphics.RectF);
+    public void drawPicture(android.graphics.Picture, android.graphics.Rect);
+    public void drawPoint(float, float, android.graphics.Paint);
+    public void drawPoints(float[], int, int, android.graphics.Paint);
+    public void drawPoints(float[], android.graphics.Paint);
+    public void drawPosText(char[], int, int, float[], android.graphics.Paint);
+    public void drawPosText(java.lang.String, float[], android.graphics.Paint);
+    public void drawRGB(int, int, int);
+    public void drawRect(android.graphics.RectF, android.graphics.Paint);
+    public void drawRect(android.graphics.Rect, android.graphics.Paint);
+    public void drawRect(float, float, float, float, android.graphics.Paint);
+    public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
+    public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
+    public void drawText(char[], int, int, float, float, android.graphics.Paint);
+    public void drawText(java.lang.String, float, float, android.graphics.Paint);
+    public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
+    public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
+    public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
+    public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
+    public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
+    public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
+    public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
+    public boolean getClipBounds(android.graphics.Rect);
+    public android.graphics.Rect getClipBounds();
+    public int getDensity();
+    public android.graphics.DrawFilter getDrawFilter();
+    public int getHeight();
+    public void getMatrix(android.graphics.Matrix);
+    public android.graphics.Matrix getMatrix();
+    public int getMaximumBitmapHeight();
+    public int getMaximumBitmapWidth();
+    public int getSaveCount();
+    public int getWidth();
+    public boolean isHardwareAccelerated();
+    public boolean isOpaque();
+    public boolean quickReject(android.graphics.RectF, android.graphics.Canvas$EdgeType);
+    public boolean quickReject(android.graphics.Path, android.graphics.Canvas$EdgeType);
+    public boolean quickReject(float, float, float, float, android.graphics.Canvas$EdgeType);
+    public void restore();
+    public void restoreToCount(int);
+    public void rotate(float);
+    public void rotate(float, float, float);
+    public int save();
+    public int save(int);
+    public int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
+    public int saveLayer(android.graphics.RectF, android.graphics.Paint);
+    public int saveLayer(float, float, float, float, android.graphics.Paint, int);
+    public int saveLayer(float, float, float, float, android.graphics.Paint);
+    public int saveLayerAlpha(android.graphics.RectF, int, int);
+    public int saveLayerAlpha(android.graphics.RectF, int);
+    public int saveLayerAlpha(float, float, float, float, int, int);
+    public int saveLayerAlpha(float, float, float, float, int);
+    public void scale(float, float);
+    public void scale(float, float, float, float);
+    public void setBitmap(android.graphics.Bitmap);
+    public void setDensity(int);
+    public void setDrawFilter(android.graphics.DrawFilter);
+    public void setMatrix(android.graphics.Matrix);
+    public void skew(float, float);
+    public void translate(float, float);
+
+
+    public static int ALL_SAVE_FLAG;
+    public static int CLIP_SAVE_FLAG;
+    public static int CLIP_TO_LAYER_SAVE_FLAG;
+    public static int FULL_COLOR_LAYER_SAVE_FLAG;
+    public static int HAS_ALPHA_LAYER_SAVE_FLAG;
+    public static int MATRIX_SAVE_FLAG;
+}
+
+-keep class android.graphics.Canvas$EdgeType {
+
+    public static android.graphics.Canvas$EdgeType valueOf(java.lang.String);
+    public static android.graphics.Canvas$EdgeType[] values();
+
+    public static android.graphics.Canvas$EdgeType AA;
+    public static android.graphics.Canvas$EdgeType BW;
+
+}
+
+-keep class android.graphics.Canvas$VertexMode {
+
+    public static android.graphics.Canvas$VertexMode valueOf(java.lang.String);
+    public static android.graphics.Canvas$VertexMode[] values();
+
+    public static android.graphics.Canvas$VertexMode TRIANGLES;
+    public static android.graphics.Canvas$VertexMode TRIANGLE_FAN;
+    public static android.graphics.Canvas$VertexMode TRIANGLE_STRIP;
+
+}
+
+-keep class android.graphics.ColorFilter {
+    <init>();
+
+    protected void finalize();
+
+
+}
+
+-keep class android.graphics.DrawFilter {
+    <init>();
+
+    protected void finalize();
+
+
+}
+
+-keep class android.graphics.MaskFilter {
+    <init>();
+
+    protected void finalize();
+
+
+}
+
+-keep class android.graphics.Matrix {
+    <init>();
+    <init>(android.graphics.Matrix);
+
+    public boolean equals(java.lang.Object);
+    protected void finalize();
+    public void getValues(float[]);
+    public int hashCode();
+    public boolean invert(android.graphics.Matrix);
+    public boolean isAffine();
+    public boolean isIdentity();
+    public void mapPoints(float[], int, float[], int, int);
+    public void mapPoints(float[], float[]);
+    public void mapPoints(float[]);
+    public float mapRadius(float);
+    public boolean mapRect(android.graphics.RectF, android.graphics.RectF);
+    public boolean mapRect(android.graphics.RectF);
+    public void mapVectors(float[], int, float[], int, int);
+    public void mapVectors(float[], float[]);
+    public void mapVectors(float[]);
+    public boolean postConcat(android.graphics.Matrix);
+    public boolean postRotate(float, float, float);
+    public boolean postRotate(float);
+    public boolean postScale(float, float, float, float);
+    public boolean postScale(float, float);
+    public boolean postSkew(float, float, float, float);
+    public boolean postSkew(float, float);
+    public boolean postTranslate(float, float);
+    public boolean preConcat(android.graphics.Matrix);
+    public boolean preRotate(float, float, float);
+    public boolean preRotate(float);
+    public boolean preScale(float, float, float, float);
+    public boolean preScale(float, float);
+    public boolean preSkew(float, float, float, float);
+    public boolean preSkew(float, float);
+    public boolean preTranslate(float, float);
+    public boolean rectStaysRect();
+    public void reset();
+    public void set(android.graphics.Matrix);
+    public boolean setConcat(android.graphics.Matrix, android.graphics.Matrix);
+    public boolean setPolyToPoly(float[], int, float[], int, int);
+    public boolean setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix$ScaleToFit);
+    public void setRotate(float, float, float);
+    public void setRotate(float);
+    public void setScale(float, float, float, float);
+    public void setScale(float, float);
+    public void setSinCos(float, float, float, float);
+    public void setSinCos(float, float);
+    public void setSkew(float, float, float, float);
+    public void setSkew(float, float);
+    public void setTranslate(float, float);
+    public void setValues(float[]);
+    public java.lang.String toShortString();
+    public java.lang.String toString();
+
+
+    public static int MPERSP_0;
+    public static int MPERSP_1;
+    public static int MPERSP_2;
+    public static int MSCALE_X;
+    public static int MSCALE_Y;
+    public static int MSKEW_X;
+    public static int MSKEW_Y;
+    public static int MTRANS_X;
+    public static int MTRANS_Y;
+}
+
+-keep class android.graphics.Matrix$ScaleToFit {
+
+    public static android.graphics.Matrix$ScaleToFit valueOf(java.lang.String);
+    public static android.graphics.Matrix$ScaleToFit[] values();
+
+    public static android.graphics.Matrix$ScaleToFit CENTER;
+    public static android.graphics.Matrix$ScaleToFit END;
+    public static android.graphics.Matrix$ScaleToFit FILL;
+    public static android.graphics.Matrix$ScaleToFit START;
+
+}
+
+-keep class android.graphics.Movie {
+
+    public static android.graphics.Movie decodeByteArray(byte[], int, int);
+    public static android.graphics.Movie decodeFile(java.lang.String);
+    public static android.graphics.Movie decodeStream(java.io.InputStream);
+    public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
+    public void draw(android.graphics.Canvas, float, float);
+    public int duration();
+    protected void finalize();
+    public int height();
+    public boolean isOpaque();
+    public boolean setTime(int);
+    public int width();
+
+
+}
+
+-keep class android.graphics.Outline {
+    <init>();
+    <init>(android.graphics.Outline);
+
+    public boolean canClip();
+    public float getAlpha();
+    public boolean isEmpty();
+    public void offset(int, int);
+    public void set(android.graphics.Outline);
+    public void setAlpha(float);
+    public void setConvexPath(android.graphics.Path);
+    public void setEmpty();
+    public void setOval(int, int, int, int);
+    public void setOval(android.graphics.Rect);
+    public void setRect(int, int, int, int);
+    public void setRect(android.graphics.Rect);
+    public void setRoundRect(int, int, int, int, float);
+    public void setRoundRect(android.graphics.Rect, float);
+
+
+}
+
+-keep class android.graphics.Paint {
+    <init>();
+    <init>(int);
+    <init>(android.graphics.Paint);
+
+    public float ascent();
+    public int breakText(char[], int, int, float, float[]);
+    public int breakText(java.lang.CharSequence, int, int, boolean, float, float[]);
+    public int breakText(java.lang.String, boolean, float, float[]);
+    public void clearShadowLayer();
+    public float descent();
+    protected void finalize();
+    public int getAlpha();
+    public int getColor();
+    public android.graphics.ColorFilter getColorFilter();
+    public boolean getFillPath(android.graphics.Path, android.graphics.Path);
+    public int getFlags();
+    public java.lang.String getFontFeatureSettings();
+    public float getFontMetrics(android.graphics.Paint$FontMetrics);
+    public android.graphics.Paint$FontMetrics getFontMetrics();
+    public int getFontMetricsInt(android.graphics.Paint$FontMetricsInt);
+    public android.graphics.Paint$FontMetricsInt getFontMetricsInt();
+    public float getFontSpacing();
+    public int getHinting();
+    public float getLetterSpacing();
+    public android.graphics.MaskFilter getMaskFilter();
+    public int getOffsetForAdvance(char[], int, int, int, int, boolean, float);
+    public int getOffsetForAdvance(java.lang.CharSequence, int, int, int, int, boolean, float);
+    public android.graphics.PathEffect getPathEffect();
+    public android.graphics.Rasterizer getRasterizer();
+    public float getRunAdvance(char[], int, int, int, int, boolean, int);
+    public float getRunAdvance(java.lang.CharSequence, int, int, int, int, boolean, int);
+    public android.graphics.Shader getShader();
+    public android.graphics.Paint$Cap getStrokeCap();
+    public android.graphics.Paint$Join getStrokeJoin();
+    public float getStrokeMiter();
+    public float getStrokeWidth();
+    public android.graphics.Paint$Style getStyle();
+    public android.graphics.Paint$Align getTextAlign();
+    public void getTextBounds(java.lang.String, int, int, android.graphics.Rect);
+    public void getTextBounds(char[], int, int, android.graphics.Rect);
+    public java.util.Locale getTextLocale();
+    public void getTextPath(char[], int, int, float, float, android.graphics.Path);
+    public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path);
+    public float getTextScaleX();
+    public float getTextSize();
+    public float getTextSkewX();
+    public int getTextWidths(char[], int, int, float[]);
+    public int getTextWidths(java.lang.CharSequence, int, int, float[]);
+    public int getTextWidths(java.lang.String, int, int, float[]);
+    public int getTextWidths(java.lang.String, float[]);
+    public android.graphics.Typeface getTypeface();
+    public android.graphics.Xfermode getXfermode();
+    public boolean hasGlyph(java.lang.String);
+    public boolean isAntiAlias();
+    public boolean isDither();
+    public boolean isElegantTextHeight();
+    public boolean isFakeBoldText();
+    public boolean isFilterBitmap();
+    public boolean isLinearText();
+    public boolean isStrikeThruText();
+    public boolean isSubpixelText();
+    public boolean isUnderlineText();
+    public float measureText(char[], int, int);
+    public float measureText(java.lang.String, int, int);
+    public float measureText(java.lang.String);
+    public float measureText(java.lang.CharSequence, int, int);
+    public void reset();
+    public void set(android.graphics.Paint);
+    public void setARGB(int, int, int, int);
+    public void setAlpha(int);
+    public void setAntiAlias(boolean);
+    public void setColor(int);
+    public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
+    public void setDither(boolean);
+    public void setElegantTextHeight(boolean);
+    public void setFakeBoldText(boolean);
+    public void setFilterBitmap(boolean);
+    public void setFlags(int);
+    public void setFontFeatureSettings(java.lang.String);
+    public void setHinting(int);
+    public void setLetterSpacing(float);
+    public void setLinearText(boolean);
+    public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
+    public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
+    public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
+    public android.graphics.Shader setShader(android.graphics.Shader);
+    public void setShadowLayer(float, float, float, int);
+    public void setStrikeThruText(boolean);
+    public void setStrokeCap(android.graphics.Paint$Cap);
+    public void setStrokeJoin(android.graphics.Paint$Join);
+    public void setStrokeMiter(float);
+    public void setStrokeWidth(float);
+    public void setStyle(android.graphics.Paint$Style);
+    public void setSubpixelText(boolean);
+    public void setTextAlign(android.graphics.Paint$Align);
+    public void setTextLocale(java.util.Locale);
+    public void setTextScaleX(float);
+    public void setTextSize(float);
+    public void setTextSkewX(float);
+    public android.graphics.Typeface setTypeface(android.graphics.Typeface);
+    public void setUnderlineText(boolean);
+    public android.graphics.Xfermode setXfermode(android.graphics.Xfermode);
+
+
+    public static int ANTI_ALIAS_FLAG;
+    public static int DEV_KERN_TEXT_FLAG;
+    public static int DITHER_FLAG;
+    public static int EMBEDDED_BITMAP_TEXT_FLAG;
+    public static int FAKE_BOLD_TEXT_FLAG;
+    public static int FILTER_BITMAP_FLAG;
+    public static int HINTING_OFF;
+    public static int HINTING_ON;
+    public static int LINEAR_TEXT_FLAG;
+    public static int STRIKE_THRU_TEXT_FLAG;
+    public static int SUBPIXEL_TEXT_FLAG;
+    public static int UNDERLINE_TEXT_FLAG;
+}
+
+-keep class android.graphics.Paint$Align {
+
+    public static android.graphics.Paint$Align valueOf(java.lang.String);
+    public static android.graphics.Paint$Align[] values();
+
+    public static android.graphics.Paint$Align CENTER;
+    public static android.graphics.Paint$Align LEFT;
+    public static android.graphics.Paint$Align RIGHT;
+
+}
+
+-keep class android.graphics.Paint$Cap {
+
+    public static android.graphics.Paint$Cap valueOf(java.lang.String);
+    public static android.graphics.Paint$Cap[] values();
+
+    public static android.graphics.Paint$Cap BUTT;
+    public static android.graphics.Paint$Cap ROUND;
+    public static android.graphics.Paint$Cap SQUARE;
+
+}
+
+-keep class android.graphics.Paint$FontMetrics {
+    <init>();
+
+
+
+    public float ascent;
+    public float bottom;
+    public float descent;
+    public float leading;
+    public float top;
+}
+
+-keep class android.graphics.Paint$FontMetricsInt {
+    <init>();
+
+    public java.lang.String toString();
+
+
+    public int ascent;
+    public int bottom;
+    public int descent;
+    public int leading;
+    public int top;
+}
+
+-keep class android.graphics.Paint$Join {
+
+    public static android.graphics.Paint$Join valueOf(java.lang.String);
+    public static android.graphics.Paint$Join[] values();
+
+    public static android.graphics.Paint$Join BEVEL;
+    public static android.graphics.Paint$Join MITER;
+    public static android.graphics.Paint$Join ROUND;
+
+}
+
+-keep class android.graphics.Paint$Style {
+
+    public static android.graphics.Paint$Style valueOf(java.lang.String);
+    public static android.graphics.Paint$Style[] values();
+
+    public static android.graphics.Paint$Style FILL;
+    public static android.graphics.Paint$Style FILL_AND_STROKE;
+    public static android.graphics.Paint$Style STROKE;
+
+}
+
+-keep class android.graphics.Path {
+    <init>();
+    <init>(android.graphics.Path);
+
+    public void addArc(android.graphics.RectF, float, float);
+    public void addArc(float, float, float, float, float, float);
+    public void addCircle(float, float, float, android.graphics.Path$Direction);
+    public void addOval(android.graphics.RectF, android.graphics.Path$Direction);
+    public void addOval(float, float, float, float, android.graphics.Path$Direction);
+    public void addPath(android.graphics.Path, float, float);
+    public void addPath(android.graphics.Path);
+    public void addPath(android.graphics.Path, android.graphics.Matrix);
+    public void addRect(android.graphics.RectF, android.graphics.Path$Direction);
+    public void addRect(float, float, float, float, android.graphics.Path$Direction);
+    public void addRoundRect(android.graphics.RectF, float, float, android.graphics.Path$Direction);
+    public void addRoundRect(float, float, float, float, float, float, android.graphics.Path$Direction);
+    public void addRoundRect(android.graphics.RectF, float[], android.graphics.Path$Direction);
+    public void addRoundRect(float, float, float, float, float[], android.graphics.Path$Direction);
+    public void arcTo(android.graphics.RectF, float, float, boolean);
+    public void arcTo(android.graphics.RectF, float, float);
+    public void arcTo(float, float, float, float, float, float, boolean);
+    public void close();
+    public void computeBounds(android.graphics.RectF, boolean);
+    public void cubicTo(float, float, float, float, float, float);
+    protected void finalize();
+    public android.graphics.Path$FillType getFillType();
+    public void incReserve(int);
+    public boolean isConvex();
+    public boolean isEmpty();
+    public boolean isInverseFillType();
+    public boolean isRect(android.graphics.RectF);
+    public void lineTo(float, float);
+    public void moveTo(float, float);
+    public void offset(float, float, android.graphics.Path);
+    public void offset(float, float);
+    public boolean op(android.graphics.Path, android.graphics.Path$Op);
+    public boolean op(android.graphics.Path, android.graphics.Path, android.graphics.Path$Op);
+    public void quadTo(float, float, float, float);
+    public void rCubicTo(float, float, float, float, float, float);
+    public void rLineTo(float, float);
+    public void rMoveTo(float, float);
+    public void rQuadTo(float, float, float, float);
+    public void reset();
+    public void rewind();
+    public void set(android.graphics.Path);
+    public void setFillType(android.graphics.Path$FillType);
+    public void setLastPoint(float, float);
+    public void toggleInverseFillType();
+    public void transform(android.graphics.Matrix, android.graphics.Path);
+    public void transform(android.graphics.Matrix);
+
+
+}
+
+-keep class android.graphics.Path$Direction {
+
+    public static android.graphics.Path$Direction valueOf(java.lang.String);
+    public static android.graphics.Path$Direction[] values();
+
+    public static android.graphics.Path$Direction CCW;
+    public static android.graphics.Path$Direction CW;
+
+}
+
+-keep class android.graphics.Path$FillType {
+
+    public static android.graphics.Path$FillType valueOf(java.lang.String);
+    public static android.graphics.Path$FillType[] values();
+
+    public static android.graphics.Path$FillType EVEN_ODD;
+    public static android.graphics.Path$FillType INVERSE_EVEN_ODD;
+    public static android.graphics.Path$FillType INVERSE_WINDING;
+    public static android.graphics.Path$FillType WINDING;
+
+}
+
+-keep class android.graphics.Path$Op {
+
+    public static android.graphics.Path$Op valueOf(java.lang.String);
+    public static android.graphics.Path$Op[] values();
+
+    public static android.graphics.Path$Op DIFFERENCE;
+    public static android.graphics.Path$Op INTERSECT;
+    public static android.graphics.Path$Op REVERSE_DIFFERENCE;
+    public static android.graphics.Path$Op UNION;
+    public static android.graphics.Path$Op XOR;
+
+}
+
+-keep class android.graphics.PathEffect {
+    <init>();
+
+    protected void finalize();
+
+
+}
+
+-keep class android.graphics.Picture {
+    <init>();
+    <init>(android.graphics.Picture);
+
+    public android.graphics.Canvas beginRecording(int, int);
+    public static android.graphics.Picture createFromStream(java.io.InputStream);
+    public void draw(android.graphics.Canvas);
+    public void endRecording();
+    protected void finalize();
+    public int getHeight();
+    public int getWidth();
+    public void writeToStream(java.io.OutputStream);
+
+
+}
+
+-keep class android.graphics.Point {
+    <init>();
+    <init>(int, int);
+    <init>(android.graphics.Point);
+
+    public int describeContents();
+    public boolean equals(int, int);
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+    public void negate();
+    public void offset(int, int);
+    public void readFromParcel(android.os.Parcel);
+    public void set(int, int);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public int x;
+    public int y;
+}
+
+-keep class android.graphics.PorterDuff {
+    <init>();
+
+
+
+}
+
+-keep class android.graphics.PorterDuff$Mode {
+
+    public static android.graphics.PorterDuff$Mode valueOf(java.lang.String);
+    public static android.graphics.PorterDuff$Mode[] values();
+
+    public static android.graphics.PorterDuff$Mode ADD;
+    public static android.graphics.PorterDuff$Mode CLEAR;
+    public static android.graphics.PorterDuff$Mode DARKEN;
+    public static android.graphics.PorterDuff$Mode DST;
+    public static android.graphics.PorterDuff$Mode DST_ATOP;
+    public static android.graphics.PorterDuff$Mode DST_IN;
+    public static android.graphics.PorterDuff$Mode DST_OUT;
+    public static android.graphics.PorterDuff$Mode DST_OVER;
+    public static android.graphics.PorterDuff$Mode LIGHTEN;
+    public static android.graphics.PorterDuff$Mode MULTIPLY;
+    public static android.graphics.PorterDuff$Mode OVERLAY;
+    public static android.graphics.PorterDuff$Mode SCREEN;
+    public static android.graphics.PorterDuff$Mode SRC;
+    public static android.graphics.PorterDuff$Mode SRC_ATOP;
+    public static android.graphics.PorterDuff$Mode SRC_IN;
+    public static android.graphics.PorterDuff$Mode SRC_OUT;
+    public static android.graphics.PorterDuff$Mode SRC_OVER;
+    public static android.graphics.PorterDuff$Mode XOR;
+
+}
+
+-keep class android.graphics.Rasterizer {
+    <init>();
+
+    protected void finalize();
+
+
+}
+
+-keep class android.graphics.Rect {
+    <init>();
+    <init>(int, int, int, int);
+    <init>(android.graphics.Rect);
+
+    public int centerX();
+    public int centerY();
+    public boolean contains(int, int);
+    public boolean contains(int, int, int, int);
+    public boolean contains(android.graphics.Rect);
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public float exactCenterX();
+    public float exactCenterY();
+    public java.lang.String flattenToString();
+    public int hashCode();
+    public int height();
+    public void inset(int, int);
+    public boolean intersect(int, int, int, int);
+    public boolean intersect(android.graphics.Rect);
+    public boolean intersects(int, int, int, int);
+    public static boolean intersects(android.graphics.Rect, android.graphics.Rect);
+    public boolean isEmpty();
+    public void offset(int, int);
+    public void offsetTo(int, int);
+    public void readFromParcel(android.os.Parcel);
+    public void set(int, int, int, int);
+    public void set(android.graphics.Rect);
+    public void setEmpty();
+    public boolean setIntersect(android.graphics.Rect, android.graphics.Rect);
+    public void sort();
+    public java.lang.String toShortString();
+    public java.lang.String toString();
+    public static android.graphics.Rect unflattenFromString(java.lang.String);
+    public void union(int, int, int, int);
+    public void union(android.graphics.Rect);
+    public void union(int, int);
+    public int width();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public int bottom;
+    public int left;
+    public int right;
+    public int top;
+}
+
+-keep class android.graphics.RectF {
+    <init>();
+    <init>(float, float, float, float);
+    <init>(android.graphics.RectF);
+    <init>(android.graphics.Rect);
+
+    public float centerX();
+    public float centerY();
+    public boolean contains(float, float);
+    public boolean contains(float, float, float, float);
+    public boolean contains(android.graphics.RectF);
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+    public float height();
+    public void inset(float, float);
+    public boolean intersect(float, float, float, float);
+    public boolean intersect(android.graphics.RectF);
+    public boolean intersects(float, float, float, float);
+    public static boolean intersects(android.graphics.RectF, android.graphics.RectF);
+    public boolean isEmpty();
+    public void offset(float, float);
+    public void offsetTo(float, float);
+    public void readFromParcel(android.os.Parcel);
+    public void round(android.graphics.Rect);
+    public void roundOut(android.graphics.Rect);
+    public void set(float, float, float, float);
+    public void set(android.graphics.RectF);
+    public void set(android.graphics.Rect);
+    public void setEmpty();
+    public boolean setIntersect(android.graphics.RectF, android.graphics.RectF);
+    public void sort();
+    public java.lang.String toShortString();
+    public java.lang.String toString();
+    public void union(float, float, float, float);
+    public void union(android.graphics.RectF);
+    public void union(float, float);
+    public float width();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public float bottom;
+    public float left;
+    public float right;
+    public float top;
+}
+
+-keep class android.graphics.Region {
+    <init>();
+    <init>(android.graphics.Region);
+    <init>(android.graphics.Rect);
+    <init>(int, int, int, int);
+
+    public boolean contains(int, int);
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    protected void finalize();
+    public android.graphics.Path getBoundaryPath();
+    public boolean getBoundaryPath(android.graphics.Path);
+    public android.graphics.Rect getBounds();
+    public boolean getBounds(android.graphics.Rect);
+    public boolean isComplex();
+    public boolean isEmpty();
+    public boolean isRect();
+    public boolean op(android.graphics.Rect, android.graphics.Region$Op);
+    public boolean op(int, int, int, int, android.graphics.Region$Op);
+    public boolean op(android.graphics.Region, android.graphics.Region$Op);
+    public boolean op(android.graphics.Rect, android.graphics.Region, android.graphics.Region$Op);
+    public boolean op(android.graphics.Region, android.graphics.Region, android.graphics.Region$Op);
+    public boolean quickContains(android.graphics.Rect);
+    public boolean quickContains(int, int, int, int);
+    public boolean quickReject(android.graphics.Rect);
+    public boolean quickReject(int, int, int, int);
+    public boolean quickReject(android.graphics.Region);
+    public boolean set(android.graphics.Region);
+    public boolean set(android.graphics.Rect);
+    public boolean set(int, int, int, int);
+    public void setEmpty();
+    public boolean setPath(android.graphics.Path, android.graphics.Region);
+    public java.lang.String toString();
+    public void translate(int, int);
+    public void translate(int, int, android.graphics.Region);
+    public boolean union(android.graphics.Rect);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.graphics.Region$Op {
+
+    public static android.graphics.Region$Op valueOf(java.lang.String);
+    public static android.graphics.Region$Op[] values();
+
+    public static android.graphics.Region$Op DIFFERENCE;
+    public static android.graphics.Region$Op INTERSECT;
+    public static android.graphics.Region$Op REPLACE;
+    public static android.graphics.Region$Op REVERSE_DIFFERENCE;
+    public static android.graphics.Region$Op UNION;
+    public static android.graphics.Region$Op XOR;
+
+}
+
+-keep class android.graphics.Shader {
+    <init>();
+
+    protected void finalize();
+    public boolean getLocalMatrix(android.graphics.Matrix);
+    public void setLocalMatrix(android.graphics.Matrix);
+
+
+}
+
+-keep class android.graphics.Typeface {
+
+    public static android.graphics.Typeface create(java.lang.String, int);
+    public static android.graphics.Typeface create(android.graphics.Typeface, int);
+    public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
+    public static android.graphics.Typeface createFromFile(java.io.File);
+    public static android.graphics.Typeface createFromFile(java.lang.String);
+    public static android.graphics.Typeface defaultFromStyle(int);
+    public boolean equals(java.lang.Object);
+    protected void finalize();
+    public int getStyle();
+    public int hashCode();
+    public boolean isBold();
+    public boolean isItalic();
+
+
+    public static int BOLD;
+    public static int BOLD_ITALIC;
+    public static android.graphics.Typeface DEFAULT;
+    public static android.graphics.Typeface DEFAULT_BOLD;
+    public static int ITALIC;
+    public static android.graphics.Typeface MONOSPACE;
+    public static int NORMAL;
+    public static android.graphics.Typeface SANS_SERIF;
+    public static android.graphics.Typeface SERIF;
+}
+
+-keep class android.graphics.Xfermode {
+    <init>();
+
+    protected void finalize();
+
+
+}
+
+-keep class android.graphics.drawable.Drawable {
+    <init>();
+
+    public void applyTheme(android.content.res.Resources$Theme);
+    public boolean canApplyTheme();
+    public void clearColorFilter();
+    public void copyBounds(android.graphics.Rect);
+    public android.graphics.Rect copyBounds();
+    public static android.graphics.drawable.Drawable createFromPath(java.lang.String);
+    public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String);
+    public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String, android.graphics.BitmapFactory$Options);
+    public static android.graphics.drawable.Drawable createFromStream(java.io.InputStream, java.lang.String);
+    public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
+    public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
+    public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
+    public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
+    public abstract void draw(android.graphics.Canvas);
+    public int getAlpha();
+    public android.graphics.Rect getBounds();
+    public android.graphics.drawable.Drawable$Callback getCallback();
+    public int getChangingConfigurations();
+    public android.graphics.ColorFilter getColorFilter();
+    public android.graphics.drawable.Drawable$ConstantState getConstantState();
+    public android.graphics.drawable.Drawable getCurrent();
+    public android.graphics.Rect getDirtyBounds();
+    public void getHotspotBounds(android.graphics.Rect);
+    public int getIntrinsicHeight();
+    public int getIntrinsicWidth();
+    public int getLayoutDirection();
+    public int getLevel();
+    public int getMinimumHeight();
+    public int getMinimumWidth();
+    public abstract int getOpacity();
+    public void getOutline(android.graphics.Outline);
+    public boolean getPadding(android.graphics.Rect);
+    public int[] getState();
+    public android.graphics.Region getTransparentRegion();
+    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
+    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
+    public void invalidateSelf();
+    public boolean isAutoMirrored();
+    public boolean isFilterBitmap();
+    public boolean isStateful();
+    public boolean isVisible();
+    public void jumpToCurrentState();
+    public android.graphics.drawable.Drawable mutate();
+    protected void onBoundsChange(android.graphics.Rect);
+    public boolean onLayoutDirectionChanged(int);
+    protected boolean onLevelChange(int);
+    protected boolean onStateChange(int[]);
+    public static int resolveOpacity(int, int);
+    public void scheduleSelf(java.lang.Runnable, long);
+    public abstract void setAlpha(int);
+    public void setAutoMirrored(boolean);
+    public void setBounds(int, int, int, int);
+    public void setBounds(android.graphics.Rect);
+    public void setCallback(android.graphics.drawable.Drawable$Callback);
+    public void setChangingConfigurations(int);
+    public abstract void setColorFilter(android.graphics.ColorFilter);
+    public void setColorFilter(int, android.graphics.PorterDuff$Mode);
+    public void setDither(boolean);
+    public void setFilterBitmap(boolean);
+    public void setHotspot(float, float);
+    public void setHotspotBounds(int, int, int, int);
+    public boolean setLayoutDirection(int);
+    public boolean setLevel(int);
+    public boolean setState(int[]);
+    public void setTint(int);
+    public void setTintList(android.content.res.ColorStateList);
+    public void setTintMode(android.graphics.PorterDuff$Mode);
+    public boolean setVisible(boolean, boolean);
+    public void unscheduleSelf(java.lang.Runnable);
+
+
+}
+
+-keep class android.graphics.drawable.Drawable$Callback {
+
+    public abstract void invalidateDrawable(android.graphics.drawable.Drawable);
+    public abstract void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+    public abstract void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+
+
+}
+
+-keep class android.graphics.drawable.Drawable$ConstantState {
+    <init>();
+
+    public boolean canApplyTheme();
+    public abstract int getChangingConfigurations();
+    public abstract android.graphics.drawable.Drawable newDrawable();
+    public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources);
+    public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources, android.content.res.Resources$Theme);
+
+
+}
+
+-keep class android.media.AudioAttributes {
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public int getContentType();
+    public int getFlags();
+    public int getUsage();
+    public int hashCode();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static int CONTENT_TYPE_MOVIE;
+    public static int CONTENT_TYPE_MUSIC;
+    public static int CONTENT_TYPE_SONIFICATION;
+    public static int CONTENT_TYPE_SPEECH;
+    public static int CONTENT_TYPE_UNKNOWN;
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_AUDIBILITY_ENFORCED;
+    public static int FLAG_HW_AV_SYNC;
+    public static int USAGE_ALARM;
+    public static int USAGE_ASSISTANCE_ACCESSIBILITY;
+    public static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
+    public static int USAGE_ASSISTANCE_SONIFICATION;
+    public static int USAGE_GAME;
+    public static int USAGE_MEDIA;
+    public static int USAGE_NOTIFICATION;
+    public static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
+    public static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
+    public static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
+    public static int USAGE_NOTIFICATION_EVENT;
+    public static int USAGE_NOTIFICATION_RINGTONE;
+    public static int USAGE_UNKNOWN;
+    public static int USAGE_VOICE_COMMUNICATION;
+    public static int USAGE_VOICE_COMMUNICATION_SIGNALLING;
+}
+
+-keep class android.media.AudioDeviceCallback {
+    <init>();
+
+    public void onAudioDevicesAdded(android.media.AudioDeviceInfo[]);
+    public void onAudioDevicesRemoved(android.media.AudioDeviceInfo[]);
+
+
+}
+
+-keep class android.media.AudioDeviceInfo {
+
+    public int[] getChannelCounts();
+    public int[] getChannelIndexMasks();
+    public int[] getChannelMasks();
+    public int[] getEncodings();
+    public int getId();
+    public java.lang.CharSequence getProductName();
+    public int[] getSampleRates();
+    public int getType();
+    public boolean isSink();
+    public boolean isSource();
+
+
+    public static int TYPE_AUX_LINE;
+    public static int TYPE_BLUETOOTH_A2DP;
+    public static int TYPE_BLUETOOTH_SCO;
+    public static int TYPE_BUILTIN_EARPIECE;
+    public static int TYPE_BUILTIN_MIC;
+    public static int TYPE_BUILTIN_SPEAKER;
+    public static int TYPE_DOCK;
+    public static int TYPE_FM;
+    public static int TYPE_FM_TUNER;
+    public static int TYPE_HDMI;
+    public static int TYPE_HDMI_ARC;
+    public static int TYPE_IP;
+    public static int TYPE_LINE_ANALOG;
+    public static int TYPE_LINE_DIGITAL;
+    public static int TYPE_TELEPHONY;
+    public static int TYPE_TV_TUNER;
+    public static int TYPE_UNKNOWN;
+    public static int TYPE_USB_ACCESSORY;
+    public static int TYPE_USB_DEVICE;
+    public static int TYPE_WIRED_HEADPHONES;
+    public static int TYPE_WIRED_HEADSET;
+}
+
+-keep class android.media.AudioFormat {
+
+    public int getChannelCount();
+    public int getChannelIndexMask();
+    public int getChannelMask();
+    public int getEncoding();
+    public int getSampleRate();
+    public java.lang.String toString();
+
+
+    public static int CHANNEL_CONFIGURATION_DEFAULT;
+    public static int CHANNEL_CONFIGURATION_INVALID;
+    public static int CHANNEL_CONFIGURATION_MONO;
+    public static int CHANNEL_CONFIGURATION_STEREO;
+    public static int CHANNEL_INVALID;
+    public static int CHANNEL_IN_BACK;
+    public static int CHANNEL_IN_BACK_PROCESSED;
+    public static int CHANNEL_IN_DEFAULT;
+    public static int CHANNEL_IN_FRONT;
+    public static int CHANNEL_IN_FRONT_PROCESSED;
+    public static int CHANNEL_IN_LEFT;
+    public static int CHANNEL_IN_LEFT_PROCESSED;
+    public static int CHANNEL_IN_MONO;
+    public static int CHANNEL_IN_PRESSURE;
+    public static int CHANNEL_IN_RIGHT;
+    public static int CHANNEL_IN_RIGHT_PROCESSED;
+    public static int CHANNEL_IN_STEREO;
+    public static int CHANNEL_IN_VOICE_DNLINK;
+    public static int CHANNEL_IN_VOICE_UPLINK;
+    public static int CHANNEL_IN_X_AXIS;
+    public static int CHANNEL_IN_Y_AXIS;
+    public static int CHANNEL_IN_Z_AXIS;
+    public static int CHANNEL_OUT_5POINT1;
+    public static int CHANNEL_OUT_7POINT1;
+    public static int CHANNEL_OUT_7POINT1_SURROUND;
+    public static int CHANNEL_OUT_BACK_CENTER;
+    public static int CHANNEL_OUT_BACK_LEFT;
+    public static int CHANNEL_OUT_BACK_RIGHT;
+    public static int CHANNEL_OUT_DEFAULT;
+    public static int CHANNEL_OUT_FRONT_CENTER;
+    public static int CHANNEL_OUT_FRONT_LEFT;
+    public static int CHANNEL_OUT_FRONT_LEFT_OF_CENTER;
+    public static int CHANNEL_OUT_FRONT_RIGHT;
+    public static int CHANNEL_OUT_FRONT_RIGHT_OF_CENTER;
+    public static int CHANNEL_OUT_LOW_FREQUENCY;
+    public static int CHANNEL_OUT_MONO;
+    public static int CHANNEL_OUT_QUAD;
+    public static int CHANNEL_OUT_SIDE_LEFT;
+    public static int CHANNEL_OUT_SIDE_RIGHT;
+    public static int CHANNEL_OUT_STEREO;
+    public static int CHANNEL_OUT_SURROUND;
+    public static int ENCODING_AC3;
+    public static int ENCODING_DEFAULT;
+    public static int ENCODING_DTS;
+    public static int ENCODING_DTS_HD;
+    public static int ENCODING_E_AC3;
+    public static int ENCODING_INVALID;
+    public static int ENCODING_PCM_16BIT;
+    public static int ENCODING_PCM_8BIT;
+    public static int ENCODING_PCM_FLOAT;
+}
+
+-keep class android.media.AudioManager {
+
+    public int abandonAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener);
+    public void adjustStreamVolume(int, int, int);
+    public void adjustSuggestedStreamVolume(int, int, int);
+    public void adjustVolume(int, int);
+    public void dispatchMediaKeyEvent(android.view.KeyEvent);
+    public int generateAudioSessionId();
+    public android.media.AudioDeviceInfo[] getDevices(int);
+    public int getMode();
+    public java.lang.String getParameters(java.lang.String);
+    public java.lang.String getProperty(java.lang.String);
+    public int getRingerMode();
+    public int getRouting(int);
+    public int getStreamMaxVolume(int);
+    public int getStreamVolume(int);
+    public int getVibrateSetting(int);
+    public boolean isBluetoothA2dpOn();
+    public boolean isBluetoothScoAvailableOffCall();
+    public boolean isBluetoothScoOn();
+    public boolean isMicrophoneMute();
+    public boolean isMusicActive();
+    public boolean isSpeakerphoneOn();
+    public boolean isStreamMute(int);
+    public boolean isVolumeFixed();
+    public boolean isWiredHeadsetOn();
+    public void loadSoundEffects();
+    public void playSoundEffect(int);
+    public void playSoundEffect(int, float);
+    public void registerAudioDeviceCallback(android.media.AudioDeviceCallback, android.os.Handler);
+    public void registerMediaButtonEventReceiver(android.content.ComponentName);
+    public void registerMediaButtonEventReceiver(android.app.PendingIntent);
+    public void registerRemoteControlClient(android.media.RemoteControlClient);
+    public boolean registerRemoteController(android.media.RemoteController);
+    public int requestAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener, int, int);
+    public void setBluetoothA2dpOn(boolean);
+    public void setBluetoothScoOn(boolean);
+    public void setMicrophoneMute(boolean);
+    public void setMode(int);
+    public void setParameters(java.lang.String);
+    public void setRingerMode(int);
+    public void setRouting(int, int, int);
+    public void setSpeakerphoneOn(boolean);
+    public void setStreamMute(int, boolean);
+    public void setStreamSolo(int, boolean);
+    public void setStreamVolume(int, int, int);
+    public void setVibrateSetting(int, int);
+    public void setWiredHeadsetOn(boolean);
+    public boolean shouldVibrate(int);
+    public void startBluetoothSco();
+    public void stopBluetoothSco();
+    public void unloadSoundEffects();
+    public void unregisterAudioDeviceCallback(android.media.AudioDeviceCallback);
+    public void unregisterMediaButtonEventReceiver(android.content.ComponentName);
+    public void unregisterMediaButtonEventReceiver(android.app.PendingIntent);
+    public void unregisterRemoteControlClient(android.media.RemoteControlClient);
+    public void unregisterRemoteController(android.media.RemoteController);
+
+
+    public static java.lang.String ACTION_AUDIO_BECOMING_NOISY;
+    public static java.lang.String ACTION_HDMI_AUDIO_PLUG;
+    public static java.lang.String ACTION_HEADSET_PLUG;
+    public static java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED;
+    public static java.lang.String ACTION_SCO_AUDIO_STATE_UPDATED;
+    public static int ADJUST_LOWER;
+    public static int ADJUST_MUTE;
+    public static int ADJUST_RAISE;
+    public static int ADJUST_SAME;
+    public static int ADJUST_TOGGLE_MUTE;
+    public static int ADJUST_UNMUTE;
+    public static int AUDIOFOCUS_GAIN;
+    public static int AUDIOFOCUS_GAIN_TRANSIENT;
+    public static int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE;
+    public static int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
+    public static int AUDIOFOCUS_LOSS;
+    public static int AUDIOFOCUS_LOSS_TRANSIENT;
+    public static int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK;
+    public static int AUDIOFOCUS_REQUEST_FAILED;
+    public static int AUDIOFOCUS_REQUEST_GRANTED;
+    public static int AUDIO_SESSION_ID_GENERATE;
+    public static int ERROR;
+    public static int ERROR_DEAD_OBJECT;
+    public static java.lang.String EXTRA_AUDIO_PLUG_STATE;
+    public static java.lang.String EXTRA_ENCODINGS;
+    public static java.lang.String EXTRA_MAX_CHANNEL_COUNT;
+    public static java.lang.String EXTRA_RINGER_MODE;
+    public static java.lang.String EXTRA_SCO_AUDIO_PREVIOUS_STATE;
+    public static java.lang.String EXTRA_SCO_AUDIO_STATE;
+    public static java.lang.String EXTRA_VIBRATE_SETTING;
+    public static java.lang.String EXTRA_VIBRATE_TYPE;
+    public static int FLAG_ALLOW_RINGER_MODES;
+    public static int FLAG_PLAY_SOUND;
+    public static int FLAG_REMOVE_SOUND_AND_VIBRATE;
+    public static int FLAG_SHOW_UI;
+    public static int FLAG_VIBRATE;
+    public static int FX_FOCUS_NAVIGATION_DOWN;
+    public static int FX_FOCUS_NAVIGATION_LEFT;
+    public static int FX_FOCUS_NAVIGATION_RIGHT;
+    public static int FX_FOCUS_NAVIGATION_UP;
+    public static int FX_KEYPRESS_DELETE;
+    public static int FX_KEYPRESS_INVALID;
+    public static int FX_KEYPRESS_RETURN;
+    public static int FX_KEYPRESS_SPACEBAR;
+    public static int FX_KEYPRESS_STANDARD;
+    public static int FX_KEY_CLICK;
+    public static int GET_DEVICES_ALL;
+    public static int GET_DEVICES_INPUTS;
+    public static int GET_DEVICES_OUTPUTS;
+    public static int MODE_CURRENT;
+    public static int MODE_INVALID;
+    public static int MODE_IN_CALL;
+    public static int MODE_IN_COMMUNICATION;
+    public static int MODE_NORMAL;
+    public static int MODE_RINGTONE;
+    public static int NUM_STREAMS;
+    public static java.lang.String PROPERTY_OUTPUT_FRAMES_PER_BUFFER;
+    public static java.lang.String PROPERTY_OUTPUT_SAMPLE_RATE;
+    public static java.lang.String PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND;
+    public static java.lang.String PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND;
+    public static java.lang.String RINGER_MODE_CHANGED_ACTION;
+    public static int RINGER_MODE_NORMAL;
+    public static int RINGER_MODE_SILENT;
+    public static int RINGER_MODE_VIBRATE;
+    public static int ROUTE_ALL;
+    public static int ROUTE_BLUETOOTH;
+    public static int ROUTE_BLUETOOTH_A2DP;
+    public static int ROUTE_BLUETOOTH_SCO;
+    public static int ROUTE_EARPIECE;
+    public static int ROUTE_HEADSET;
+    public static int ROUTE_SPEAKER;
+    public static int SCO_AUDIO_STATE_CONNECTED;
+    public static int SCO_AUDIO_STATE_CONNECTING;
+    public static int SCO_AUDIO_STATE_DISCONNECTED;
+    public static int SCO_AUDIO_STATE_ERROR;
+    public static int STREAM_ALARM;
+    public static int STREAM_DTMF;
+    public static int STREAM_MUSIC;
+    public static int STREAM_NOTIFICATION;
+    public static int STREAM_RING;
+    public static int STREAM_SYSTEM;
+    public static int STREAM_VOICE_CALL;
+    public static int USE_DEFAULT_STREAM_TYPE;
+    public static java.lang.String VIBRATE_SETTING_CHANGED_ACTION;
+    public static int VIBRATE_SETTING_OFF;
+    public static int VIBRATE_SETTING_ON;
+    public static int VIBRATE_SETTING_ONLY_SILENT;
+    public static int VIBRATE_TYPE_NOTIFICATION;
+    public static int VIBRATE_TYPE_RINGER;
+}
+
+-keep class android.media.AudioManager$OnAudioFocusChangeListener {
+
+    public abstract void onAudioFocusChange(int);
+
+
+}
+
+-keep class android.media.MediaDescription {
+
+    public int describeContents();
+    public java.lang.CharSequence getDescription();
+    public android.os.Bundle getExtras();
+    public android.graphics.Bitmap getIconBitmap();
+    public android.net.Uri getIconUri();
+    public java.lang.String getMediaId();
+    public android.net.Uri getMediaUri();
+    public java.lang.CharSequence getSubtitle();
+    public java.lang.CharSequence getTitle();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.media.MediaMetadata {
+
+    public boolean containsKey(java.lang.String);
+    public int describeContents();
+    public android.graphics.Bitmap getBitmap(java.lang.String);
+    public android.media.MediaDescription getDescription();
+    public long getLong(java.lang.String);
+    public android.media.Rating getRating(java.lang.String);
+    public java.lang.String getString(java.lang.String);
+    public java.lang.CharSequence getText(java.lang.String);
+    public java.util.Set keySet();
+    public int size();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static java.lang.String METADATA_KEY_ALBUM;
+    public static java.lang.String METADATA_KEY_ALBUM_ART;
+    public static java.lang.String METADATA_KEY_ALBUM_ARTIST;
+    public static java.lang.String METADATA_KEY_ALBUM_ART_URI;
+    public static java.lang.String METADATA_KEY_ART;
+    public static java.lang.String METADATA_KEY_ARTIST;
+    public static java.lang.String METADATA_KEY_ART_URI;
+    public static java.lang.String METADATA_KEY_AUTHOR;
+    public static java.lang.String METADATA_KEY_COMPILATION;
+    public static java.lang.String METADATA_KEY_COMPOSER;
+    public static java.lang.String METADATA_KEY_DATE;
+    public static java.lang.String METADATA_KEY_DISC_NUMBER;
+    public static java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION;
+    public static java.lang.String METADATA_KEY_DISPLAY_ICON;
+    public static java.lang.String METADATA_KEY_DISPLAY_ICON_URI;
+    public static java.lang.String METADATA_KEY_DISPLAY_SUBTITLE;
+    public static java.lang.String METADATA_KEY_DISPLAY_TITLE;
+    public static java.lang.String METADATA_KEY_DURATION;
+    public static java.lang.String METADATA_KEY_GENRE;
+    public static java.lang.String METADATA_KEY_MEDIA_ID;
+    public static java.lang.String METADATA_KEY_NUM_TRACKS;
+    public static java.lang.String METADATA_KEY_RATING;
+    public static java.lang.String METADATA_KEY_TITLE;
+    public static java.lang.String METADATA_KEY_TRACK_NUMBER;
+    public static java.lang.String METADATA_KEY_USER_RATING;
+    public static java.lang.String METADATA_KEY_WRITER;
+    public static java.lang.String METADATA_KEY_YEAR;
+}
+
+-keep class android.media.MediaMetadataEditor {
+
+    public synchronized void addEditableKey(int);
+    public abstract void apply();
+    public synchronized void clear();
+    public synchronized android.graphics.Bitmap getBitmap(int, android.graphics.Bitmap);
+    public synchronized int[] getEditableKeys();
+    public synchronized long getLong(int, long);
+    public synchronized java.lang.Object getObject(int, java.lang.Object);
+    public synchronized java.lang.String getString(int, java.lang.String);
+    public synchronized android.media.MediaMetadataEditor putBitmap(int, android.graphics.Bitmap);
+    public synchronized android.media.MediaMetadataEditor putLong(int, long);
+    public synchronized android.media.MediaMetadataEditor putObject(int, java.lang.Object);
+    public synchronized android.media.MediaMetadataEditor putString(int, java.lang.String);
+    public synchronized void removeEditableKeys();
+
+
+    public static int BITMAP_KEY_ARTWORK;
+    public static int RATING_KEY_BY_OTHERS;
+    public static int RATING_KEY_BY_USER;
+}
+
+-keep class android.media.Rating {
+
+    public int describeContents();
+    public float getPercentRating();
+    public int getRatingStyle();
+    public float getStarRating();
+    public boolean hasHeart();
+    public boolean isRated();
+    public boolean isThumbUp();
+    public static android.media.Rating newHeartRating(boolean);
+    public static android.media.Rating newPercentageRating(float);
+    public static android.media.Rating newStarRating(int, float);
+    public static android.media.Rating newThumbRating(boolean);
+    public static android.media.Rating newUnratedRating(int);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int RATING_3_STARS;
+    public static int RATING_4_STARS;
+    public static int RATING_5_STARS;
+    public static int RATING_HEART;
+    public static int RATING_NONE;
+    public static int RATING_PERCENTAGE;
+    public static int RATING_THUMB_UP_DOWN;
+}
+
+-keep class android.media.RemoteControlClient {
+    <init>(android.app.PendingIntent);
+    <init>(android.app.PendingIntent, android.os.Looper);
+
+    public android.media.RemoteControlClient$MetadataEditor editMetadata(boolean);
+    public android.media.session.MediaSession getMediaSession();
+    public void setMetadataUpdateListener(android.media.RemoteControlClient$OnMetadataUpdateListener);
+    public void setOnGetPlaybackPositionListener(android.media.RemoteControlClient$OnGetPlaybackPositionListener);
+    public void setPlaybackPositionUpdateListener(android.media.RemoteControlClient$OnPlaybackPositionUpdateListener);
+    public void setPlaybackState(int);
+    public void setPlaybackState(int, long, float);
+    public void setTransportControlFlags(int);
+
+
+    public static int FLAG_KEY_MEDIA_FAST_FORWARD;
+    public static int FLAG_KEY_MEDIA_NEXT;
+    public static int FLAG_KEY_MEDIA_PAUSE;
+    public static int FLAG_KEY_MEDIA_PLAY;
+    public static int FLAG_KEY_MEDIA_PLAY_PAUSE;
+    public static int FLAG_KEY_MEDIA_POSITION_UPDATE;
+    public static int FLAG_KEY_MEDIA_PREVIOUS;
+    public static int FLAG_KEY_MEDIA_RATING;
+    public static int FLAG_KEY_MEDIA_REWIND;
+    public static int FLAG_KEY_MEDIA_STOP;
+    public static int PLAYSTATE_BUFFERING;
+    public static int PLAYSTATE_ERROR;
+    public static int PLAYSTATE_FAST_FORWARDING;
+    public static int PLAYSTATE_PAUSED;
+    public static int PLAYSTATE_PLAYING;
+    public static int PLAYSTATE_REWINDING;
+    public static int PLAYSTATE_SKIPPING_BACKWARDS;
+    public static int PLAYSTATE_SKIPPING_FORWARDS;
+    public static int PLAYSTATE_STOPPED;
+}
+
+-keep class android.media.RemoteControlClient$MetadataEditor {
+
+    public synchronized void apply();
+    public synchronized void clear();
+    public synchronized android.media.RemoteControlClient$MetadataEditor putBitmap(int, android.graphics.Bitmap);
+    public android.media.MediaMetadataEditor putBitmap(int, android.graphics.Bitmap);
+    public synchronized android.media.RemoteControlClient$MetadataEditor putLong(int, long);
+    public android.media.MediaMetadataEditor putLong(int, long);
+    public synchronized android.media.RemoteControlClient$MetadataEditor putObject(int, java.lang.Object);
+    public android.media.MediaMetadataEditor putObject(int, java.lang.Object);
+    public synchronized android.media.RemoteControlClient$MetadataEditor putString(int, java.lang.String);
+    public android.media.MediaMetadataEditor putString(int, java.lang.String);
+
+
+    public static int BITMAP_KEY_ARTWORK;
+}
+
+-keep class android.media.RemoteControlClient$OnGetPlaybackPositionListener {
+
+    public abstract long onGetPlaybackPosition();
+
+
+}
+
+-keep class android.media.RemoteControlClient$OnMetadataUpdateListener {
+
+    public abstract void onMetadataUpdate(int, java.lang.Object);
+
+
+}
+
+-keep class android.media.RemoteControlClient$OnPlaybackPositionUpdateListener {
+
+    public abstract void onPlaybackPositionUpdate(long);
+
+
+}
+
+-keep class android.media.RemoteController {
+    <init>(android.content.Context, android.media.RemoteController$OnClientUpdateListener);
+    <init>(android.content.Context, android.media.RemoteController$OnClientUpdateListener, android.os.Looper);
+
+    public boolean clearArtworkConfiguration();
+    public android.media.RemoteController$MetadataEditor editMetadata();
+    public long getEstimatedMediaPosition();
+    public boolean seekTo(long);
+    public boolean sendMediaKeyEvent(android.view.KeyEvent);
+    public boolean setArtworkConfiguration(int, int);
+    public boolean setSynchronizationMode(int);
+
+
+    public static int POSITION_SYNCHRONIZATION_CHECK;
+    public static int POSITION_SYNCHRONIZATION_NONE;
+}
+
+-keep class android.media.RemoteController$MetadataEditor {
+
+    public synchronized void apply();
+
+
+}
+
+-keep class android.media.RemoteController$OnClientUpdateListener {
+
+    public abstract void onClientChange(boolean);
+    public abstract void onClientMetadataUpdate(android.media.RemoteController$MetadataEditor);
+    public abstract void onClientPlaybackStateUpdate(int);
+    public abstract void onClientPlaybackStateUpdate(int, long, long, float);
+    public abstract void onClientTransportControlUpdate(int);
+
+
+}
+
+-keep class android.media.VolumeProvider {
+    <init>(int, int, int);
+
+    public int getCurrentVolume();
+    public int getMaxVolume();
+    public int getVolumeControl();
+    public void onAdjustVolume(int);
+    public void onSetVolumeTo(int);
+    public void setCurrentVolume(int);
+
+
+    public static int VOLUME_CONTROL_ABSOLUTE;
+    public static int VOLUME_CONTROL_FIXED;
+    public static int VOLUME_CONTROL_RELATIVE;
+}
+
+-keep class android.media.session.MediaController {
+    <init>(android.content.Context, android.media.session.MediaSession$Token);
+
+    public void adjustVolume(int, int);
+    public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
+    public android.os.Bundle getExtras();
+    public long getFlags();
+    public android.media.MediaMetadata getMetadata();
+    public java.lang.String getPackageName();
+    public android.media.session.MediaController$PlaybackInfo getPlaybackInfo();
+    public android.media.session.PlaybackState getPlaybackState();
+    public java.util.List getQueue();
+    public java.lang.CharSequence getQueueTitle();
+    public int getRatingType();
+    public android.app.PendingIntent getSessionActivity();
+    public android.media.session.MediaSession$Token getSessionToken();
+    public android.media.session.MediaController$TransportControls getTransportControls();
+    public void registerCallback(android.media.session.MediaController$Callback);
+    public void registerCallback(android.media.session.MediaController$Callback, android.os.Handler);
+    public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    public void setVolumeTo(int, int);
+    public void unregisterCallback(android.media.session.MediaController$Callback);
+
+
+}
+
+-keep class android.media.session.MediaController$Callback {
+    <init>();
+
+    public void onAudioInfoChanged(android.media.session.MediaController$PlaybackInfo);
+    public void onExtrasChanged(android.os.Bundle);
+    public void onMetadataChanged(android.media.MediaMetadata);
+    public void onPlaybackStateChanged(android.media.session.PlaybackState);
+    public void onQueueChanged(java.util.List);
+    public void onQueueTitleChanged(java.lang.CharSequence);
+    public void onSessionDestroyed();
+    public void onSessionEvent(java.lang.String, android.os.Bundle);
+
+
+}
+
+-keep class android.media.session.MediaController$PlaybackInfo {
+
+    public android.media.AudioAttributes getAudioAttributes();
+    public int getCurrentVolume();
+    public int getMaxVolume();
+    public int getPlaybackType();
+    public int getVolumeControl();
+
+
+    public static int PLAYBACK_TYPE_LOCAL;
+    public static int PLAYBACK_TYPE_REMOTE;
+}
+
+-keep class android.media.session.MediaController$TransportControls {
+
+    public void fastForward();
+    public void pause();
+    public void play();
+    public void playFromMediaId(java.lang.String, android.os.Bundle);
+    public void playFromSearch(java.lang.String, android.os.Bundle);
+    public void playFromUri(android.net.Uri, android.os.Bundle);
+    public void rewind();
+    public void seekTo(long);
+    public void sendCustomAction(android.media.session.PlaybackState$CustomAction, android.os.Bundle);
+    public void sendCustomAction(java.lang.String, android.os.Bundle);
+    public void setRating(android.media.Rating);
+    public void skipToNext();
+    public void skipToPrevious();
+    public void skipToQueueItem(long);
+    public void stop();
+
+
+}
+
+-keep class android.media.session.MediaSession {
+    <init>(android.content.Context, java.lang.String);
+
+    public android.media.session.MediaController getController();
+    public android.media.session.MediaSession$Token getSessionToken();
+    public boolean isActive();
+    public void release();
+    public void sendSessionEvent(java.lang.String, android.os.Bundle);
+    public void setActive(boolean);
+    public void setCallback(android.media.session.MediaSession$Callback);
+    public void setCallback(android.media.session.MediaSession$Callback, android.os.Handler);
+    public void setExtras(android.os.Bundle);
+    public void setFlags(int);
+    public void setMediaButtonReceiver(android.app.PendingIntent);
+    public void setMetadata(android.media.MediaMetadata);
+    public void setPlaybackState(android.media.session.PlaybackState);
+    public void setPlaybackToLocal(android.media.AudioAttributes);
+    public void setPlaybackToRemote(android.media.VolumeProvider);
+    public void setQueue(java.util.List);
+    public void setQueueTitle(java.lang.CharSequence);
+    public void setRatingType(int);
+    public void setSessionActivity(android.app.PendingIntent);
+
+
+    public static int FLAG_HANDLES_MEDIA_BUTTONS;
+    public static int FLAG_HANDLES_TRANSPORT_CONTROLS;
+}
+
+-keep class android.media.session.MediaSession$Callback {
+    <init>();
+
+    public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    public void onCustomAction(java.lang.String, android.os.Bundle);
+    public void onFastForward();
+    public boolean onMediaButtonEvent(android.content.Intent);
+    public void onPause();
+    public void onPlay();
+    public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
+    public void onPlayFromSearch(java.lang.String, android.os.Bundle);
+    public void onPlayFromUri(android.net.Uri, android.os.Bundle);
+    public void onRewind();
+    public void onSeekTo(long);
+    public void onSetRating(android.media.Rating);
+    public void onSkipToNext();
+    public void onSkipToPrevious();
+    public void onSkipToQueueItem(long);
+    public void onStop();
+
+
+}
+
+-keep class android.media.session.MediaSession$QueueItem {
+    <init>(android.media.MediaDescription, long);
+
+    public int describeContents();
+    public android.media.MediaDescription getDescription();
+    public long getQueueId();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int UNKNOWN_ID;
+}
+
+-keep class android.media.session.MediaSession$Token {
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.media.session.PlaybackState {
+
+    public int describeContents();
+    public long getActions();
+    public long getActiveQueueItemId();
+    public long getBufferedPosition();
+    public java.util.List getCustomActions();
+    public java.lang.CharSequence getErrorMessage();
+    public android.os.Bundle getExtras();
+    public long getLastPositionUpdateTime();
+    public float getPlaybackSpeed();
+    public long getPosition();
+    public int getState();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static long ACTION_FAST_FORWARD;
+    public static long ACTION_PAUSE;
+    public static long ACTION_PLAY;
+    public static long ACTION_PLAY_FROM_MEDIA_ID;
+    public static long ACTION_PLAY_FROM_SEARCH;
+    public static long ACTION_PLAY_FROM_URI;
+    public static long ACTION_PLAY_PAUSE;
+    public static long ACTION_REWIND;
+    public static long ACTION_SEEK_TO;
+    public static long ACTION_SET_RATING;
+    public static long ACTION_SKIP_TO_NEXT;
+    public static long ACTION_SKIP_TO_PREVIOUS;
+    public static long ACTION_SKIP_TO_QUEUE_ITEM;
+    public static long ACTION_STOP;
+    public static android.os.Parcelable$Creator CREATOR;
+    public static long PLAYBACK_POSITION_UNKNOWN;
+    public static int STATE_BUFFERING;
+    public static int STATE_CONNECTING;
+    public static int STATE_ERROR;
+    public static int STATE_FAST_FORWARDING;
+    public static int STATE_NONE;
+    public static int STATE_PAUSED;
+    public static int STATE_PLAYING;
+    public static int STATE_REWINDING;
+    public static int STATE_SKIPPING_TO_NEXT;
+    public static int STATE_SKIPPING_TO_PREVIOUS;
+    public static int STATE_SKIPPING_TO_QUEUE_ITEM;
+    public static int STATE_STOPPED;
+}
+
+-keep class android.media.session.PlaybackState$CustomAction {
+
+    public int describeContents();
+    public java.lang.String getAction();
+    public android.os.Bundle getExtras();
+    public int getIcon();
+    public java.lang.CharSequence getName();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.net.Uri {
+
+    public abstract android.net.Uri$Builder buildUpon();
+    public int compareTo(android.net.Uri);
+    public int compareTo(java.lang.Object);
+    public static java.lang.String decode(java.lang.String);
+    public static java.lang.String encode(java.lang.String);
+    public static java.lang.String encode(java.lang.String, java.lang.String);
+    public boolean equals(java.lang.Object);
+    public static android.net.Uri fromFile(java.io.File);
+    public static android.net.Uri fromParts(java.lang.String, java.lang.String, java.lang.String);
+    public abstract java.lang.String getAuthority();
+    public boolean getBooleanQueryParameter(java.lang.String, boolean);
+    public abstract java.lang.String getEncodedAuthority();
+    public abstract java.lang.String getEncodedFragment();
+    public abstract java.lang.String getEncodedPath();
+    public abstract java.lang.String getEncodedQuery();
+    public abstract java.lang.String getEncodedSchemeSpecificPart();
+    public abstract java.lang.String getEncodedUserInfo();
+    public abstract java.lang.String getFragment();
+    public abstract java.lang.String getHost();
+    public abstract java.lang.String getLastPathSegment();
+    public abstract java.lang.String getPath();
+    public abstract java.util.List getPathSegments();
+    public abstract int getPort();
+    public abstract java.lang.String getQuery();
+    public java.lang.String getQueryParameter(java.lang.String);
+    public java.util.Set getQueryParameterNames();
+    public java.util.List getQueryParameters(java.lang.String);
+    public abstract java.lang.String getScheme();
+    public abstract java.lang.String getSchemeSpecificPart();
+    public abstract java.lang.String getUserInfo();
+    public int hashCode();
+    public boolean isAbsolute();
+    public abstract boolean isHierarchical();
+    public boolean isOpaque();
+    public abstract boolean isRelative();
+    public android.net.Uri normalizeScheme();
+    public static android.net.Uri parse(java.lang.String);
+    public abstract java.lang.String toString();
+    public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
+    public static void writeToParcel(android.os.Parcel, android.net.Uri);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static android.net.Uri EMPTY;
+}
+
+-keep class android.net.Uri$Builder {
+    <init>();
+
+    public android.net.Uri$Builder appendEncodedPath(java.lang.String);
+    public android.net.Uri$Builder appendPath(java.lang.String);
+    public android.net.Uri$Builder appendQueryParameter(java.lang.String, java.lang.String);
+    public android.net.Uri$Builder authority(java.lang.String);
+    public android.net.Uri build();
+    public android.net.Uri$Builder clearQuery();
+    public android.net.Uri$Builder encodedAuthority(java.lang.String);
+    public android.net.Uri$Builder encodedFragment(java.lang.String);
+    public android.net.Uri$Builder encodedOpaquePart(java.lang.String);
+    public android.net.Uri$Builder encodedPath(java.lang.String);
+    public android.net.Uri$Builder encodedQuery(java.lang.String);
+    public android.net.Uri$Builder fragment(java.lang.String);
+    public android.net.Uri$Builder opaquePart(java.lang.String);
+    public android.net.Uri$Builder path(java.lang.String);
+    public android.net.Uri$Builder query(java.lang.String);
+    public android.net.Uri$Builder scheme(java.lang.String);
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.os.BaseBundle {
+
+    public void clear();
+    public boolean containsKey(java.lang.String);
+    public java.lang.Object get(java.lang.String);
+    public boolean getBoolean(java.lang.String);
+    public boolean getBoolean(java.lang.String, boolean);
+    public boolean[] getBooleanArray(java.lang.String);
+    public double getDouble(java.lang.String);
+    public double getDouble(java.lang.String, double);
+    public double[] getDoubleArray(java.lang.String);
+    public int getInt(java.lang.String);
+    public int getInt(java.lang.String, int);
+    public int[] getIntArray(java.lang.String);
+    public long getLong(java.lang.String);
+    public long getLong(java.lang.String, long);
+    public long[] getLongArray(java.lang.String);
+    public java.lang.String getString(java.lang.String);
+    public java.lang.String getString(java.lang.String, java.lang.String);
+    public java.lang.String[] getStringArray(java.lang.String);
+    public boolean isEmpty();
+    public java.util.Set keySet();
+    public void putAll(android.os.PersistableBundle);
+    public void putBoolean(java.lang.String, boolean);
+    public void putBooleanArray(java.lang.String, boolean[]);
+    public void putDouble(java.lang.String, double);
+    public void putDoubleArray(java.lang.String, double[]);
+    public void putInt(java.lang.String, int);
+    public void putIntArray(java.lang.String, int[]);
+    public void putLong(java.lang.String, long);
+    public void putLongArray(java.lang.String, long[]);
+    public void putString(java.lang.String, java.lang.String);
+    public void putStringArray(java.lang.String, java.lang.String[]);
+    public void remove(java.lang.String);
+    public int size();
+
+
+}
+
+-keep class android.os.Bundle {
+    <init>();
+    <init>(java.lang.ClassLoader);
+    <init>(int);
+    <init>(android.os.Bundle);
+    <init>(android.os.PersistableBundle);
+
+    public void clear();
+    public java.lang.Object clone();
+    public int describeContents();
+    public android.os.IBinder getBinder(java.lang.String);
+    public android.os.Bundle getBundle(java.lang.String);
+    public byte getByte(java.lang.String);
+    public java.lang.Byte getByte(java.lang.String, byte);
+    public byte[] getByteArray(java.lang.String);
+    public char getChar(java.lang.String);
+    public char getChar(java.lang.String, char);
+    public char[] getCharArray(java.lang.String);
+    public java.lang.CharSequence getCharSequence(java.lang.String);
+    public java.lang.CharSequence getCharSequence(java.lang.String, java.lang.CharSequence);
+    public java.lang.CharSequence[] getCharSequenceArray(java.lang.String);
+    public java.util.ArrayList getCharSequenceArrayList(java.lang.String);
+    public java.lang.ClassLoader getClassLoader();
+    public float getFloat(java.lang.String);
+    public float getFloat(java.lang.String, float);
+    public float[] getFloatArray(java.lang.String);
+    public java.util.ArrayList getIntegerArrayList(java.lang.String);
+    public android.os.Parcelable getParcelable(java.lang.String);
+    public android.os.Parcelable[] getParcelableArray(java.lang.String);
+    public java.util.ArrayList getParcelableArrayList(java.lang.String);
+    public java.io.Serializable getSerializable(java.lang.String);
+    public short getShort(java.lang.String);
+    public short getShort(java.lang.String, short);
+    public short[] getShortArray(java.lang.String);
+    public android.util.Size getSize(java.lang.String);
+    public android.util.SizeF getSizeF(java.lang.String);
+    public android.util.SparseArray getSparseParcelableArray(java.lang.String);
+    public java.util.ArrayList getStringArrayList(java.lang.String);
+    public boolean hasFileDescriptors();
+    public void putAll(android.os.Bundle);
+    public void putBinder(java.lang.String, android.os.IBinder);
+    public void putBundle(java.lang.String, android.os.Bundle);
+    public void putByte(java.lang.String, byte);
+    public void putByteArray(java.lang.String, byte[]);
+    public void putChar(java.lang.String, char);
+    public void putCharArray(java.lang.String, char[]);
+    public void putCharSequence(java.lang.String, java.lang.CharSequence);
+    public void putCharSequenceArray(java.lang.String, java.lang.CharSequence[]);
+    public void putCharSequenceArrayList(java.lang.String, java.util.ArrayList);
+    public void putFloat(java.lang.String, float);
+    public void putFloatArray(java.lang.String, float[]);
+    public void putIntegerArrayList(java.lang.String, java.util.ArrayList);
+    public void putParcelable(java.lang.String, android.os.Parcelable);
+    public void putParcelableArray(java.lang.String, android.os.Parcelable[]);
+    public void putParcelableArrayList(java.lang.String, java.util.ArrayList);
+    public void putSerializable(java.lang.String, java.io.Serializable);
+    public void putShort(java.lang.String, short);
+    public void putShortArray(java.lang.String, short[]);
+    public void putSize(java.lang.String, android.util.Size);
+    public void putSizeF(java.lang.String, android.util.SizeF);
+    public void putSparseParcelableArray(java.lang.String, android.util.SparseArray);
+    public void putStringArrayList(java.lang.String, java.util.ArrayList);
+    public void readFromParcel(android.os.Parcel);
+    public void setClassLoader(java.lang.ClassLoader);
+    public synchronized java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static android.os.Bundle EMPTY;
+}
+
+-keep class android.os.CancellationSignal {
+    <init>();
+
+    public void cancel();
+    public boolean isCanceled();
+    public void setOnCancelListener(android.os.CancellationSignal$OnCancelListener);
+    public void throwIfCanceled();
+
+
+}
+
+-keep class android.os.CancellationSignal$OnCancelListener {
+
+    public abstract void onCancel();
+
+
+}
+
+-keep class android.os.Handler {
+    <init>();
+    <init>(android.os.Handler$Callback);
+    <init>(android.os.Looper);
+    <init>(android.os.Looper, android.os.Handler$Callback);
+
+    public void dispatchMessage(android.os.Message);
+    public void dump(android.util.Printer, java.lang.String);
+    public android.os.Looper getLooper();
+    public java.lang.String getMessageName(android.os.Message);
+    public void handleMessage(android.os.Message);
+    public boolean hasMessages(int);
+    public boolean hasMessages(int, java.lang.Object);
+    public android.os.Message obtainMessage();
+    public android.os.Message obtainMessage(int);
+    public android.os.Message obtainMessage(int, java.lang.Object);
+    public android.os.Message obtainMessage(int, int, int);
+    public android.os.Message obtainMessage(int, int, int, java.lang.Object);
+    public boolean post(java.lang.Runnable);
+    public boolean postAtFrontOfQueue(java.lang.Runnable);
+    public boolean postAtTime(java.lang.Runnable, long);
+    public boolean postAtTime(java.lang.Runnable, java.lang.Object, long);
+    public boolean postDelayed(java.lang.Runnable, long);
+    public void removeCallbacks(java.lang.Runnable);
+    public void removeCallbacks(java.lang.Runnable, java.lang.Object);
+    public void removeCallbacksAndMessages(java.lang.Object);
+    public void removeMessages(int);
+    public void removeMessages(int, java.lang.Object);
+    public boolean sendEmptyMessage(int);
+    public boolean sendEmptyMessageAtTime(int, long);
+    public boolean sendEmptyMessageDelayed(int, long);
+    public boolean sendMessage(android.os.Message);
+    public boolean sendMessageAtFrontOfQueue(android.os.Message);
+    public boolean sendMessageAtTime(android.os.Message, long);
+    public boolean sendMessageDelayed(android.os.Message, long);
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.os.Handler$Callback {
+
+    public abstract boolean handleMessage(android.os.Message);
+
+
+}
+
+-keep class android.os.IBinder {
+
+    public abstract void dump(java.io.FileDescriptor, java.lang.String[]);
+    public abstract void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
+    public abstract java.lang.String getInterfaceDescriptor();
+    public abstract boolean isBinderAlive();
+    public abstract void linkToDeath(android.os.IBinder$DeathRecipient, int);
+    public abstract boolean pingBinder();
+    public abstract android.os.IInterface queryLocalInterface(java.lang.String);
+    public abstract boolean transact(int, android.os.Parcel, android.os.Parcel, int);
+    public abstract boolean unlinkToDeath(android.os.IBinder$DeathRecipient, int);
+
+
+    public static int DUMP_TRANSACTION;
+    public static int FIRST_CALL_TRANSACTION;
+    public static int FLAG_ONEWAY;
+    public static int INTERFACE_TRANSACTION;
+    public static int LAST_CALL_TRANSACTION;
+    public static int LIKE_TRANSACTION;
+    public static int PING_TRANSACTION;
+    public static int TWEET_TRANSACTION;
+}
+
+-keep class android.os.IBinder$DeathRecipient {
+
+    public abstract void binderDied();
+
+
+}
+
+-keep class android.os.IInterface {
+
+    public abstract android.os.IBinder asBinder();
+
+
+}
+
+-keep class android.os.Looper {
+
+    public void dump(android.util.Printer, java.lang.String);
+    public static android.os.Looper getMainLooper();
+    public android.os.MessageQueue getQueue();
+    public java.lang.Thread getThread();
+    public boolean isCurrentThread();
+    public static void loop();
+    public static android.os.Looper myLooper();
+    public static android.os.MessageQueue myQueue();
+    public static void prepare();
+    public static void prepareMainLooper();
+    public void quit();
+    public void quitSafely();
+    public void setMessageLogging(android.util.Printer);
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.os.Message {
+    <init>();
+
+    public void copyFrom(android.os.Message);
+    public int describeContents();
+    public java.lang.Runnable getCallback();
+    public android.os.Bundle getData();
+    public android.os.Handler getTarget();
+    public long getWhen();
+    public boolean isAsynchronous();
+    public static android.os.Message obtain();
+    public static android.os.Message obtain(android.os.Message);
+    public static android.os.Message obtain(android.os.Handler);
+    public static android.os.Message obtain(android.os.Handler, java.lang.Runnable);
+    public static android.os.Message obtain(android.os.Handler, int);
+    public static android.os.Message obtain(android.os.Handler, int, java.lang.Object);
+    public static android.os.Message obtain(android.os.Handler, int, int, int);
+    public static android.os.Message obtain(android.os.Handler, int, int, int, java.lang.Object);
+    public android.os.Bundle peekData();
+    public void recycle();
+    public void sendToTarget();
+    public void setAsynchronous(boolean);
+    public void setData(android.os.Bundle);
+    public void setTarget(android.os.Handler);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public int arg1;
+    public int arg2;
+    public java.lang.Object obj;
+    public android.os.Messenger replyTo;
+    public int sendingUid;
+    public int what;
+}
+
+-keep class android.os.MessageQueue {
+
+    public void addIdleHandler(android.os.MessageQueue$IdleHandler);
+    public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue$OnFileDescriptorEventListener);
+    protected void finalize();
+    public boolean isIdle();
+    public void removeIdleHandler(android.os.MessageQueue$IdleHandler);
+    public void removeOnFileDescriptorEventListener(java.io.FileDescriptor);
+
+
+}
+
+-keep class android.os.MessageQueue$IdleHandler {
+
+    public abstract boolean queueIdle();
+
+
+}
+
+-keep class android.os.MessageQueue$OnFileDescriptorEventListener {
+
+    public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int);
+
+
+    public static int EVENT_ERROR;
+    public static int EVENT_INPUT;
+    public static int EVENT_OUTPUT;
+}
+
+-keep class android.os.Messenger {
+    <init>(android.os.Handler);
+    <init>(android.os.IBinder);
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public android.os.IBinder getBinder();
+    public int hashCode();
+    public static android.os.Messenger readMessengerOrNullFromParcel(android.os.Parcel);
+    public void send(android.os.Message);
+    public static void writeMessengerOrNullToParcel(android.os.Messenger, android.os.Parcel);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.os.Parcel {
+
+    public void appendFrom(android.os.Parcel, int, int);
+    public android.os.IBinder[] createBinderArray();
+    public java.util.ArrayList createBinderArrayList();
+    public boolean[] createBooleanArray();
+    public byte[] createByteArray();
+    public char[] createCharArray();
+    public double[] createDoubleArray();
+    public float[] createFloatArray();
+    public int[] createIntArray();
+    public long[] createLongArray();
+    public java.lang.String[] createStringArray();
+    public java.util.ArrayList createStringArrayList();
+    public java.lang.Object[] createTypedArray(android.os.Parcelable$Creator);
+    public java.util.ArrayList createTypedArrayList(android.os.Parcelable$Creator);
+    public int dataAvail();
+    public int dataCapacity();
+    public int dataPosition();
+    public int dataSize();
+    public void enforceInterface(java.lang.String);
+    protected void finalize();
+    public boolean hasFileDescriptors();
+    public byte[] marshall();
+    public static android.os.Parcel obtain();
+    public java.lang.Object[] readArray(java.lang.ClassLoader);
+    public java.util.ArrayList readArrayList(java.lang.ClassLoader);
+    public void readBinderArray(android.os.IBinder[]);
+    public void readBinderList(java.util.List);
+    public void readBooleanArray(boolean[]);
+    public android.os.Bundle readBundle();
+    public android.os.Bundle readBundle(java.lang.ClassLoader);
+    public byte readByte();
+    public void readByteArray(byte[]);
+    public void readCharArray(char[]);
+    public double readDouble();
+    public void readDoubleArray(double[]);
+    public void readException();
+    public void readException(int, java.lang.String);
+    public android.os.ParcelFileDescriptor readFileDescriptor();
+    public float readFloat();
+    public void readFloatArray(float[]);
+    public java.util.HashMap readHashMap(java.lang.ClassLoader);
+    public int readInt();
+    public void readIntArray(int[]);
+    public void readList(java.util.List, java.lang.ClassLoader);
+    public long readLong();
+    public void readLongArray(long[]);
+    public void readMap(java.util.Map, java.lang.ClassLoader);
+    public android.os.Parcelable readParcelable(java.lang.ClassLoader);
+    public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
+    public android.os.PersistableBundle readPersistableBundle();
+    public android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
+    public java.io.Serializable readSerializable();
+    public android.util.Size readSize();
+    public android.util.SizeF readSizeF();
+    public android.util.SparseArray readSparseArray(java.lang.ClassLoader);
+    public android.util.SparseBooleanArray readSparseBooleanArray();
+    public java.lang.String readString();
+    public void readStringArray(java.lang.String[]);
+    public void readStringList(java.util.List);
+    public android.os.IBinder readStrongBinder();
+    public void readTypedArray(java.lang.Object[], android.os.Parcelable$Creator);
+    public void readTypedList(java.util.List, android.os.Parcelable$Creator);
+    public java.lang.Object readTypedObject(android.os.Parcelable$Creator);
+    public java.lang.Object readValue(java.lang.ClassLoader);
+    public void recycle();
+    public void setDataCapacity(int);
+    public void setDataPosition(int);
+    public void setDataSize(int);
+    public void unmarshall(byte[], int, int);
+    public void writeArray(java.lang.Object[]);
+    public void writeBinderArray(android.os.IBinder[]);
+    public void writeBinderList(java.util.List);
+    public void writeBooleanArray(boolean[]);
+    public void writeBundle(android.os.Bundle);
+    public void writeByte(byte);
+    public void writeByteArray(byte[]);
+    public void writeByteArray(byte[], int, int);
+    public void writeCharArray(char[]);
+    public void writeDouble(double);
+    public void writeDoubleArray(double[]);
+    public void writeException(java.lang.Exception);
+    public void writeFileDescriptor(java.io.FileDescriptor);
+    public void writeFloat(float);
+    public void writeFloatArray(float[]);
+    public void writeInt(int);
+    public void writeIntArray(int[]);
+    public void writeInterfaceToken(java.lang.String);
+    public void writeList(java.util.List);
+    public void writeLong(long);
+    public void writeLongArray(long[]);
+    public void writeMap(java.util.Map);
+    public void writeNoException();
+    public void writeParcelable(android.os.Parcelable, int);
+    public void writeParcelableArray(android.os.Parcelable[], int);
+    public void writePersistableBundle(android.os.PersistableBundle);
+    public void writeSerializable(java.io.Serializable);
+    public void writeSize(android.util.Size);
+    public void writeSizeF(android.util.SizeF);
+    public void writeSparseArray(android.util.SparseArray);
+    public void writeSparseBooleanArray(android.util.SparseBooleanArray);
+    public void writeString(java.lang.String);
+    public void writeStringArray(java.lang.String[]);
+    public void writeStringList(java.util.List);
+    public void writeStrongBinder(android.os.IBinder);
+    public void writeStrongInterface(android.os.IInterface);
+    public void writeTypedArray(android.os.Parcelable[], int);
+    public void writeTypedList(java.util.List);
+    public void writeTypedObject(android.os.Parcelable, int);
+    public void writeValue(java.lang.Object);
+
+
+    public static android.os.Parcelable$Creator STRING_CREATOR;
+}
+
+-keep class android.os.ParcelFileDescriptor {
+    <init>(android.os.ParcelFileDescriptor);
+
+    public static android.os.ParcelFileDescriptor adoptFd(int);
+    public boolean canDetectErrors();
+    public void checkError();
+    public void close();
+    public void closeWithError(java.lang.String);
+    public static android.os.ParcelFileDescriptor[] createPipe();
+    public static android.os.ParcelFileDescriptor[] createReliablePipe();
+    public static android.os.ParcelFileDescriptor[] createReliableSocketPair();
+    public static android.os.ParcelFileDescriptor[] createSocketPair();
+    public int describeContents();
+    public int detachFd();
+    public static android.os.ParcelFileDescriptor dup(java.io.FileDescriptor);
+    public android.os.ParcelFileDescriptor dup();
+    protected void finalize();
+    public static android.os.ParcelFileDescriptor fromDatagramSocket(java.net.DatagramSocket);
+    public static android.os.ParcelFileDescriptor fromFd(int);
+    public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
+    public int getFd();
+    public java.io.FileDescriptor getFileDescriptor();
+    public long getStatSize();
+    public static android.os.ParcelFileDescriptor open(java.io.File, int);
+    public static android.os.ParcelFileDescriptor open(java.io.File, int, android.os.Handler, android.os.ParcelFileDescriptor$OnCloseListener);
+    public static int parseMode(java.lang.String);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int MODE_APPEND;
+    public static int MODE_CREATE;
+    public static int MODE_READ_ONLY;
+    public static int MODE_READ_WRITE;
+    public static int MODE_TRUNCATE;
+    public static int MODE_WORLD_READABLE;
+    public static int MODE_WORLD_WRITEABLE;
+    public static int MODE_WRITE_ONLY;
+}
+
+-keep class android.os.ParcelFileDescriptor$OnCloseListener {
+
+    public abstract void onClose(java.io.IOException);
+
+
+}
+
+-keep class android.os.Parcelable {
+
+    public abstract int describeContents();
+    public abstract void writeToParcel(android.os.Parcel, int);
+
+
+    public static int CONTENTS_FILE_DESCRIPTOR;
+    public static int PARCELABLE_WRITE_RETURN_VALUE;
+}
+
+-keep class android.os.Parcelable$Creator {
+
+    public abstract java.lang.Object createFromParcel(android.os.Parcel);
+    public abstract java.lang.Object[] newArray(int);
+
+
+}
+
+-keep class android.os.PatternMatcher {
+    <init>(java.lang.String, int);
+    <init>(android.os.Parcel);
+
+    public int describeContents();
+    public java.lang.String getPath();
+    public int getType();
+    public boolean match(java.lang.String);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int PATTERN_LITERAL;
+    public static int PATTERN_PREFIX;
+    public static int PATTERN_SIMPLE_GLOB;
+}
+
+-keep class android.os.PersistableBundle {
+    <init>();
+    <init>(int);
+    <init>(android.os.PersistableBundle);
+
+    public java.lang.Object clone();
+    public int describeContents();
+    public android.os.PersistableBundle getPersistableBundle(java.lang.String);
+    public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
+    public synchronized java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static android.os.PersistableBundle EMPTY;
+}
+
+-keep class android.os.RemoteException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class android.os.ResultReceiver {
+    <init>(android.os.Handler);
+
+    public int describeContents();
+    protected void onReceiveResult(int, android.os.Bundle);
+    public void send(int, android.os.Bundle);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.os.UserHandle {
+    <init>(android.os.Parcel);
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+    public static android.os.UserHandle readFromParcel(android.os.Parcel);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+    public static void writeToParcel(android.os.UserHandle, android.os.Parcel);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.os.Vibrator {
+
+    public abstract void cancel();
+    public abstract boolean hasVibrator();
+    public void vibrate(long);
+    public void vibrate(long, android.media.AudioAttributes);
+    public void vibrate(long[], int);
+    public void vibrate(long[], int, android.media.AudioAttributes);
+
+
+}
+
+-keep class android.support.car.Car {
+
+    public void connect();
+    public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback, android.os.Handler);
+    public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback);
+    public void disconnect();
+    public java.lang.Object getCarManager(java.lang.String);
+    public java.lang.Object getCarManager(java.lang.Class);
+    public boolean isConnected();
+    public boolean isConnecting();
+
+
+    public static java.lang.String APP_FOCUS_SERVICE;
+    public static java.lang.String AUDIO_SERVICE;
+    public static int CONNECTION_TYPE_ADB_EMULATOR;
+    public static int CONNECTION_TYPE_EMBEDDED;
+    public static int CONNECTION_TYPE_EMBEDDED_MOCKING;
+    public static int CONNECTION_TYPE_EMULATOR;
+    public static int CONNECTION_TYPE_ON_DEVICE_EMULATOR;
+    public static int CONNECTION_TYPE_UNKNOWN;
+    public static int CONNECTION_TYPE_USB;
+    public static int CONNECTION_TYPE_WIFI;
+    public static java.lang.String INFO_SERVICE;
+    public static java.lang.String NAVIGATION_STATUS_SERVICE;
+    public static java.lang.String PACKAGE_SERVICE;
+    public static java.lang.String PERMISSION_CAR_NAVIGATION_MANAGER;
+    public static java.lang.String PERMISSION_VENDOR_EXTENSION;
+    public static java.lang.String SENSOR_SERVICE;
+}
+
+-keep class android.support.car.CarAppFocusManager {
+    <init>();
+
+    public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback, int);
+    public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
+    public abstract void addFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
+    public abstract boolean isOwningFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
+    public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
+    public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener);
+    public abstract int requestAppFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
+
+
+    public static int APP_FOCUS_REQUEST_FAILED;
+    public static int APP_FOCUS_REQUEST_SUCCEEDED;
+    public static int APP_FOCUS_TYPE_NAVIGATION;
+}
+
+-keep class android.support.car.CarAppFocusManager$OnAppFocusChangedListener {
+
+    public abstract void onAppFocusChanged(android.support.car.CarAppFocusManager, int, boolean);
+
+
+}
+
+-keep class android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback {
+
+    public abstract void onAppFocusOwnershipGranted(android.support.car.CarAppFocusManager, int);
+    public abstract void onAppFocusOwnershipLost(android.support.car.CarAppFocusManager, int);
+
+
+}
+
+-keep class android.support.car.CarConnectionCallback {
+    <init>();
+
+    public abstract void onConnected(android.support.car.Car);
+    public abstract void onDisconnected(android.support.car.Car);
+
+
+}
+
+-keep class android.support.car.CarInfoManager {
+    <init>();
+
+    public abstract int getDriverPosition();
+    public abstract java.lang.String getHeadunitManufacturer();
+    public abstract java.lang.String getHeadunitModel();
+    public abstract java.lang.String getHeadunitSoftwareBuild();
+    public abstract java.lang.String getHeadunitSoftwareVersion();
+    public abstract java.lang.String getManufacturer();
+    public abstract java.lang.String getModel();
+    public abstract java.lang.String getModelYear();
+    public abstract java.lang.String getVehicleId();
+
+
+    public static int DRIVER_SIDE_CENTER;
+    public static int DRIVER_SIDE_LEFT;
+    public static int DRIVER_SIDE_RIGHT;
+    public static int DRIVER_SIDE_UNKNOWN;
+}
+
+-keep class android.support.car.CarNotConnectedException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Exception);
+
+
+
+}
+
+-keep class android.support.car.annotation.ValueTypeDef {
+
+
+
+}
+
+-keep class android.support.car.annotation.VersionDef {
+
+
+
+}
+
+-keep class android.support.car.hardware.CarSensorEvent {
+
+    public android.support.car.hardware.CarSensorEvent$CompassData getCompassData();
+    public android.support.car.hardware.CarSensorEvent$DrivingStatusData getDrivingStatusData();
+    public android.support.car.hardware.CarSensorEvent$NightData getNightData();
+    public android.support.car.hardware.CarSensorEvent$ParkingBrakeData getParkingBrakeData();
+
+
+    public static int DRIVE_STATUS_FULLY_RESTRICTED;
+    public static int DRIVE_STATUS_LIMIT_MESSAGE_LEN;
+    public static int DRIVE_STATUS_NO_CONFIG;
+    public static int DRIVE_STATUS_NO_KEYBOARD_INPUT;
+    public static int DRIVE_STATUS_NO_VIDEO;
+    public static int DRIVE_STATUS_NO_VOICE_INPUT;
+    public static int DRIVE_STATUS_UNRESTRICTED;
+    public static int INDEX_COMPASS_BEARING;
+    public static int INDEX_COMPASS_PITCH;
+    public static int INDEX_COMPASS_ROLL;
+    public float[] floatValues;
+    public int[] intValues;
+    public int sensorType;
+    public long timestamp;
+}
+
+-keep class android.support.car.hardware.CarSensorEvent$CompassData {
+
+
+
+    public float bearing;
+    public float pitch;
+    public float roll;
+    public long timestamp;
+}
+
+-keep class android.support.car.hardware.CarSensorEvent$DrivingStatusData {
+
+    public boolean isConfigurationRestricted();
+    public boolean isFullyRestricted();
+    public boolean isKeyboardRestricted();
+    public boolean isMessageLengthRestricted();
+    public boolean isVideoRestricted();
+    public boolean isVoiceRestricted();
+
+
+    public int status;
+    public long timestamp;
+}
+
+-keep class android.support.car.hardware.CarSensorEvent$NightData {
+
+
+
+    public boolean isNightMode;
+    public long timestamp;
+}
+
+-keep class android.support.car.hardware.CarSensorEvent$ParkingBrakeData {
+
+
+
+    public boolean isEngaged;
+    public long timestamp;
+}
+
+-keep class android.support.car.hardware.CarSensorManager {
+    <init>();
+
+    public abstract boolean addListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int, int);
+    public abstract android.support.car.hardware.CarSensorEvent getLatestSensorEvent(int);
+    public abstract int[] getSupportedSensors();
+    public abstract boolean isSensorSupported(int);
+    public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener);
+    public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int);
+
+
+    public static int SENSOR_RATE_FASTEST;
+    public static int SENSOR_RATE_NORMAL;
+    public static int SENSOR_TYPE_COMPASS;
+    public static int SENSOR_TYPE_DRIVING_STATUS;
+    public static int SENSOR_TYPE_NIGHT;
+    public static int SENSOR_TYPE_PARKING_BRAKE;
+}
+
+-keep class android.support.car.hardware.CarSensorManager$OnSensorChangedListener {
+
+    public abstract void onSensorChanged(android.support.car.hardware.CarSensorManager, android.support.car.hardware.CarSensorEvent);
+
+
+}
+
+-keep class android.support.car.media.CarAudioManager {
+    <init>();
+
+    public abstract void abandonAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener, android.media.AudioAttributes);
+    public abstract android.support.car.media.CarAudioRecord createCarAudioRecord(int);
+    public abstract android.media.AudioAttributes getAudioAttributesForCarUsage(int);
+    public abstract android.media.AudioFormat getAudioRecordAudioFormat();
+    public abstract int getAudioRecordMaxBufferSize();
+    public abstract int getAudioRecordMinBufferSize();
+    public abstract boolean isAudioRecordSupported();
+    public abstract boolean isMediaMuted();
+    public abstract int requestAudioFocus(android.media.AudioManager$OnAudioFocusChangeListener, android.media.AudioAttributes, int);
+
+
+    public static int CAR_AUDIO_USAGE_ALARM;
+    public static int CAR_AUDIO_USAGE_DEFAULT;
+    public static int CAR_AUDIO_USAGE_MUSIC;
+    public static int CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
+    public static int CAR_AUDIO_USAGE_NOTIFICATION;
+    public static int CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
+    public static int CAR_AUDIO_USAGE_SYSTEM_SOUND;
+    public static int CAR_AUDIO_USAGE_VOICE_CALL;
+    public static int CAR_AUDIO_USAGE_VOICE_COMMAND;
+}
+
+-keep class android.support.car.media.CarAudioRecord {
+    <init>();
+
+    public abstract int getAudioSessionId();
+    public abstract int getBufferSize();
+    public abstract int getRecordingState();
+    public abstract int getState();
+    public abstract int read(byte[], int, int);
+    public abstract void release();
+    public abstract void startRecording();
+    public abstract void stop();
+
+
+}
+
+-keep class android.support.car.navigation.CarNavigationInstrumentCluster {
+
+    public int getImageColorDepthBits();
+    public int getImageHeight();
+    public int getImageWidth();
+    public int getMinIntervalMillis();
+    public int getType();
+    public boolean supportsCustomImages();
+    public java.lang.String toString();
+
+
+    public static int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED;
+    public static int CLUSTER_TYPE_IMAGE_CODES_ONLY;
+}
+
+-keep class android.support.car.navigation.CarNavigationStatusManager {
+    <init>();
+
+    public abstract void addListener(android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback);
+    public abstract void removeListener();
+    public abstract void sendNavigationStatus(int);
+    public abstract void sendNavigationTurnDistanceEvent(int, int, int, int);
+    public abstract void sendNavigationTurnEvent(int, java.lang.CharSequence, int, int, int);
+
+
+    public static int DISTANCE_FEET;
+    public static int DISTANCE_KILOMETERS;
+    public static int DISTANCE_METERS;
+    public static int DISTANCE_MILES;
+    public static int DISTANCE_YARDS;
+    public static int STATUS_ACTIVE;
+    public static int STATUS_INACTIVE;
+    public static int STATUS_UNAVAILABLE;
+    public static int TURN_DEPART;
+    public static int TURN_DESTINATION;
+    public static int TURN_FERRY_BOAT;
+    public static int TURN_FERRY_TRAIN;
+    public static int TURN_FORK;
+    public static int TURN_MERGE;
+    public static int TURN_NAME_CHANGE;
+    public static int TURN_OFF_RAMP;
+    public static int TURN_ON_RAMP;
+    public static int TURN_ROUNDABOUT_ENTER;
+    public static int TURN_ROUNDABOUT_ENTER_AND_EXIT;
+    public static int TURN_ROUNDABOUT_EXIT;
+    public static int TURN_SHARP_TURN;
+    public static int TURN_SIDE_LEFT;
+    public static int TURN_SIDE_RIGHT;
+    public static int TURN_SIDE_UNSPECIFIED;
+    public static int TURN_SLIGHT_TURN;
+    public static int TURN_STRAIGHT;
+    public static int TURN_TURN;
+    public static int TURN_UNKNOWN;
+    public static int TURN_U_TURN;
+}
+
+-keep class android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback {
+
+    public abstract void onInstrumentClusterStarted(android.support.car.navigation.CarNavigationStatusManager, android.support.car.navigation.CarNavigationInstrumentCluster);
+    public abstract void onInstrumentClusterStopped(android.support.car.navigation.CarNavigationStatusManager);
+
+
+}
+
+-keep class android.util.AndroidException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Exception);
+
+
+
+}
+
+-keep class android.util.AttributeSet {
+
+    public abstract boolean getAttributeBooleanValue(java.lang.String, java.lang.String, boolean);
+    public abstract boolean getAttributeBooleanValue(int, boolean);
+    public abstract int getAttributeCount();
+    public abstract float getAttributeFloatValue(java.lang.String, java.lang.String, float);
+    public abstract float getAttributeFloatValue(int, float);
+    public abstract int getAttributeIntValue(java.lang.String, java.lang.String, int);
+    public abstract int getAttributeIntValue(int, int);
+    public abstract int getAttributeListValue(java.lang.String, java.lang.String, java.lang.String[], int);
+    public abstract int getAttributeListValue(int, java.lang.String[], int);
+    public abstract java.lang.String getAttributeName(int);
+    public abstract int getAttributeNameResource(int);
+    public abstract int getAttributeResourceValue(java.lang.String, java.lang.String, int);
+    public abstract int getAttributeResourceValue(int, int);
+    public abstract int getAttributeUnsignedIntValue(java.lang.String, java.lang.String, int);
+    public abstract int getAttributeUnsignedIntValue(int, int);
+    public abstract java.lang.String getAttributeValue(int);
+    public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
+    public abstract java.lang.String getClassAttribute();
+    public abstract java.lang.String getIdAttribute();
+    public abstract int getIdAttributeResourceValue(int);
+    public abstract java.lang.String getPositionDescription();
+    public abstract int getStyleAttribute();
+
+
+}
+
+-keep class android.util.DisplayMetrics {
+    <init>();
+
+    public boolean equals(java.lang.Object);
+    public boolean equals(android.util.DisplayMetrics);
+    public int hashCode();
+    public void setTo(android.util.DisplayMetrics);
+    public void setToDefaults();
+    public java.lang.String toString();
+
+
+    public static int DENSITY_280;
+    public static int DENSITY_360;
+    public static int DENSITY_400;
+    public static int DENSITY_420;
+    public static int DENSITY_560;
+    public static int DENSITY_DEFAULT;
+    public static int DENSITY_HIGH;
+    public static int DENSITY_LOW;
+    public static int DENSITY_MEDIUM;
+    public static int DENSITY_TV;
+    public static int DENSITY_XHIGH;
+    public static int DENSITY_XXHIGH;
+    public static int DENSITY_XXXHIGH;
+    public float density;
+    public int densityDpi;
+    public int heightPixels;
+    public float scaledDensity;
+    public int widthPixels;
+    public float xdpi;
+    public float ydpi;
+}
+
+-keep class android.util.Pair {
+    <init>(java.lang.Object, java.lang.Object);
+
+    public static android.util.Pair create(java.lang.Object, java.lang.Object);
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+
+
+    public java.lang.Object first;
+    public java.lang.Object second;
+}
+
+-keep class android.util.Printer {
+
+    public abstract void println(java.lang.String);
+
+
+}
+
+-keep class android.util.Size {
+    <init>(int, int);
+
+    public boolean equals(java.lang.Object);
+    public int getHeight();
+    public int getWidth();
+    public int hashCode();
+    public static android.util.Size parseSize(java.lang.String);
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.util.SizeF {
+    <init>(float, float);
+
+    public boolean equals(java.lang.Object);
+    public float getHeight();
+    public float getWidth();
+    public int hashCode();
+    public static android.util.SizeF parseSizeF(java.lang.String);
+    public java.lang.String toString();
+
+
+}
+
+-keep class android.util.SparseArray {
+    <init>();
+    <init>(int);
+
+    public void append(int, java.lang.Object);
+    public void clear();
+    public android.util.SparseArray clone();
+    public java.lang.Object clone();
+    public void delete(int);
+    public java.lang.Object get(int);
+    public java.lang.Object get(int, java.lang.Object);
+    public int indexOfKey(int);
+    public int indexOfValue(java.lang.Object);
+    public int keyAt(int);
+    public void put(int, java.lang.Object);
+    public void remove(int);
+    public void removeAt(int);
+    public void removeAtRange(int, int);
+    public void setValueAt(int, java.lang.Object);
+    public int size();
+    public java.lang.String toString();
+    public java.lang.Object valueAt(int);
+
+
+}
+
+-keep class android.util.SparseBooleanArray {
+    <init>();
+    <init>(int);
+
+    public void append(int, boolean);
+    public void clear();
+    public android.util.SparseBooleanArray clone();
+    public java.lang.Object clone();
+    public void delete(int);
+    public boolean get(int);
+    public boolean get(int, boolean);
+    public int indexOfKey(int);
+    public int indexOfValue(boolean);
+    public int keyAt(int);
+    public void put(int, boolean);
+    public int size();
+    public java.lang.String toString();
+    public boolean valueAt(int);
+
+
+}
+
+-keep class android.util.TypedValue {
+    <init>();
+
+    public static float applyDimension(int, float, android.util.DisplayMetrics);
+    public java.lang.CharSequence coerceToString();
+    public static java.lang.String coerceToString(int, int);
+    public static float complexToDimension(int, android.util.DisplayMetrics);
+    public static int complexToDimensionPixelOffset(int, android.util.DisplayMetrics);
+    public static int complexToDimensionPixelSize(int, android.util.DisplayMetrics);
+    public static float complexToFloat(int);
+    public static float complexToFraction(int, float, float);
+    public int getComplexUnit();
+    public float getDimension(android.util.DisplayMetrics);
+    public float getFloat();
+    public float getFraction(float, float);
+    public void setTo(android.util.TypedValue);
+    public java.lang.String toString();
+
+
+    public static int COMPLEX_MANTISSA_MASK;
+    public static int COMPLEX_MANTISSA_SHIFT;
+    public static int COMPLEX_RADIX_0p23;
+    public static int COMPLEX_RADIX_16p7;
+    public static int COMPLEX_RADIX_23p0;
+    public static int COMPLEX_RADIX_8p15;
+    public static int COMPLEX_RADIX_MASK;
+    public static int COMPLEX_RADIX_SHIFT;
+    public static int COMPLEX_UNIT_DIP;
+    public static int COMPLEX_UNIT_FRACTION;
+    public static int COMPLEX_UNIT_FRACTION_PARENT;
+    public static int COMPLEX_UNIT_IN;
+    public static int COMPLEX_UNIT_MASK;
+    public static int COMPLEX_UNIT_MM;
+    public static int COMPLEX_UNIT_PT;
+    public static int COMPLEX_UNIT_PX;
+    public static int COMPLEX_UNIT_SHIFT;
+    public static int COMPLEX_UNIT_SP;
+    public static int DATA_NULL_EMPTY;
+    public static int DATA_NULL_UNDEFINED;
+    public static int DENSITY_DEFAULT;
+    public static int DENSITY_NONE;
+    public static int TYPE_ATTRIBUTE;
+    public static int TYPE_DIMENSION;
+    public static int TYPE_FIRST_COLOR_INT;
+    public static int TYPE_FIRST_INT;
+    public static int TYPE_FLOAT;
+    public static int TYPE_FRACTION;
+    public static int TYPE_INT_BOOLEAN;
+    public static int TYPE_INT_COLOR_ARGB4;
+    public static int TYPE_INT_COLOR_ARGB8;
+    public static int TYPE_INT_COLOR_RGB4;
+    public static int TYPE_INT_COLOR_RGB8;
+    public static int TYPE_INT_DEC;
+    public static int TYPE_INT_HEX;
+    public static int TYPE_LAST_COLOR_INT;
+    public static int TYPE_LAST_INT;
+    public static int TYPE_NULL;
+    public static int TYPE_REFERENCE;
+    public static int TYPE_STRING;
+    public int assetCookie;
+    public int changingConfigurations;
+    public int data;
+    public int density;
+    public int resourceId;
+    public java.lang.CharSequence string;
+    public int type;
+}
+
+-keep class android.view.Display {
+
+    public long getAppVsyncOffsetNanos();
+    public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
+    public int getDisplayId();
+    public int getFlags();
+    public int getHeight();
+    public void getMetrics(android.util.DisplayMetrics);
+    public android.view.Display$Mode getMode();
+    public java.lang.String getName();
+    public int getOrientation();
+    public int getPixelFormat();
+    public long getPresentationDeadlineNanos();
+    public void getRealMetrics(android.util.DisplayMetrics);
+    public void getRealSize(android.graphics.Point);
+    public void getRectSize(android.graphics.Rect);
+    public float getRefreshRate();
+    public int getRotation();
+    public void getSize(android.graphics.Point);
+    public int getState();
+    public android.view.Display$Mode[] getSupportedModes();
+    public float[] getSupportedRefreshRates();
+    public int getWidth();
+    public boolean isValid();
+    public java.lang.String toString();
+
+
+    public static int DEFAULT_DISPLAY;
+    public static int FLAG_PRESENTATION;
+    public static int FLAG_PRIVATE;
+    public static int FLAG_ROUND;
+    public static int FLAG_SECURE;
+    public static int FLAG_SUPPORTS_PROTECTED_BUFFERS;
+    public static int INVALID_DISPLAY;
+    public static int STATE_DOZE;
+    public static int STATE_DOZE_SUSPEND;
+    public static int STATE_OFF;
+    public static int STATE_ON;
+    public static int STATE_UNKNOWN;
+}
+
+-keep class android.view.Display$Mode {
+
+    public int describeContents();
+    public boolean equals(java.lang.Object);
+    public int getModeId();
+    public int getPhysicalHeight();
+    public int getPhysicalWidth();
+    public float getRefreshRate();
+    public int hashCode();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.view.InputDevice {
+
+    public int describeContents();
+    public int getControllerNumber();
+    public java.lang.String getDescriptor();
+    public static android.view.InputDevice getDevice(int);
+    public static int[] getDeviceIds();
+    public int getId();
+    public android.view.KeyCharacterMap getKeyCharacterMap();
+    public int getKeyboardType();
+    public android.view.InputDevice$MotionRange getMotionRange(int);
+    public android.view.InputDevice$MotionRange getMotionRange(int, int);
+    public java.util.List getMotionRanges();
+    public java.lang.String getName();
+    public int getProductId();
+    public int getSources();
+    public int getVendorId();
+    public android.os.Vibrator getVibrator();
+    public boolean[] hasKeys(int[]);
+    public boolean hasMicrophone();
+    public boolean isVirtual();
+    public boolean supportsSource(int);
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int KEYBOARD_TYPE_ALPHABETIC;
+    public static int KEYBOARD_TYPE_NONE;
+    public static int KEYBOARD_TYPE_NON_ALPHABETIC;
+    public static int MOTION_RANGE_ORIENTATION;
+    public static int MOTION_RANGE_PRESSURE;
+    public static int MOTION_RANGE_SIZE;
+    public static int MOTION_RANGE_TOOL_MAJOR;
+    public static int MOTION_RANGE_TOOL_MINOR;
+    public static int MOTION_RANGE_TOUCH_MAJOR;
+    public static int MOTION_RANGE_TOUCH_MINOR;
+    public static int MOTION_RANGE_X;
+    public static int MOTION_RANGE_Y;
+    public static int SOURCE_ANY;
+    public static int SOURCE_BLUETOOTH_STYLUS;
+    public static int SOURCE_CLASS_BUTTON;
+    public static int SOURCE_CLASS_JOYSTICK;
+    public static int SOURCE_CLASS_MASK;
+    public static int SOURCE_CLASS_NONE;
+    public static int SOURCE_CLASS_POINTER;
+    public static int SOURCE_CLASS_POSITION;
+    public static int SOURCE_CLASS_TRACKBALL;
+    public static int SOURCE_DPAD;
+    public static int SOURCE_GAMEPAD;
+    public static int SOURCE_HDMI;
+    public static int SOURCE_JOYSTICK;
+    public static int SOURCE_KEYBOARD;
+    public static int SOURCE_MOUSE;
+    public static int SOURCE_STYLUS;
+    public static int SOURCE_TOUCHPAD;
+    public static int SOURCE_TOUCHSCREEN;
+    public static int SOURCE_TOUCH_NAVIGATION;
+    public static int SOURCE_TRACKBALL;
+    public static int SOURCE_UNKNOWN;
+}
+
+-keep class android.view.InputDevice$MotionRange {
+
+    public int getAxis();
+    public float getFlat();
+    public float getFuzz();
+    public float getMax();
+    public float getMin();
+    public float getRange();
+    public float getResolution();
+    public int getSource();
+    public boolean isFromSource(int);
+
+
+}
+
+-keep class android.view.InputEvent {
+
+    public int describeContents();
+    public android.view.InputDevice getDevice();
+    public abstract int getDeviceId();
+    public abstract long getEventTime();
+    public abstract int getSource();
+    public boolean isFromSource(int);
+
+
+    public static android.os.Parcelable$Creator CREATOR;
+}
+
+-keep class android.view.KeyCharacterMap {
+
+    public int describeContents();
+    public static boolean deviceHasKey(int);
+    public static boolean[] deviceHasKeys(int[]);
+    protected void finalize();
+    public int get(int, int);
+    public static int getDeadChar(int, int);
+    public char getDisplayLabel(int);
+    public android.view.KeyEvent[] getEvents(char[]);
+    public boolean getKeyData(int, android.view.KeyCharacterMap$KeyData);
+    public int getKeyboardType();
+    public char getMatch(int, char[]);
+    public char getMatch(int, char[], int);
+    public int getModifierBehavior();
+    public char getNumber(int);
+    public boolean isPrintingKey(int);
+    public static android.view.KeyCharacterMap load(int);
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static int ALPHA;
+    public static int BUILT_IN_KEYBOARD;
+    public static int COMBINING_ACCENT;
+    public static int COMBINING_ACCENT_MASK;
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FULL;
+    public static char HEX_INPUT;
+    public static int MODIFIER_BEHAVIOR_CHORDED;
+    public static int MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED;
+    public static int NUMERIC;
+    public static char PICKER_DIALOG_INPUT;
+    public static int PREDICTIVE;
+    public static int SPECIAL_FUNCTION;
+    public static int VIRTUAL_KEYBOARD;
+}
+
+-keep class android.view.KeyCharacterMap$KeyData {
+    <init>();
+
+
+
+    public static int META_LENGTH;
+    public char displayLabel;
+    public char[] meta;
+    public char number;
+}
+
+-keep class android.view.KeyEvent {
+    <init>(int, int);
+    <init>(long, long, int, int, int);
+    <init>(long, long, int, int, int, int);
+    <init>(long, long, int, int, int, int, int, int);
+    <init>(long, long, int, int, int, int, int, int, int);
+    <init>(long, long, int, int, int, int, int, int, int, int);
+    <init>(long, java.lang.String, int, int);
+    <init>(android.view.KeyEvent);
+    <init>(android.view.KeyEvent, long, int);
+
+    public static android.view.KeyEvent changeAction(android.view.KeyEvent, int);
+    public static android.view.KeyEvent changeFlags(android.view.KeyEvent, int);
+    public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int);
+    public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int, int);
+    public boolean dispatch(android.view.KeyEvent$Callback);
+    public boolean dispatch(android.view.KeyEvent$Callback, android.view.KeyEvent$DispatcherState, java.lang.Object);
+    public int getAction();
+    public java.lang.String getCharacters();
+    public static int getDeadChar(int, int);
+    public int getDeviceId();
+    public char getDisplayLabel();
+    public long getDownTime();
+    public long getEventTime();
+    public int getFlags();
+    public android.view.KeyCharacterMap getKeyCharacterMap();
+    public int getKeyCode();
+    public boolean getKeyData(android.view.KeyCharacterMap$KeyData);
+    public char getMatch(char[]);
+    public char getMatch(char[], int);
+    public static int getMaxKeyCode();
+    public int getMetaState();
+    public static int getModifierMetaStateMask();
+    public int getModifiers();
+    public char getNumber();
+    public int getRepeatCount();
+    public int getScanCode();
+    public int getSource();
+    public int getUnicodeChar();
+    public int getUnicodeChar(int);
+    public boolean hasModifiers(int);
+    public boolean hasNoModifiers();
+    public boolean isAltPressed();
+    public boolean isCanceled();
+    public boolean isCapsLockOn();
+    public boolean isCtrlPressed();
+    public boolean isFunctionPressed();
+    public static boolean isGamepadButton(int);
+    public boolean isLongPress();
+    public boolean isMetaPressed();
+    public static boolean isModifierKey(int);
+    public boolean isNumLockOn();
+    public boolean isPrintingKey();
+    public boolean isScrollLockOn();
+    public boolean isShiftPressed();
+    public boolean isSymPressed();
+    public boolean isSystem();
+    public boolean isTracking();
+    public static int keyCodeFromString(java.lang.String);
+    public static java.lang.String keyCodeToString(int);
+    public static boolean metaStateHasModifiers(int, int);
+    public static boolean metaStateHasNoModifiers(int);
+    public static int normalizeMetaState(int);
+    public void setSource(int);
+    public void startTracking();
+    public java.lang.String toString();
+    public void writeToParcel(android.os.Parcel, int);
+
+
+    public static int ACTION_DOWN;
+    public static int ACTION_MULTIPLE;
+    public static int ACTION_UP;
+    public static android.os.Parcelable$Creator CREATOR;
+    public static int FLAG_CANCELED;
+    public static int FLAG_CANCELED_LONG_PRESS;
+    public static int FLAG_EDITOR_ACTION;
+    public static int FLAG_FALLBACK;
+    public static int FLAG_FROM_SYSTEM;
+    public static int FLAG_KEEP_TOUCH_MODE;
+    public static int FLAG_LONG_PRESS;
+    public static int FLAG_SOFT_KEYBOARD;
+    public static int FLAG_TRACKING;
+    public static int FLAG_VIRTUAL_HARD_KEY;
+    public static int FLAG_WOKE_HERE;
+    public static int KEYCODE_0;
+    public static int KEYCODE_1;
+    public static int KEYCODE_11;
+    public static int KEYCODE_12;
+    public static int KEYCODE_2;
+    public static int KEYCODE_3;
+    public static int KEYCODE_3D_MODE;
+    public static int KEYCODE_4;
+    public static int KEYCODE_5;
+    public static int KEYCODE_6;
+    public static int KEYCODE_7;
+    public static int KEYCODE_8;
+    public static int KEYCODE_9;
+    public static int KEYCODE_A;
+    public static int KEYCODE_ALT_LEFT;
+    public static int KEYCODE_ALT_RIGHT;
+    public static int KEYCODE_APOSTROPHE;
+    public static int KEYCODE_APP_SWITCH;
+    public static int KEYCODE_ASSIST;
+    public static int KEYCODE_AT;
+    public static int KEYCODE_AVR_INPUT;
+    public static int KEYCODE_AVR_POWER;
+    public static int KEYCODE_B;
+    public static int KEYCODE_BACK;
+    public static int KEYCODE_BACKSLASH;
+    public static int KEYCODE_BOOKMARK;
+    public static int KEYCODE_BREAK;
+    public static int KEYCODE_BRIGHTNESS_DOWN;
+    public static int KEYCODE_BRIGHTNESS_UP;
+    public static int KEYCODE_BUTTON_1;
+    public static int KEYCODE_BUTTON_10;
+    public static int KEYCODE_BUTTON_11;
+    public static int KEYCODE_BUTTON_12;
+    public static int KEYCODE_BUTTON_13;
+    public static int KEYCODE_BUTTON_14;
+    public static int KEYCODE_BUTTON_15;
+    public static int KEYCODE_BUTTON_16;
+    public static int KEYCODE_BUTTON_2;
+    public static int KEYCODE_BUTTON_3;
+    public static int KEYCODE_BUTTON_4;
+    public static int KEYCODE_BUTTON_5;
+    public static int KEYCODE_BUTTON_6;
+    public static int KEYCODE_BUTTON_7;
+    public static int KEYCODE_BUTTON_8;
+    public static int KEYCODE_BUTTON_9;
+    public static int KEYCODE_BUTTON_A;
+    public static int KEYCODE_BUTTON_B;
+    public static int KEYCODE_BUTTON_C;
+    public static int KEYCODE_BUTTON_L1;
+    public static int KEYCODE_BUTTON_L2;
+    public static int KEYCODE_BUTTON_MODE;
+    public static int KEYCODE_BUTTON_R1;
+    public static int KEYCODE_BUTTON_R2;
+    public static int KEYCODE_BUTTON_SELECT;
+    public static int KEYCODE_BUTTON_START;
+    public static int KEYCODE_BUTTON_THUMBL;
+    public static int KEYCODE_BUTTON_THUMBR;
+    public static int KEYCODE_BUTTON_X;
+    public static int KEYCODE_BUTTON_Y;
+    public static int KEYCODE_BUTTON_Z;
+    public static int KEYCODE_C;
+    public static int KEYCODE_CALCULATOR;
+    public static int KEYCODE_CALENDAR;
+    public static int KEYCODE_CALL;
+    public static int KEYCODE_CAMERA;
+    public static int KEYCODE_CAPS_LOCK;
+    public static int KEYCODE_CAPTIONS;
+    public static int KEYCODE_CHANNEL_DOWN;
+    public static int KEYCODE_CHANNEL_UP;
+    public static int KEYCODE_CLEAR;
+    public static int KEYCODE_COMMA;
+    public static int KEYCODE_CONTACTS;
+    public static int KEYCODE_CTRL_LEFT;
+    public static int KEYCODE_CTRL_RIGHT;
+    public static int KEYCODE_D;
+    public static int KEYCODE_DEL;
+    public static int KEYCODE_DPAD_CENTER;
+    public static int KEYCODE_DPAD_DOWN;
+    public static int KEYCODE_DPAD_LEFT;
+    public static int KEYCODE_DPAD_RIGHT;
+    public static int KEYCODE_DPAD_UP;
+    public static int KEYCODE_DVR;
+    public static int KEYCODE_E;
+    public static int KEYCODE_EISU;
+    public static int KEYCODE_ENDCALL;
+    public static int KEYCODE_ENTER;
+    public static int KEYCODE_ENVELOPE;
+    public static int KEYCODE_EQUALS;
+    public static int KEYCODE_ESCAPE;
+    public static int KEYCODE_EXPLORER;
+    public static int KEYCODE_F;
+    public static int KEYCODE_F1;
+    public static int KEYCODE_F10;
+    public static int KEYCODE_F11;
+    public static int KEYCODE_F12;
+    public static int KEYCODE_F2;
+    public static int KEYCODE_F3;
+    public static int KEYCODE_F4;
+    public static int KEYCODE_F5;
+    public static int KEYCODE_F6;
+    public static int KEYCODE_F7;
+    public static int KEYCODE_F8;
+    public static int KEYCODE_F9;
+    public static int KEYCODE_FOCUS;
+    public static int KEYCODE_FORWARD;
+    public static int KEYCODE_FORWARD_DEL;
+    public static int KEYCODE_FUNCTION;
+    public static int KEYCODE_G;
+    public static int KEYCODE_GRAVE;
+    public static int KEYCODE_GUIDE;
+    public static int KEYCODE_H;
+    public static int KEYCODE_HEADSETHOOK;
+    public static int KEYCODE_HELP;
+    public static int KEYCODE_HENKAN;
+    public static int KEYCODE_HOME;
+    public static int KEYCODE_I;
+    public static int KEYCODE_INFO;
+    public static int KEYCODE_INSERT;
+    public static int KEYCODE_J;
+    public static int KEYCODE_K;
+    public static int KEYCODE_KANA;
+    public static int KEYCODE_KATAKANA_HIRAGANA;
+    public static int KEYCODE_L;
+    public static int KEYCODE_LANGUAGE_SWITCH;
+    public static int KEYCODE_LAST_CHANNEL;
+    public static int KEYCODE_LEFT_BRACKET;
+    public static int KEYCODE_M;
+    public static int KEYCODE_MANNER_MODE;
+    public static int KEYCODE_MEDIA_AUDIO_TRACK;
+    public static int KEYCODE_MEDIA_CLOSE;
+    public static int KEYCODE_MEDIA_EJECT;
+    public static int KEYCODE_MEDIA_FAST_FORWARD;
+    public static int KEYCODE_MEDIA_NEXT;
+    public static int KEYCODE_MEDIA_PAUSE;
+    public static int KEYCODE_MEDIA_PLAY;
+    public static int KEYCODE_MEDIA_PLAY_PAUSE;
+    public static int KEYCODE_MEDIA_PREVIOUS;
+    public static int KEYCODE_MEDIA_RECORD;
+    public static int KEYCODE_MEDIA_REWIND;
+    public static int KEYCODE_MEDIA_SKIP_BACKWARD;
+    public static int KEYCODE_MEDIA_SKIP_FORWARD;
+    public static int KEYCODE_MEDIA_STEP_BACKWARD;
+    public static int KEYCODE_MEDIA_STEP_FORWARD;
+    public static int KEYCODE_MEDIA_STOP;
+    public static int KEYCODE_MEDIA_TOP_MENU;
+    public static int KEYCODE_MENU;
+    public static int KEYCODE_META_LEFT;
+    public static int KEYCODE_META_RIGHT;
+    public static int KEYCODE_MINUS;
+    public static int KEYCODE_MOVE_END;
+    public static int KEYCODE_MOVE_HOME;
+    public static int KEYCODE_MUHENKAN;
+    public static int KEYCODE_MUSIC;
+    public static int KEYCODE_MUTE;
+    public static int KEYCODE_N;
+    public static int KEYCODE_NAVIGATE_IN;
+    public static int KEYCODE_NAVIGATE_NEXT;
+    public static int KEYCODE_NAVIGATE_OUT;
+    public static int KEYCODE_NAVIGATE_PREVIOUS;
+    public static int KEYCODE_NOTIFICATION;
+    public static int KEYCODE_NUM;
+    public static int KEYCODE_NUMPAD_0;
+    public static int KEYCODE_NUMPAD_1;
+    public static int KEYCODE_NUMPAD_2;
+    public static int KEYCODE_NUMPAD_3;
+    public static int KEYCODE_NUMPAD_4;
+    public static int KEYCODE_NUMPAD_5;
+    public static int KEYCODE_NUMPAD_6;
+    public static int KEYCODE_NUMPAD_7;
+    public static int KEYCODE_NUMPAD_8;
+    public static int KEYCODE_NUMPAD_9;
+    public static int KEYCODE_NUMPAD_ADD;
+    public static int KEYCODE_NUMPAD_COMMA;
+    public static int KEYCODE_NUMPAD_DIVIDE;
+    public static int KEYCODE_NUMPAD_DOT;
+    public static int KEYCODE_NUMPAD_ENTER;
+    public static int KEYCODE_NUMPAD_EQUALS;
+    public static int KEYCODE_NUMPAD_LEFT_PAREN;
+    public static int KEYCODE_NUMPAD_MULTIPLY;
+    public static int KEYCODE_NUMPAD_RIGHT_PAREN;
+    public static int KEYCODE_NUMPAD_SUBTRACT;
+    public static int KEYCODE_NUM_LOCK;
+    public static int KEYCODE_O;
+    public static int KEYCODE_P;
+    public static int KEYCODE_PAGE_DOWN;
+    public static int KEYCODE_PAGE_UP;
+    public static int KEYCODE_PAIRING;
+    public static int KEYCODE_PERIOD;
+    public static int KEYCODE_PICTSYMBOLS;
+    public static int KEYCODE_PLUS;
+    public static int KEYCODE_POUND;
+    public static int KEYCODE_POWER;
+    public static int KEYCODE_PROG_BLUE;
+    public static int KEYCODE_PROG_GREEN;
+    public static int KEYCODE_PROG_RED;
+    public static int KEYCODE_PROG_YELLOW;
+    public static int KEYCODE_Q;
+    public static int KEYCODE_R;
+    public static int KEYCODE_RIGHT_BRACKET;
+    public static int KEYCODE_RO;
+    public static int KEYCODE_S;
+    public static int KEYCODE_SCROLL_LOCK;
+    public static int KEYCODE_SEARCH;
+    public static int KEYCODE_SEMICOLON;
+    public static int KEYCODE_SETTINGS;
+    public static int KEYCODE_SHIFT_LEFT;
+    public static int KEYCODE_SHIFT_RIGHT;
+    public static int KEYCODE_SLASH;
+    public static int KEYCODE_SLEEP;
+    public static int KEYCODE_SOFT_LEFT;
+    public static int KEYCODE_SOFT_RIGHT;
+    public static int KEYCODE_SPACE;
+    public static int KEYCODE_STAR;
+    public static int KEYCODE_STB_INPUT;
+    public static int KEYCODE_STB_POWER;
+    public static int KEYCODE_SWITCH_CHARSET;
+    public static int KEYCODE_SYM;
+    public static int KEYCODE_SYSRQ;
+    public static int KEYCODE_T;
+    public static int KEYCODE_TAB;
+    public static int KEYCODE_TV;
+    public static int KEYCODE_TV_ANTENNA_CABLE;
+    public static int KEYCODE_TV_AUDIO_DESCRIPTION;
+    public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN;
+    public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP;
+    public static int KEYCODE_TV_CONTENTS_MENU;
+    public static int KEYCODE_TV_DATA_SERVICE;
+    public static int KEYCODE_TV_INPUT;
+    public static int KEYCODE_TV_INPUT_COMPONENT_1;
+    public static int KEYCODE_TV_INPUT_COMPONENT_2;
+    public static int KEYCODE_TV_INPUT_COMPOSITE_1;
+    public static int KEYCODE_TV_INPUT_COMPOSITE_2;
+    public static int KEYCODE_TV_INPUT_HDMI_1;
+    public static int KEYCODE_TV_INPUT_HDMI_2;
+    public static int KEYCODE_TV_INPUT_HDMI_3;
+    public static int KEYCODE_TV_INPUT_HDMI_4;
+    public static int KEYCODE_TV_INPUT_VGA_1;
+    public static int KEYCODE_TV_MEDIA_CONTEXT_MENU;
+    public static int KEYCODE_TV_NETWORK;
+    public static int KEYCODE_TV_NUMBER_ENTRY;
+    public static int KEYCODE_TV_POWER;
+    public static int KEYCODE_TV_RADIO_SERVICE;
+    public static int KEYCODE_TV_SATELLITE;
+    public static int KEYCODE_TV_SATELLITE_BS;
+    public static int KEYCODE_TV_SATELLITE_CS;
+    public static int KEYCODE_TV_SATELLITE_SERVICE;
+    public static int KEYCODE_TV_TELETEXT;
+    public static int KEYCODE_TV_TERRESTRIAL_ANALOG;
+    public static int KEYCODE_TV_TERRESTRIAL_DIGITAL;
+    public static int KEYCODE_TV_TIMER_PROGRAMMING;
+    public static int KEYCODE_TV_ZOOM_MODE;
+    public static int KEYCODE_U;
+    public static int KEYCODE_UNKNOWN;
+    public static int KEYCODE_V;
+    public static int KEYCODE_VOICE_ASSIST;
+    public static int KEYCODE_VOLUME_DOWN;
+    public static int KEYCODE_VOLUME_MUTE;
+    public static int KEYCODE_VOLUME_UP;
+    public static int KEYCODE_W;
+    public static int KEYCODE_WAKEUP;
+    public static int KEYCODE_WINDOW;
+    public static int KEYCODE_X;
+    public static int KEYCODE_Y;
+    public static int KEYCODE_YEN;
+    public static int KEYCODE_Z;
+    public static int KEYCODE_ZENKAKU_HANKAKU;
+    public static int KEYCODE_ZOOM_IN;
+    public static int KEYCODE_ZOOM_OUT;
+    public static int MAX_KEYCODE;
+    public static int META_ALT_LEFT_ON;
+    public static int META_ALT_MASK;
+    public static int META_ALT_ON;
+    public static int META_ALT_RIGHT_ON;
+    public static int META_CAPS_LOCK_ON;
+    public static int META_CTRL_LEFT_ON;
+    public static int META_CTRL_MASK;
+    public static int META_CTRL_ON;
+    public static int META_CTRL_RIGHT_ON;
+    public static int META_FUNCTION_ON;
+    public static int META_META_LEFT_ON;
+    public static int META_META_MASK;
+    public static int META_META_ON;
+    public static int META_META_RIGHT_ON;
+    public static int META_NUM_LOCK_ON;
+    public static int META_SCROLL_LOCK_ON;
+    public static int META_SHIFT_LEFT_ON;
+    public static int META_SHIFT_MASK;
+    public static int META_SHIFT_ON;
+    public static int META_SHIFT_RIGHT_ON;
+    public static int META_SYM_ON;
+}
+
+-keep class android.view.KeyEvent$Callback {
+
+    public abstract boolean onKeyDown(int, android.view.KeyEvent);
+    public abstract boolean onKeyLongPress(int, android.view.KeyEvent);
+    public abstract boolean onKeyMultiple(int, int, android.view.KeyEvent);
+    public abstract boolean onKeyUp(int, android.view.KeyEvent);
+
+
+}
+
+-keep class android.view.KeyEvent$DispatcherState {
+    <init>();
+
+    public void handleUpEvent(android.view.KeyEvent);
+    public boolean isTracking(android.view.KeyEvent);
+    public void performedLongPress(android.view.KeyEvent);
+    public void reset();
+    public void reset(java.lang.Object);
+    public void startTracking(android.view.KeyEvent, java.lang.Object);
+
+
+}
+
+-keep class java.io.File {
+    <init>(java.io.File, java.lang.String);
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.String);
+    <init>(java.net.URI);
+
+    public boolean canExecute();
+    public boolean canRead();
+    public boolean canWrite();
+    public int compareTo(java.io.File);
+    public int compareTo(java.lang.Object);
+    public boolean createNewFile();
+    public static java.io.File createTempFile(java.lang.String, java.lang.String);
+    public static java.io.File createTempFile(java.lang.String, java.lang.String, java.io.File);
+    public boolean delete();
+    public void deleteOnExit();
+    public boolean equals(java.lang.Object);
+    public boolean exists();
+    public java.io.File getAbsoluteFile();
+    public java.lang.String getAbsolutePath();
+    public java.io.File getCanonicalFile();
+    public java.lang.String getCanonicalPath();
+    public long getFreeSpace();
+    public java.lang.String getName();
+    public java.lang.String getParent();
+    public java.io.File getParentFile();
+    public java.lang.String getPath();
+    public long getTotalSpace();
+    public long getUsableSpace();
+    public int hashCode();
+    public boolean isAbsolute();
+    public boolean isDirectory();
+    public boolean isFile();
+    public boolean isHidden();
+    public long lastModified();
+    public long length();
+    public java.lang.String[] list();
+    public java.lang.String[] list(java.io.FilenameFilter);
+    public java.io.File[] listFiles();
+    public java.io.File[] listFiles(java.io.FilenameFilter);
+    public java.io.File[] listFiles(java.io.FileFilter);
+    public static java.io.File[] listRoots();
+    public boolean mkdir();
+    public boolean mkdirs();
+    public boolean renameTo(java.io.File);
+    public boolean setExecutable(boolean, boolean);
+    public boolean setExecutable(boolean);
+    public boolean setLastModified(long);
+    public boolean setReadOnly();
+    public boolean setReadable(boolean, boolean);
+    public boolean setReadable(boolean);
+    public boolean setWritable(boolean, boolean);
+    public boolean setWritable(boolean);
+    public java.lang.String toString();
+    public java.net.URI toURI();
+    public java.net.URL toURL();
+
+
+    public static java.lang.String pathSeparator;
+    public static char pathSeparatorChar;
+    public static java.lang.String separator;
+    public static char separatorChar;
+}
+
+-keep class java.io.FileDescriptor {
+    <init>();
+
+    public void sync();
+    public java.lang.String toString();
+    public boolean valid();
+
+
+    public static java.io.FileDescriptor err;
+    public static java.io.FileDescriptor in;
+    public static java.io.FileDescriptor out;
+}
+
+-keep class java.io.FileFilter {
+
+    public abstract boolean accept(java.io.File);
+
+
+}
+
+-keep class java.io.FileInputStream {
+    <init>(java.io.File);
+    <init>(java.io.FileDescriptor);
+    <init>(java.lang.String);
+
+    public int available();
+    public void close();
+    protected void finalize();
+    public java.nio.channels.FileChannel getChannel();
+    public java.io.FileDescriptor getFD();
+    public int read();
+    public int read(byte[], int, int);
+    public long skip(long);
+
+
+}
+
+-keep class java.io.FileNotFoundException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.io.FileOutputStream {
+    <init>(java.io.File);
+    <init>(java.io.File, boolean);
+    <init>(java.io.FileDescriptor);
+    <init>(java.lang.String);
+    <init>(java.lang.String, boolean);
+
+    public void close();
+    protected void finalize();
+    public java.nio.channels.FileChannel getChannel();
+    public java.io.FileDescriptor getFD();
+    public void write(byte[], int, int);
+    public void write(int);
+
+
+}
+
+-keep class java.io.FilenameFilter {
+
+    public abstract boolean accept(java.io.File, java.lang.String);
+
+
+}
+
+-keep class java.io.FilterOutputStream {
+    <init>(java.io.OutputStream);
+
+    public void close();
+    public void flush();
+    public void write(byte[], int, int);
+    public void write(int);
+
+
+    protected java.io.OutputStream out;
+}
+
+-keep class java.io.IOException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.io.InputStream {
+    <init>();
+
+    public int available();
+    public void close();
+    public void mark(int);
+    public boolean markSupported();
+    public abstract int read();
+    public int read(byte[]);
+    public int read(byte[], int, int);
+    public synchronized void reset();
+    public long skip(long);
+
+
+}
+
+-keep class java.io.ObjectStreamException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.io.OutputStream {
+    <init>();
+
+    public void close();
+    public void flush();
+    public void write(byte[]);
+    public void write(byte[], int, int);
+    public abstract void write(int);
+
+
+}
+
+-keep class java.io.PrintStream {
+    <init>(java.io.OutputStream);
+    <init>(java.io.OutputStream, boolean);
+    <init>(java.io.OutputStream, boolean, java.lang.String);
+    <init>(java.io.File);
+    <init>(java.io.File, java.lang.String);
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.String);
+
+    public java.io.PrintStream append(char);
+    public java.io.PrintStream append(java.lang.CharSequence);
+    public java.io.PrintStream append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence);
+    public java.lang.Appendable append(char);
+    public boolean checkError();
+    protected void clearError();
+    public synchronized void close();
+    public synchronized void flush();
+    public java.io.PrintStream format(java.lang.String, java.lang.Object[]);
+    public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object[]);
+    public void print(char[]);
+    public void print(char);
+    public void print(double);
+    public void print(float);
+    public void print(int);
+    public void print(long);
+    public void print(java.lang.Object);
+    public synchronized void print(java.lang.String);
+    public void print(boolean);
+    public java.io.PrintStream printf(java.lang.String, java.lang.Object[]);
+    public java.io.PrintStream printf(java.util.Locale, java.lang.String, java.lang.Object[]);
+    public void println();
+    public void println(char[]);
+    public void println(char);
+    public void println(double);
+    public void println(float);
+    public void println(int);
+    public void println(long);
+    public void println(java.lang.Object);
+    public synchronized void println(java.lang.String);
+    public void println(boolean);
+    protected void setError();
+    public void write(byte[], int, int);
+    public synchronized void write(int);
+
+
+}
+
+-keep class java.io.PrintWriter {
+    <init>(java.io.OutputStream);
+    <init>(java.io.OutputStream, boolean);
+    <init>(java.io.Writer);
+    <init>(java.io.Writer, boolean);
+    <init>(java.io.File);
+    <init>(java.io.File, java.lang.String);
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.String);
+
+    public java.io.PrintWriter append(char);
+    public java.io.PrintWriter append(java.lang.CharSequence);
+    public java.io.PrintWriter append(java.lang.CharSequence, int, int);
+    public java.io.Writer append(java.lang.CharSequence, int, int);
+    public java.io.Writer append(java.lang.CharSequence);
+    public java.io.Writer append(char);
+    public java.lang.Appendable append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence);
+    public java.lang.Appendable append(char);
+    public boolean checkError();
+    protected void clearError();
+    public void close();
+    public void flush();
+    public java.io.PrintWriter format(java.lang.String, java.lang.Object[]);
+    public java.io.PrintWriter format(java.util.Locale, java.lang.String, java.lang.Object[]);
+    public void print(char[]);
+    public void print(char);
+    public void print(double);
+    public void print(float);
+    public void print(int);
+    public void print(long);
+    public void print(java.lang.Object);
+    public void print(java.lang.String);
+    public void print(boolean);
+    public java.io.PrintWriter printf(java.lang.String, java.lang.Object[]);
+    public java.io.PrintWriter printf(java.util.Locale, java.lang.String, java.lang.Object[]);
+    public void println();
+    public void println(char[]);
+    public void println(char);
+    public void println(double);
+    public void println(float);
+    public void println(int);
+    public void println(long);
+    public void println(java.lang.Object);
+    public void println(java.lang.String);
+    public void println(boolean);
+    protected void setError();
+    public void write(char[]);
+    public void write(char[], int, int);
+    public void write(int);
+    public void write(java.lang.String);
+    public void write(java.lang.String, int, int);
+
+
+    protected java.io.Writer out;
+}
+
+-keep class java.io.Reader {
+    <init>();
+    <init>(java.lang.Object);
+
+    public abstract void close();
+    public void mark(int);
+    public boolean markSupported();
+    public int read();
+    public int read(char[]);
+    public abstract int read(char[], int, int);
+    public int read(java.nio.CharBuffer);
+    public boolean ready();
+    public void reset();
+    public long skip(long);
+
+
+    protected java.lang.Object lock;
+}
+
+-keep class java.io.Serializable {
+
+
+
+}
+
+-keep class java.io.SyncFailedException {
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.io.UnsupportedEncodingException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.io.Writer {
+    <init>();
+    <init>(java.lang.Object);
+
+    public java.io.Writer append(char);
+    public java.io.Writer append(java.lang.CharSequence);
+    public java.io.Writer append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence);
+    public java.lang.Appendable append(char);
+    public abstract void close();
+    public abstract void flush();
+    public void write(char[]);
+    public abstract void write(char[], int, int);
+    public void write(int);
+    public void write(java.lang.String);
+    public void write(java.lang.String, int, int);
+
+
+    protected java.lang.Object lock;
+}
+
+-keep class java.lang.AbstractStringBuilder {
+
+    public int capacity();
+    public char charAt(int);
+    public int codePointAt(int);
+    public int codePointBefore(int);
+    public int codePointCount(int, int);
+    public void ensureCapacity(int);
+    public void getChars(int, int, char[], int);
+    public int indexOf(java.lang.String);
+    public int indexOf(java.lang.String, int);
+    public int lastIndexOf(java.lang.String);
+    public int lastIndexOf(java.lang.String, int);
+    public int length();
+    public int offsetByCodePoints(int, int);
+    public void setCharAt(int, char);
+    public void setLength(int);
+    public java.lang.CharSequence subSequence(int, int);
+    public java.lang.String substring(int);
+    public java.lang.String substring(int, int);
+    public java.lang.String toString();
+    public void trimToSize();
+
+
+}
+
+-keep class java.lang.Appendable {
+
+    public abstract java.lang.Appendable append(char);
+    public abstract java.lang.Appendable append(java.lang.CharSequence);
+    public abstract java.lang.Appendable append(java.lang.CharSequence, int, int);
+
+
+}
+
+-keep class java.lang.Boolean {
+    <init>(java.lang.String);
+    <init>(boolean);
+
+    public boolean booleanValue();
+    public static int compare(boolean, boolean);
+    public int compareTo(java.lang.Boolean);
+    public int compareTo(java.lang.Object);
+    public boolean equals(java.lang.Object);
+    public static boolean getBoolean(java.lang.String);
+    public int hashCode();
+    public static boolean parseBoolean(java.lang.String);
+    public java.lang.String toString();
+    public static java.lang.String toString(boolean);
+    public static java.lang.Boolean valueOf(java.lang.String);
+    public static java.lang.Boolean valueOf(boolean);
+
+
+    public static java.lang.Boolean FALSE;
+    public static java.lang.Boolean TRUE;
+    public static java.lang.Class TYPE;
+}
+
+-keep class java.lang.Byte {
+    <init>(byte);
+    <init>(java.lang.String);
+
+    public byte byteValue();
+    public static int compare(byte, byte);
+    public int compareTo(java.lang.Byte);
+    public int compareTo(java.lang.Object);
+    public static java.lang.Byte decode(java.lang.String);
+    public double doubleValue();
+    public boolean equals(java.lang.Object);
+    public float floatValue();
+    public int hashCode();
+    public int intValue();
+    public long longValue();
+    public static byte parseByte(java.lang.String);
+    public static byte parseByte(java.lang.String, int);
+    public short shortValue();
+    public java.lang.String toString();
+    public static java.lang.String toString(byte);
+    public static java.lang.Byte valueOf(java.lang.String);
+    public static java.lang.Byte valueOf(java.lang.String, int);
+    public static java.lang.Byte valueOf(byte);
+
+
+    public static byte MAX_VALUE;
+    public static byte MIN_VALUE;
+    public static int SIZE;
+    public static java.lang.Class TYPE;
+}
+
+-keep class java.lang.CharSequence {
+
+    public abstract char charAt(int);
+    public abstract int length();
+    public abstract java.lang.CharSequence subSequence(int, int);
+    public abstract java.lang.String toString();
+
+
+}
+
+-keep class java.lang.Character {
+    <init>(char);
+
+    public static int charCount(int);
+    public char charValue();
+    public static int codePointAt(java.lang.CharSequence, int);
+    public static int codePointAt(char[], int);
+    public static int codePointAt(char[], int, int);
+    public static int codePointBefore(java.lang.CharSequence, int);
+    public static int codePointBefore(char[], int);
+    public static int codePointBefore(char[], int, int);
+    public static int codePointCount(java.lang.CharSequence, int, int);
+    public static int codePointCount(char[], int, int);
+    public static int compare(char, char);
+    public int compareTo(java.lang.Character);
+    public int compareTo(java.lang.Object);
+    public static int digit(char, int);
+    public static int digit(int, int);
+    public boolean equals(java.lang.Object);
+    public static char forDigit(int, int);
+    public static byte getDirectionality(char);
+    public static byte getDirectionality(int);
+    public static java.lang.String getName(int);
+    public static int getNumericValue(char);
+    public static int getNumericValue(int);
+    public static int getType(char);
+    public static int getType(int);
+    public int hashCode();
+    public static char highSurrogate(int);
+    public static boolean isAlphabetic(int);
+    public static boolean isBmpCodePoint(int);
+    public static boolean isDefined(char);
+    public static boolean isDefined(int);
+    public static boolean isDigit(char);
+    public static boolean isDigit(int);
+    public static boolean isHighSurrogate(char);
+    public static boolean isISOControl(char);
+    public static boolean isISOControl(int);
+    public static boolean isIdentifierIgnorable(char);
+    public static boolean isIdentifierIgnorable(int);
+    public static boolean isIdeographic(int);
+    public static boolean isJavaIdentifierPart(char);
+    public static boolean isJavaIdentifierPart(int);
+    public static boolean isJavaIdentifierStart(char);
+    public static boolean isJavaIdentifierStart(int);
+    public static boolean isJavaLetter(char);
+    public static boolean isJavaLetterOrDigit(char);
+    public static boolean isLetter(char);
+    public static boolean isLetter(int);
+    public static boolean isLetterOrDigit(char);
+    public static boolean isLetterOrDigit(int);
+    public static boolean isLowSurrogate(char);
+    public static boolean isLowerCase(char);
+    public static boolean isLowerCase(int);
+    public static boolean isMirrored(char);
+    public static boolean isMirrored(int);
+    public static boolean isSpace(char);
+    public static boolean isSpaceChar(char);
+    public static boolean isSpaceChar(int);
+    public static boolean isSupplementaryCodePoint(int);
+    public static boolean isSurrogate(char);
+    public static boolean isSurrogatePair(char, char);
+    public static boolean isTitleCase(char);
+    public static boolean isTitleCase(int);
+    public static boolean isUnicodeIdentifierPart(char);
+    public static boolean isUnicodeIdentifierPart(int);
+    public static boolean isUnicodeIdentifierStart(char);
+    public static boolean isUnicodeIdentifierStart(int);
+    public static boolean isUpperCase(char);
+    public static boolean isUpperCase(int);
+    public static boolean isValidCodePoint(int);
+    public static boolean isWhitespace(char);
+    public static boolean isWhitespace(int);
+    public static char lowSurrogate(int);
+    public static int offsetByCodePoints(java.lang.CharSequence, int, int);
+    public static int offsetByCodePoints(char[], int, int, int, int);
+    public static char reverseBytes(char);
+    public static int toChars(int, char[], int);
+    public static char[] toChars(int);
+    public static int toCodePoint(char, char);
+    public static char toLowerCase(char);
+    public static int toLowerCase(int);
+    public java.lang.String toString();
+    public static java.lang.String toString(char);
+    public static char toTitleCase(char);
+    public static int toTitleCase(int);
+    public static char toUpperCase(char);
+    public static int toUpperCase(int);
+    public static java.lang.Character valueOf(char);
+
+
+    public static byte COMBINING_SPACING_MARK;
+    public static byte CONNECTOR_PUNCTUATION;
+    public static byte CONTROL;
+    public static byte CURRENCY_SYMBOL;
+    public static byte DASH_PUNCTUATION;
+    public static byte DECIMAL_DIGIT_NUMBER;
+    public static byte DIRECTIONALITY_ARABIC_NUMBER;
+    public static byte DIRECTIONALITY_BOUNDARY_NEUTRAL;
+    public static byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR;
+    public static byte DIRECTIONALITY_EUROPEAN_NUMBER;
+    public static byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR;
+    public static byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR;
+    public static byte DIRECTIONALITY_LEFT_TO_RIGHT;
+    public static byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING;
+    public static byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE;
+    public static byte DIRECTIONALITY_NONSPACING_MARK;
+    public static byte DIRECTIONALITY_OTHER_NEUTRALS;
+    public static byte DIRECTIONALITY_PARAGRAPH_SEPARATOR;
+    public static byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT;
+    public static byte DIRECTIONALITY_RIGHT_TO_LEFT;
+    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
+    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING;
+    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE;
+    public static byte DIRECTIONALITY_SEGMENT_SEPARATOR;
+    public static byte DIRECTIONALITY_UNDEFINED;
+    public static byte DIRECTIONALITY_WHITESPACE;
+    public static byte ENCLOSING_MARK;
+    public static byte END_PUNCTUATION;
+    public static byte FINAL_QUOTE_PUNCTUATION;
+    public static byte FORMAT;
+    public static byte INITIAL_QUOTE_PUNCTUATION;
+    public static byte LETTER_NUMBER;
+    public static byte LINE_SEPARATOR;
+    public static byte LOWERCASE_LETTER;
+    public static byte MATH_SYMBOL;
+    public static int MAX_CODE_POINT;
+    public static char MAX_HIGH_SURROGATE;
+    public static char MAX_LOW_SURROGATE;
+    public static int MAX_RADIX;
+    public static char MAX_SURROGATE;
+    public static char MAX_VALUE;
+    public static int MIN_CODE_POINT;
+    public static char MIN_HIGH_SURROGATE;
+    public static char MIN_LOW_SURROGATE;
+    public static int MIN_RADIX;
+    public static int MIN_SUPPLEMENTARY_CODE_POINT;
+    public static char MIN_SURROGATE;
+    public static char MIN_VALUE;
+    public static byte MODIFIER_LETTER;
+    public static byte MODIFIER_SYMBOL;
+    public static byte NON_SPACING_MARK;
+    public static byte OTHER_LETTER;
+    public static byte OTHER_NUMBER;
+    public static byte OTHER_PUNCTUATION;
+    public static byte OTHER_SYMBOL;
+    public static byte PARAGRAPH_SEPARATOR;
+    public static byte PRIVATE_USE;
+    public static int SIZE;
+    public static byte SPACE_SEPARATOR;
+    public static byte START_PUNCTUATION;
+    public static byte SURROGATE;
+    public static byte TITLECASE_LETTER;
+    public static java.lang.Class TYPE;
+    public static byte UNASSIGNED;
+    public static byte UPPERCASE_LETTER;
+}
+
+-keep class java.lang.Class {
+
+    public java.lang.Class asSubclass(java.lang.Class);
+    public java.lang.Object cast(java.lang.Object);
+    public boolean desiredAssertionStatus();
+    public static java.lang.Class forName(java.lang.String);
+    public static java.lang.Class forName(java.lang.String, boolean, java.lang.ClassLoader);
+    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
+    public java.lang.annotation.Annotation[] getAnnotations();
+    public java.lang.String getCanonicalName();
+    public java.lang.ClassLoader getClassLoader();
+    public java.lang.Class[] getClasses();
+    public java.lang.Class getComponentType();
+    public java.lang.reflect.Constructor getConstructor(java.lang.Class[]);
+    public java.lang.reflect.Constructor[] getConstructors();
+    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    public java.lang.Class[] getDeclaredClasses();
+    public java.lang.reflect.Constructor getDeclaredConstructor(java.lang.Class[]);
+    public java.lang.reflect.Constructor[] getDeclaredConstructors();
+    public java.lang.reflect.Field getDeclaredField(java.lang.String);
+    public java.lang.reflect.Field[] getDeclaredFields();
+    public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class[]);
+    public java.lang.reflect.Method[] getDeclaredMethods();
+    public java.lang.Class getDeclaringClass();
+    public java.lang.Class getEnclosingClass();
+    public java.lang.reflect.Constructor getEnclosingConstructor();
+    public java.lang.reflect.Method getEnclosingMethod();
+    public java.lang.Object[] getEnumConstants();
+    public java.lang.reflect.Field getField(java.lang.String);
+    public java.lang.reflect.Field[] getFields();
+    public java.lang.reflect.Type[] getGenericInterfaces();
+    public java.lang.reflect.Type getGenericSuperclass();
+    public java.lang.Class[] getInterfaces();
+    public java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class[]);
+    public java.lang.reflect.Method[] getMethods();
+    public int getModifiers();
+    public java.lang.String getName();
+    public java.lang.Package getPackage();
+    public java.security.ProtectionDomain getProtectionDomain();
+    public java.net.URL getResource(java.lang.String);
+    public java.io.InputStream getResourceAsStream(java.lang.String);
+    public java.lang.Object[] getSigners();
+    public java.lang.String getSimpleName();
+    public java.lang.Class getSuperclass();
+    public synchronized java.lang.reflect.TypeVariable[] getTypeParameters();
+    public boolean isAnnotation();
+    public boolean isAnnotationPresent(java.lang.Class);
+    public boolean isAnonymousClass();
+    public boolean isArray();
+    public boolean isAssignableFrom(java.lang.Class);
+    public boolean isEnum();
+    public boolean isInstance(java.lang.Object);
+    public boolean isInterface();
+    public boolean isLocalClass();
+    public boolean isMemberClass();
+    public boolean isPrimitive();
+    public boolean isSynthetic();
+    public java.lang.Object newInstance();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.lang.ClassFormatError {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.ClassLoader {
+    <init>();
+    <init>(java.lang.ClassLoader);
+
+    public void clearAssertionStatus();
+    protected java.lang.Class defineClass(byte[], int, int);
+    protected java.lang.Class defineClass(java.lang.String, byte[], int, int);
+    protected java.lang.Class defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain);
+    protected java.lang.Class defineClass(java.lang.String, java.nio.ByteBuffer, java.security.ProtectionDomain);
+    protected java.lang.Package definePackage(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.net.URL);
+    protected java.lang.Class findClass(java.lang.String);
+    protected java.lang.String findLibrary(java.lang.String);
+    protected java.lang.Class findLoadedClass(java.lang.String);
+    protected java.net.URL findResource(java.lang.String);
+    protected java.util.Enumeration findResources(java.lang.String);
+    protected java.lang.Class findSystemClass(java.lang.String);
+    protected java.lang.Package getPackage(java.lang.String);
+    protected java.lang.Package[] getPackages();
+    public java.lang.ClassLoader getParent();
+    public java.net.URL getResource(java.lang.String);
+    public java.io.InputStream getResourceAsStream(java.lang.String);
+    public java.util.Enumeration getResources(java.lang.String);
+    public static java.lang.ClassLoader getSystemClassLoader();
+    public static java.net.URL getSystemResource(java.lang.String);
+    public static java.io.InputStream getSystemResourceAsStream(java.lang.String);
+    public static java.util.Enumeration getSystemResources(java.lang.String);
+    public java.lang.Class loadClass(java.lang.String);
+    protected java.lang.Class loadClass(java.lang.String, boolean);
+    protected void resolveClass(java.lang.Class);
+    public void setClassAssertionStatus(java.lang.String, boolean);
+    public void setDefaultAssertionStatus(boolean);
+    public void setPackageAssertionStatus(java.lang.String, boolean);
+    protected void setSigners(java.lang.Class, java.lang.Object[]);
+
+
+}
+
+-keep class java.lang.ClassNotFoundException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+
+    public java.lang.Throwable getCause();
+    public java.lang.Throwable getException();
+
+
+}
+
+-keep class java.lang.CloneNotSupportedException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.Double {
+    <init>(double);
+    <init>(java.lang.String);
+
+    public byte byteValue();
+    public static int compare(double, double);
+    public int compareTo(java.lang.Double);
+    public int compareTo(java.lang.Object);
+    public static long doubleToLongBits(double);
+    public static long doubleToRawLongBits(double);
+    public double doubleValue();
+    public boolean equals(java.lang.Object);
+    public float floatValue();
+    public int hashCode();
+    public int intValue();
+    public boolean isInfinite();
+    public static boolean isInfinite(double);
+    public boolean isNaN();
+    public static boolean isNaN(double);
+    public static double longBitsToDouble(long);
+    public long longValue();
+    public static double parseDouble(java.lang.String);
+    public short shortValue();
+    public static java.lang.String toHexString(double);
+    public java.lang.String toString();
+    public static java.lang.String toString(double);
+    public static java.lang.Double valueOf(java.lang.String);
+    public static java.lang.Double valueOf(double);
+
+
+    public static int MAX_EXPONENT;
+    public static double MAX_VALUE;
+    public static int MIN_EXPONENT;
+    public static double MIN_NORMAL;
+    public static double MIN_VALUE;
+    public static double NEGATIVE_INFINITY;
+    public static double NaN;
+    public static double POSITIVE_INFINITY;
+    public static int SIZE;
+    public static java.lang.Class TYPE;
+}
+
+-keep class java.lang.Enum {
+    <init>(java.lang.String, int);
+
+    protected java.lang.Object clone();
+    public int compareTo(java.lang.Enum);
+    public int compareTo(java.lang.Object);
+    public boolean equals(java.lang.Object);
+    protected void finalize();
+    public java.lang.Class getDeclaringClass();
+    public int hashCode();
+    public java.lang.String name();
+    public int ordinal();
+    public java.lang.String toString();
+    public static java.lang.Enum valueOf(java.lang.Class, java.lang.String);
+
+
+}
+
+-keep class java.lang.Error {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.Exception {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.Float {
+    <init>(float);
+    <init>(double);
+    <init>(java.lang.String);
+
+    public byte byteValue();
+    public static int compare(float, float);
+    public int compareTo(java.lang.Float);
+    public int compareTo(java.lang.Object);
+    public double doubleValue();
+    public boolean equals(java.lang.Object);
+    public static int floatToIntBits(float);
+    public static int floatToRawIntBits(float);
+    public float floatValue();
+    public int hashCode();
+    public static float intBitsToFloat(int);
+    public int intValue();
+    public boolean isInfinite();
+    public static boolean isInfinite(float);
+    public boolean isNaN();
+    public static boolean isNaN(float);
+    public long longValue();
+    public static float parseFloat(java.lang.String);
+    public short shortValue();
+    public static java.lang.String toHexString(float);
+    public java.lang.String toString();
+    public static java.lang.String toString(float);
+    public static java.lang.Float valueOf(java.lang.String);
+    public static java.lang.Float valueOf(float);
+
+
+    public static int MAX_EXPONENT;
+    public static float MAX_VALUE;
+    public static int MIN_EXPONENT;
+    public static float MIN_NORMAL;
+    public static float MIN_VALUE;
+    public static float NEGATIVE_INFINITY;
+    public static float NaN;
+    public static float POSITIVE_INFINITY;
+    public static int SIZE;
+    public static java.lang.Class TYPE;
+}
+
+-keep class java.lang.IllegalAccessException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.IllegalArgumentException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.IllegalStateException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.InstantiationException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.Integer {
+    <init>(int);
+    <init>(java.lang.String);
+
+    public static int bitCount(int);
+    public byte byteValue();
+    public static int compare(int, int);
+    public int compareTo(java.lang.Integer);
+    public int compareTo(java.lang.Object);
+    public static java.lang.Integer decode(java.lang.String);
+    public double doubleValue();
+    public boolean equals(java.lang.Object);
+    public float floatValue();
+    public static java.lang.Integer getInteger(java.lang.String);
+    public static java.lang.Integer getInteger(java.lang.String, int);
+    public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer);
+    public int hashCode();
+    public static int highestOneBit(int);
+    public int intValue();
+    public long longValue();
+    public static int lowestOneBit(int);
+    public static int numberOfLeadingZeros(int);
+    public static int numberOfTrailingZeros(int);
+    public static int parseInt(java.lang.String);
+    public static int parseInt(java.lang.String, int);
+    public static int reverse(int);
+    public static int reverseBytes(int);
+    public static int rotateLeft(int, int);
+    public static int rotateRight(int, int);
+    public short shortValue();
+    public static int signum(int);
+    public static java.lang.String toBinaryString(int);
+    public static java.lang.String toHexString(int);
+    public static java.lang.String toOctalString(int);
+    public java.lang.String toString();
+    public static java.lang.String toString(int);
+    public static java.lang.String toString(int, int);
+    public static java.lang.Integer valueOf(java.lang.String);
+    public static java.lang.Integer valueOf(java.lang.String, int);
+    public static java.lang.Integer valueOf(int);
+
+
+    public static int MAX_VALUE;
+    public static int MIN_VALUE;
+    public static int SIZE;
+    public static java.lang.Class TYPE;
+}
+
+-keep class java.lang.InterruptedException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.LinkageError {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.Long {
+    <init>(long);
+    <init>(java.lang.String);
+
+    public static int bitCount(long);
+    public byte byteValue();
+    public static int compare(long, long);
+    public int compareTo(java.lang.Long);
+    public int compareTo(java.lang.Object);
+    public static java.lang.Long decode(java.lang.String);
+    public double doubleValue();
+    public boolean equals(java.lang.Object);
+    public float floatValue();
+    public static java.lang.Long getLong(java.lang.String);
+    public static java.lang.Long getLong(java.lang.String, long);
+    public static java.lang.Long getLong(java.lang.String, java.lang.Long);
+    public int hashCode();
+    public static long highestOneBit(long);
+    public int intValue();
+    public long longValue();
+    public static long lowestOneBit(long);
+    public static int numberOfLeadingZeros(long);
+    public static int numberOfTrailingZeros(long);
+    public static long parseLong(java.lang.String);
+    public static long parseLong(java.lang.String, int);
+    public static long reverse(long);
+    public static long reverseBytes(long);
+    public static long rotateLeft(long, int);
+    public static long rotateRight(long, int);
+    public short shortValue();
+    public static int signum(long);
+    public static java.lang.String toBinaryString(long);
+    public static java.lang.String toHexString(long);
+    public static java.lang.String toOctalString(long);
+    public java.lang.String toString();
+    public static java.lang.String toString(long);
+    public static java.lang.String toString(long, int);
+    public static java.lang.Long valueOf(java.lang.String);
+    public static java.lang.Long valueOf(java.lang.String, int);
+    public static java.lang.Long valueOf(long);
+
+
+    public static long MAX_VALUE;
+    public static long MIN_VALUE;
+    public static int SIZE;
+    public static java.lang.Class TYPE;
+}
+
+-keep class java.lang.NoSuchFieldException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.NoSuchMethodException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.Number {
+    <init>();
+
+    public byte byteValue();
+    public abstract double doubleValue();
+    public abstract float floatValue();
+    public abstract int intValue();
+    public abstract long longValue();
+    public short shortValue();
+
+
+}
+
+-keep class java.lang.NumberFormatException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.lang.Object {
+    <init>();
+
+    protected java.lang.Object clone();
+    public boolean equals(java.lang.Object);
+    protected void finalize();
+    public java.lang.Class getClass();
+    public int hashCode();
+    public void notify();
+    public void notifyAll();
+    public java.lang.String toString();
+    public void wait();
+    public void wait(long);
+    public void wait(long, int);
+
+
+}
+
+-keep class java.lang.Package {
+
+    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
+    public java.lang.annotation.Annotation[] getAnnotations();
+    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    public java.lang.String getImplementationTitle();
+    public java.lang.String getImplementationVendor();
+    public java.lang.String getImplementationVersion();
+    public java.lang.String getName();
+    public static java.lang.Package getPackage(java.lang.String);
+    public static java.lang.Package[] getPackages();
+    public java.lang.String getSpecificationTitle();
+    public java.lang.String getSpecificationVendor();
+    public java.lang.String getSpecificationVersion();
+    public int hashCode();
+    public boolean isAnnotationPresent(java.lang.Class);
+    public boolean isCompatibleWith(java.lang.String);
+    public boolean isSealed();
+    public boolean isSealed(java.net.URL);
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.lang.ReflectiveOperationException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.Throwable);
+    <init>(java.lang.String, java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.Runnable {
+
+    public abstract void run();
+
+
+}
+
+-keep class java.lang.RuntimeException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.SecurityException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.Short {
+    <init>(java.lang.String);
+    <init>(short);
+
+    public byte byteValue();
+    public static int compare(short, short);
+    public int compareTo(java.lang.Short);
+    public int compareTo(java.lang.Object);
+    public static java.lang.Short decode(java.lang.String);
+    public double doubleValue();
+    public boolean equals(java.lang.Object);
+    public float floatValue();
+    public int hashCode();
+    public int intValue();
+    public long longValue();
+    public static short parseShort(java.lang.String);
+    public static short parseShort(java.lang.String, int);
+    public static short reverseBytes(short);
+    public short shortValue();
+    public java.lang.String toString();
+    public static java.lang.String toString(short);
+    public static java.lang.Short valueOf(java.lang.String);
+    public static java.lang.Short valueOf(java.lang.String, int);
+    public static java.lang.Short valueOf(short);
+
+
+    public static short MAX_VALUE;
+    public static short MIN_VALUE;
+    public static int SIZE;
+    public static java.lang.Class TYPE;
+}
+
+-keep class java.lang.StackTraceElement {
+    <init>(java.lang.String, java.lang.String, java.lang.String, int);
+
+    public boolean equals(java.lang.Object);
+    public java.lang.String getClassName();
+    public java.lang.String getFileName();
+    public int getLineNumber();
+    public java.lang.String getMethodName();
+    public int hashCode();
+    public boolean isNativeMethod();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.lang.String {
+    <init>();
+    <init>(byte[]);
+    <init>(byte[], int);
+    <init>(byte[], int, int);
+    <init>(byte[], int, int, int);
+    <init>(byte[], int, int, java.lang.String);
+    <init>(byte[], java.lang.String);
+    <init>(byte[], int, int, java.nio.charset.Charset);
+    <init>(byte[], java.nio.charset.Charset);
+    <init>(char[]);
+    <init>(char[], int, int);
+    <init>(java.lang.String);
+    <init>(java.lang.StringBuffer);
+    <init>(int[], int, int);
+    <init>(java.lang.StringBuilder);
+
+    public char charAt(int);
+    public int codePointAt(int);
+    public int codePointBefore(int);
+    public int codePointCount(int, int);
+    public int compareTo(java.lang.String);
+    public int compareTo(java.lang.Object);
+    public int compareToIgnoreCase(java.lang.String);
+    public java.lang.String concat(java.lang.String);
+    public boolean contains(java.lang.CharSequence);
+    public boolean contentEquals(java.lang.StringBuffer);
+    public boolean contentEquals(java.lang.CharSequence);
+    public static java.lang.String copyValueOf(char[]);
+    public static java.lang.String copyValueOf(char[], int, int);
+    public boolean endsWith(java.lang.String);
+    public boolean equals(java.lang.Object);
+    public boolean equalsIgnoreCase(java.lang.String);
+    public static java.lang.String format(java.lang.String, java.lang.Object[]);
+    public static java.lang.String format(java.util.Locale, java.lang.String, java.lang.Object[]);
+    public void getBytes(int, int, byte[], int);
+    public byte[] getBytes();
+    public byte[] getBytes(java.lang.String);
+    public byte[] getBytes(java.nio.charset.Charset);
+    public void getChars(int, int, char[], int);
+    public int hashCode();
+    public int indexOf(int);
+    public int indexOf(int, int);
+    public int indexOf(java.lang.String);
+    public int indexOf(java.lang.String, int);
+    public java.lang.String intern();
+    public boolean isEmpty();
+    public int lastIndexOf(int);
+    public int lastIndexOf(int, int);
+    public int lastIndexOf(java.lang.String);
+    public int lastIndexOf(java.lang.String, int);
+    public int length();
+    public boolean matches(java.lang.String);
+    public int offsetByCodePoints(int, int);
+    public boolean regionMatches(int, java.lang.String, int, int);
+    public boolean regionMatches(boolean, int, java.lang.String, int, int);
+    public java.lang.String replace(char, char);
+    public java.lang.String replace(java.lang.CharSequence, java.lang.CharSequence);
+    public java.lang.String replaceAll(java.lang.String, java.lang.String);
+    public java.lang.String replaceFirst(java.lang.String, java.lang.String);
+    public java.lang.String[] split(java.lang.String);
+    public java.lang.String[] split(java.lang.String, int);
+    public boolean startsWith(java.lang.String);
+    public boolean startsWith(java.lang.String, int);
+    public java.lang.CharSequence subSequence(int, int);
+    public java.lang.String substring(int);
+    public java.lang.String substring(int, int);
+    public char[] toCharArray();
+    public java.lang.String toLowerCase();
+    public java.lang.String toLowerCase(java.util.Locale);
+    public java.lang.String toString();
+    public java.lang.String toUpperCase();
+    public java.lang.String toUpperCase(java.util.Locale);
+    public java.lang.String trim();
+    public static java.lang.String valueOf(char[]);
+    public static java.lang.String valueOf(char[], int, int);
+    public static java.lang.String valueOf(char);
+    public static java.lang.String valueOf(double);
+    public static java.lang.String valueOf(float);
+    public static java.lang.String valueOf(int);
+    public static java.lang.String valueOf(long);
+    public static java.lang.String valueOf(java.lang.Object);
+    public static java.lang.String valueOf(boolean);
+
+
+    public static java.util.Comparator CASE_INSENSITIVE_ORDER;
+}
+
+-keep class java.lang.StringBuffer {
+    <init>();
+    <init>(int);
+    <init>(java.lang.String);
+    <init>(java.lang.CharSequence);
+
+    public java.lang.StringBuffer append(boolean);
+    public synchronized java.lang.StringBuffer append(char);
+    public java.lang.StringBuffer append(double);
+    public java.lang.StringBuffer append(float);
+    public java.lang.StringBuffer append(int);
+    public java.lang.StringBuffer append(long);
+    public synchronized java.lang.StringBuffer append(java.lang.Object);
+    public synchronized java.lang.StringBuffer append(java.lang.String);
+    public synchronized java.lang.StringBuffer append(java.lang.StringBuffer);
+    public synchronized java.lang.StringBuffer append(char[]);
+    public synchronized java.lang.StringBuffer append(char[], int, int);
+    public synchronized java.lang.StringBuffer append(java.lang.CharSequence);
+    public synchronized java.lang.StringBuffer append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence);
+    public java.lang.Appendable append(char);
+    public java.lang.StringBuffer appendCodePoint(int);
+    public int capacity();
+    public synchronized char charAt(int);
+    public synchronized int codePointAt(int);
+    public synchronized int codePointBefore(int);
+    public synchronized int codePointCount(int, int);
+    public synchronized java.lang.StringBuffer delete(int, int);
+    public synchronized java.lang.StringBuffer deleteCharAt(int);
+    public synchronized void ensureCapacity(int);
+    public synchronized void getChars(int, int, char[], int);
+    public synchronized int indexOf(java.lang.String, int);
+    public int indexOf(java.lang.String);
+    public synchronized java.lang.StringBuffer insert(int, char);
+    public java.lang.StringBuffer insert(int, boolean);
+    public java.lang.StringBuffer insert(int, int);
+    public java.lang.StringBuffer insert(int, long);
+    public java.lang.StringBuffer insert(int, double);
+    public java.lang.StringBuffer insert(int, float);
+    public java.lang.StringBuffer insert(int, java.lang.Object);
+    public synchronized java.lang.StringBuffer insert(int, java.lang.String);
+    public synchronized java.lang.StringBuffer insert(int, char[]);
+    public synchronized java.lang.StringBuffer insert(int, char[], int, int);
+    public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence);
+    public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence, int, int);
+    public synchronized int lastIndexOf(java.lang.String, int);
+    public int lastIndexOf(java.lang.String);
+    public int length();
+    public synchronized int offsetByCodePoints(int, int);
+    public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
+    public synchronized java.lang.StringBuffer reverse();
+    public synchronized void setCharAt(int, char);
+    public synchronized void setLength(int);
+    public synchronized java.lang.CharSequence subSequence(int, int);
+    public synchronized java.lang.String substring(int);
+    public synchronized java.lang.String substring(int, int);
+    public synchronized java.lang.String toString();
+    public synchronized void trimToSize();
+
+
+}
+
+-keep class java.lang.StringBuilder {
+    <init>();
+    <init>(int);
+    <init>(java.lang.CharSequence);
+    <init>(java.lang.String);
+
+    public java.lang.StringBuilder append(boolean);
+    public java.lang.StringBuilder append(char);
+    public java.lang.StringBuilder append(int);
+    public java.lang.StringBuilder append(long);
+    public java.lang.StringBuilder append(float);
+    public java.lang.StringBuilder append(double);
+    public java.lang.StringBuilder append(java.lang.Object);
+    public java.lang.StringBuilder append(java.lang.String);
+    public java.lang.StringBuilder append(java.lang.StringBuffer);
+    public java.lang.StringBuilder append(char[]);
+    public java.lang.StringBuilder append(char[], int, int);
+    public java.lang.StringBuilder append(java.lang.CharSequence);
+    public java.lang.StringBuilder append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence);
+    public java.lang.Appendable append(char);
+    public java.lang.StringBuilder appendCodePoint(int);
+    public int capacity();
+    public char charAt(int);
+    public int codePointAt(int);
+    public int codePointBefore(int);
+    public int codePointCount(int, int);
+    public java.lang.StringBuilder delete(int, int);
+    public java.lang.StringBuilder deleteCharAt(int);
+    public void ensureCapacity(int);
+    public void getChars(int, int, char[], int);
+    public int indexOf(java.lang.String, int);
+    public int indexOf(java.lang.String);
+    public java.lang.StringBuilder insert(int, boolean);
+    public java.lang.StringBuilder insert(int, char);
+    public java.lang.StringBuilder insert(int, int);
+    public java.lang.StringBuilder insert(int, long);
+    public java.lang.StringBuilder insert(int, float);
+    public java.lang.StringBuilder insert(int, double);
+    public java.lang.StringBuilder insert(int, java.lang.Object);
+    public java.lang.StringBuilder insert(int, java.lang.String);
+    public java.lang.StringBuilder insert(int, char[]);
+    public java.lang.StringBuilder insert(int, char[], int, int);
+    public java.lang.StringBuilder insert(int, java.lang.CharSequence);
+    public java.lang.StringBuilder insert(int, java.lang.CharSequence, int, int);
+    public int lastIndexOf(java.lang.String, int);
+    public int lastIndexOf(java.lang.String);
+    public int length();
+    public int offsetByCodePoints(int, int);
+    public java.lang.StringBuilder replace(int, int, java.lang.String);
+    public java.lang.StringBuilder reverse();
+    public void setCharAt(int, char);
+    public void setLength(int);
+    public java.lang.CharSequence subSequence(int, int);
+    public java.lang.String substring(int, int);
+    public java.lang.String substring(int);
+    public java.lang.String toString();
+    public void trimToSize();
+
+
+}
+
+-keep class java.lang.Thread {
+    <init>();
+    <init>(java.lang.Runnable);
+    <init>(java.lang.Runnable, java.lang.String);
+    <init>(java.lang.String);
+    <init>(java.lang.ThreadGroup, java.lang.Runnable);
+    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String);
+    <init>(java.lang.ThreadGroup, java.lang.String);
+    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long);
+
+    public static int activeCount();
+    public void checkAccess();
+    public int countStackFrames();
+    public static java.lang.Thread currentThread();
+    public void destroy();
+    public static void dumpStack();
+    public static int enumerate(java.lang.Thread[]);
+    public static java.util.Map getAllStackTraces();
+    public java.lang.ClassLoader getContextClassLoader();
+    public static java.lang.Thread$UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
+    public long getId();
+    public java.lang.String getName();
+    public int getPriority();
+    public java.lang.StackTraceElement[] getStackTrace();
+    public java.lang.Thread$State getState();
+    public java.lang.ThreadGroup getThreadGroup();
+    public java.lang.Thread$UncaughtExceptionHandler getUncaughtExceptionHandler();
+    public static boolean holdsLock(java.lang.Object);
+    public void interrupt();
+    public static boolean interrupted();
+    public boolean isAlive();
+    public boolean isDaemon();
+    public boolean isInterrupted();
+    public void join();
+    public void join(long);
+    public void join(long, int);
+    public void resume();
+    public void run();
+    public void setContextClassLoader(java.lang.ClassLoader);
+    public void setDaemon(boolean);
+    public static void setDefaultUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
+    public void setName(java.lang.String);
+    public void setPriority(int);
+    public void setUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
+    public static void sleep(long);
+    public static void sleep(long, int);
+    public synchronized void start();
+    public void stop();
+    public synchronized void stop(java.lang.Throwable);
+    public void suspend();
+    public java.lang.String toString();
+    public static void yield();
+
+
+    public static int MAX_PRIORITY;
+    public static int MIN_PRIORITY;
+    public static int NORM_PRIORITY;
+}
+
+-keep class java.lang.Thread$State {
+
+    public static java.lang.Thread$State valueOf(java.lang.String);
+    public static java.lang.Thread$State[] values();
+
+    public static java.lang.Thread$State BLOCKED;
+    public static java.lang.Thread$State NEW;
+    public static java.lang.Thread$State RUNNABLE;
+    public static java.lang.Thread$State TERMINATED;
+    public static java.lang.Thread$State TIMED_WAITING;
+    public static java.lang.Thread$State WAITING;
+
+}
+
+-keep class java.lang.Thread$UncaughtExceptionHandler {
+
+    public abstract void uncaughtException(java.lang.Thread, java.lang.Throwable);
+
+
+}
+
+-keep class java.lang.ThreadGroup {
+    <init>(java.lang.String);
+    <init>(java.lang.ThreadGroup, java.lang.String);
+
+    public int activeCount();
+    public int activeGroupCount();
+    public boolean allowThreadSuspension(boolean);
+    public void checkAccess();
+    public void destroy();
+    public int enumerate(java.lang.Thread[]);
+    public int enumerate(java.lang.Thread[], boolean);
+    public int enumerate(java.lang.ThreadGroup[]);
+    public int enumerate(java.lang.ThreadGroup[], boolean);
+    public int getMaxPriority();
+    public java.lang.String getName();
+    public java.lang.ThreadGroup getParent();
+    public void interrupt();
+    public boolean isDaemon();
+    public synchronized boolean isDestroyed();
+    public void list();
+    public boolean parentOf(java.lang.ThreadGroup);
+    public void resume();
+    public void setDaemon(boolean);
+    public void setMaxPriority(int);
+    public void stop();
+    public void suspend();
+    public java.lang.String toString();
+    public void uncaughtException(java.lang.Thread, java.lang.Throwable);
+
+
+}
+
+-keep class java.lang.Throwable {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);
+
+    public void addSuppressed(java.lang.Throwable);
+    public java.lang.Throwable fillInStackTrace();
+    public java.lang.Throwable getCause();
+    public java.lang.String getLocalizedMessage();
+    public java.lang.String getMessage();
+    public java.lang.StackTraceElement[] getStackTrace();
+    public java.lang.Throwable[] getSuppressed();
+    public java.lang.Throwable initCause(java.lang.Throwable);
+    public void printStackTrace();
+    public void printStackTrace(java.io.PrintStream);
+    public void printStackTrace(java.io.PrintWriter);
+    public void setStackTrace(java.lang.StackTraceElement[]);
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.lang.UnsupportedOperationException {
+    <init>();
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.lang.annotation.Annotation {
+
+    public abstract java.lang.Class annotationType();
+    public abstract boolean equals(java.lang.Object);
+    public abstract int hashCode();
+    public abstract java.lang.String toString();
+
+
+}
+
+-keep class java.lang.reflect.AccessibleObject {
+    <init>();
+
+    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
+    public java.lang.annotation.Annotation[] getAnnotations();
+    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    public boolean isAccessible();
+    public boolean isAnnotationPresent(java.lang.Class);
+    public void setAccessible(boolean);
+    public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean);
+
+
+}
+
+-keep class java.lang.reflect.Constructor {
+
+    public boolean equals(java.lang.Object);
+    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
+    public java.lang.annotation.Annotation[] getAnnotations();
+    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    public java.lang.Class getDeclaringClass();
+    public java.lang.Class[] getExceptionTypes();
+    public java.lang.reflect.Type[] getGenericExceptionTypes();
+    public java.lang.reflect.Type[] getGenericParameterTypes();
+    public int getModifiers();
+    public java.lang.String getName();
+    public java.lang.annotation.Annotation[][] getParameterAnnotations();
+    public java.lang.Class[] getParameterTypes();
+    public java.lang.reflect.TypeVariable[] getTypeParameters();
+    public int hashCode();
+    public boolean isAnnotationPresent(java.lang.Class);
+    public boolean isSynthetic();
+    public boolean isVarArgs();
+    public java.lang.Object newInstance(java.lang.Object[]);
+    public void setAccessible(boolean);
+    public java.lang.String toGenericString();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.lang.reflect.Field {
+
+    public boolean equals(java.lang.Object);
+    public java.lang.Object get(java.lang.Object);
+    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
+    public boolean getBoolean(java.lang.Object);
+    public byte getByte(java.lang.Object);
+    public char getChar(java.lang.Object);
+    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    public java.lang.Class getDeclaringClass();
+    public double getDouble(java.lang.Object);
+    public float getFloat(java.lang.Object);
+    public java.lang.reflect.Type getGenericType();
+    public int getInt(java.lang.Object);
+    public long getLong(java.lang.Object);
+    public int getModifiers();
+    public java.lang.String getName();
+    public short getShort(java.lang.Object);
+    public java.lang.Class getType();
+    public int hashCode();
+    public boolean isAnnotationPresent(java.lang.Class);
+    public boolean isEnumConstant();
+    public boolean isSynthetic();
+    public void set(java.lang.Object, java.lang.Object);
+    public void setBoolean(java.lang.Object, boolean);
+    public void setByte(java.lang.Object, byte);
+    public void setChar(java.lang.Object, char);
+    public void setDouble(java.lang.Object, double);
+    public void setFloat(java.lang.Object, float);
+    public void setInt(java.lang.Object, int);
+    public void setLong(java.lang.Object, long);
+    public void setShort(java.lang.Object, short);
+    public java.lang.String toGenericString();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.lang.reflect.GenericDeclaration {
+
+    public abstract java.lang.reflect.TypeVariable[] getTypeParameters();
+
+
+}
+
+-keep class java.lang.reflect.InvocationTargetException {
+    <init>();
+    <init>(java.lang.Throwable);
+    <init>(java.lang.Throwable, java.lang.String);
+
+    public java.lang.Throwable getCause();
+    public java.lang.Throwable getTargetException();
+
+
+}
+
+-keep class java.lang.reflect.Method {
+
+    public boolean equals(java.lang.Object);
+    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
+    public java.lang.annotation.Annotation[] getAnnotations();
+    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    public java.lang.Class getDeclaringClass();
+    public java.lang.Object getDefaultValue();
+    public java.lang.Class[] getExceptionTypes();
+    public java.lang.reflect.Type[] getGenericExceptionTypes();
+    public java.lang.reflect.Type[] getGenericParameterTypes();
+    public java.lang.reflect.Type getGenericReturnType();
+    public int getModifiers();
+    public java.lang.String getName();
+    public java.lang.annotation.Annotation[][] getParameterAnnotations();
+    public java.lang.Class[] getParameterTypes();
+    public java.lang.Class getReturnType();
+    public java.lang.reflect.TypeVariable[] getTypeParameters();
+    public int hashCode();
+    public java.lang.Object invoke(java.lang.Object, java.lang.Object[]);
+    public boolean isAnnotationPresent(java.lang.Class);
+    public boolean isBridge();
+    public boolean isSynthetic();
+    public boolean isVarArgs();
+    public java.lang.String toGenericString();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.lang.reflect.Type {
+
+
+
+}
+
+-keep class java.lang.reflect.TypeVariable {
+
+    public abstract java.lang.reflect.Type[] getBounds();
+    public abstract java.lang.reflect.GenericDeclaration getGenericDeclaration();
+    public abstract java.lang.String getName();
+
+
+}
+
+-keep class java.net.ContentHandler {
+    <init>();
+
+    public abstract java.lang.Object getContent(java.net.URLConnection);
+    public java.lang.Object getContent(java.net.URLConnection, java.lang.Class[]);
+
+
+}
+
+-keep class java.net.ContentHandlerFactory {
+
+    public abstract java.net.ContentHandler createContentHandler(java.lang.String);
+
+
+}
+
+-keep class java.net.DatagramPacket {
+    <init>(byte[], int);
+    <init>(byte[], int, int);
+    <init>(byte[], int, int, java.net.InetAddress, int);
+    <init>(byte[], int, java.net.InetAddress, int);
+    <init>(byte[], int, java.net.SocketAddress);
+    <init>(byte[], int, int, java.net.SocketAddress);
+
+    public synchronized java.net.InetAddress getAddress();
+    public synchronized byte[] getData();
+    public synchronized int getLength();
+    public synchronized int getOffset();
+    public synchronized int getPort();
+    public synchronized java.net.SocketAddress getSocketAddress();
+    public synchronized void setAddress(java.net.InetAddress);
+    public synchronized void setData(byte[], int, int);
+    public synchronized void setData(byte[]);
+    public synchronized void setLength(int);
+    public synchronized void setPort(int);
+    public synchronized void setSocketAddress(java.net.SocketAddress);
+
+
+}
+
+-keep class java.net.DatagramSocket {
+    <init>();
+    <init>(int);
+    <init>(int, java.net.InetAddress);
+    <init>(java.net.DatagramSocketImpl);
+    <init>(java.net.SocketAddress);
+
+    public void bind(java.net.SocketAddress);
+    public void close();
+    public void connect(java.net.SocketAddress);
+    public void connect(java.net.InetAddress, int);
+    public void disconnect();
+    public boolean getBroadcast();
+    public java.nio.channels.DatagramChannel getChannel();
+    public java.net.InetAddress getInetAddress();
+    public java.net.InetAddress getLocalAddress();
+    public int getLocalPort();
+    public java.net.SocketAddress getLocalSocketAddress();
+    public int getPort();
+    public synchronized int getReceiveBufferSize();
+    public java.net.SocketAddress getRemoteSocketAddress();
+    public boolean getReuseAddress();
+    public synchronized int getSendBufferSize();
+    public synchronized int getSoTimeout();
+    public int getTrafficClass();
+    public boolean isBound();
+    public boolean isClosed();
+    public boolean isConnected();
+    public synchronized void receive(java.net.DatagramPacket);
+    public void send(java.net.DatagramPacket);
+    public void setBroadcast(boolean);
+    public static synchronized void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory);
+    public synchronized void setReceiveBufferSize(int);
+    public void setReuseAddress(boolean);
+    public synchronized void setSendBufferSize(int);
+    public synchronized void setSoTimeout(int);
+    public void setTrafficClass(int);
+
+
+}
+
+-keep class java.net.DatagramSocketImpl {
+    <init>();
+
+    protected abstract void bind(int, java.net.InetAddress);
+    protected abstract void close();
+    protected void connect(java.net.InetAddress, int);
+    protected abstract void create();
+    protected void disconnect();
+    protected java.io.FileDescriptor getFileDescriptor();
+    protected int getLocalPort();
+    protected abstract byte getTTL();
+    protected abstract int getTimeToLive();
+    protected abstract void join(java.net.InetAddress);
+    protected abstract void joinGroup(java.net.SocketAddress, java.net.NetworkInterface);
+    protected abstract void leave(java.net.InetAddress);
+    protected abstract void leaveGroup(java.net.SocketAddress, java.net.NetworkInterface);
+    protected abstract int peek(java.net.InetAddress);
+    protected abstract int peekData(java.net.DatagramPacket);
+    protected abstract void receive(java.net.DatagramPacket);
+    protected abstract void send(java.net.DatagramPacket);
+    protected abstract void setTTL(byte);
+    protected abstract void setTimeToLive(int);
+
+
+    protected java.io.FileDescriptor fd;
+    protected int localPort;
+}
+
+-keep class java.net.DatagramSocketImplFactory {
+
+    public abstract java.net.DatagramSocketImpl createDatagramSocketImpl();
+
+
+}
+
+-keep class java.net.FileNameMap {
+
+    public abstract java.lang.String getContentTypeFor(java.lang.String);
+
+
+}
+
+-keep class java.net.InetAddress {
+
+    public boolean equals(java.lang.Object);
+    public byte[] getAddress();
+    public static java.net.InetAddress[] getAllByName(java.lang.String);
+    public static java.net.InetAddress getByAddress(byte[]);
+    public static java.net.InetAddress getByAddress(java.lang.String, byte[]);
+    public static java.net.InetAddress getByName(java.lang.String);
+    public java.lang.String getCanonicalHostName();
+    public java.lang.String getHostAddress();
+    public java.lang.String getHostName();
+    public static java.net.InetAddress getLocalHost();
+    public static java.net.InetAddress getLoopbackAddress();
+    public int hashCode();
+    public boolean isAnyLocalAddress();
+    public boolean isLinkLocalAddress();
+    public boolean isLoopbackAddress();
+    public boolean isMCGlobal();
+    public boolean isMCLinkLocal();
+    public boolean isMCNodeLocal();
+    public boolean isMCOrgLocal();
+    public boolean isMCSiteLocal();
+    public boolean isMulticastAddress();
+    public boolean isReachable(int);
+    public boolean isReachable(java.net.NetworkInterface, int, int);
+    public boolean isSiteLocalAddress();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.net.InterfaceAddress {
+
+    public boolean equals(java.lang.Object);
+    public java.net.InetAddress getAddress();
+    public java.net.InetAddress getBroadcast();
+    public short getNetworkPrefixLength();
+    public int hashCode();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.net.MalformedURLException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.net.NetworkInterface {
+
+    public boolean equals(java.lang.Object);
+    public static java.net.NetworkInterface getByIndex(int);
+    public static java.net.NetworkInterface getByInetAddress(java.net.InetAddress);
+    public static java.net.NetworkInterface getByName(java.lang.String);
+    public java.lang.String getDisplayName();
+    public byte[] getHardwareAddress();
+    public int getIndex();
+    public java.util.Enumeration getInetAddresses();
+    public java.util.List getInterfaceAddresses();
+    public int getMTU();
+    public java.lang.String getName();
+    public static java.util.Enumeration getNetworkInterfaces();
+    public java.net.NetworkInterface getParent();
+    public java.util.Enumeration getSubInterfaces();
+    public int hashCode();
+    public boolean isLoopback();
+    public boolean isPointToPoint();
+    public boolean isUp();
+    public boolean isVirtual();
+    public boolean supportsMulticast();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.net.Proxy {
+    <init>(java.net.Proxy$Type, java.net.SocketAddress);
+
+    public java.net.SocketAddress address();
+    public boolean equals(java.lang.Object);
+    public int hashCode();
+    public java.lang.String toString();
+    public java.net.Proxy$Type type();
+
+
+    public static java.net.Proxy NO_PROXY;
+}
+
+-keep class java.net.Proxy$Type {
+
+    public static java.net.Proxy$Type valueOf(java.lang.String);
+    public static java.net.Proxy$Type[] values();
+
+    public static java.net.Proxy$Type DIRECT;
+    public static java.net.Proxy$Type HTTP;
+    public static java.net.Proxy$Type SOCKS;
+
+}
+
+-keep class java.net.ServerSocket {
+    <init>();
+    <init>(int);
+    <init>(int, int);
+    <init>(int, int, java.net.InetAddress);
+
+    public java.net.Socket accept();
+    public void bind(java.net.SocketAddress);
+    public void bind(java.net.SocketAddress, int);
+    public void close();
+    public java.nio.channels.ServerSocketChannel getChannel();
+    public java.net.InetAddress getInetAddress();
+    public int getLocalPort();
+    public java.net.SocketAddress getLocalSocketAddress();
+    public int getReceiveBufferSize();
+    public boolean getReuseAddress();
+    public synchronized int getSoTimeout();
+    protected void implAccept(java.net.Socket);
+    public boolean isBound();
+    public boolean isClosed();
+    public void setPerformancePreferences(int, int, int);
+    public void setReceiveBufferSize(int);
+    public void setReuseAddress(boolean);
+    public synchronized void setSoTimeout(int);
+    public static synchronized void setSocketFactory(java.net.SocketImplFactory);
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.net.Socket {
+    <init>();
+    <init>(java.net.Proxy);
+    <init>(java.lang.String, int);
+    <init>(java.lang.String, int, java.net.InetAddress, int);
+    <init>(java.lang.String, int, boolean);
+    <init>(java.net.InetAddress, int);
+    <init>(java.net.InetAddress, int, java.net.InetAddress, int);
+    <init>(java.net.InetAddress, int, boolean);
+    <init>(java.net.SocketImpl);
+
+    public void bind(java.net.SocketAddress);
+    public synchronized void close();
+    public void connect(java.net.SocketAddress);
+    public void connect(java.net.SocketAddress, int);
+    public java.nio.channels.SocketChannel getChannel();
+    public java.net.InetAddress getInetAddress();
+    public java.io.InputStream getInputStream();
+    public boolean getKeepAlive();
+    public java.net.InetAddress getLocalAddress();
+    public int getLocalPort();
+    public java.net.SocketAddress getLocalSocketAddress();
+    public boolean getOOBInline();
+    public java.io.OutputStream getOutputStream();
+    public int getPort();
+    public synchronized int getReceiveBufferSize();
+    public java.net.SocketAddress getRemoteSocketAddress();
+    public boolean getReuseAddress();
+    public synchronized int getSendBufferSize();
+    public int getSoLinger();
+    public synchronized int getSoTimeout();
+    public boolean getTcpNoDelay();
+    public int getTrafficClass();
+    public boolean isBound();
+    public boolean isClosed();
+    public boolean isConnected();
+    public boolean isInputShutdown();
+    public boolean isOutputShutdown();
+    public void sendUrgentData(int);
+    public void setKeepAlive(boolean);
+    public void setOOBInline(boolean);
+    public void setPerformancePreferences(int, int, int);
+    public synchronized void setReceiveBufferSize(int);
+    public void setReuseAddress(boolean);
+    public synchronized void setSendBufferSize(int);
+    public void setSoLinger(boolean, int);
+    public synchronized void setSoTimeout(int);
+    public static synchronized void setSocketImplFactory(java.net.SocketImplFactory);
+    public void setTcpNoDelay(boolean);
+    public void setTrafficClass(int);
+    public void shutdownInput();
+    public void shutdownOutput();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.net.SocketAddress {
+    <init>();
+
+
+
+}
+
+-keep class java.net.SocketException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.net.SocketImpl {
+    <init>();
+
+    protected abstract void accept(java.net.SocketImpl);
+    protected abstract int available();
+    protected abstract void bind(java.net.InetAddress, int);
+    protected abstract void close();
+    protected abstract void connect(java.lang.String, int);
+    protected abstract void connect(java.net.InetAddress, int);
+    protected abstract void connect(java.net.SocketAddress, int);
+    protected abstract void create(boolean);
+    protected java.io.FileDescriptor getFileDescriptor();
+    protected java.net.InetAddress getInetAddress();
+    protected abstract java.io.InputStream getInputStream();
+    protected int getLocalPort();
+    protected abstract java.io.OutputStream getOutputStream();
+    protected int getPort();
+    protected abstract void listen(int);
+    protected abstract void sendUrgentData(int);
+    protected void setPerformancePreferences(int, int, int);
+    protected void shutdownInput();
+    protected void shutdownOutput();
+    protected boolean supportsUrgentData();
+    public java.lang.String toString();
+
+
+    protected java.net.InetAddress address;
+    protected java.io.FileDescriptor fd;
+    protected int localport;
+    protected int port;
+}
+
+-keep class java.net.SocketImplFactory {
+
+    public abstract java.net.SocketImpl createSocketImpl();
+
+
+}
+
+-keep class java.net.URI {
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.String, java.lang.String);
+    <init>(java.lang.String, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String);
+    <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+
+    public int compareTo(java.net.URI);
+    public int compareTo(java.lang.Object);
+    public static java.net.URI create(java.lang.String);
+    public boolean equals(java.lang.Object);
+    public java.lang.String getAuthority();
+    public java.lang.String getFragment();
+    public java.lang.String getHost();
+    public java.lang.String getPath();
+    public int getPort();
+    public java.lang.String getQuery();
+    public java.lang.String getRawAuthority();
+    public java.lang.String getRawFragment();
+    public java.lang.String getRawPath();
+    public java.lang.String getRawQuery();
+    public java.lang.String getRawSchemeSpecificPart();
+    public java.lang.String getRawUserInfo();
+    public java.lang.String getScheme();
+    public java.lang.String getSchemeSpecificPart();
+    public java.lang.String getUserInfo();
+    public int hashCode();
+    public boolean isAbsolute();
+    public boolean isOpaque();
+    public java.net.URI normalize();
+    public java.net.URI parseServerAuthority();
+    public java.net.URI relativize(java.net.URI);
+    public java.net.URI resolve(java.net.URI);
+    public java.net.URI resolve(java.lang.String);
+    public java.lang.String toASCIIString();
+    public java.lang.String toString();
+    public java.net.URL toURL();
+
+
+}
+
+-keep class java.net.URISyntaxException {
+    <init>(java.lang.String, java.lang.String, int);
+    <init>(java.lang.String, java.lang.String);
+
+    public int getIndex();
+    public java.lang.String getInput();
+    public java.lang.String getMessage();
+    public java.lang.String getReason();
+
+
+}
+
+-keep class java.net.URL {
+    <init>(java.lang.String);
+    <init>(java.net.URL, java.lang.String);
+    <init>(java.net.URL, java.lang.String, java.net.URLStreamHandler);
+    <init>(java.lang.String, java.lang.String, java.lang.String);
+    <init>(java.lang.String, java.lang.String, int, java.lang.String);
+    <init>(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler);
+
+    public boolean equals(java.lang.Object);
+    public java.lang.String getAuthority();
+    public java.lang.Object getContent();
+    public java.lang.Object getContent(java.lang.Class[]);
+    public int getDefaultPort();
+    public java.lang.String getFile();
+    public java.lang.String getHost();
+    public java.lang.String getPath();
+    public int getPort();
+    public java.lang.String getProtocol();
+    public java.lang.String getQuery();
+    public java.lang.String getRef();
+    public java.lang.String getUserInfo();
+    public int hashCode();
+    public java.net.URLConnection openConnection();
+    public java.net.URLConnection openConnection(java.net.Proxy);
+    public java.io.InputStream openStream();
+    public boolean sameFile(java.net.URL);
+    protected void set(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String);
+    protected void set(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    public static synchronized void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
+    public java.lang.String toExternalForm();
+    public java.lang.String toString();
+    public java.net.URI toURI();
+
+
+}
+
+-keep class java.net.URLConnection {
+    <init>(java.net.URL);
+
+    public void addRequestProperty(java.lang.String, java.lang.String);
+    public abstract void connect();
+    public boolean getAllowUserInteraction();
+    public int getConnectTimeout();
+    public java.lang.Object getContent();
+    public java.lang.Object getContent(java.lang.Class[]);
+    public java.lang.String getContentEncoding();
+    public int getContentLength();
+    public java.lang.String getContentType();
+    public long getDate();
+    public static boolean getDefaultAllowUserInteraction();
+    public static java.lang.String getDefaultRequestProperty(java.lang.String);
+    public boolean getDefaultUseCaches();
+    public boolean getDoInput();
+    public boolean getDoOutput();
+    public long getExpiration();
+    public static java.net.FileNameMap getFileNameMap();
+    public java.lang.String getHeaderField(int);
+    public java.lang.String getHeaderField(java.lang.String);
+    public long getHeaderFieldDate(java.lang.String, long);
+    public int getHeaderFieldInt(java.lang.String, int);
+    public java.lang.String getHeaderFieldKey(int);
+    public java.util.Map getHeaderFields();
+    public long getIfModifiedSince();
+    public java.io.InputStream getInputStream();
+    public long getLastModified();
+    public java.io.OutputStream getOutputStream();
+    public java.security.Permission getPermission();
+    public int getReadTimeout();
+    public java.util.Map getRequestProperties();
+    public java.lang.String getRequestProperty(java.lang.String);
+    public java.net.URL getURL();
+    public boolean getUseCaches();
+    public static java.lang.String guessContentTypeFromName(java.lang.String);
+    public static java.lang.String guessContentTypeFromStream(java.io.InputStream);
+    public void setAllowUserInteraction(boolean);
+    public void setConnectTimeout(int);
+    public static synchronized void setContentHandlerFactory(java.net.ContentHandlerFactory);
+    public static void setDefaultAllowUserInteraction(boolean);
+    public static void setDefaultRequestProperty(java.lang.String, java.lang.String);
+    public void setDefaultUseCaches(boolean);
+    public void setDoInput(boolean);
+    public void setDoOutput(boolean);
+    public static void setFileNameMap(java.net.FileNameMap);
+    public void setIfModifiedSince(long);
+    public void setReadTimeout(int);
+    public void setRequestProperty(java.lang.String, java.lang.String);
+    public void setUseCaches(boolean);
+    public java.lang.String toString();
+
+
+    protected boolean allowUserInteraction;
+    protected boolean connected;
+    protected boolean doInput;
+    protected boolean doOutput;
+    protected long ifModifiedSince;
+    protected java.net.URL url;
+    protected boolean useCaches;
+}
+
+-keep class java.net.URLStreamHandler {
+    <init>();
+
+    protected boolean equals(java.net.URL, java.net.URL);
+    protected int getDefaultPort();
+    protected java.net.InetAddress getHostAddress(java.net.URL);
+    protected int hashCode(java.net.URL);
+    protected boolean hostsEqual(java.net.URL, java.net.URL);
+    protected abstract java.net.URLConnection openConnection(java.net.URL);
+    protected java.net.URLConnection openConnection(java.net.URL, java.net.Proxy);
+    protected void parseURL(java.net.URL, java.lang.String, int, int);
+    protected boolean sameFile(java.net.URL, java.net.URL);
+    protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String);
+    protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    protected java.lang.String toExternalForm(java.net.URL);
+
+
+}
+
+-keep class java.net.URLStreamHandlerFactory {
+
+    public abstract java.net.URLStreamHandler createURLStreamHandler(java.lang.String);
+
+
+}
+
+-keep class java.net.UnknownHostException {
+    <init>();
+    <init>(java.lang.String);
+
+
+
+}
+
+-keep class java.nio.Buffer {
+
+    public abstract java.lang.Object array();
+    public abstract int arrayOffset();
+    public int capacity();
+    public java.nio.Buffer clear();
+    public java.nio.Buffer flip();
+    public abstract boolean hasArray();
+    public boolean hasRemaining();
+    public abstract boolean isDirect();
+    public abstract boolean isReadOnly();
+    public int limit();
+    public java.nio.Buffer limit(int);
+    public java.nio.Buffer mark();
+    public int position();
+    public java.nio.Buffer position(int);
+    public int remaining();
+    public java.nio.Buffer reset();
+    public java.nio.Buffer rewind();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.nio.BufferOverflowException {
+    <init>();
+
+
+
+}
+
+-keep class java.nio.BufferUnderflowException {
+    <init>();
+
+
+
+}
+
+-keep class java.nio.ByteBuffer {
+
+    public static java.nio.ByteBuffer allocate(int);
+    public static java.nio.ByteBuffer allocateDirect(int);
+    public byte[] array();
+    public java.lang.Object array();
+    public int arrayOffset();
+    public abstract java.nio.CharBuffer asCharBuffer();
+    public abstract java.nio.DoubleBuffer asDoubleBuffer();
+    public abstract java.nio.FloatBuffer asFloatBuffer();
+    public abstract java.nio.IntBuffer asIntBuffer();
+    public abstract java.nio.LongBuffer asLongBuffer();
+    public abstract java.nio.ByteBuffer asReadOnlyBuffer();
+    public abstract java.nio.ShortBuffer asShortBuffer();
+    public abstract java.nio.ByteBuffer compact();
+    public int compareTo(java.nio.ByteBuffer);
+    public int compareTo(java.lang.Object);
+    public abstract java.nio.ByteBuffer duplicate();
+    public boolean equals(java.lang.Object);
+    public abstract byte get();
+    public java.nio.ByteBuffer get(byte[]);
+    public java.nio.ByteBuffer get(byte[], int, int);
+    public abstract byte get(int);
+    public abstract char getChar();
+    public abstract char getChar(int);
+    public abstract double getDouble();
+    public abstract double getDouble(int);
+    public abstract float getFloat();
+    public abstract float getFloat(int);
+    public abstract int getInt();
+    public abstract int getInt(int);
+    public abstract long getLong();
+    public abstract long getLong(int);
+    public abstract short getShort();
+    public abstract short getShort(int);
+    public boolean hasArray();
+    public int hashCode();
+    public abstract boolean isDirect();
+    public java.nio.ByteOrder order();
+    public java.nio.ByteBuffer order(java.nio.ByteOrder);
+    public abstract java.nio.ByteBuffer put(byte);
+    public java.nio.ByteBuffer put(byte[]);
+    public java.nio.ByteBuffer put(byte[], int, int);
+    public java.nio.ByteBuffer put(java.nio.ByteBuffer);
+    public abstract java.nio.ByteBuffer put(int, byte);
+    public abstract java.nio.ByteBuffer putChar(char);
+    public abstract java.nio.ByteBuffer putChar(int, char);
+    public abstract java.nio.ByteBuffer putDouble(double);
+    public abstract java.nio.ByteBuffer putDouble(int, double);
+    public abstract java.nio.ByteBuffer putFloat(float);
+    public abstract java.nio.ByteBuffer putFloat(int, float);
+    public abstract java.nio.ByteBuffer putInt(int);
+    public abstract java.nio.ByteBuffer putInt(int, int);
+    public abstract java.nio.ByteBuffer putLong(long);
+    public abstract java.nio.ByteBuffer putLong(int, long);
+    public abstract java.nio.ByteBuffer putShort(short);
+    public abstract java.nio.ByteBuffer putShort(int, short);
+    public abstract java.nio.ByteBuffer slice();
+    public static java.nio.ByteBuffer wrap(byte[]);
+    public static java.nio.ByteBuffer wrap(byte[], int, int);
+
+
+}
+
+-keep class java.nio.ByteOrder {
+
+    public static java.nio.ByteOrder nativeOrder();
+    public java.lang.String toString();
+
+
+    public static java.nio.ByteOrder BIG_ENDIAN;
+    public static java.nio.ByteOrder LITTLE_ENDIAN;
+}
+
+-keep class java.nio.CharBuffer {
+
+    public static java.nio.CharBuffer allocate(int);
+    public java.nio.CharBuffer append(char);
+    public java.nio.CharBuffer append(java.lang.CharSequence);
+    public java.nio.CharBuffer append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence, int, int);
+    public java.lang.Appendable append(java.lang.CharSequence);
+    public java.lang.Appendable append(char);
+    public char[] array();
+    public java.lang.Object array();
+    public int arrayOffset();
+    public abstract java.nio.CharBuffer asReadOnlyBuffer();
+    public char charAt(int);
+    public abstract java.nio.CharBuffer compact();
+    public int compareTo(java.nio.CharBuffer);
+    public int compareTo(java.lang.Object);
+    public abstract java.nio.CharBuffer duplicate();
+    public boolean equals(java.lang.Object);
+    public abstract char get();
+    public java.nio.CharBuffer get(char[]);
+    public java.nio.CharBuffer get(char[], int, int);
+    public abstract char get(int);
+    public boolean hasArray();
+    public int hashCode();
+    public abstract boolean isDirect();
+    public int length();
+    public abstract java.nio.ByteOrder order();
+    public abstract java.nio.CharBuffer put(char);
+    public java.nio.CharBuffer put(char[]);
+    public java.nio.CharBuffer put(char[], int, int);
+    public java.nio.CharBuffer put(java.nio.CharBuffer);
+    public abstract java.nio.CharBuffer put(int, char);
+    public java.nio.CharBuffer put(java.lang.String);
+    public java.nio.CharBuffer put(java.lang.String, int, int);
+    public int read(java.nio.CharBuffer);
+    public abstract java.nio.CharBuffer slice();
+    public abstract java.nio.CharBuffer subSequence(int, int);
+    public java.lang.CharSequence subSequence(int, int);
+    public java.lang.String toString();
+    public static java.nio.CharBuffer wrap(char[]);
+    public static java.nio.CharBuffer wrap(char[], int, int);
+    public static java.nio.CharBuffer wrap(java.lang.CharSequence);
+    public static java.nio.CharBuffer wrap(java.lang.CharSequence, int, int);
+
+
+}
+
+-keep class java.nio.DoubleBuffer {
+
+    public static java.nio.DoubleBuffer allocate(int);
+    public double[] array();
+    public java.lang.Object array();
+    public int arrayOffset();
+    public abstract java.nio.DoubleBuffer asReadOnlyBuffer();
+    public abstract java.nio.DoubleBuffer compact();
+    public int compareTo(java.nio.DoubleBuffer);
+    public int compareTo(java.lang.Object);
+    public abstract java.nio.DoubleBuffer duplicate();
+    public boolean equals(java.lang.Object);
+    public abstract double get();
+    public java.nio.DoubleBuffer get(double[]);
+    public java.nio.DoubleBuffer get(double[], int, int);
+    public abstract double get(int);
+    public boolean hasArray();
+    public int hashCode();
+    public abstract boolean isDirect();
+    public abstract java.nio.ByteOrder order();
+    public abstract java.nio.DoubleBuffer put(double);
+    public java.nio.DoubleBuffer put(double[]);
+    public java.nio.DoubleBuffer put(double[], int, int);
+    public java.nio.DoubleBuffer put(java.nio.DoubleBuffer);
+    public abstract java.nio.DoubleBuffer put(int, double);
+    public abstract java.nio.DoubleBuffer slice();
+    public static java.nio.DoubleBuffer wrap(double[]);
+    public static java.nio.DoubleBuffer wrap(double[], int, int);
+
+
+}
+
+-keep class java.nio.FloatBuffer {
+
+    public static java.nio.FloatBuffer allocate(int);
+    public float[] array();
+    public java.lang.Object array();
+    public int arrayOffset();
+    public abstract java.nio.FloatBuffer asReadOnlyBuffer();
+    public abstract java.nio.FloatBuffer compact();
+    public int compareTo(java.nio.FloatBuffer);
+    public int compareTo(java.lang.Object);
+    public abstract java.nio.FloatBuffer duplicate();
+    public boolean equals(java.lang.Object);
+    public abstract float get();
+    public java.nio.FloatBuffer get(float[]);
+    public java.nio.FloatBuffer get(float[], int, int);
+    public abstract float get(int);
+    public boolean hasArray();
+    public int hashCode();
+    public abstract boolean isDirect();
+    public abstract java.nio.ByteOrder order();
+    public abstract java.nio.FloatBuffer put(float);
+    public java.nio.FloatBuffer put(float[]);
+    public java.nio.FloatBuffer put(float[], int, int);
+    public java.nio.FloatBuffer put(java.nio.FloatBuffer);
+    public abstract java.nio.FloatBuffer put(int, float);
+    public abstract java.nio.FloatBuffer slice();
+    public static java.nio.FloatBuffer wrap(float[]);
+    public static java.nio.FloatBuffer wrap(float[], int, int);
+
+
+}
+
+-keep class java.nio.IntBuffer {
+
+    public static java.nio.IntBuffer allocate(int);
+    public int[] array();
+    public java.lang.Object array();
+    public int arrayOffset();
+    public abstract java.nio.IntBuffer asReadOnlyBuffer();
+    public abstract java.nio.IntBuffer compact();
+    public int compareTo(java.nio.IntBuffer);
+    public int compareTo(java.lang.Object);
+    public abstract java.nio.IntBuffer duplicate();
+    public boolean equals(java.lang.Object);
+    public abstract int get();
+    public java.nio.IntBuffer get(int[]);
+    public java.nio.IntBuffer get(int[], int, int);
+    public abstract int get(int);
+    public boolean hasArray();
+    public int hashCode();
+    public abstract boolean isDirect();
+    public abstract java.nio.ByteOrder order();
+    public abstract java.nio.IntBuffer put(int);
+    public java.nio.IntBuffer put(int[]);
+    public java.nio.IntBuffer put(int[], int, int);
+    public java.nio.IntBuffer put(java.nio.IntBuffer);
+    public abstract java.nio.IntBuffer put(int, int);
+    public abstract java.nio.IntBuffer slice();
+    public static java.nio.IntBuffer wrap(int[]);
+    public static java.nio.IntBuffer wrap(int[], int, int);
+
+
+}
+
+-keep class java.nio.LongBuffer {
+
+    public static java.nio.LongBuffer allocate(int);
+    public long[] array();
+    public java.lang.Object array();
+    public int arrayOffset();
+    public abstract java.nio.LongBuffer asReadOnlyBuffer();
+    public abstract java.nio.LongBuffer compact();
+    public int compareTo(java.nio.LongBuffer);
+    public int compareTo(java.lang.Object);
+    public abstract java.nio.LongBuffer duplicate();
+    public boolean equals(java.lang.Object);
+    public abstract long get();
+    public java.nio.LongBuffer get(long[]);
+    public java.nio.LongBuffer get(long[], int, int);
+    public abstract long get(int);
+    public boolean hasArray();
+    public int hashCode();
+    public abstract boolean isDirect();
+    public abstract java.nio.ByteOrder order();
+    public abstract java.nio.LongBuffer put(long);
+    public java.nio.LongBuffer put(long[]);
+    public java.nio.LongBuffer put(long[], int, int);
+    public java.nio.LongBuffer put(java.nio.LongBuffer);
+    public abstract java.nio.LongBuffer put(int, long);
+    public abstract java.nio.LongBuffer slice();
+    public static java.nio.LongBuffer wrap(long[]);
+    public static java.nio.LongBuffer wrap(long[], int, int);
+
+
+}
+
+-keep class java.nio.MappedByteBuffer {
+
+    public java.nio.MappedByteBuffer force();
+    public boolean isLoaded();
+    public java.nio.MappedByteBuffer load();
+
+
+}
+
+-keep class java.nio.ShortBuffer {
+
+    public static java.nio.ShortBuffer allocate(int);
+    public short[] array();
+    public java.lang.Object array();
+    public int arrayOffset();
+    public abstract java.nio.ShortBuffer asReadOnlyBuffer();
+    public abstract java.nio.ShortBuffer compact();
+    public int compareTo(java.nio.ShortBuffer);
+    public int compareTo(java.lang.Object);
+    public abstract java.nio.ShortBuffer duplicate();
+    public boolean equals(java.lang.Object);
+    public abstract short get();
+    public java.nio.ShortBuffer get(short[]);
+    public java.nio.ShortBuffer get(short[], int, int);
+    public abstract short get(int);
+    public boolean hasArray();
+    public int hashCode();
+    public abstract boolean isDirect();
+    public abstract java.nio.ByteOrder order();
+    public abstract java.nio.ShortBuffer put(short);
+    public java.nio.ShortBuffer put(short[]);
+    public java.nio.ShortBuffer put(short[], int, int);
+    public java.nio.ShortBuffer put(java.nio.ShortBuffer);
+    public abstract java.nio.ShortBuffer put(int, short);
+    public abstract java.nio.ShortBuffer slice();
+    public static java.nio.ShortBuffer wrap(short[]);
+    public static java.nio.ShortBuffer wrap(short[], int, int);
+
+
+}
+
+-keep class java.nio.channels.AsynchronousCloseException {
+    <init>();
+
+
+
+}
+
+-keep class java.nio.channels.Channel {
+
+    public abstract void close();
+    public abstract boolean isOpen();
+
+
+}
+
+-keep class java.nio.channels.ClosedChannelException {
+    <init>();
+
+
+
+}
+
+-keep class java.nio.channels.DatagramChannel {
+    <init>(java.nio.channels.spi.SelectorProvider);
+
+    public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress);
+    public abstract java.nio.channels.DatagramChannel disconnect();
+    public abstract boolean isConnected();
+    public static java.nio.channels.DatagramChannel open();
+    public abstract int read(java.nio.ByteBuffer);
+    public abstract long read(java.nio.ByteBuffer[], int, int);
+    public synchronized long read(java.nio.ByteBuffer[]);
+    public abstract java.net.SocketAddress receive(java.nio.ByteBuffer);
+    public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress);
+    public abstract java.net.DatagramSocket socket();
+    public int validOps();
+    public abstract int write(java.nio.ByteBuffer);
+    public abstract long write(java.nio.ByteBuffer[], int, int);
+    public synchronized long write(java.nio.ByteBuffer[]);
+
+
+}
+
+-keep class java.nio.channels.FileChannel {
+    <init>();
+
+    public abstract void force(boolean);
+    public java.nio.channels.FileLock lock();
+    public abstract java.nio.channels.FileLock lock(long, long, boolean);
+    public abstract java.nio.MappedByteBuffer map(java.nio.channels.FileChannel$MapMode, long, long);
+    public abstract long position();
+    public abstract java.nio.channels.FileChannel position(long);
+    public abstract int read(java.nio.ByteBuffer);
+    public abstract int read(java.nio.ByteBuffer, long);
+    public long read(java.nio.ByteBuffer[]);
+    public abstract long read(java.nio.ByteBuffer[], int, int);
+    public abstract long size();
+    public abstract long transferFrom(java.nio.channels.ReadableByteChannel, long, long);
+    public abstract long transferTo(long, long, java.nio.channels.WritableByteChannel);
+    public abstract java.nio.channels.FileChannel truncate(long);
+    public java.nio.channels.FileLock tryLock();
+    public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
+    public abstract int write(java.nio.ByteBuffer);
+    public abstract int write(java.nio.ByteBuffer, long);
+    public long write(java.nio.ByteBuffer[]);
+    public abstract long write(java.nio.ByteBuffer[], int, int);
+
+
+}
+
+-keep class java.nio.channels.FileChannel$MapMode {
+
+    public java.lang.String toString();
+
+
+    public static java.nio.channels.FileChannel$MapMode PRIVATE;
+    public static java.nio.channels.FileChannel$MapMode READ_ONLY;
+    public static java.nio.channels.FileChannel$MapMode READ_WRITE;
+}
+
+-keep class java.nio.channels.FileLock {
+    <init>(java.nio.channels.FileChannel, long, long, boolean);
+
+    public java.nio.channels.FileChannel channel();
+    public void close();
+    public boolean isShared();
+    public abstract boolean isValid();
+    public boolean overlaps(long, long);
+    public long position();
+    public abstract void release();
+    public long size();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.nio.channels.Pipe {
+    <init>();
+
+    public static java.nio.channels.Pipe open();
+    public abstract java.nio.channels.Pipe$SinkChannel sink();
+    public abstract java.nio.channels.Pipe$SourceChannel source();
+
+
+}
+
+-keep class java.nio.channels.Pipe$SinkChannel {
+    <init>(java.nio.channels.spi.SelectorProvider);
+
+    public int validOps();
+
+
+}
+
+-keep class java.nio.channels.Pipe$SourceChannel {
+    <init>(java.nio.channels.spi.SelectorProvider);
+
+    public int validOps();
+
+
+}
+
+-keep class java.nio.channels.ReadableByteChannel {
+
+    public abstract int read(java.nio.ByteBuffer);
+
+
+}
+
+-keep class java.nio.channels.SelectableChannel {
+    <init>();
+
+    public abstract java.lang.Object blockingLock();
+    public abstract java.nio.channels.SelectableChannel configureBlocking(boolean);
+    public abstract boolean isBlocking();
+    public abstract boolean isRegistered();
+    public abstract java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
+    public abstract java.nio.channels.spi.SelectorProvider provider();
+    public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int);
+    public abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);
+    public abstract int validOps();
+
+
+}
+
+-keep class java.nio.channels.SelectionKey {
+    <init>();
+
+    public java.lang.Object attach(java.lang.Object);
+    public java.lang.Object attachment();
+    public abstract void cancel();
+    public abstract java.nio.channels.SelectableChannel channel();
+    public abstract int interestOps();
+    public abstract java.nio.channels.SelectionKey interestOps(int);
+    public boolean isAcceptable();
+    public boolean isConnectable();
+    public boolean isReadable();
+    public abstract boolean isValid();
+    public boolean isWritable();
+    public abstract int readyOps();
+    public abstract java.nio.channels.Selector selector();
+
+
+    public static int OP_ACCEPT;
+    public static int OP_CONNECT;
+    public static int OP_READ;
+    public static int OP_WRITE;
+}
+
+-keep class java.nio.channels.Selector {
+    <init>();
+
+    public abstract void close();
+    public abstract boolean isOpen();
+    public abstract java.util.Set keys();
+    public static java.nio.channels.Selector open();
+    public abstract java.nio.channels.spi.SelectorProvider provider();
+    public abstract int select();
+    public abstract int select(long);
+    public abstract int selectNow();
+    public abstract java.util.Set selectedKeys();
+    public abstract java.nio.channels.Selector wakeup();
+
+
+}
+
+-keep class java.nio.channels.ServerSocketChannel {
+    <init>(java.nio.channels.spi.SelectorProvider);
+
+    public abstract java.nio.channels.SocketChannel accept();
+    public static java.nio.channels.ServerSocketChannel open();
+    public abstract java.net.ServerSocket socket();
+    public int validOps();
+
+
+}
+
+-keep class java.nio.channels.SocketChannel {
+    <init>(java.nio.channels.spi.SelectorProvider);
+
+    public abstract boolean connect(java.net.SocketAddress);
+    public abstract boolean finishConnect();
+    public abstract boolean isConnected();
+    public abstract boolean isConnectionPending();
+    public static java.nio.channels.SocketChannel open();
+    public static java.nio.channels.SocketChannel open(java.net.SocketAddress);
+    public abstract int read(java.nio.ByteBuffer);
+    public abstract long read(java.nio.ByteBuffer[], int, int);
+    public synchronized long read(java.nio.ByteBuffer[]);
+    public abstract java.net.Socket socket();
+    public int validOps();
+    public abstract int write(java.nio.ByteBuffer);
+    public abstract long write(java.nio.ByteBuffer[], int, int);
+    public synchronized long write(java.nio.ByteBuffer[]);
+
+
+}
+
+-keep class java.nio.channels.WritableByteChannel {
+
+    public abstract int write(java.nio.ByteBuffer);
+
+
+}
+
+-keep class java.nio.channels.spi.AbstractInterruptibleChannel {
+    <init>();
+
+    protected void begin();
+    public void close();
+    protected void end(boolean);
+    protected abstract void implCloseChannel();
+    public synchronized boolean isOpen();
+
+
+}
+
+-keep class java.nio.channels.spi.AbstractSelectableChannel {
+    <init>(java.nio.channels.spi.SelectorProvider);
+
+    public java.lang.Object blockingLock();
+    public java.nio.channels.SelectableChannel configureBlocking(boolean);
+    protected synchronized void implCloseChannel();
+    protected abstract void implCloseSelectableChannel();
+    protected abstract void implConfigureBlocking(boolean);
+    public boolean isBlocking();
+    public synchronized boolean isRegistered();
+    public synchronized java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
+    public java.nio.channels.spi.SelectorProvider provider();
+    public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);
+
+
+}
+
+-keep class java.nio.channels.spi.AbstractSelectionKey {
+    <init>();
+
+    public void cancel();
+    public boolean isValid();
+
+
+}
+
+-keep class java.nio.channels.spi.AbstractSelector {
+    <init>(java.nio.channels.spi.SelectorProvider);
+
+    protected void begin();
+    protected java.util.Set cancelledKeys();
+    public void close();
+    protected void deregister(java.nio.channels.spi.AbstractSelectionKey);
+    protected void end();
+    protected abstract void implCloseSelector();
+    public boolean isOpen();
+    public java.nio.channels.spi.SelectorProvider provider();
+    protected abstract java.nio.channels.SelectionKey register(java.nio.channels.spi.AbstractSelectableChannel, int, java.lang.Object);
+
+
+}
+
+-keep class java.nio.channels.spi.SelectorProvider {
+    <init>();
+
+    public java.nio.channels.Channel inheritedChannel();
+    public abstract java.nio.channels.DatagramChannel openDatagramChannel();
+    public abstract java.nio.channels.Pipe openPipe();
+    public abstract java.nio.channels.spi.AbstractSelector openSelector();
+    public abstract java.nio.channels.ServerSocketChannel openServerSocketChannel();
+    public abstract java.nio.channels.SocketChannel openSocketChannel();
+    public static synchronized java.nio.channels.spi.SelectorProvider provider();
+
+
+}
+
+-keep class java.nio.charset.CharacterCodingException {
+    <init>();
+
+
+
+}
+
+-keep class java.nio.charset.Charset {
+    <init>(java.lang.String, java.lang.String[]);
+
+    public java.util.Set aliases();
+    public static java.util.SortedMap availableCharsets();
+    public boolean canEncode();
+    public int compareTo(java.nio.charset.Charset);
+    public int compareTo(java.lang.Object);
+    public abstract boolean contains(java.nio.charset.Charset);
+    public java.nio.CharBuffer decode(java.nio.ByteBuffer);
+    public static java.nio.charset.Charset defaultCharset();
+    public java.lang.String displayName();
+    public java.lang.String displayName(java.util.Locale);
+    public java.nio.ByteBuffer encode(java.nio.CharBuffer);
+    public java.nio.ByteBuffer encode(java.lang.String);
+    public boolean equals(java.lang.Object);
+    public static java.nio.charset.Charset forName(java.lang.String);
+    public int hashCode();
+    public boolean isRegistered();
+    public static boolean isSupported(java.lang.String);
+    public java.lang.String name();
+    public abstract java.nio.charset.CharsetDecoder newDecoder();
+    public abstract java.nio.charset.CharsetEncoder newEncoder();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.nio.charset.CharsetDecoder {
+    <init>(java.nio.charset.Charset, float, float);
+
+    public float averageCharsPerByte();
+    public java.nio.charset.Charset charset();
+    public java.nio.CharBuffer decode(java.nio.ByteBuffer);
+    public java.nio.charset.CoderResult decode(java.nio.ByteBuffer, java.nio.CharBuffer, boolean);
+    protected abstract java.nio.charset.CoderResult decodeLoop(java.nio.ByteBuffer, java.nio.CharBuffer);
+    public java.nio.charset.Charset detectedCharset();
+    public java.nio.charset.CoderResult flush(java.nio.CharBuffer);
+    protected java.nio.charset.CoderResult implFlush(java.nio.CharBuffer);
+    protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
+    protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
+    protected void implReplaceWith(java.lang.String);
+    protected void implReset();
+    public boolean isAutoDetecting();
+    public boolean isCharsetDetected();
+    public java.nio.charset.CodingErrorAction malformedInputAction();
+    public float maxCharsPerByte();
+    public java.nio.charset.CharsetDecoder onMalformedInput(java.nio.charset.CodingErrorAction);
+    public java.nio.charset.CharsetDecoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
+    public java.nio.charset.CharsetDecoder replaceWith(java.lang.String);
+    public java.lang.String replacement();
+    public java.nio.charset.CharsetDecoder reset();
+    public java.nio.charset.CodingErrorAction unmappableCharacterAction();
+
+
+}
+
+-keep class java.nio.charset.CharsetEncoder {
+    <init>(java.nio.charset.Charset, float, float);
+    <init>(java.nio.charset.Charset, float, float, byte[]);
+
+    public float averageBytesPerChar();
+    public boolean canEncode(char);
+    public boolean canEncode(java.lang.CharSequence);
+    public java.nio.charset.Charset charset();
+    public java.nio.ByteBuffer encode(java.nio.CharBuffer);
+    public java.nio.charset.CoderResult encode(java.nio.CharBuffer, java.nio.ByteBuffer, boolean);
+    protected abstract java.nio.charset.CoderResult encodeLoop(java.nio.CharBuffer, java.nio.ByteBuffer);
+    public java.nio.charset.CoderResult flush(java.nio.ByteBuffer);
+    protected java.nio.charset.CoderResult implFlush(java.nio.ByteBuffer);
+    protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
+    protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
+    protected void implReplaceWith(byte[]);
+    protected void implReset();
+    public boolean isLegalReplacement(byte[]);
+    public java.nio.charset.CodingErrorAction malformedInputAction();
+    public float maxBytesPerChar();
+    public java.nio.charset.CharsetEncoder onMalformedInput(java.nio.charset.CodingErrorAction);
+    public java.nio.charset.CharsetEncoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
+    public java.nio.charset.CharsetEncoder replaceWith(byte[]);
+    public byte[] replacement();
+    public java.nio.charset.CharsetEncoder reset();
+    public java.nio.charset.CodingErrorAction unmappableCharacterAction();
+
+
+}
+
+-keep class java.nio.charset.CoderResult {
+
+    public boolean isError();
+    public boolean isMalformed();
+    public boolean isOverflow();
+    public boolean isUnderflow();
+    public boolean isUnmappable();
+    public int length();
+    public static synchronized java.nio.charset.CoderResult malformedForLength(int);
+    public void throwException();
+    public java.lang.String toString();
+    public static synchronized java.nio.charset.CoderResult unmappableForLength(int);
+
+
+    public static java.nio.charset.CoderResult OVERFLOW;
+    public static java.nio.charset.CoderResult UNDERFLOW;
+}
+
+-keep class java.nio.charset.CodingErrorAction {
+
+    public java.lang.String toString();
+
+
+    public static java.nio.charset.CodingErrorAction IGNORE;
+    public static java.nio.charset.CodingErrorAction REPLACE;
+    public static java.nio.charset.CodingErrorAction REPORT;
+}
+
+-keep class java.nio.charset.MalformedInputException {
+    <init>(int);
+
+    public int getInputLength();
+    public java.lang.String getMessage();
+
+
+}
+
+-keep class java.nio.charset.UnmappableCharacterException {
+    <init>(int);
+
+    public int getInputLength();
+    public java.lang.String getMessage();
+
+
+}
+
+-keep class java.security.CodeSigner {
+    <init>(java.security.cert.CertPath, java.security.Timestamp);
+
+    public boolean equals(java.lang.Object);
+    public java.security.cert.CertPath getSignerCertPath();
+    public java.security.Timestamp getTimestamp();
+    public int hashCode();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.security.CodeSource {
+    <init>(java.net.URL, java.security.cert.Certificate[]);
+    <init>(java.net.URL, java.security.CodeSigner[]);
+
+    public java.security.cert.Certificate[] getCertificates();
+    public java.security.CodeSigner[] getCodeSigners();
+    public java.net.URL getLocation();
+    public boolean implies(java.security.CodeSource);
+
+
+}
+
+-keep class java.security.GeneralSecurityException {
+    <init>(java.lang.String);
+    <init>();
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.security.InvalidKeyException {
+    <init>(java.lang.String);
+    <init>();
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.security.KeyException {
+    <init>(java.lang.String);
+    <init>();
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.security.NoSuchAlgorithmException {
+    <init>(java.lang.String);
+    <init>();
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.security.NoSuchProviderException {
+    <init>(java.lang.String);
+    <init>();
+
+
+
+}
+
+-keep class java.security.Permission {
+    <init>(java.lang.String);
+
+    public void checkGuard(java.lang.Object);
+    public abstract java.lang.String getActions();
+    public java.lang.String getName();
+    public abstract boolean implies(java.security.Permission);
+    public java.security.PermissionCollection newPermissionCollection();
+
+
+}
+
+-keep class java.security.PermissionCollection {
+    <init>();
+
+    public abstract void add(java.security.Permission);
+    public abstract java.util.Enumeration elements();
+    public abstract boolean implies(java.security.Permission);
+    public boolean isReadOnly();
+    public void setReadOnly();
+
+
+}
+
+-keep class java.security.Principal {
+
+    public abstract boolean equals(java.lang.Object);
+    public abstract java.lang.String getName();
+    public abstract int hashCode();
+    public abstract java.lang.String toString();
+
+
+}
+
+-keep class java.security.ProtectionDomain {
+    <init>(java.security.CodeSource, java.security.PermissionCollection);
+    <init>(java.security.CodeSource, java.security.PermissionCollection, java.lang.ClassLoader, java.security.Principal[]);
+
+    public java.lang.ClassLoader getClassLoader();
+    public java.security.CodeSource getCodeSource();
+    public java.security.PermissionCollection getPermissions();
+    public java.security.Principal[] getPrincipals();
+    public boolean implies(java.security.Permission);
+
+
+}
+
+-keep class java.security.PublicKey {
+
+
+
+    public static long serialVersionUID;
+}
+
+-keep class java.security.SignatureException {
+    <init>(java.lang.String);
+    <init>();
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.security.Timestamp {
+    <init>(java.util.Date, java.security.cert.CertPath);
+
+    public boolean equals(java.lang.Object);
+    public java.security.cert.CertPath getSignerCertPath();
+    public java.util.Date getTimestamp();
+    public int hashCode();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.security.cert.CertPath {
+    <init>(java.lang.String);
+
+    public boolean equals(java.lang.Object);
+    public abstract java.util.List getCertificates();
+    public abstract byte[] getEncoded();
+    public abstract byte[] getEncoded(java.lang.String);
+    public abstract java.util.Iterator getEncodings();
+    public java.lang.String getType();
+    public int hashCode();
+    public java.lang.String toString();
+    protected java.lang.Object writeReplace();
+
+
+}
+
+-keep class java.security.cert.Certificate {
+    <init>(java.lang.String);
+
+    public boolean equals(java.lang.Object);
+    public abstract byte[] getEncoded();
+    public abstract java.security.PublicKey getPublicKey();
+    public java.lang.String getType();
+    public int hashCode();
+    public abstract java.lang.String toString();
+    public abstract void verify(java.security.PublicKey);
+    public abstract void verify(java.security.PublicKey, java.lang.String);
+    protected java.lang.Object writeReplace();
+
+
+}
+
+-keep class java.security.cert.CertificateEncodingException {
+    <init>(java.lang.String);
+    <init>();
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.security.cert.CertificateException {
+    <init>(java.lang.String);
+    <init>();
+    <init>(java.lang.String, java.lang.Throwable);
+    <init>(java.lang.Throwable);
+
+
+
+}
+
+-keep class java.util.AbstractCollection {
+    <init>();
+
+    public boolean add(java.lang.Object);
+    public boolean addAll(java.util.Collection);
+    public void clear();
+    public boolean contains(java.lang.Object);
+    public boolean containsAll(java.util.Collection);
+    public boolean isEmpty();
+    public abstract java.util.Iterator iterator();
+    public boolean remove(java.lang.Object);
+    public boolean removeAll(java.util.Collection);
+    public boolean retainAll(java.util.Collection);
+    public abstract int size();
+    public java.lang.Object[] toArray();
+    public java.lang.Object[] toArray(java.lang.Object[]);
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.util.AbstractList {
+    <init>();
+
+    public void add(int, java.lang.Object);
+    public boolean add(java.lang.Object);
+    public boolean addAll(int, java.util.Collection);
+    public void clear();
+    public boolean equals(java.lang.Object);
+    public abstract java.lang.Object get(int);
+    public int hashCode();
+    public int indexOf(java.lang.Object);
+    public java.util.Iterator iterator();
+    public int lastIndexOf(java.lang.Object);
+    public java.util.ListIterator listIterator();
+    public java.util.ListIterator listIterator(int);
+    public java.lang.Object remove(int);
+    protected void removeRange(int, int);
+    public java.lang.Object set(int, java.lang.Object);
+    public java.util.List subList(int, int);
+
+
+    protected transient int modCount;
+}
+
+-keep class java.util.AbstractMap {
+    <init>();
+
+    public void clear();
+    protected java.lang.Object clone();
+    public boolean containsKey(java.lang.Object);
+    public boolean containsValue(java.lang.Object);
+    public abstract java.util.Set entrySet();
+    public boolean equals(java.lang.Object);
+    public java.lang.Object get(java.lang.Object);
+    public int hashCode();
+    public boolean isEmpty();
+    public java.util.Set keySet();
+    public java.lang.Object put(java.lang.Object, java.lang.Object);
+    public void putAll(java.util.Map);
+    public java.lang.Object remove(java.lang.Object);
+    public int size();
+    public java.lang.String toString();
+    public java.util.Collection values();
+
+
+}
+
+-keep class java.util.ArrayList {
+    <init>(int);
+    <init>();
+    <init>(java.util.Collection);
+
+    public boolean add(java.lang.Object);
+    public void add(int, java.lang.Object);
+    public boolean addAll(java.util.Collection);
+    public boolean addAll(int, java.util.Collection);
+    public void clear();
+    public java.lang.Object clone();
+    public boolean contains(java.lang.Object);
+    public void ensureCapacity(int);
+    public boolean equals(java.lang.Object);
+    public java.lang.Object get(int);
+    public int hashCode();
+    public int indexOf(java.lang.Object);
+    public boolean isEmpty();
+    public java.util.Iterator iterator();
+    public int lastIndexOf(java.lang.Object);
+    public java.lang.Object remove(int);
+    public boolean remove(java.lang.Object);
+    protected void removeRange(int, int);
+    public java.lang.Object set(int, java.lang.Object);
+    public int size();
+    public java.lang.Object[] toArray();
+    public java.lang.Object[] toArray(java.lang.Object[]);
+    public void trimToSize();
+
+
+}
+
+-keep class java.util.Collection {
+
+    public abstract boolean add(java.lang.Object);
+    public abstract boolean addAll(java.util.Collection);
+    public abstract void clear();
+    public abstract boolean contains(java.lang.Object);
+    public abstract boolean containsAll(java.util.Collection);
+    public abstract boolean equals(java.lang.Object);
+    public abstract int hashCode();
+    public abstract boolean isEmpty();
+    public abstract java.util.Iterator iterator();
+    public abstract boolean remove(java.lang.Object);
+    public abstract boolean removeAll(java.util.Collection);
+    public abstract boolean retainAll(java.util.Collection);
+    public abstract int size();
+    public abstract java.lang.Object[] toArray();
+    public abstract java.lang.Object[] toArray(java.lang.Object[]);
+
+
+}
+
+-keep class java.util.Comparator {
+
+    public abstract int compare(java.lang.Object, java.lang.Object);
+    public abstract boolean equals(java.lang.Object);
+
+
+}
+
+-keep class java.util.Date {
+    <init>();
+    <init>(int, int, int);
+    <init>(int, int, int, int, int);
+    <init>(int, int, int, int, int, int);
+    <init>(long);
+    <init>(java.lang.String);
+
+    public static long UTC(int, int, int, int, int, int);
+    public boolean after(java.util.Date);
+    public boolean before(java.util.Date);
+    public java.lang.Object clone();
+    public int compareTo(java.util.Date);
+    public int compareTo(java.lang.Object);
+    public boolean equals(java.lang.Object);
+    public int getDate();
+    public int getDay();
+    public int getHours();
+    public int getMinutes();
+    public int getMonth();
+    public int getSeconds();
+    public long getTime();
+    public int getTimezoneOffset();
+    public int getYear();
+    public int hashCode();
+    public static long parse(java.lang.String);
+    public void setDate(int);
+    public void setHours(int);
+    public void setMinutes(int);
+    public void setMonth(int);
+    public void setSeconds(int);
+    public void setTime(long);
+    public void setYear(int);
+    public java.lang.String toGMTString();
+    public java.lang.String toLocaleString();
+    public java.lang.String toString();
+
+
+}
+
+-keep class java.util.Enumeration {
+
+    public abstract boolean hasMoreElements();
+    public abstract java.lang.Object nextElement();
+
+
+}
+
+-keep class java.util.HashMap {
+    <init>();
+    <init>(int);
+    <init>(int, float);
+    <init>(java.util.Map);
+
+    public void clear();
+    public java.lang.Object clone();
+    public boolean containsKey(java.lang.Object);
+    public boolean containsValue(java.lang.Object);
+    public java.util.Set entrySet();
+    public java.lang.Object get(java.lang.Object);
+    public boolean isEmpty();
+    public java.util.Set keySet();
+    public java.lang.Object put(java.lang.Object, java.lang.Object);
+    public void putAll(java.util.Map);
+    public java.lang.Object remove(java.lang.Object);
+    public int size();
+    public java.util.Collection values();
+
+
+}
+
+-keep class java.util.Iterator {
+
+    public abstract boolean hasNext();
+    public abstract java.lang.Object next();
+    public abstract void remove();
+
+
+}
+
+-keep class java.util.List {
+
+    public abstract void add(int, java.lang.Object);
+    public abstract boolean add(java.lang.Object);
+    public abstract boolean addAll(int, java.util.Collection);
+    public abstract boolean addAll(java.util.Collection);
+    public abstract void clear();
+    public abstract boolean contains(java.lang.Object);
+    public abstract boolean containsAll(java.util.Collection);
+    public abstract boolean equals(java.lang.Object);
+    public abstract java.lang.Object get(int);
+    public abstract int hashCode();
+    public abstract int indexOf(java.lang.Object);
+    public abstract boolean isEmpty();
+    public abstract java.util.Iterator iterator();
+    public abstract int lastIndexOf(java.lang.Object);
+    public abstract java.util.ListIterator listIterator();
+    public abstract java.util.ListIterator listIterator(int);
+    public abstract java.lang.Object remove(int);
+    public abstract boolean remove(java.lang.Object);
+    public abstract boolean removeAll(java.util.Collection);
+    public abstract boolean retainAll(java.util.Collection);
+    public abstract java.lang.Object set(int, java.lang.Object);
+    public abstract int size();
+    public abstract java.util.List subList(int, int);
+    public abstract java.lang.Object[] toArray();
+    public abstract java.lang.Object[] toArray(java.lang.Object[]);
+
+
+}
+
+-keep class java.util.ListIterator {
+
+    public abstract void add(java.lang.Object);
+    public abstract boolean hasNext();
+    public abstract boolean hasPrevious();
+    public abstract java.lang.Object next();
+    public abstract int nextIndex();
+    public abstract java.lang.Object previous();
+    public abstract int previousIndex();
+    public abstract void remove();
+    public abstract void set(java.lang.Object);
+
+
+}
+
+-keep class java.util.Locale {
+    <init>(java.lang.String);
+    <init>(java.lang.String, java.lang.String);
+    <init>(java.lang.String, java.lang.String, java.lang.String);
+
+    public java.lang.Object clone();
+    public boolean equals(java.lang.Object);
+    public static java.util.Locale forLanguageTag(java.lang.String);
+    public static java.util.Locale[] getAvailableLocales();
+    public java.lang.String getCountry();
+    public static java.util.Locale getDefault();
+    public java.lang.String getDisplayCountry();
+    public java.lang.String getDisplayCountry(java.util.Locale);
+    public java.lang.String getDisplayLanguage();
+    public java.lang.String getDisplayLanguage(java.util.Locale);
+    public java.lang.String getDisplayName();
+    public java.lang.String getDisplayName(java.util.Locale);
+    public java.lang.String getDisplayScript();
+    public java.lang.String getDisplayScript(java.util.Locale);
+    public java.lang.String getDisplayVariant();
+    public java.lang.String getDisplayVariant(java.util.Locale);
+    public java.lang.String getExtension(char);
+    public java.util.Set getExtensionKeys();
+    public java.lang.String getISO3Country();
+    public java.lang.String getISO3Language();
+    public static java.lang.String[] getISOCountries();
+    public static java.lang.String[] getISOLanguages();
+    public java.lang.String getLanguage();
+    public java.lang.String getScript();
+    public java.util.Set getUnicodeLocaleAttributes();
+    public java.util.Set getUnicodeLocaleKeys();
+    public java.lang.String getUnicodeLocaleType(java.lang.String);
+    public java.lang.String getVariant();
+    public synchronized int hashCode();
+    public static synchronized void setDefault(java.util.Locale);
+    public java.lang.String toLanguageTag();
+    public java.lang.String toString();
+
+
+    public static java.util.Locale CANADA;
+    public static java.util.Locale CANADA_FRENCH;
+    public static java.util.Locale CHINA;
+    public static java.util.Locale CHINESE;
+    public static java.util.Locale ENGLISH;
+    public static java.util.Locale FRANCE;
+    public static java.util.Locale FRENCH;
+    public static java.util.Locale GERMAN;
+    public static java.util.Locale GERMANY;
+    public static java.util.Locale ITALIAN;
+    public static java.util.Locale ITALY;
+    public static java.util.Locale JAPAN;
+    public static java.util.Locale JAPANESE;
+    public static java.util.Locale KOREA;
+    public static java.util.Locale KOREAN;
+    public static java.util.Locale PRC;
+    public static char PRIVATE_USE_EXTENSION;
+    public static java.util.Locale ROOT;
+    public static java.util.Locale SIMPLIFIED_CHINESE;
+    public static java.util.Locale TAIWAN;
+    public static java.util.Locale TRADITIONAL_CHINESE;
+    public static java.util.Locale UK;
+    public static char UNICODE_LOCALE_EXTENSION;
+    public static java.util.Locale US;
+}
+
+-keep class java.util.Map {
+
+    public abstract void clear();
+    public abstract boolean containsKey(java.lang.Object);
+    public abstract boolean containsValue(java.lang.Object);
+    public abstract java.util.Set entrySet();
+    public abstract boolean equals(java.lang.Object);
+    public abstract java.lang.Object get(java.lang.Object);
+    public abstract int hashCode();
+    public abstract boolean isEmpty();
+    public abstract java.util.Set keySet();
+    public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
+    public abstract void putAll(java.util.Map);
+    public abstract java.lang.Object remove(java.lang.Object);
+    public abstract int size();
+    public abstract java.util.Collection values();
+
+
+}
+
+-keep class java.util.Map$Entry {
+
+    public abstract boolean equals(java.lang.Object);
+    public abstract java.lang.Object getKey();
+    public abstract java.lang.Object getValue();
+    public abstract int hashCode();
+    public abstract java.lang.Object setValue(java.lang.Object);
+
+
+}
+
+-keep class java.util.Set {
+
+    public abstract boolean add(java.lang.Object);
+    public abstract boolean addAll(java.util.Collection);
+    public abstract void clear();
+    public abstract boolean contains(java.lang.Object);
+    public abstract boolean containsAll(java.util.Collection);
+    public abstract boolean equals(java.lang.Object);
+    public abstract int hashCode();
+    public abstract boolean isEmpty();
+    public abstract java.util.Iterator iterator();
+    public abstract boolean remove(java.lang.Object);
+    public abstract boolean removeAll(java.util.Collection);
+    public abstract boolean retainAll(java.util.Collection);
+    public abstract int size();
+    public abstract java.lang.Object[] toArray();
+    public abstract java.lang.Object[] toArray(java.lang.Object[]);
+
+
+}
+
+-keep class java.util.SortedMap {
+
+    public abstract java.util.Comparator comparator();
+    public abstract java.lang.Object firstKey();
+    public abstract java.util.SortedMap headMap(java.lang.Object);
+    public abstract java.lang.Object lastKey();
+    public abstract java.util.SortedMap subMap(java.lang.Object, java.lang.Object);
+    public abstract java.util.SortedMap tailMap(java.lang.Object);
+
+
+}
+
+-keep class org.xmlpull.v1.XmlPullParser {
+
+    public abstract void defineEntityReplacementText(java.lang.String, java.lang.String);
+    public abstract int getAttributeCount();
+    public abstract java.lang.String getAttributeName(int);
+    public abstract java.lang.String getAttributeNamespace(int);
+    public abstract java.lang.String getAttributePrefix(int);
+    public abstract java.lang.String getAttributeType(int);
+    public abstract java.lang.String getAttributeValue(int);
+    public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
+    public abstract int getColumnNumber();
+    public abstract int getDepth();
+    public abstract int getEventType();
+    public abstract boolean getFeature(java.lang.String);
+    public abstract java.lang.String getInputEncoding();
+    public abstract int getLineNumber();
+    public abstract java.lang.String getName();
+    public abstract java.lang.String getNamespace(java.lang.String);
+    public abstract java.lang.String getNamespace();
+    public abstract int getNamespaceCount(int);
+    public abstract java.lang.String getNamespacePrefix(int);
+    public abstract java.lang.String getNamespaceUri(int);
+    public abstract java.lang.String getPositionDescription();
+    public abstract java.lang.String getPrefix();
+    public abstract java.lang.Object getProperty(java.lang.String);
+    public abstract java.lang.String getText();
+    public abstract char[] getTextCharacters(int[]);
+    public abstract boolean isAttributeDefault(int);
+    public abstract boolean isEmptyElementTag();
+    public abstract boolean isWhitespace();
+    public abstract int next();
+    public abstract int nextTag();
+    public abstract java.lang.String nextText();
+    public abstract int nextToken();
+    public abstract void require(int, java.lang.String, java.lang.String);
+    public abstract void setFeature(java.lang.String, boolean);
+    public abstract void setInput(java.io.Reader);
+    public abstract void setInput(java.io.InputStream, java.lang.String);
+    public abstract void setProperty(java.lang.String, java.lang.Object);
+
+
+    public static int CDSECT;
+    public static int COMMENT;
+    public static int DOCDECL;
+    public static int END_DOCUMENT;
+    public static int END_TAG;
+    public static int ENTITY_REF;
+    public static java.lang.String FEATURE_PROCESS_DOCDECL;
+    public static java.lang.String FEATURE_PROCESS_NAMESPACES;
+    public static java.lang.String FEATURE_REPORT_NAMESPACE_ATTRIBUTES;
+    public static java.lang.String FEATURE_VALIDATION;
+    public static int IGNORABLE_WHITESPACE;
+    public static java.lang.String NO_NAMESPACE;
+    public static int PROCESSING_INSTRUCTION;
+    public static int START_DOCUMENT;
+    public static int START_TAG;
+    public static int TEXT;
+    public static java.lang.String[] TYPES;
+}
+
+-keep class org.xmlpull.v1.XmlPullParserException {
+    <init>(java.lang.String);
+    <init>(java.lang.String, org.xmlpull.v1.XmlPullParser, java.lang.Throwable);
+
+    public int getColumnNumber();
+    public java.lang.Throwable getDetail();
+    public int getLineNumber();
+    public void printStackTrace();
+
+
+    protected int column;
+    protected java.lang.Throwable detail;
+    protected int row;
+}
+
+-keep class org.xmlpull.v1.XmlSerializer {
+
+    public abstract org.xmlpull.v1.XmlSerializer attribute(java.lang.String, java.lang.String, java.lang.String);
+    public abstract void cdsect(java.lang.String);
+    public abstract void comment(java.lang.String);
+    public abstract void docdecl(java.lang.String);
+    public abstract void endDocument();
+    public abstract org.xmlpull.v1.XmlSerializer endTag(java.lang.String, java.lang.String);
+    public abstract void entityRef(java.lang.String);
+    public abstract void flush();
+    public abstract int getDepth();
+    public abstract boolean getFeature(java.lang.String);
+    public abstract java.lang.String getName();
+    public abstract java.lang.String getNamespace();
+    public abstract java.lang.String getPrefix(java.lang.String, boolean);
+    public abstract java.lang.Object getProperty(java.lang.String);
+    public abstract void ignorableWhitespace(java.lang.String);
+    public abstract void processingInstruction(java.lang.String);
+    public abstract void setFeature(java.lang.String, boolean);
+    public abstract void setOutput(java.io.OutputStream, java.lang.String);
+    public abstract void setOutput(java.io.Writer);
+    public abstract void setPrefix(java.lang.String, java.lang.String);
+    public abstract void setProperty(java.lang.String, java.lang.Object);
+    public abstract void startDocument(java.lang.String, java.lang.Boolean);
+    public abstract org.xmlpull.v1.XmlSerializer startTag(java.lang.String, java.lang.String);
+    public abstract org.xmlpull.v1.XmlSerializer text(java.lang.String);
+    public abstract org.xmlpull.v1.XmlSerializer text(char[], int, int);
+
+
+}
+
diff --git a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
index e338a8b..3a21b1e 100644
--- a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
+++ b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
@@ -21,8 +21,6 @@
 import android.content.ServiceConnection;
 import android.os.Handler;
 import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
 import android.support.car.content.pm.CarPackageManagerEmbedded;
 import android.support.car.hardware.CarSensorManagerEmbedded;
 import android.support.car.media.CarAudioManagerEmbedded;
diff --git a/car-support-lib/src/android/support/car/hardware/CarSensorEvent.java b/car-support-lib/src/android/support/car/hardware/CarSensorEvent.java
index 2b9aa65..3cc16c6 100644
--- a/car-support-lib/src/android/support/car/hardware/CarSensorEvent.java
+++ b/car-support-lib/src/android/support/car/hardware/CarSensorEvent.java
@@ -72,7 +72,7 @@
 
     private static final long MILLI_IN_NANOS = 1000000L;
 
-    /** Sensor type for this event, such as {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}. */
+    /** Sensor type for this event, such as {@link CarSensorManager#SENSOR_TYPE_COMPASS}. */
     public final int sensorType;
 
     /**
@@ -571,6 +571,7 @@
      * with type {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL}.
      *
      * @return A FuelLevel object corresponding to the data contained in the CarSensorEvent.
+     * @hide
      */
     public FuelLevelData getFuelLevelData() {
         checkType(CarSensorManager.SENSOR_TYPE_FUEL_LEVEL);
@@ -634,6 +635,7 @@
      * type {@link CarSensorManager#SENSOR_TYPE_RPM}.
      *
      * @return An RpmData object corresponding to the data contained in the CarSensorEvent.
+     * @hide
      */
     public RpmData getRpmData() {
         checkType(CarSensorManager.SENSOR_TYPE_RPM);
@@ -740,6 +742,7 @@
      *
      * @return An AccelerometerData object corresponding to the data contained in the
      * CarSensorEvent.
+     * @hide
      */
     public AccelerometerData getAccelerometerData() {
         checkType(CarSensorManager.SENSOR_TYPE_ACCELEROMETER);
@@ -775,6 +778,7 @@
      * with type {@link CarSensorManager#SENSOR_TYPE_GYROSCOPE}.
      *
      * @return A GyroscopeData object corresponding to the data contained in the CarSensorEvent.
+     * @hide
      */
     public GyroscopeData getGyroscopeData() {
         checkType(CarSensorManager.SENSOR_TYPE_GYROSCOPE);
diff --git a/car-support-lib/src/android/support/car/hardware/CarSensorManager.java b/car-support-lib/src/android/support/car/hardware/CarSensorManager.java
index 09586bd..a7e4323 100644
--- a/car-support-lib/src/android/support/car/hardware/CarSensorManager.java
+++ b/car-support-lib/src/android/support/car/hardware/CarSensorManager.java
@@ -216,11 +216,6 @@
      * The {@link OnSensorChangedListener} is the identifier for the request and the same
      * instance must be passed into {@link #removeListener(OnSensorChangedListener)}.
      * <p>
-     * Requires {@link android.Manifest.permission#ACCESS_FINE_LOCATION} for
-     * {@link #SENSOR_TYPE_LOCATION}, {@link Car#PERMISSION_SPEED} for
-     * {@link #SENSOR_TYPE_CAR_SPEED}, {@link Car#PERMISSION_MILEAGE} for
-     * {@link #SENSOR_TYPE_ODOMETER}, or {@link Car#PERMISSION_FUEL} for
-     * {@link #SENSOR_TYPE_FUEL_LEVEL}.
      *
      * @param sensorType Sensor type to subscribe.
      * @param rate How fast sensor events are delivered. Should be one of
diff --git a/car-usb-handler/Android.mk b/car-usb-handler/Android.mk
new file mode 100644
index 0000000..c050854
--- /dev/null
+++ b/car-usb-handler/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CarUsbHandler
+
+# Each update should be signed by OEMs
+LOCAL_CERTIFICATE := platform
+LOCAL_PRIVILEGED_MODULE := true
+
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+LOCAL_PROGUARD_ENABLED := disabled
+
+LOCAL_JAVA_LIBRARIES += android.car
+
+include $(BUILD_PACKAGE)
diff --git a/car-usb-handler/AndroidManifest.xml b/car-usb-handler/AndroidManifest.xml
new file mode 100644
index 0000000..be64f82
--- /dev/null
+++ b/car-usb-handler/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+        package="android.car.usb.handler" >
+    <uses-sdk android:minSdkVersion="25" />
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.MANAGE_USB" />
+    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"
+                 android:directBootAware="true" >
+        <activity android:name=".UsbHostManagementActivity"
+                  android:theme="@android:style/Theme.Material.Light.Dialog"
+                  android:launchMode="singleTop" />
+        <receiver android:name=".BootUsbScanner" >
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+            </intent-filter>
+        </receiver>
+    </application>
+</manifest>
diff --git a/car-usb-handler/proguard.flags b/car-usb-handler/proguard.flags
new file mode 100644
index 0000000..565df26
--- /dev/null
+++ b/car-usb-handler/proguard.flags
@@ -0,0 +1,2 @@
+-verbose
+-keep @com.android.internal.annotations.VisibleForTesting class *
diff --git a/car-usb-handler/res/drawable-hdpi/ic_launcher.png b/car-usb-handler/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/car-usb-handler/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/car-usb-handler/res/drawable-ldpi/ic_launcher.png b/car-usb-handler/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/car-usb-handler/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/car-usb-handler/res/drawable-mdpi/ic_launcher.png b/car-usb-handler/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/car-usb-handler/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/car-usb-handler/res/drawable-xhdpi/ic_launcher.png b/car-usb-handler/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/car-usb-handler/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/car-usb-handler/res/layout/usb_handler_row.xml b/car-usb-handler/res/layout/usb_handler_row.xml
new file mode 100644
index 0000000..cc34e5e
--- /dev/null
+++ b/car-usb-handler/res/layout/usb_handler_row.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="horizontal" >
+  <ImageView
+      android:id="@+id/usb_handler_icon"
+      android:layout_width="60dp"
+      android:layout_height="60dp"
+      android:padding="5dp" />
+  <TextView
+        android:id="@+id/usb_handler_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical" />
+</LinearLayout>
diff --git a/car-usb-handler/res/layout/usb_host.xml b/car-usb-handler/res/layout/usb_host.xml
new file mode 100644
index 0000000..fbcc608
--- /dev/null
+++ b/car-usb-handler/res/layout/usb_host.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical" >
+  <LinearLayout
+      android:id="@+id/usb_handlers_progress"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:orientation="horizontal"
+      android:visibility="gone"
+      android:gravity="center">
+      <ProgressBar
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"/>
+      <TextView
+          android:text="@+string/usb_resolving_handlers"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:orientation="vertical" />
+  </LinearLayout>
+  <ListView
+            android:id="@+id/usb_handlers_list"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/car-usb-handler/res/values/strings.xml b/car-usb-handler/res/values/strings.xml
new file mode 100644
index 0000000..2242648
--- /dev/null
+++ b/car-usb-handler/res/values/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<resources>
+    <string name="app_name">USB Handler</string>
+
+    <!-- USB Manager Settings -->
+    <string name="usb_title">USB Devices settings</string>
+    <string name="usb_description">Customize your USB Devices settings</string>
+    <string name="usb_available_devices">Connected devices</string>
+    <string name="usb_saved_devices">Saved devices</string>
+    <string name="usb_pref_delete_title">Remove handling app for USB device</string>
+    <string name="usb_pref_delete_message">Are you sure you wan to delete dafault handling app for %1$s?</string>
+    <string name="usb_pref_delete_yes">Yes</string>
+    <string name="usb_pref_delete_cancel">Cancel</string>
+    <string name="usb_resolving_handlers">Getting supported handlers</string>
+</resources>
diff --git a/car-usb-handler/res/xml/usb_manager_prefs.xml b/car-usb-handler/res/xml/usb_manager_prefs.xml
new file mode 100644
index 0000000..b090124
--- /dev/null
+++ b/car-usb-handler/res/xml/usb_manager_prefs.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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.
+  -->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+</PreferenceScreen>
diff --git a/car-usb-handler/src/android/car/usb/handler/AoapInterface.java b/car-usb-handler/src/android/car/usb/handler/AoapInterface.java
new file mode 100644
index 0000000..e4d843f
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/AoapInterface.java
@@ -0,0 +1,146 @@
+/**
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * <p>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
+ *
+ * <p>http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * <p>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.
+ */
+package android.car.usb.handler;
+
+import android.hardware.usb.UsbConstants;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.util.Log;
+import java.io.IOException;
+
+final class AoapInterface {
+    /**
+     * Use Google Vendor ID when in accessory mode
+     */
+    public static final int USB_ACCESSORY_VENDOR_ID = 0x18D1;
+
+    /**
+     * Product ID to use when in accessory mode
+     */
+    public static final int USB_ACCESSORY_PRODUCT_ID = 0x2D00;
+
+    /**
+     * Product ID to use when in accessory mode and adb is enabled
+     */
+    public static final int USB_ACCESSORY_ADB_PRODUCT_ID = 0x2D01;
+
+    /**
+     * Indexes for strings sent by the host via ACCESSORY_SEND_STRING
+     */
+    public static final int ACCESSORY_STRING_MANUFACTURER = 0;
+    public static final int ACCESSORY_STRING_MODEL = 1;
+    public static final int ACCESSORY_STRING_DESCRIPTION = 2;
+    public static final int ACCESSORY_STRING_VERSION = 3;
+    public static final int ACCESSORY_STRING_URI = 4;
+    public static final int ACCESSORY_STRING_SERIAL = 5;
+
+    /**
+     * Control request for retrieving device's protocol version
+     *
+     *  requestType:    USB_DIR_IN | USB_TYPE_VENDOR
+     *  request:        ACCESSORY_GET_PROTOCOL
+     *  value:          0
+     *  index:          0
+     *  data            version number (16 bits little endian)
+     *                     1 for original accessory support
+     *                     2 adds HID and device to host audio support
+     */
+    public static final int ACCESSORY_GET_PROTOCOL = 51;
+
+    /**
+     * Control request for host to send a string to the device
+     *
+     *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+     *  request:        ACCESSORY_SEND_STRING
+     *  value:          0
+     *  index:          string ID
+     *  data            zero terminated UTF8 string
+     *
+     *  The device can later retrieve these strings via the
+     *  ACCESSORY_GET_STRING_* ioctls
+     */
+    public static final int ACCESSORY_SEND_STRING = 52;
+
+    /**
+     * Control request for starting device in accessory mode.
+     * The host sends this after setting all its strings to the device.
+     *
+     *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+     *  request:        ACCESSORY_START
+     *  value:          0
+     *  index:          0
+     *  data            none
+     */
+    public static final int ACCESSORY_START = 53;
+
+    /**
+     * Max payload size for AOAP. Limited by driver.
+     */
+    public static final int MAX_PAYLOAD_SIZE = 16384;
+
+    /**
+     * Accessory write timeout.
+     */
+    public static final int AOAP_TIMEOUT_MS = 2000;
+
+    private static final String TAG = AoapInterface.class.getSimpleName();
+
+    public static int getProtocol(UsbDeviceConnection conn) {
+        byte[] buffer = new byte[2];
+        int len = conn.controlTransfer(
+                UsbConstants.USB_DIR_IN | UsbConstants.USB_TYPE_VENDOR,
+                ACCESSORY_GET_PROTOCOL, 0, 0, buffer, 2, AOAP_TIMEOUT_MS);
+        if (len != 2) {
+            return -1;
+        }
+        return (buffer[1] << 8) | buffer[0];
+    }
+
+    public static boolean isSupported(UsbDeviceConnection conn) {
+        return getProtocol(conn) >= 1;
+    }
+
+    public static void sendString(UsbDeviceConnection conn, int index, String string)
+            throws IOException {
+        byte[] buffer = (string + "\0").getBytes();
+        int len = conn.controlTransfer(
+                UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR,
+                ACCESSORY_SEND_STRING, 0, index,
+                buffer, buffer.length, AOAP_TIMEOUT_MS);
+        if (len != buffer.length) {
+            throw new IOException("Failed to send string " + index + ": \"" + string + "\"");
+        } else {
+            Log.i(TAG, "Sent string " + index + ": \"" + string + "\"");
+        }
+    }
+
+    public static void sendAoapStart(UsbDeviceConnection conn) throws IOException {
+        int len = conn.controlTransfer(
+                UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR,
+                ACCESSORY_START, 0, 0, null, 0, AOAP_TIMEOUT_MS);
+        if (len < 0) {
+            throw new IOException("Control transfer for accessory start failed: " + len);
+        }
+    }
+
+    public static boolean isDeviceInAoapMode(UsbDevice device) {
+        if (device == null) {
+            return false;
+        }
+        final int vid = device.getVendorId();
+        final int pid = device.getProductId();
+        return vid == USB_ACCESSORY_VENDOR_ID
+                && (pid == USB_ACCESSORY_PRODUCT_ID || pid == USB_ACCESSORY_ADB_PRODUCT_ID);
+    }
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/BootUsbScanner.java b/car-usb-handler/src/android/car/usb/handler/BootUsbScanner.java
new file mode 100644
index 0000000..5255f16
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/BootUsbScanner.java
@@ -0,0 +1,40 @@
+package android.car.usb.handler;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbManager;
+
+public class BootUsbScanner extends BroadcastReceiver {
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        // TODO: move probing of devices to a service, since AoapInterface.isSupported() could take
+        // up to 2 seconds and many USB devices could be connected.
+        UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
+        for (UsbDevice device : manager.getDeviceList().values()) {
+            if (AoapInterface.isDeviceInAoapMode(device)) {
+                // This could happen if we reboot. We should try to handle this accessory.
+                handle(context, device);
+            } else {
+                UsbDeviceConnection connection = UsbUtil.openConnection(manager, device);
+                try {
+                    if (AoapInterface.isSupported(connection)) {
+                        handle(context, device);
+                    }
+                } finally {
+                    connection.close();
+                }
+            }
+        }
+    }
+
+    private void handle(Context context, UsbDevice device) {
+        Intent manageDevice = new Intent(context, UsbHostManagementActivity.class);
+        manageDevice.setAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+        manageDevice.putExtra(UsbManager.EXTRA_DEVICE, device);
+        manageDevice.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        context.startActivity(manageDevice);
+    }
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbDeviceHandlerResolver.java b/car-usb-handler/src/android/car/usb/handler/UsbDeviceHandlerResolver.java
new file mode 100644
index 0000000..c0eebbe
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/UsbDeviceHandlerResolver.java
@@ -0,0 +1,670 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.car.usb.handler;
+
+import android.car.IUsbAoapSupportCheckService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.content.res.XmlResourceParser;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbInterface;
+import android.hardware.usb.UsbManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.Pair;
+import com.android.internal.util.XmlUtils;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import org.xmlpull.v1.XmlPullParser;
+
+/** Resolves supported handlers for USB device. */
+public final class UsbDeviceHandlerResolver {
+    private static final String TAG = UsbDeviceHandlerResolver.class.getSimpleName();
+    private static final boolean LOCAL_LOGD = true;
+
+    /**
+     * Callbacks for device resolver.
+     */
+    public interface UsbDeviceHandlerResolverCallback {
+        /** Handlers are resolved */
+        void onHandlersResolveCompleted(
+                UsbDevice device, List<UsbDeviceSettings> availableSettings);
+        /** Device was dispatched */
+        void onDeviceDispatched();
+    }
+
+    private final UsbManager mUsbManager;
+    private final PackageManager mPackageManager;
+    private final UsbDeviceHandlerResolverCallback mDeviceCallback;
+    private final Context mContext;
+    private final HandlerThread mHandlerThread;
+    private final UsbDeviceResolverHandler mHandler;
+
+    private class DeviceContext {
+        public final UsbDevice usbDevice;
+        public final UsbDeviceConnection connection;
+        public final UsbDeviceSettings settings;
+        public final List<UsbDeviceSettings> activeDeviceSettings;
+        public final Queue<Pair<ResolveInfo, DeviceFilter>> mActiveDeviceOptions =
+                new LinkedList<>();
+
+        private volatile IUsbAoapSupportCheckService mUsbAoapSupportCheckService;
+        private final ServiceConnection mServiceConnection = new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName className, IBinder service) {
+                Log.i(TAG, "onServiceConnected: " + className);
+                mUsbAoapSupportCheckService = IUsbAoapSupportCheckService.Stub.asInterface(service);
+                mHandler.requestOnServiceConnectionStateChanged(DeviceContext.this);
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName className) {
+                Log.i(TAG, "onServiceDisconnected: " + className);
+                mUsbAoapSupportCheckService = null;
+                mHandler.requestOnServiceConnectionStateChanged(DeviceContext.this);
+            }
+        };
+
+        public DeviceContext(UsbDevice usbDevice, UsbDeviceSettings settings,
+                List<UsbDeviceSettings> activeDeviceSettings) {
+            this.usbDevice = usbDevice;
+            this.settings = settings;
+            this.activeDeviceSettings = activeDeviceSettings;
+            connection = UsbUtil.openConnection(mUsbManager, usbDevice);
+        }
+    }
+
+    // This class is used to describe a USB device.
+    // When used in HashMaps all values must be specified,
+    // but wildcards can be used for any of the fields in
+    // the package meta-data.
+    private static class DeviceFilter {
+        // USB Vendor ID (or -1 for unspecified)
+        public final int mVendorId;
+        // USB Product ID (or -1 for unspecified)
+        public final int mProductId;
+        // USB device or interface class (or -1 for unspecified)
+        public final int mClass;
+        // USB device subclass (or -1 for unspecified)
+        public final int mSubclass;
+        // USB device protocol (or -1 for unspecified)
+        public final int mProtocol;
+        // USB device manufacturer name string (or null for unspecified)
+        public final String mManufacturerName;
+        // USB device product name string (or null for unspecified)
+        public final String mProductName;
+        // USB device serial number string (or null for unspecified)
+        public final String mSerialNumber;
+
+        // USB device in AOAP mode manufacturer
+        public final String mAoapManufacturer;
+        // USB device in AOAP mode model
+        public final String mAoapModel;
+        // USB device in AOAP mode description string
+        public final String mAoapDescription;
+        // USB device in AOAP mode version
+        public final String mAoapVersion;
+        // USB device in AOAP mode URI
+        public final String mAoapUri;
+        // USB device in AOAP mode serial
+        public final String mAoapSerial;
+        // USB device in AOAP mode verification service
+        public final String mAoapService;
+
+        DeviceFilter(int vid, int pid, int clasz, int subclass, int protocol,
+                            String manufacturer, String product, String serialnum,
+                            String aoapManufacturer, String aoapModel, String aoapDescription,
+                            String aoapVersion, String aoapUri, String aoapSerial,
+                            String aoapService) {
+            mVendorId = vid;
+            mProductId = pid;
+            mClass = clasz;
+            mSubclass = subclass;
+            mProtocol = protocol;
+            mManufacturerName = manufacturer;
+            mProductName = product;
+            mSerialNumber = serialnum;
+
+            mAoapManufacturer = aoapManufacturer;
+            mAoapModel = aoapModel;
+            mAoapDescription = aoapDescription;
+            mAoapVersion = aoapVersion;
+            mAoapUri = aoapUri;
+            mAoapSerial = aoapSerial;
+            mAoapService = aoapService;
+        }
+
+        DeviceFilter(UsbDevice device) {
+            mVendorId = device.getVendorId();
+            mProductId = device.getProductId();
+            mClass = device.getDeviceClass();
+            mSubclass = device.getDeviceSubclass();
+            mProtocol = device.getDeviceProtocol();
+            mManufacturerName = device.getManufacturerName();
+            mProductName = device.getProductName();
+            mSerialNumber = device.getSerialNumber();
+            mAoapManufacturer = null;
+            mAoapModel = null;
+            mAoapDescription = null;
+            mAoapVersion = null;
+            mAoapUri = null;
+            mAoapSerial = null;
+            mAoapService = null;
+        }
+
+        public static DeviceFilter read(XmlPullParser parser, boolean aoapData) {
+            int vendorId = -1;
+            int productId = -1;
+            int deviceClass = -1;
+            int deviceSubclass = -1;
+            int deviceProtocol = -1;
+            String manufacturerName = null;
+            String productName = null;
+            String serialNumber = null;
+
+            String aoapManufacturer = null;
+            String aoapModel = null;
+            String aoapDescription = null;
+            String aoapVersion = null;
+            String aoapUri = null;
+            String aoapSerial = null;
+            String aoapService = null;
+
+            int count = parser.getAttributeCount();
+            for (int i = 0; i < count; i++) {
+                String name = parser.getAttributeName(i);
+                String value = parser.getAttributeValue(i);
+                // Attribute values are ints or strings
+                if (!aoapData && "manufacturer-name".equals(name)) {
+                    manufacturerName = value;
+                } else if (!aoapData && "product-name".equals(name)) {
+                    productName = value;
+                } else if (!aoapData && "serial-number".equals(name)) {
+                    serialNumber = value;
+                } else if (aoapData && "manufacturer".equals(name)) {
+                    aoapManufacturer = value;
+                } else if (aoapData && "model".equals(name)) {
+                    aoapModel = value;
+                } else if (aoapData && "description".equals(name)) {
+                    aoapDescription = value;
+                } else if (aoapData && "version".equals(name)) {
+                    aoapVersion = value;
+                } else if (aoapData && "uri".equals(name)) {
+                    aoapUri = value;
+                } else if (aoapData && "serial".equals(name)) {
+                    aoapSerial = value;
+                } else if (aoapData && "service".equals(name)) {
+                    aoapService = value;
+                } else if (!aoapData) {
+                    int intValue = -1;
+                    int radix = 10;
+                    if (value != null && value.length() > 2 && value.charAt(0) == '0'
+                            && (value.charAt(1) == 'x' || value.charAt(1) == 'X')) {
+                        // allow hex values starting with 0x or 0X
+                        radix = 16;
+                        value = value.substring(2);
+                    }
+                    try {
+                        intValue = Integer.parseInt(value, radix);
+                    } catch (NumberFormatException e) {
+                        Log.e(TAG, "invalid number for field " + name, e);
+                        continue;
+                    }
+                    if ("vendor-id".equals(name)) {
+                        vendorId = intValue;
+                    } else if ("product-id".equals(name)) {
+                        productId = intValue;
+                    } else if ("class".equals(name)) {
+                        deviceClass = intValue;
+                    } else if ("subclass".equals(name)) {
+                        deviceSubclass = intValue;
+                    } else if ("protocol".equals(name)) {
+                        deviceProtocol = intValue;
+                    }
+                }
+            }
+            return new DeviceFilter(vendorId, productId,
+                                    deviceClass, deviceSubclass, deviceProtocol,
+                                    manufacturerName, productName, serialNumber, aoapManufacturer,
+                                    aoapModel, aoapDescription, aoapVersion, aoapUri, aoapSerial,
+                                    aoapService);
+        }
+
+        private boolean matches(int clasz, int subclass, int protocol) {
+            return ((mClass == -1 || clasz == mClass)
+                    && (mSubclass == -1 || subclass == mSubclass)
+                    && (mProtocol == -1 || protocol == mProtocol));
+        }
+
+        public boolean matches(UsbDevice device) {
+            if (mVendorId != -1 && device.getVendorId() != mVendorId) {
+                return false;
+            }
+            if (mProductId != -1 && device.getProductId() != mProductId) {
+                return false;
+            }
+            if (mManufacturerName != null && device.getManufacturerName() == null) {
+                return false;
+            }
+            if (mProductName != null && device.getProductName() == null) {
+                return false;
+            }
+            if (mSerialNumber != null && device.getSerialNumber() == null) {
+                return false;
+            }
+            if (mManufacturerName != null && device.getManufacturerName() != null
+                    && !mManufacturerName.equals(device.getManufacturerName())) {
+                return false;
+            }
+            if (mProductName != null && device.getProductName() != null
+                    && !mProductName.equals(device.getProductName())) {
+                return false;
+            }
+            if (mSerialNumber != null && device.getSerialNumber() != null
+                    && !mSerialNumber.equals(device.getSerialNumber())) {
+                return false;
+            }
+
+            // check device class/subclass/protocol
+            if (matches(device.getDeviceClass(), device.getDeviceSubclass(),
+                        device.getDeviceProtocol())) {
+                return true;
+            }
+
+            // if device doesn't match, check the interfaces
+            int count = device.getInterfaceCount();
+            for (int i = 0; i < count; i++) {
+                UsbInterface intf = device.getInterface(i);
+                if (matches(intf.getInterfaceClass(), intf.getInterfaceSubclass(),
+                            intf.getInterfaceProtocol())) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            // can't compare if we have wildcard strings
+            if (mVendorId == -1 || mProductId == -1
+                    || mClass == -1 || mSubclass == -1 || mProtocol == -1) {
+                return false;
+            }
+            if (obj instanceof DeviceFilter) {
+                DeviceFilter filter = (DeviceFilter) obj;
+
+                if (filter.mVendorId != mVendorId
+                        || filter.mProductId != mProductId
+                        || filter.mClass != mClass
+                        || filter.mSubclass != mSubclass
+                        || filter.mProtocol != mProtocol) {
+                    return false;
+                }
+                if ((filter.mManufacturerName != null && mManufacturerName == null)
+                        || (filter.mManufacturerName == null && mManufacturerName != null)
+                        || (filter.mProductName != null && mProductName == null)
+                        || (filter.mProductName == null && mProductName != null)
+                        || (filter.mSerialNumber != null && mSerialNumber == null)
+                        || (filter.mSerialNumber == null && mSerialNumber != null)) {
+                    return false;
+                }
+                if  ((filter.mManufacturerName != null && mManufacturerName != null
+                          && !mManufacturerName.equals(filter.mManufacturerName))
+                          || (filter.mProductName != null && mProductName != null
+                          && !mProductName.equals(filter.mProductName))
+                          || (filter.mSerialNumber != null && mSerialNumber != null
+                          && !mSerialNumber.equals(filter.mSerialNumber))) {
+                    return false;
+                }
+                return true;
+            }
+            if (obj instanceof UsbDevice) {
+                UsbDevice device = (UsbDevice) obj;
+                if (device.getVendorId() != mVendorId
+                        || device.getProductId() != mProductId
+                        || device.getDeviceClass() != mClass
+                        || device.getDeviceSubclass() != mSubclass
+                        || device.getDeviceProtocol() != mProtocol) {
+                    return false;
+                }
+                if ((mManufacturerName != null && device.getManufacturerName() == null)
+                        || (mManufacturerName == null && device.getManufacturerName() != null)
+                        || (mProductName != null && device.getProductName() == null)
+                        || (mProductName == null && device.getProductName() != null)
+                        || (mSerialNumber != null && device.getSerialNumber() == null)
+                        || (mSerialNumber == null && device.getSerialNumber() != null)) {
+                    return false;
+                }
+                if ((device.getManufacturerName() != null
+                        && !mManufacturerName.equals(device.getManufacturerName()))
+                        || (device.getProductName() != null
+                        && !mProductName.equals(device.getProductName()))
+                        || (device.getSerialNumber() != null
+                        && !mSerialNumber.equals(device.getSerialNumber()))) {
+                    return false;
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            return (((mVendorId << 16) | mProductId)
+                    ^ ((mClass << 16) | (mSubclass << 8) | mProtocol));
+        }
+
+        @Override
+        public String toString() {
+            return "DeviceFilter[mVendorId=" + mVendorId + ",mProductId=" + mProductId
+                    + ",mClass=" + mClass + ",mSubclass=" + mSubclass
+                    + ",mProtocol=" + mProtocol + ",mManufacturerName=" + mManufacturerName
+                    + ",mProductName=" + mProductName + ",mSerialNumber=" + mSerialNumber + "]";
+        }
+    }
+
+    public UsbDeviceHandlerResolver(UsbManager manager, Context context,
+            UsbDeviceHandlerResolverCallback deviceListener) {
+        mUsbManager = manager;
+        mContext = context;
+        mDeviceCallback = deviceListener;
+        mHandlerThread = new HandlerThread(TAG);
+        mHandlerThread.start();
+        mHandler = new UsbDeviceResolverHandler(mHandlerThread.getLooper());
+        mPackageManager = context.getPackageManager();
+    }
+
+    /**
+     * Releases current object.
+     */
+    public void release() {
+        if (mHandlerThread != null) {
+            mHandlerThread.quitSafely();
+        }
+    }
+
+    /**
+     * Resolves handlers for USB device.
+     */
+    public void resolve(UsbDevice device) {
+        mHandler.requestResolveHandlers(device);
+    }
+
+    /**
+     * Dispatches device to component.
+     */
+    public boolean dispatch(UsbDevice device, ComponentName component, boolean inAoap) {
+        if (LOCAL_LOGD) {
+            Log.d(TAG, "dispatch: " + device + " component: " + component + " inAoap: " + inAoap);
+        }
+
+        ActivityInfo activityInfo;
+        try {
+            activityInfo = mPackageManager.getActivityInfo(component, PackageManager.GET_META_DATA);
+        } catch (NameNotFoundException e) {
+            Log.e(TAG, "Activity not found: " + component);
+            return false;
+        }
+
+        Intent intent = createDeviceAttachedIntent(device);
+        if (inAoap) {
+            if (AoapInterface.isDeviceInAoapMode(device)) {
+                mDeviceCallback.onDeviceDispatched();
+            } else {
+                DeviceFilter filter =
+                        packageMatches(activityInfo, intent.getAction(), device, true);
+                if (filter != null) {
+                    requestAoapSwitch(device, filter);
+                    return true;
+                }
+            }
+        }
+
+        intent.setComponent(component);
+        mUsbManager.grantPermission(device, activityInfo.applicationInfo.uid);
+
+        mContext.startActivity(intent);
+        mHandler.requestCompleteDeviceDispatch();
+        return true;
+    }
+
+    private static Intent createDeviceAttachedIntent(UsbDevice device) {
+        Intent intent = new Intent(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+        intent.putExtra(UsbManager.EXTRA_DEVICE, device);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        return intent;
+    }
+
+    private void doHandleResolveHandlers(UsbDevice device) {
+        if (LOCAL_LOGD) {
+            Log.d(TAG, "doHandleResolveHandlers: " + device);
+        }
+
+        Intent intent = createDeviceAttachedIntent(device);
+        List<Pair<ResolveInfo, DeviceFilter>> matches = getDeviceMatches(device, intent, false);
+        if (LOCAL_LOGD) {
+            Log.d(TAG, "matches size: " + matches.size());
+        }
+        List<UsbDeviceSettings> settings = new ArrayList<>(matches.size());
+        for (Pair<ResolveInfo, DeviceFilter> info : matches) {
+            UsbDeviceSettings setting = UsbDeviceSettings.constructSettings(device);
+            setting.setHandler(
+                    new ComponentName(
+                            info.first.activityInfo.packageName, info.first.activityInfo.name));
+            settings.add(setting);
+        }
+        DeviceContext deviceContext =
+                new DeviceContext(device, UsbDeviceSettings.constructSettings(device), settings);
+        if (AoapInterface.isSupported(deviceContext.connection)) {
+            deviceContext.mActiveDeviceOptions.addAll(getDeviceMatches(device, intent, true));
+            queryNextAoapHandler(deviceContext);
+        } else {
+            deviceProbingComplete(deviceContext);
+        }
+    }
+
+    private void queryNextAoapHandler(DeviceContext context) {
+        Pair<ResolveInfo, DeviceFilter> option = context.mActiveDeviceOptions.peek();
+        if (option == null) {
+            Log.w(TAG, "No more options left.");
+            deviceProbingComplete(context);
+            return;
+        }
+        Intent serviceIntent = new Intent();
+        serviceIntent.setComponent(ComponentName.unflattenFromString(option.second.mAoapService));
+        boolean bound = mContext.bindService(serviceIntent, context.mServiceConnection,
+                Context.BIND_AUTO_CREATE);
+        if (bound) {
+            mHandler.requestServiceConnectionTimeout();
+        } else {
+            if (LOCAL_LOGD) {
+                Log.d(TAG, "Failed to bind to the service");
+            }
+            context.mActiveDeviceOptions.poll();
+            queryNextAoapHandler(context);
+        }
+    }
+
+    private void requestAoapSwitch(UsbDevice device, DeviceFilter filter) {
+        UsbDeviceConnection connection = UsbUtil.openConnection(mUsbManager, device);
+        try {
+            UsbUtil.sendAoapAccessoryStart(
+                    connection,
+                    filter.mAoapManufacturer,
+                    filter.mAoapModel,
+                    filter.mAoapDescription,
+                    filter.mAoapVersion,
+                    filter.mAoapUri,
+                    filter.mAoapSerial);
+        } catch (IOException e) {
+            Log.w(TAG, "Failed to switch device into AOAP mode", e);
+        }
+        connection.close();
+    }
+
+    private void deviceProbingComplete(DeviceContext context) {
+        if (LOCAL_LOGD) {
+            Log.d(TAG, "deviceProbingComplete");
+        }
+        mDeviceCallback.onHandlersResolveCompleted(context.usbDevice, context.activeDeviceSettings);
+    }
+
+    private void doHandleServiceConnectionStateChanged(DeviceContext context) {
+        if (LOCAL_LOGD) {
+            Log.d(TAG, "doHandleServiceConnectionStateChanged: "
+                    + context.mUsbAoapSupportCheckService);
+        }
+        if (context.mUsbAoapSupportCheckService != null) {
+            boolean deviceSupported = false;
+            try {
+                deviceSupported =
+                        context.mUsbAoapSupportCheckService.isDeviceSupported(context.usbDevice);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Call to remote service failed", e);
+            }
+            if (deviceSupported) {
+                Pair<ResolveInfo, DeviceFilter> option = context.mActiveDeviceOptions.peek();
+
+                UsbDeviceSettings setting = UsbDeviceSettings.constructSettings(context.settings);
+                setting.setHandler(
+                        new ComponentName(
+                            option.first.activityInfo.packageName, option.first.activityInfo.name));
+                setting.setAoap(true);
+                context.activeDeviceSettings.add(setting);
+            }
+            mContext.unbindService(context.mServiceConnection);
+        }
+        context.mActiveDeviceOptions.poll();
+        queryNextAoapHandler(context);
+    }
+
+    private List<Pair<ResolveInfo, DeviceFilter>> getDeviceMatches(
+            UsbDevice device, Intent intent, boolean forAoap) {
+        List<Pair<ResolveInfo, DeviceFilter>> matches = new ArrayList<>();
+        List<ResolveInfo> resolveInfos =
+                mPackageManager.queryIntentActivities(intent, PackageManager.GET_META_DATA);
+        for (ResolveInfo resolveInfo : resolveInfos) {
+            DeviceFilter filter = packageMatches(resolveInfo.activityInfo,
+                    intent.getAction(), device, forAoap);
+            if (filter != null) {
+                matches.add(Pair.create(resolveInfo, filter));
+            }
+        }
+        return matches;
+    }
+
+    private DeviceFilter packageMatches(ActivityInfo ai, String metaDataName, UsbDevice device,
+            boolean forAoap) {
+        if (LOCAL_LOGD) {
+            Log.d(TAG, "packageMatches ai: " + ai + "metaDataName: " + metaDataName + " forAoap: "
+                    + forAoap);
+        }
+        String filterTagName = forAoap ? "usb-aoap-accessory" : "usb-device";
+        XmlResourceParser parser = null;
+        try {
+            parser = ai.loadXmlMetaData(mPackageManager, metaDataName);
+            if (parser == null) {
+                Log.w(TAG, "no meta-data for " + ai);
+                return null;
+            }
+
+            XmlUtils.nextElement(parser);
+            while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+                String tagName = parser.getName();
+                if (device != null && filterTagName.equals(tagName)) {
+                    DeviceFilter filter = DeviceFilter.read(parser, forAoap);
+                    if (forAoap || filter.matches(device)) {
+                        return filter;
+                    }
+                }
+                XmlUtils.nextElement(parser);
+            }
+        } catch (Exception e) {
+            Log.w(TAG, "Unable to load component info " + ai.toString(), e);
+        } finally {
+            if (parser != null) parser.close();
+        }
+        return null;
+    }
+
+    private class UsbDeviceResolverHandler extends Handler {
+        private static final int MSG_RESOLVE_HANDLERS = 0;
+        private static final int MSG_SERVICE_CONNECTION_STATE_CHANGE = 1;
+        private static final int MSG_SERVICE_CONNECTION_TIMEOUT = 2;
+        private static final int MSG_COMPLETE_DISPATCH = 3;
+
+        private static final long CONNECT_TIMEOUT_MS = 5000;
+
+        private UsbDeviceResolverHandler(Looper looper) {
+            super(looper);
+        }
+
+        public void requestResolveHandlers(UsbDevice device) {
+            Message msg = obtainMessage(MSG_RESOLVE_HANDLERS, device);
+            sendMessage(msg);
+        }
+
+        public void requestOnServiceConnectionStateChanged(DeviceContext deviceContext) {
+            sendMessage(obtainMessage(MSG_SERVICE_CONNECTION_STATE_CHANGE, deviceContext));
+        }
+
+        public void requestServiceConnectionTimeout() {
+            sendEmptyMessageDelayed(MSG_SERVICE_CONNECTION_TIMEOUT, CONNECT_TIMEOUT_MS);
+        }
+
+        public void requestCompleteDeviceDispatch() {
+            sendEmptyMessage(MSG_COMPLETE_DISPATCH);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_RESOLVE_HANDLERS:
+                    doHandleResolveHandlers((UsbDevice) msg.obj);
+                    break;
+                case MSG_SERVICE_CONNECTION_STATE_CHANGE:
+                    removeMessages(MSG_SERVICE_CONNECTION_TIMEOUT);
+                    doHandleServiceConnectionStateChanged((DeviceContext) msg.obj);
+                    break;
+                case MSG_SERVICE_CONNECTION_TIMEOUT:
+                    Log.i(TAG, "Service connection timeout");
+                    doHandleServiceConnectionStateChanged(null);
+                    break;
+                case MSG_COMPLETE_DISPATCH:
+                    mDeviceCallback.onDeviceDispatched();
+                    break;
+                default:
+                    Log.w(TAG, "Unsupported message: " + msg);
+            }
+        }
+    }
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbDevicePreference.java b/car-usb-handler/src/android/car/usb/handler/UsbDevicePreference.java
new file mode 100644
index 0000000..e4b6a84
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/UsbDevicePreference.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.car.usb.handler;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.preference.Preference;
+
+/**
+ * Setting preference used for USB devices.
+ */
+public final class UsbDevicePreference extends Preference
+        implements Preference.OnPreferenceClickListener {
+
+    /**
+     * Callbacks to handle preference changes.
+     */
+    public interface UsbDevicePreferenceCallback {
+        /** Preference deleted */
+        void onUsbDevicePreferenceDelete(Preference preference, UsbDeviceSettings settings);
+    }
+
+    private final UsbDeviceSettings mUsbDeviceSettings;
+    private final UsbDevicePreferenceCallback mCallback;
+
+    public UsbDevicePreference(Context context, UsbDeviceSettings usbDeviceSettings,
+            UsbDevicePreferenceCallback callback) {
+        super(context);
+        mCallback = callback;
+        mUsbDeviceSettings = usbDeviceSettings;
+        setTitle(usbDeviceSettings.getDeviceName());
+        if (usbDeviceSettings.getHandler() != null) {
+            setSummary(usbDeviceSettings.getHandler().flattenToShortString());
+        }
+        setOnPreferenceClickListener(this);
+    }
+
+    @Override
+    public boolean onPreferenceClick(final Preference preference) {
+        new AlertDialog.Builder(getContext())
+                .setTitle(R.string.usb_pref_delete_title)
+                .setMessage(String.format(
+                        getContext().getResources().getString(R.string.usb_pref_delete_message),
+                        mUsbDeviceSettings.getDeviceName()))
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setPositiveButton(R.string.usb_pref_delete_yes,
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int whichButton) {
+                                mCallback.onUsbDevicePreferenceDelete(
+                                        preference, mUsbDeviceSettings);
+                            }})
+                .setNegativeButton(R.string.usb_pref_delete_cancel, null)
+                .show();
+        return true;
+    }
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbDeviceSettings.java b/car-usb-handler/src/android/car/usb/handler/UsbDeviceSettings.java
new file mode 100644
index 0000000..5084414
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/UsbDeviceSettings.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.car.usb.handler;
+
+import android.content.ComponentName;
+import android.hardware.usb.UsbDevice;
+import com.android.internal.util.Preconditions;
+
+/**
+ * Settings for USB device.
+ * @hide
+ */
+public final class UsbDeviceSettings {
+
+    private final String mSerialNumber;
+    private final int mVid;
+    private final int mPid;
+    private String mDeviceName;
+    private ComponentName mHandler;
+    private boolean mAoap;
+    private boolean mDefaultHandler;
+
+    UsbDeviceSettings(String serialNumber, int vid, int pid) {
+        Preconditions.checkNotNull(serialNumber);
+
+        mSerialNumber = serialNumber;
+        mVid = vid;
+        mPid = pid;
+    }
+
+    public String getSerialNumber() {
+        return mSerialNumber;
+    }
+
+    public int getVid() {
+        return mVid;
+    }
+
+    public int getPid() {
+        return mPid;
+    }
+
+    public void setDeviceName(String deviceName) {
+        mDeviceName = deviceName;
+    }
+
+    public String getDeviceName() {
+        return mDeviceName;
+    }
+
+    public void setHandler(ComponentName handler) {
+        mHandler = handler;
+    }
+
+    public ComponentName getHandler() {
+        return mHandler;
+    }
+
+    public void setAoap(boolean aoap) {
+        mAoap = aoap;
+    }
+
+    public boolean getAoap() {
+        return mAoap;
+    }
+
+    public void setDefaultHandler(boolean defaultHandler) {
+        mDefaultHandler = defaultHandler;
+    }
+
+    public boolean isDefaultHandler() {
+        return mDefaultHandler;
+    }
+
+    @Override
+    public String toString() {
+        return "UsbDeviceSettings{serial=" + mSerialNumber + ", vid=" + mVid + ", pid=" + mPid
+                + ", name=" + mDeviceName + ", handler=" + mHandler.toString() + ", aoap=" + mAoap
+                + ", default=" + mDefaultHandler + "}";
+    }
+
+    /**
+     * Checks if setting matches {@code UsbDevice}.
+     */
+    public boolean matchesDevice(UsbDevice device) {
+        return getSerialNumber().equals(device.getSerialNumber());
+    }
+
+    /**
+     * Creates settings from {@code UsbDevice}.
+     */
+    public static UsbDeviceSettings constructSettings(UsbDevice device) {
+        UsbDeviceSettings settings = new UsbDeviceSettings(
+                device.getSerialNumber(), device.getVendorId(), device.getProductId());
+        settings.setDeviceName(device.getProductName());
+        return settings;
+    }
+
+    /**
+     * Creates settings from other settings.
+     * <p>
+     * Only basic properties are inherited.
+     */
+    public static UsbDeviceSettings constructSettings(UsbDeviceSettings origSettings) {
+        UsbDeviceSettings settings = new UsbDeviceSettings(
+                origSettings.getSerialNumber(), origSettings.getVid(), origSettings.getPid());
+        settings.setDeviceName(origSettings.getDeviceName());
+        return settings;
+    }
+
+    /**
+     * Creates settings.
+     */
+    public static UsbDeviceSettings constructSettings(String serialNumber, int vid, int pid,
+            String deviceName, ComponentName handler, boolean aoap) {
+        UsbDeviceSettings settings = new UsbDeviceSettings(serialNumber, vid, pid);
+        settings.setDeviceName(deviceName);
+        settings.setHandler(handler);
+        settings.setAoap(aoap);
+        return settings;
+    }
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbHostController.java b/car-usb-handler/src/android/car/usb/handler/UsbHostController.java
new file mode 100644
index 0000000..b705928
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/UsbHostController.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.car.usb.handler;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbManager;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller used to handle USB device connections.
+ * TODO: Support handling multiple new USB devices at the same time.
+ */
+public final class UsbHostController
+        implements UsbDeviceHandlerResolver.UsbDeviceHandlerResolverCallback {
+
+    /**
+     * Callbacks for controller
+     */
+    public interface UsbHostControllerCallbacks {
+        /** Host controller ready for shutdown */
+        void shutdown();
+        /** Change of processing state */
+        void processingStateChanged(boolean processing);
+        /** Title of processing changed */
+        void titleChanged(String title);
+        /** Options for USB device changed */
+        void optionsUpdated(List<UsbDeviceSettings> options);
+    }
+
+    private static final String TAG = UsbHostController.class.getSimpleName();
+    private static final boolean LOCAL_LOGD = true;
+    private static final boolean LOCAL_LOGV = true;
+
+
+    private final List<UsbDeviceSettings> mEmptyList = new ArrayList<>();
+    private final Context mContext;
+    private final UsbHostControllerCallbacks mCallback;
+    private final UsbSettingsStorage mUsbSettingsStorage;
+    private final UsbManager mUsbManager;
+    private final UsbDeviceHandlerResolver mUsbResolver;
+    private final UsbHostControllerHandler mHandler;
+
+    private final BroadcastReceiver mUsbBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {
+                UsbDevice device = intent.<UsbDevice>getParcelableExtra(UsbManager.EXTRA_DEVICE);
+                unsetActiveDeviceIfSerialMatch(device);
+            } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
+                UsbDevice device = intent.<UsbDevice>getParcelableExtra(UsbManager.EXTRA_DEVICE);
+                setActiveDeviceIfSerialMatch(device);
+            }
+        }
+    };
+
+    @GuardedBy("this")
+    private UsbDevice mActiveDevice;
+
+    @GuardedBy("this")
+    private String mProcessingDeviceSerial;
+
+    public UsbHostController(Context context, UsbHostControllerCallbacks callbacks) {
+        mContext = context;
+        mCallback = callbacks;
+        mHandler = new UsbHostControllerHandler(Looper.myLooper());
+        mUsbSettingsStorage = new UsbSettingsStorage(context);
+        mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
+        mUsbResolver = new UsbDeviceHandlerResolver(mUsbManager, mContext, this);
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
+        context.registerReceiver(mUsbBroadcastReceiver, filter);
+
+    }
+
+    private synchronized void setActiveDeviceIfSerialMatch(UsbDevice device) {
+        if (device != null && device.getSerialNumber() != null
+                && device.getSerialNumber().equals(mProcessingDeviceSerial)) {
+            mActiveDevice = device;
+        }
+    }
+
+    private synchronized void unsetActiveDeviceIfSerialMatch(UsbDevice device) {
+        mHandler.requestDeviceRemoved();
+        if (mActiveDevice != null && mActiveDevice.getSerialNumber() != null
+                && mActiveDevice.getSerialNumber().equals(device.getSerialNumber())) {
+            mActiveDevice = null;
+        }
+    }
+
+    private synchronized boolean startDeviceProcessingIfNull(UsbDevice device) {
+        if (mActiveDevice == null) {
+            mActiveDevice = device;
+            mProcessingDeviceSerial = device.getSerialNumber();
+            return true;
+        }
+        return false;
+    }
+
+    private synchronized void stopDeviceProcessing() {
+        mActiveDevice = null;
+        mProcessingDeviceSerial = null;
+    }
+
+    private synchronized UsbDevice getActiveDevice() {
+        return mActiveDevice;
+    }
+
+    private boolean deviceMatchedActiveDevice(UsbDevice device) {
+        UsbDevice activeDevice = getActiveDevice();
+        return activeDevice != null && activeDevice.getSerialNumber() != null
+                && activeDevice.getSerialNumber().equals(device.getSerialNumber());
+    }
+
+    /**
+     * Processes device new device.
+     * <p>
+     * It will load existing settings or resolve supported handlers.
+     */
+    public void processDevice(UsbDevice device) {
+        if (!startDeviceProcessingIfNull(device)) {
+            Log.w(TAG, "Currently, other device is being processed");
+        }
+        mCallback.optionsUpdated(mEmptyList);
+        mCallback.processingStateChanged(true);
+
+        UsbDeviceSettings settings = mUsbSettingsStorage.getSettings(device.getSerialNumber());
+        if (settings != null && mUsbResolver.dispatch(
+                    mActiveDevice, settings.getHandler(), settings.getAoap())) {
+            if (LOCAL_LOGV) {
+                Log.v(TAG, "Usb Device: " + device + " was sent to component: "
+                        + settings.getHandler());
+            }
+            return;
+        }
+        mCallback.titleChanged(device.getManufacturerName() + " " + device.getProductName());
+        mUsbResolver.resolve(device);
+    }
+
+    /**
+     * Applies device settings.
+     */
+    public void applyDeviceSettings(UsbDeviceSettings settings) {
+        mUsbSettingsStorage.saveSettings(settings);
+        mUsbResolver.dispatch(getActiveDevice(), settings.getHandler(), settings.getAoap());
+    }
+
+    /**
+     * Release object.
+     */
+    public void release() {
+        mContext.unregisterReceiver(mUsbBroadcastReceiver);
+        mUsbResolver.release();
+    }
+
+    @Override
+    public void onHandlersResolveCompleted(
+            UsbDevice device, List<UsbDeviceSettings> handlers) {
+        if (LOCAL_LOGD) {
+            Log.d(TAG, "onHandlersResolveComplete: " + device);
+        }
+        if (deviceMatchedActiveDevice(device)) {
+            mCallback.processingStateChanged(false);
+            if (handlers.isEmpty()) {
+                onDeviceDispatched();
+            } else if (handlers.size() == 1) {
+                applyDeviceSettings(handlers.get(0));
+            } else {
+                mCallback.optionsUpdated(handlers);
+            }
+        } else {
+            Log.w(TAG, "Handlers ignored as they came for inactive device");
+        }
+    }
+
+    @Override
+    public void onDeviceDispatched() {
+        stopDeviceProcessing();
+        mCallback.shutdown();
+    }
+
+    void doHandleDeviceRemoved() {
+        if (getActiveDevice() == null) {
+            if (LOCAL_LOGD) {
+                Log.d(TAG, "USB device detached");
+            }
+            stopDeviceProcessing();
+            mCallback.shutdown();
+        }
+    }
+
+    private class UsbHostControllerHandler extends Handler {
+        private static final int MSG_DEVICE_REMOVED = 1;
+
+        private static final int DEVICE_REMOVE_TIMEOUT_MS = 500;
+
+        private UsbHostControllerHandler(Looper looper) {
+            super(looper);
+        }
+
+        private void requestDeviceRemoved() {
+            sendEmptyMessageDelayed(MSG_DEVICE_REMOVED, DEVICE_REMOVE_TIMEOUT_MS);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_DEVICE_REMOVED:
+                    doHandleDeviceRemoved();
+                    break;
+                default:
+                    Log.w(TAG, "Unhandled message: " + msg);
+                    super.handleMessage(msg);
+            }
+        }
+    }
+
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbHostManagementActivity.java b/car-usb-handler/src/android/car/usb/handler/UsbHostManagementActivity.java
new file mode 100644
index 0000000..387ae62
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/UsbHostManagementActivity.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.car.usb.handler;
+
+import android.annotation.Nullable;
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbManager;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+import java.util.List;
+
+/**
+ * Activity to handle USB device attached.
+ * <p>
+ * When user plugs in USB device: a) Device was used before and user selected handler for it. In
+ * this case handler will be launched. b) Device has not handler assigned. In this case supported
+ * handlers will be captured, and user will be presented with choice to assign default handler.
+ * After that handler will be launched.
+ */
+public class UsbHostManagementActivity extends Activity
+        implements UsbHostController.UsbHostControllerCallbacks {
+    private static final String TAG = UsbHostManagementActivity.class.getSimpleName();
+
+    private HandlersAdapter mListAdapter;
+    private ListView mHandlersList;
+    private LinearLayout mProgressInfo;
+    private UsbHostController mController;
+    private PackageManager mPackageManager;
+
+    private final AdapterView.OnItemClickListener mHandlerClickListener =
+            new AdapterView.OnItemClickListener() {
+        @Override
+        public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
+            UsbDeviceSettings settings = (UsbDeviceSettings) parent.getItemAtPosition(position);
+            settings.setDefaultHandler(true);
+            mController.applyDeviceSettings(settings);
+        }
+    };
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.usb_host);
+        mHandlersList = (ListView) findViewById(R.id.usb_handlers_list);
+        mProgressInfo = (LinearLayout) findViewById(R.id.usb_handlers_progress);
+        mListAdapter = new HandlersAdapter(this);
+        mHandlersList.setAdapter(mListAdapter);
+        mHandlersList.setOnItemClickListener(mHandlerClickListener);
+        mController = new UsbHostController(this, this);
+        mPackageManager = getPackageManager();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mController.release();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        UsbDevice connectedDevice = getDevice();
+        if (connectedDevice != null) {
+            mController.processDevice(connectedDevice);
+        } else {
+            finish();
+        }
+    }
+
+    @Override
+    public void shutdown() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                finish();
+            }
+        });
+    }
+
+    @Override
+    public void processingStateChanged(final boolean processing) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mProgressInfo.setVisibility(processing ? View.VISIBLE : View.GONE);
+            }
+        });
+    }
+
+  @Override
+  public void titleChanged(final String title) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                setTitle(title);
+            }
+        });
+    }
+
+  @Override
+  public void optionsUpdated(final List<UsbDeviceSettings> options) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListAdapter.clear();
+                mListAdapter.addAll(options);
+            }
+        });
+    }
+
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        setIntent(intent);
+    }
+
+    @Nullable
+    private UsbDevice getDevice() {
+        if (!UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(getIntent().getAction())) {
+            return null;
+        }
+        return (UsbDevice) getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);
+    }
+
+    private class HandlersAdapter extends ArrayAdapter<UsbDeviceSettings> {
+        class HandlerHolder {
+            public TextView mAppName;
+            public ImageView mAppIcon;
+        }
+
+        HandlersAdapter(Context context) {
+            super(context, R.layout.usb_handler_row);
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            View rowView = convertView;
+            if (rowView == null) {
+                rowView = getLayoutInflater().inflate(R.layout.usb_handler_row, null);
+                HandlerHolder holder = new HandlerHolder();
+                holder.mAppName = (TextView) rowView.findViewById(R.id.usb_handler_title);
+                holder.mAppIcon = (ImageView) rowView.findViewById(R.id.usb_handler_icon);
+                rowView.setTag(holder);
+            }
+
+            HandlerHolder holder = (HandlerHolder) rowView.getTag();
+            ComponentName handler = getItem(position).getHandler();
+
+            try {
+                ApplicationInfo appInfo =
+                        mPackageManager.getApplicationInfo(handler.getPackageName(), 0);
+                holder.mAppName.setText(appInfo.loadLabel(mPackageManager));
+                holder.mAppIcon.setImageDrawable(appInfo.loadIcon(mPackageManager));
+            } catch (NameNotFoundException e) {
+                Log.e(TAG, "Handling package not found: " + handler.getPackageName());
+                holder.mAppName.setText(handler.flattenToShortString());
+                holder.mAppIcon.setImageResource(android.R.color.transparent);
+            }
+            return rowView;
+        }
+    }
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbSettingsStorage.java b/car-usb-handler/src/android/car/usb/handler/UsbSettingsStorage.java
new file mode 100644
index 0000000..157c92f
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/UsbSettingsStorage.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.car.usb.handler;
+
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Provides API to persist USB device settings.
+ */
+public final class UsbSettingsStorage {
+    private static final String TAG = UsbSettingsStorage.class.getSimpleName();
+
+    private static final String TABLE_USB_SETTINGS = "usb_devices";
+    private static final String COLUMN_SERIAL = "serial";
+    private static final String COLUMN_VID = "vid";
+    private static final String COLUMN_PID = "pid";
+    private static final String COLUMN_NAME = "name";
+    private static final String COLUMN_HANDLER = "handler";
+    private static final String COLUMN_AOAP = "aoap";
+    private static final String COLUMN_DEFAULT_HANDLER = "default_handler";
+
+    private final UsbSettingsDbHelper mDbHelper;
+
+    public UsbSettingsStorage(Context context) {
+        mDbHelper = new UsbSettingsDbHelper(context);
+    }
+
+    /**
+     * Returns settings for {@serialNumber} or null if it doesn't exist.
+     */
+    @Nullable
+    public UsbDeviceSettings getSettings(String serialNumber) {
+        try (SQLiteDatabase db = mDbHelper.getReadableDatabase();
+             Cursor resultCursor = db.query(
+                     TABLE_USB_SETTINGS,
+                     null,
+                     COLUMN_SERIAL + " = ?",
+                     new String[]{serialNumber},
+                     null,
+                     null,
+                     null)) {
+            if (resultCursor.getCount() > 1) {
+                throw new RuntimeException("Querying for serial number: " + serialNumber
+                        + " returned " + resultCursor.getCount() + " results");
+            }
+            if (resultCursor.getCount() == 0) {
+                Log.w(TAG, "Usb setting missing for device serial: " + serialNumber);
+                return null;
+            }
+            List<UsbDeviceSettings> settings = constructSettings(resultCursor);
+            return settings.get(0);
+        }
+    }
+
+    /**
+     * Saves or updates settings for USB device.
+     */
+    public void saveSettings(UsbDeviceSettings settings) {
+        try (SQLiteDatabase db = mDbHelper.getWritableDatabase()) {
+            long result = db.replace(
+                    TABLE_USB_SETTINGS,
+                    null,
+                    settingsToContentValues(settings));
+            if (result == -1) {
+                Log.e(TAG, "Failed to save settings: " + settings);
+            }
+        }
+    }
+
+    /**
+     * Delete settings for USB device.
+     */
+    public void deleteSettings(String serialNumber, int vid, int pid) {
+        try (SQLiteDatabase db = mDbHelper.getWritableDatabase()) {
+            int result = db.delete(
+                    TABLE_USB_SETTINGS,
+                    COLUMN_SERIAL + " = ? AND " + COLUMN_VID + " = ? AND " + COLUMN_PID
+                    + " = ?",
+                    new String[]{serialNumber, Integer.toString(vid), Integer.toString(pid)});
+            if (result == 0) {
+                Log.w(TAG, "No settings with serialNumber: " + serialNumber
+                        + " vid: " + vid + " pid: " + pid);
+            }
+            if (result > 1) {
+                Log.e(TAG, "Deleted multiple rows (" + result + ") for serialNumber: "
+                        + serialNumber + " vid: " + vid + " pid: " + pid);
+            }
+        }
+    }
+
+    /**
+     * Returns all saved settings.
+     */
+    public List<UsbDeviceSettings> getAllSettings() {
+        try (SQLiteDatabase db = mDbHelper.getReadableDatabase();
+             Cursor resultCursor = db.query(
+                     TABLE_USB_SETTINGS,
+                     null,
+                     null,
+                     null,
+                     null,
+                     null,
+                     null)) {
+            return constructSettings(resultCursor);
+        }
+    }
+
+    private List<UsbDeviceSettings> constructSettings(Cursor cursor) {
+        if (!cursor.isBeforeFirst()) {
+            throw new RuntimeException("Cursor is not reset to before first element");
+        }
+        int serialNumberColumnId = cursor.getColumnIndex(COLUMN_SERIAL);
+        int vidColumnId = cursor.getColumnIndex(COLUMN_VID);
+        int pidColumnId = cursor.getColumnIndex(COLUMN_PID);
+        int deviceNameColumnId = cursor.getColumnIndex(COLUMN_NAME);
+        int handlerColumnId = cursor.getColumnIndex(COLUMN_HANDLER);
+        int aoapColumnId = cursor.getColumnIndex(COLUMN_AOAP);
+        List<UsbDeviceSettings> results = new ArrayList<>(cursor.getCount());
+        while (cursor.moveToNext()) {
+            results.add(UsbDeviceSettings.constructSettings(
+                                cursor.getString(serialNumberColumnId),
+                                cursor.getInt(vidColumnId),
+                                cursor.getInt(pidColumnId),
+                                cursor.getString(deviceNameColumnId),
+                                ComponentName.unflattenFromString(
+                                        cursor.getString(handlerColumnId)),
+                                cursor.getInt(aoapColumnId) != 0));
+        }
+        return results;
+    }
+
+    /**
+     * Converts {@code UsbDeviceSettings} to {@code ContentValues}.
+     */
+    public ContentValues settingsToContentValues(UsbDeviceSettings settings) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(COLUMN_SERIAL, settings.getSerialNumber());
+        contentValues.put(COLUMN_VID, settings.getVid());
+        contentValues.put(COLUMN_PID, settings.getPid());
+        contentValues.put(COLUMN_NAME, settings.getDeviceName());
+        contentValues.put(COLUMN_HANDLER, settings.getHandler().flattenToShortString());
+        contentValues.put(COLUMN_AOAP, settings.getAoap() ? 1 : 0);
+        contentValues.put(COLUMN_DEFAULT_HANDLER, settings.isDefaultHandler() ? 1 : 0);
+        return contentValues;
+    }
+
+
+    private static class UsbSettingsDbHelper extends SQLiteOpenHelper {
+        private static final int DATABASE_VERSION = 1;
+        private static final String DATABASE_NAME = "usb_devices.db";
+
+        UsbSettingsDbHelper(Context context) {
+            super(context, DATABASE_NAME, null, DATABASE_VERSION);
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            db.execSQL("CREATE TABLE " + TABLE_USB_SETTINGS + " ("
+                    + COLUMN_SERIAL + " TEXT,"
+                    + COLUMN_VID + " INTEGER,"
+                    + COLUMN_PID + " INTEGER,"
+                    + COLUMN_NAME + " TEXT, "
+                    + COLUMN_HANDLER + " TEXT,"
+                    + COLUMN_AOAP + " INTEGER,"
+                    + COLUMN_DEFAULT_HANDLER + " INTEGER," + "PRIMARY KEY (" + COLUMN_SERIAL
+                    + "))");
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+            // Do nothing at this point. Not required for v1 database.
+        }
+    }
+}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbUtil.java b/car-usb-handler/src/android/car/usb/handler/UsbUtil.java
new file mode 100644
index 0000000..939fe3f
--- /dev/null
+++ b/car-usb-handler/src/android/car/usb/handler/UsbUtil.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.car.usb.handler;
+
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbManager;
+import android.text.TextUtils;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Util methods to work with USB devices.
+ */
+class UsbUtil {
+    public static List<UsbDevice> findAllPossibleAndroidDevices(UsbManager usbManager) {
+        HashMap<String, UsbDevice> devices = usbManager.getDeviceList();
+    ArrayList<UsbDevice> androidDevices = new ArrayList<>(devices.size());
+        for (UsbDevice device : devices.values()) {
+            UsbDeviceConnection connection = openConnection(usbManager, device);
+            if (AoapInterface.isSupported(connection)) {
+                androidDevices.add(device);
+            }
+            connection.close();
+        }
+        return androidDevices;
+    }
+
+    public static UsbDeviceConnection openConnection(UsbManager manager, UsbDevice device) {
+    manager.grantPermission(device);
+    return manager.openDevice(device);
+    }
+    
+    public static void sendAoapAccessoryStart(UsbDeviceConnection connection, String manufacturer,
+            String model, String description, String version, String uri, String serial)
+                    throws IOException {
+        AoapInterface.sendString(connection, AoapInterface.ACCESSORY_STRING_MANUFACTURER,
+                                 manufacturer);
+        AoapInterface.sendString(connection, AoapInterface.ACCESSORY_STRING_MODEL,
+                                 model);
+        AoapInterface.sendString(connection, AoapInterface.ACCESSORY_STRING_DESCRIPTION,
+                                 description);
+        AoapInterface.sendString(connection, AoapInterface.ACCESSORY_STRING_VERSION,
+                                 version);
+        AoapInterface.sendString(connection, AoapInterface.ACCESSORY_STRING_URI, uri);
+        AoapInterface.sendString(connection, AoapInterface.ACCESSORY_STRING_SERIAL,serial);
+        AoapInterface.sendAoapStart(connection);
+    }
+
+    public static boolean isTheSameDevice(UsbDevice l, UsbDevice r) {
+        if (TextUtils.equals(l.getManufacturerName(), r.getManufacturerName())
+                && TextUtils.equals(l.getProductName(), r.getProductName())
+                && TextUtils.equals(l.getSerialNumber(), r.getSerialNumber())) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean isDevicesMatching(UsbDevice l, UsbDevice r) {
+        if (l.getVendorId() == r.getVendorId() && l.getProductId() == r.getProductId()
+                && TextUtils.equals(l.getSerialNumber(), r.getSerialNumber())) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean isDeviceConnected(UsbManager usbManager, UsbDevice device) {
+        HashMap<String, UsbDevice> devices = usbManager.getDeviceList();
+        for (UsbDevice dev : devices.values()) {
+            if (isDevicesMatching(dev, device)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
index fe9b644..5928164 100644
--- a/car_product/build/car.mk
+++ b/car_product/build/car.mk
@@ -91,6 +91,7 @@
     Stream \
     CarHvacApp \
     CarMapsPlaceholder \
+    CarUsbHandler \
     android.car \
     libvehiclenetwork-native \
     libvehiclemonitor-native \
diff --git a/tools/bootanalyze/bootanalyze.py b/tools/bootanalyze/bootanalyze.py
index 4dc0100..1147292 100644
--- a/tools/bootanalyze/bootanalyze.py
+++ b/tools/bootanalyze/bootanalyze.py
@@ -106,7 +106,7 @@
   logcat_events, logcat_timing_events = collect_events(
     search_events, 'adb logcat -b all -v epoch', timings, cfg['stop_event'])
 
-  dmesg_events, e = collect_events(search_events, 'adb shell dmesg', {})
+  dmesg_events, e = collect_events(search_events, 'adb shell su root dmesg', {})
 
   logcat_event_time = extract_time(
     logcat_events, TIME_LOGCAT, float);
diff --git a/tools/bootanalyze/config.yaml b/tools/bootanalyze/config.yaml
index 55c5358..ee1fa9e 100644
--- a/tools/bootanalyze/config.yaml
+++ b/tools/bootanalyze/config.yaml
@@ -7,6 +7,14 @@
   kernel: Linux version
   android_init_1st_stage: init first stage started
   android_init_2st_stage: init second stage started
+  late_init: processing action \(late-init\)
+  fs: processing action \(fs\)
+  post-fs: processing action \(post-fs\)
+  late-fs: processing action \(late-fs\)
+  post-fs-data: processing action \(post-fs-data\)
+  load_persist_props_action: processing action \(load_persist_props_action\)
+  early-boot: processing action \(early-boot\)
+  boot: processing action \(boot\)
   ueventd: Starting service 'ueventd'
   system_mounted: target=/system
   data_mounted: target=/data