-keep class android.accessibilityservice.AccessibilityServiceInfo {
    <init>();
    <init>(android.content.pm.ResolveInfo, android.content.Context);

    public static java.lang.String capabilityToString(int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static java.lang.String feedbackTypeToString(int);
    public static java.lang.String flagToString(int);
    public boolean getCanRetrieveWindowContent();
    public int getCapabilities();
    public java.util.List getCapabilityInfos();
    public java.util.List getCapabilityInfos(android.content.Context);
    public android.content.ComponentName getComponentName();
    public java.lang.String getDescription();
    public java.lang.String getId();
    public android.content.pm.ResolveInfo getResolveInfo();
    public java.lang.String getSettingsActivityName();
    public int hashCode();
    public boolean isDirectBootAware();
    public java.lang.String loadDescription(android.content.pm.PackageManager);
    public java.lang.CharSequence loadSummary(android.content.pm.PackageManager);
    public void setCapabilities(int);
    public void setComponentName(android.content.ComponentName);
    public java.lang.String toString();
    public void updateDynamicallyConfigurableProperties(android.accessibilityservice.AccessibilityServiceInfo);
    public void writeToParcel(android.os.Parcel, int);


    public static int CAPABILITY_CAN_CONTROL_MAGNIFICATION;
    public static int CAPABILITY_CAN_PERFORM_GESTURES;
    public static int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
    public static int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS;
    public static int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES;
    public static int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION;
    public static int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DEFAULT;
    public static int FEEDBACK_ALL_MASK;
    public static int FEEDBACK_AUDIBLE;
    public static int FEEDBACK_BRAILLE;
    public static int FEEDBACK_GENERIC;
    public static int FEEDBACK_HAPTIC;
    public static int FEEDBACK_SPOKEN;
    public static int FEEDBACK_VISUAL;
    public static int FLAG_ENABLE_ACCESSIBILITY_VOLUME;
    public static int FLAG_FORCE_DIRECT_BOOT_AWARE;
    public static int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    public static int FLAG_REPORT_VIEW_IDS;
    public static int FLAG_REQUEST_ACCESSIBILITY_BUTTON;
    public static int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
    public static int FLAG_REQUEST_FILTER_KEY_EVENTS;
    public static int FLAG_REQUEST_FINGERPRINT_GESTURES;
    public static int FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
    public static int FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
    public boolean crashed;
    public int eventTypes;
    public int feedbackType;
    public int flags;
    public long notificationTimeout;
    public java.lang.String[] packageNames;
}

-keep class android.accessibilityservice.AccessibilityServiceInfo$CapabilityInfo {
    <init>(int, int, int);



    public int capability;
    public int descResId;
    public int titleResId;
}

-keep class android.accessibilityservice.IAccessibilityServiceClient {

    public abstract void clearAccessibilityCache();
    public abstract void init(android.accessibilityservice.IAccessibilityServiceConnection, int, android.os.IBinder);
    public abstract void onAccessibilityButtonAvailabilityChanged(boolean);
    public abstract void onAccessibilityButtonClicked();
    public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent, boolean);
    public abstract void onFingerprintCapturingGesturesChanged(boolean);
    public abstract void onFingerprintGesture(int);
    public abstract void onGesture(int);
    public abstract void onInterrupt();
    public abstract void onKeyEvent(android.view.KeyEvent, int);
    public abstract void onMagnificationChanged(android.graphics.Region, float, float, float);
    public abstract void onPerformGestureResult(int, boolean);
    public abstract void onSoftKeyboardShowModeChanged(int);


}

-keep class android.accessibilityservice.IAccessibilityServiceConnection {

    public abstract void disableSelf();
    public abstract java.lang.String[] findAccessibilityNodeInfoByAccessibilityId(int, long, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, long, android.os.Bundle);
    public abstract java.lang.String[] findAccessibilityNodeInfosByText(int, long, java.lang.String, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract java.lang.String[] findAccessibilityNodeInfosByViewId(int, long, java.lang.String, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract java.lang.String[] findFocus(int, long, int, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract java.lang.String[] focusSearch(int, long, int, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract float getMagnificationCenterX();
    public abstract float getMagnificationCenterY();
    public abstract android.graphics.Region getMagnificationRegion();
    public abstract float getMagnificationScale();
    public abstract android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
    public abstract android.view.accessibility.AccessibilityWindowInfo getWindow(int);
    public abstract java.util.List getWindows();
    public abstract boolean isAccessibilityButtonAvailable();
    public abstract boolean isFingerprintGestureDetectionAvailable();
    public abstract boolean performAccessibilityAction(int, long, int, android.os.Bundle, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract boolean performGlobalAction(int);
    public abstract boolean resetMagnification(boolean);
    public abstract void sendGesture(int, android.content.pm.ParceledListSlice);
    public abstract void setMagnificationCallbackEnabled(boolean);
    public abstract boolean setMagnificationScaleAndCenter(float, float, float, boolean);
    public abstract void setOnKeyEventResult(boolean, int);
    public abstract void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
    public abstract void setSoftKeyboardCallbackEnabled(boolean);
    public abstract boolean setSoftKeyboardShowMode(int);


}

-keep class android.accounts.Account {
    <init>(java.lang.String, java.lang.String);
    <init>(android.accounts.Account, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String);
    <init>(android.os.Parcel);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getAccessId();
    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.animation.AnimationHandler {
    <init>();

    public void addAnimationFrameCallback(android.animation.AnimationHandler$AnimationFrameCallback, long);
    public void addOneShotCommitCallback(android.animation.AnimationHandler$AnimationFrameCallback);
    public static int getAnimationCount();
    public static long getFrameDelay();
    public static android.animation.AnimationHandler getInstance();
    public void removeCallback(android.animation.AnimationHandler$AnimationFrameCallback);
    public static void setFrameDelay(long);
    public void setProvider(android.animation.AnimationHandler$AnimationFrameCallbackProvider);


    public static java.lang.ThreadLocal sAnimatorHandler;
}

-keep class android.animation.AnimationHandler$AnimationFrameCallback {

    public abstract void commitAnimationFrame(long);
    public abstract boolean doAnimationFrame(long);


}

-keep class android.animation.AnimationHandler$AnimationFrameCallbackProvider {

    public abstract long getFrameDelay();
    public abstract long getFrameTime();
    public abstract void postCommitCallback(java.lang.Runnable);
    public abstract void postFrameCallback(android.view.Choreographer$FrameCallback);
    public abstract void setFrameDelay(long);


}

-keep class android.animation.Animator {
    <init>();

    public void addListener(android.animation.Animator$AnimatorListener);
    public void addPauseListener(android.animation.Animator$AnimatorPauseListener);
    public void appendChangingConfigurations(int);
    public boolean canReverse();
    public void cancel();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public android.content.res.ConstantState createConstantState();
    public void end();
    public int getChangingConfigurations();
    public abstract long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public java.util.ArrayList getListeners();
    public abstract long getStartDelay();
    public long getTotalDuration();
    public boolean isPaused();
    public abstract boolean isRunning();
    public boolean isStarted();
    public void pause();
    public void removeAllListeners();
    public void removeListener(android.animation.Animator$AnimatorListener);
    public void removePauseListener(android.animation.Animator$AnimatorPauseListener);
    public void resume();
    public void reverse();
    public void setAllowRunningAsynchronously(boolean);
    public void setChangingConfigurations(int);
    public abstract android.animation.Animator setDuration(long);
    public abstract void setInterpolator(android.animation.TimeInterpolator);
    public abstract void setStartDelay(long);
    public void setTarget(java.lang.Object);
    public void setupEndValues();
    public void setupStartValues();
    public void start();


    public static long DURATION_INFINITE;
}

-keep class android.animation.Animator$AnimatorListener {

    public abstract void onAnimationCancel(android.animation.Animator);
    public void onAnimationEnd(android.animation.Animator, boolean);
    public abstract void onAnimationEnd(android.animation.Animator);
    public abstract void onAnimationRepeat(android.animation.Animator);
    public void onAnimationStart(android.animation.Animator, boolean);
    public abstract void onAnimationStart(android.animation.Animator);


}

-keep class android.animation.Animator$AnimatorPauseListener {

    public abstract void onAnimationPause(android.animation.Animator);
    public abstract void onAnimationResume(android.animation.Animator);


}

-keep class android.animation.AnimatorSet {
    <init>();

    public boolean canReverse();
    public void cancel();
    public android.animation.AnimatorSet clone();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public void commitAnimationFrame(long);
    public boolean doAnimationFrame(long);
    public void end();
    public int getChangingConfigurations();
    public java.util.ArrayList getChildAnimations();
    public long getCurrentPlayTime();
    public long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public long getStartDelay();
    public long getTotalDuration();
    public boolean isRunning();
    public boolean isStarted();
    public void pause();
    public android.animation.AnimatorSet$Builder play(android.animation.Animator);
    public void playSequentially(android.animation.Animator[]);
    public void playSequentially(java.util.List);
    public void playTogether(android.animation.Animator[]);
    public void playTogether(java.util.Collection);
    public void resume();
    public void reverse();
    public void setCurrentPlayTime(long);
    public android.animation.AnimatorSet setDuration(long);
    public android.animation.Animator setDuration(long);
    public void setInterpolator(android.animation.TimeInterpolator);
    public void setStartDelay(long);
    public void setTarget(java.lang.Object);
    public void setupEndValues();
    public void setupStartValues();
    public boolean shouldPlayTogether();
    public void start();
    public java.lang.String toString();


}

-keep class android.animation.AnimatorSet$Builder {

    public android.animation.AnimatorSet$Builder after(android.animation.Animator);
    public android.animation.AnimatorSet$Builder after(long);
    public android.animation.AnimatorSet$Builder before(android.animation.Animator);
    public android.animation.AnimatorSet$Builder with(android.animation.Animator);


}

-keep class android.animation.Keyframe {
    <init>();

    public abstract android.animation.Keyframe clone();
    public java.lang.Object clone();
    public float getFraction();
    public android.animation.TimeInterpolator getInterpolator();
    public java.lang.Class getType();
    public abstract java.lang.Object getValue();
    public boolean hasValue();
    public static android.animation.Keyframe ofFloat(float, float);
    public static android.animation.Keyframe ofFloat(float);
    public static android.animation.Keyframe ofInt(float, int);
    public static android.animation.Keyframe ofInt(float);
    public static android.animation.Keyframe ofObject(float, java.lang.Object);
    public static android.animation.Keyframe ofObject(float);
    public void setFraction(float);
    public void setInterpolator(android.animation.TimeInterpolator);
    public abstract void setValue(java.lang.Object);


}

-keep class android.animation.LayoutTransition {
    <init>();

    public void addChild(android.view.ViewGroup, android.view.View);
    public void addTransitionListener(android.animation.LayoutTransition$TransitionListener);
    public void cancel();
    public void cancel(int);
    public void disableTransitionType(int);
    public void enableTransitionType(int);
    public void endChangingAnimations();
    public android.animation.Animator getAnimator(int);
    public long getDuration(int);
    public android.animation.TimeInterpolator getInterpolator(int);
    public long getStagger(int);
    public long getStartDelay(int);
    public java.util.List getTransitionListeners();
    public void hideChild(android.view.ViewGroup, android.view.View);
    public void hideChild(android.view.ViewGroup, android.view.View, int);
    public boolean isChangingLayout();
    public boolean isRunning();
    public boolean isTransitionTypeEnabled(int);
    public void layoutChange(android.view.ViewGroup);
    public void removeChild(android.view.ViewGroup, android.view.View);
    public void removeTransitionListener(android.animation.LayoutTransition$TransitionListener);
    public void setAnimateParentHierarchy(boolean);
    public void setAnimator(int, android.animation.Animator);
    public void setDuration(long);
    public void setDuration(int, long);
    public void setInterpolator(int, android.animation.TimeInterpolator);
    public void setStagger(int, long);
    public void setStartDelay(int, long);
    public void showChild(android.view.ViewGroup, android.view.View);
    public void showChild(android.view.ViewGroup, android.view.View, int);
    public void startChangingAnimations();


    public static int APPEARING;
    public static int CHANGE_APPEARING;
    public static int CHANGE_DISAPPEARING;
    public static int CHANGING;
    public static int DISAPPEARING;
}

-keep class android.animation.LayoutTransition$TransitionListener {

    public abstract void endTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
    public abstract void startTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);


}

-keep class android.animation.PropertyValuesHolder {

    public android.animation.PropertyValuesHolder clone();
    public java.lang.Object clone();
    public java.lang.String getPropertyName();
    public void getPropertyValues(android.animation.PropertyValuesHolder$PropertyValues);
    public java.lang.Class getValueType();
    public static android.animation.PropertyValuesHolder ofFloat(java.lang.String, float[]);
    public static android.animation.PropertyValuesHolder ofFloat(android.util.Property, float[]);
    public static android.animation.PropertyValuesHolder ofInt(java.lang.String, int[]);
    public static android.animation.PropertyValuesHolder ofInt(android.util.Property, int[]);
    public static android.animation.PropertyValuesHolder ofKeyframe(java.lang.String, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter, android.graphics.Path);
    public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path);
    public void setConverter(android.animation.TypeConverter);
    public void setEvaluator(android.animation.TypeEvaluator);
    public void setFloatValues(float[]);
    public void setIntValues(int[]);
    public void setKeyframes(android.animation.Keyframe[]);
    public void setObjectValues(java.lang.Object[]);
    public void setProperty(android.util.Property);
    public void setPropertyName(java.lang.String);
    public java.lang.String toString();


    protected android.util.Property mProperty;
}

-keep class android.animation.PropertyValuesHolder$PropertyValues {
    <init>();

    public java.lang.String toString();


    public android.animation.PropertyValuesHolder$PropertyValues$DataSource dataSource;
    public java.lang.Object endValue;
    public java.lang.String propertyName;
    public java.lang.Object startValue;
    public java.lang.Class type;
}

-keep class android.animation.PropertyValuesHolder$PropertyValues$DataSource {

    public abstract java.lang.Object getValueAtFraction(float);


}

-keep class android.animation.StateListAnimator {
    <init>();

    public void addState(int[], android.animation.Animator);
    public void appendChangingConfigurations(int);
    public android.animation.StateListAnimator clone();
    public java.lang.Object clone();
    public android.content.res.ConstantState createConstantState();
    public int getChangingConfigurations();
    public android.animation.Animator getRunningAnimator();
    public android.view.View getTarget();
    public java.util.ArrayList getTuples();
    public void jumpToCurrentState();
    public void setChangingConfigurations(int);
    public void setState(int[]);
    public void setTarget(android.view.View);


}

-keep class android.animation.StateListAnimator$Tuple {

    public android.animation.Animator getAnimator();
    public int[] getSpecs();


}

-keep class android.animation.TimeInterpolator {

    public abstract float getInterpolation(float);


}

-keep class android.animation.TypeConverter {
    <init>(java.lang.Class, java.lang.Class);

    public abstract java.lang.Object convert(java.lang.Object);


}

-keep class android.animation.TypeEvaluator {

    public abstract java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);


}

-keep class android.animation.ValueAnimator {
    <init>();

    public void addUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
    public static boolean areAnimatorsEnabled();
    public boolean canReverse();
    public void cancel();
    public android.animation.ValueAnimator clone();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public void commitAnimationFrame(long);
    public boolean doAnimationFrame(long);
    public void end();
    public float getAnimatedFraction();
    public java.lang.Object getAnimatedValue();
    public java.lang.Object getAnimatedValue(java.lang.String);
    public android.animation.AnimationHandler getAnimationHandler();
    public static int getCurrentAnimationsCount();
    public long getCurrentPlayTime();
    public long getDuration();
    public static float getDurationScale();
    public static long getFrameDelay();
    public android.animation.TimeInterpolator getInterpolator();
    public int getRepeatCount();
    public int getRepeatMode();
    public long getStartDelay();
    public long getTotalDuration();
    public android.animation.PropertyValuesHolder[] getValues();
    public boolean isRunning();
    public boolean isStarted();
    public static android.animation.ValueAnimator ofArgb(int[]);
    public static android.animation.ValueAnimator ofFloat(float[]);
    public static android.animation.ValueAnimator ofInt(int[]);
    public static android.animation.ValueAnimator ofObject(android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.ValueAnimator ofPropertyValuesHolder(android.animation.PropertyValuesHolder[]);
    public void overrideDurationScale(float);
    public void pause();
    public void removeAllUpdateListeners();
    public void removeUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
    public void resume();
    public void reverse();
    public void setAllowRunningAsynchronously(boolean);
    public void setCurrentFraction(float);
    public void setCurrentPlayTime(long);
    public android.animation.ValueAnimator setDuration(long);
    public android.animation.Animator setDuration(long);
    public static void setDurationScale(float);
    public void setEvaluator(android.animation.TypeEvaluator);
    public void setFloatValues(float[]);
    public static void setFrameDelay(long);
    public void setIntValues(int[]);
    public void setInterpolator(android.animation.TimeInterpolator);
    public void setObjectValues(java.lang.Object[]);
    public void setRepeatCount(int);
    public void setRepeatMode(int);
    public void setStartDelay(long);
    public void setValues(android.animation.PropertyValuesHolder[]);
    public void start();
    public java.lang.String toString();


    public static int INFINITE;
    public static int RESTART;
    public static int REVERSE;
}

-keep class android.animation.ValueAnimator$AnimatorUpdateListener {

    public abstract void onAnimationUpdate(android.animation.ValueAnimator);


}

-keep class android.app.ActionBar {
    <init>();

    public abstract void addOnMenuVisibilityListener(android.app.ActionBar$OnMenuVisibilityListener);
    public abstract void addTab(android.app.ActionBar$Tab);
    public abstract void addTab(android.app.ActionBar$Tab, boolean);
    public abstract void addTab(android.app.ActionBar$Tab, int);
    public abstract void addTab(android.app.ActionBar$Tab, int, boolean);
    public boolean closeOptionsMenu();
    public boolean collapseActionView();
    public void dispatchMenuVisibilityChanged(boolean);
    public abstract android.view.View getCustomView();
    public abstract int getDisplayOptions();
    public float getElevation();
    public abstract int getHeight();
    public int getHideOffset();
    public abstract int getNavigationItemCount();
    public abstract int getNavigationMode();
    public abstract int getSelectedNavigationIndex();
    public abstract android.app.ActionBar$Tab getSelectedTab();
    public abstract java.lang.CharSequence getSubtitle();
    public abstract android.app.ActionBar$Tab getTabAt(int);
    public abstract int getTabCount();
    public android.content.Context getThemedContext();
    public abstract java.lang.CharSequence getTitle();
    public abstract void hide();
    public boolean invalidateOptionsMenu();
    public boolean isHideOnContentScrollEnabled();
    public abstract boolean isShowing();
    public boolean isTitleTruncated();
    public abstract android.app.ActionBar$Tab newTab();
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onDestroy();
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onMenuKeyEvent(android.view.KeyEvent);
    public boolean openOptionsMenu();
    public abstract void removeAllTabs();
    public abstract void removeOnMenuVisibilityListener(android.app.ActionBar$OnMenuVisibilityListener);
    public abstract void removeTab(android.app.ActionBar$Tab);
    public abstract void removeTabAt(int);
    public abstract void selectTab(android.app.ActionBar$Tab);
    public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public abstract void setCustomView(android.view.View);
    public abstract void setCustomView(android.view.View, android.app.ActionBar$LayoutParams);
    public abstract void setCustomView(int);
    public void setDefaultDisplayHomeAsUpEnabled(boolean);
    public abstract void setDisplayHomeAsUpEnabled(boolean);
    public abstract void setDisplayOptions(int);
    public abstract void setDisplayOptions(int, int);
    public abstract void setDisplayShowCustomEnabled(boolean);
    public abstract void setDisplayShowHomeEnabled(boolean);
    public abstract void setDisplayShowTitleEnabled(boolean);
    public abstract void setDisplayUseLogoEnabled(boolean);
    public void setElevation(float);
    public void setHideOffset(int);
    public void setHideOnContentScrollEnabled(boolean);
    public void setHomeActionContentDescription(java.lang.CharSequence);
    public void setHomeActionContentDescription(int);
    public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
    public void setHomeAsUpIndicator(int);
    public void setHomeButtonEnabled(boolean);
    public abstract void setIcon(int);
    public abstract void setIcon(android.graphics.drawable.Drawable);
    public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.app.ActionBar$OnNavigationListener);
    public abstract void setLogo(int);
    public abstract void setLogo(android.graphics.drawable.Drawable);
    public abstract void setNavigationMode(int);
    public abstract void setSelectedNavigationItem(int);
    public void setShowHideAnimationEnabled(boolean);
    public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
    public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
    public abstract void setSubtitle(java.lang.CharSequence);
    public abstract void setSubtitle(int);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setTitle(int);
    public void setWindowTitle(java.lang.CharSequence);
    public abstract void show();
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);


    public static int DISPLAY_HOME_AS_UP;
    public static int DISPLAY_SHOW_CUSTOM;
    public static int DISPLAY_SHOW_HOME;
    public static int DISPLAY_SHOW_TITLE;
    public static int DISPLAY_TITLE_MULTIPLE_LINES;
    public static int DISPLAY_USE_LOGO;
    public static int NAVIGATION_MODE_LIST;
    public static int NAVIGATION_MODE_STANDARD;
    public static int NAVIGATION_MODE_TABS;
}

-keep class android.app.ActionBar$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, int);
    <init>(int);
    <init>(android.app.ActionBar$LayoutParams);
    <init>(android.view.ViewGroup$LayoutParams);

    protected void encodeProperties(android.view.ViewHierarchyEncoder);


    public int gravity;
}

-keep class android.app.ActionBar$OnMenuVisibilityListener {

    public abstract void onMenuVisibilityChanged(boolean);


}

-keep class android.app.ActionBar$OnNavigationListener {

    public abstract boolean onNavigationItemSelected(int, long);


}

-keep class android.app.ActionBar$Tab {
    <init>();

    public abstract java.lang.CharSequence getContentDescription();
    public abstract android.view.View getCustomView();
    public abstract android.graphics.drawable.Drawable getIcon();
    public abstract int getPosition();
    public abstract java.lang.Object getTag();
    public abstract java.lang.CharSequence getText();
    public abstract void select();
    public abstract android.app.ActionBar$Tab setContentDescription(int);
    public abstract android.app.ActionBar$Tab setContentDescription(java.lang.CharSequence);
    public abstract android.app.ActionBar$Tab setCustomView(android.view.View);
    public abstract android.app.ActionBar$Tab setCustomView(int);
    public abstract android.app.ActionBar$Tab setIcon(android.graphics.drawable.Drawable);
    public abstract android.app.ActionBar$Tab setIcon(int);
    public abstract android.app.ActionBar$Tab setTabListener(android.app.ActionBar$TabListener);
    public abstract android.app.ActionBar$Tab setTag(java.lang.Object);
    public abstract android.app.ActionBar$Tab setText(java.lang.CharSequence);
    public abstract android.app.ActionBar$Tab setText(int);


    public static int INVALID_POSITION;
}

-keep class android.app.ActionBar$TabListener {

    public abstract void onTabReselected(android.app.ActionBar$Tab, android.app.FragmentTransaction);
    public abstract void onTabSelected(android.app.ActionBar$Tab, android.app.FragmentTransaction);
    public abstract void onTabUnselected(android.app.ActionBar$Tab, android.app.FragmentTransaction);


}

-keep class android.app.Activity {
    <init>();

    public void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    protected void attachBaseContext(android.content.Context);
    public void autofillClientAuthenticate(int, android.content.IntentSender, android.content.Intent);
    public void autofillClientDispatchUnhandledKey(android.view.View, android.view.KeyEvent);
    public android.view.View autofillClientFindViewByAccessibilityIdTraversal(int, int);
    public android.view.View autofillClientFindViewByAutofillIdTraversal(android.view.autofill.AutofillId);
    public android.view.View[] autofillClientFindViewsByAutofillIdTraversal(android.view.autofill.AutofillId[]);
    public android.os.IBinder autofillClientGetActivityToken();
    public android.content.ComponentName autofillClientGetComponentName();
    public android.view.autofill.AutofillId autofillClientGetNextAutofillId();
    public boolean[] autofillClientGetViewVisibility(android.view.autofill.AutofillId[]);
    public boolean autofillClientIsCompatibilityModeEnabled();
    public boolean autofillClientIsFillUiShowing();
    public boolean autofillClientIsVisibleForAutofill();
    public boolean autofillClientRequestHideFillUi();
    public boolean autofillClientRequestShowFillUi(android.view.View, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
    public void autofillClientResetableStateAvailable();
    public void autofillClientRunOnUiThread(java.lang.Runnable);
    public boolean canStartActivityForResult();
    public void closeContextMenu();
    public void closeOptionsMenu();
    public void convertFromTranslucent();
    public boolean convertToTranslucent(android.app.Activity$TranslucentConversionListener, android.app.ActivityOptions);
    public android.app.PendingIntent createPendingResult(int, android.content.Intent, int);
    public void dismissDialog(int);
    public void dismissKeyboardShortcutsHelper();
    public void dispatchEnterAnimationComplete();
    public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void enterPictureInPictureMode();
    public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
    public boolean enterPictureInPictureMode(android.app.PictureInPictureParams);
    public void enterPictureInPictureModeIfPossible();
    public void exitFreeformMode();
    public android.view.View findViewById(int);
    public void finish();
    public void finishActivity(int);
    public void finishActivityFromChild(android.app.Activity, int);
    public void finishAffinity();
    public void finishAfterTransition();
    public void finishAndRemoveTask();
    public void finishFromChild(android.app.Activity);
    public android.app.ActionBar getActionBar();
    public android.app.ActivityThread getActivityThread();
    public android.os.IBinder getActivityToken();
    public android.app.Application getApplication();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public android.content.ComponentName getCallingActivity();
    public java.lang.String getCallingPackage();
    public int getChangingConfigurations();
    public android.content.ComponentName getComponentName();
    public android.transition.Scene getContentScene();
    public android.transition.TransitionManager getContentTransitionManager();
    public android.view.View getCurrentFocus();
    public android.app.FragmentManager getFragmentManager();
    public android.content.Intent getIntent();
    public java.lang.Object getLastNonConfigurationInstance();
    public android.view.LayoutInflater getLayoutInflater();
    public android.app.LoaderManager getLoaderManager();
    public java.lang.String getLocalClassName();
    public int getMaxNumPictureInPictureActions();
    public android.media.session.MediaController getMediaController();
    public android.view.MenuInflater getMenuInflater();
    public int getNextAutofillId();
    public android.app.Activity getParent();
    public android.content.Intent getParentActivityIntent();
    public android.content.SharedPreferences getPreferences(int);
    public android.net.Uri getReferrer();
    public int getRequestedOrientation();
    public android.view.SearchEvent getSearchEvent();
    public java.lang.Object getSystemService(java.lang.String);
    public int getTaskId();
    public java.lang.CharSequence getTitle();
    public int getTitleColor();
    public android.app.VoiceInteractor getVoiceInteractor();
    public int getVolumeControlStream();
    public android.view.Window getWindow();
    public android.view.WindowManager getWindowManager();
    public boolean hasWindowFocus();
    public void invalidateOptionsMenu();
    public boolean isActivityTransitionRunning();
    public boolean isBackgroundVisibleBehind();
    public boolean isChangingConfigurations();
    public boolean isChild();
    public boolean isDestroyed();
    public boolean isDisablingEnterExitEventForAutofill();
    public boolean isFinishing();
    public boolean isImmersive();
    public boolean isInMultiWindowMode();
    public boolean isInPictureInPictureMode();
    public boolean isLocalVoiceInteractionSupported();
    public boolean isOverlayWithDecorCaptionEnabled();
    public boolean isResumed();
    public boolean isTaskRoot();
    public boolean isVoiceInteraction();
    public boolean isVoiceInteractionRoot();
    public android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String);
    public android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public boolean moveTaskToBack(boolean);
    public boolean navigateUpTo(android.content.Intent);
    public boolean navigateUpToFromChild(android.app.Activity, android.content.Intent);
    public void onActionModeFinished(android.view.ActionMode);
    public void onActionModeStarted(android.view.ActionMode);
    public void onActivityReenter(int, android.content.Intent);
    protected void onActivityResult(int, int, android.content.Intent);
    protected void onApplyThemeResource(android.content.res.Resources$Theme, int, boolean);
    public void onAttachFragment(android.app.Fragment);
    public void onAttachedToWindow();
    public void onBackPressed();
    public void onBackgroundVisibleBehindChanged(boolean);
    protected void onChildTitleChanged(android.app.Activity, java.lang.CharSequence);
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onContentChanged();
    public boolean onContextItemSelected(android.view.MenuItem);
    public void onContextMenuClosed(android.view.Menu);
    protected void onCreate(android.os.Bundle);
    public void onCreate(android.os.Bundle, android.os.PersistableBundle);
    public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
    public java.lang.CharSequence onCreateDescription();
    protected android.app.Dialog onCreateDialog(int);
    protected android.app.Dialog onCreateDialog(int, android.os.Bundle);
    public void onCreateNavigateUpTaskStack(android.app.TaskStackBuilder);
    public boolean onCreateOptionsMenu(android.view.Menu);
    public boolean onCreatePanelMenu(int, android.view.Menu);
    public android.view.View onCreatePanelView(int);
    public boolean onCreateThumbnail(android.graphics.Bitmap, android.graphics.Canvas);
    public android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);
    public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
    protected void onDestroy();
    public void onDetachedFromWindow();
    public void onEnterAnimationComplete();
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public boolean onKeyDown(int, android.view.KeyEvent);
    public boolean onKeyLongPress(int, android.view.KeyEvent);
    public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onKeyUp(int, android.view.KeyEvent);
    public void onLocalVoiceInteractionStarted();
    public void onLocalVoiceInteractionStopped();
    public void onLowMemory();
    public boolean onMenuItemSelected(int, android.view.MenuItem);
    public boolean onMenuOpened(int, android.view.Menu);
    public void onMovedToDisplay(int, android.content.res.Configuration);
    public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
    public void onMultiWindowModeChanged(boolean);
    public boolean onNavigateUp();
    public boolean onNavigateUpFromChild(android.app.Activity);
    public void onNewActivityOptions(android.app.ActivityOptions);
    protected void onNewIntent(android.content.Intent);
    public boolean onOptionsItemSelected(android.view.MenuItem);
    public void onOptionsMenuClosed(android.view.Menu);
    public void onPanelClosed(int, android.view.Menu);
    protected void onPause();
    public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
    public void onPictureInPictureModeChanged(boolean);
    protected void onPostCreate(android.os.Bundle);
    public void onPostCreate(android.os.Bundle, android.os.PersistableBundle);
    protected void onPostResume();
    protected void onPrepareDialog(int, android.app.Dialog);
    protected void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
    public void onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder);
    public boolean onPrepareOptionsMenu(android.view.Menu);
    public boolean onPreparePanel(int, android.view.View, android.view.Menu);
    public void onProvideAssistContent(android.app.assist.AssistContent);
    public void onProvideAssistData(android.os.Bundle);
    public void onProvideKeyboardShortcuts(java.util.List, android.view.Menu, int);
    public android.net.Uri onProvideReferrer();
    public void onRequestPermissionsResult(int, java.lang.String[], int[]);
    protected void onRestart();
    protected void onRestoreInstanceState(android.os.Bundle);
    public void onRestoreInstanceState(android.os.Bundle, android.os.PersistableBundle);
    protected void onResume();
    public java.lang.Object onRetainNonConfigurationInstance();
    protected void onSaveInstanceState(android.os.Bundle);
    public void onSaveInstanceState(android.os.Bundle, android.os.PersistableBundle);
    public boolean onSearchRequested(android.view.SearchEvent);
    public boolean onSearchRequested();
    protected void onStart();
    public void onStateNotSaved();
    protected void onStop();
    protected void onTitleChanged(java.lang.CharSequence, int);
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean onTrackballEvent(android.view.MotionEvent);
    public void onTrimMemory(int);
    public void onUserInteraction();
    protected void onUserLeaveHint();
    public void onVisibleBehindCanceled();
    public void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public void onWindowDismissed(boolean, boolean);
    public void onWindowFocusChanged(boolean);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);
    public void openContextMenu(android.view.View);
    public void openOptionsMenu();
    public void overridePendingTransition(int, int);
    public void postponeEnterTransition();
    public void recreate();
    public void registerForContextMenu(android.view.View);
    public void registerRemoteAnimations(android.view.RemoteAnimationDefinition);
    public boolean releaseInstance();
    public void removeDialog(int);
    public void reportFullyDrawn();
    public android.view.DragAndDropPermissions requestDragAndDropPermissions(android.view.DragEvent);
    public void requestPermissions(java.lang.String[], int);
    public void requestShowKeyboardShortcuts();
    public boolean requestVisibleBehind(boolean);
    public boolean requestWindowFeature(int);
    public android.view.View requireViewById(int);
    public void runOnUiThread(java.lang.Runnable);
    public void setActionBar(android.widget.Toolbar);
    public void setContentTransitionManager(android.transition.TransitionManager);
    public void setContentView(int);
    public void setContentView(android.view.View);
    public void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void setDefaultKeyMode(int);
    public void setDisablePreviewScreenshots(boolean);
    public void setEnterSharedElementCallback(android.app.SharedElementCallback);
    public void setExitSharedElementCallback(android.app.SharedElementCallback);
    public void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    public void setFeatureDrawableAlpha(int, int);
    public void setFeatureDrawableResource(int, int);
    public void setFeatureDrawableUri(int, android.net.Uri);
    public void setFinishOnTouchOutside(boolean);
    public void setImmersive(boolean);
    public void setIntent(android.content.Intent);
    public void setMediaController(android.media.session.MediaController);
    public void setOverlayWithDecorCaptionEnabled(boolean);
    public void setPersistent(boolean);
    public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
    public void setPictureInPictureParams(android.app.PictureInPictureParams);
    public void setProgress(int);
    public void setProgressBarIndeterminate(boolean);
    public void setProgressBarIndeterminateVisibility(boolean);
    public void setProgressBarVisibility(boolean);
    public void setRequestedOrientation(int);
    public void setResult(int);
    public void setResult(int, android.content.Intent);
    public void setSecondaryProgress(int);
    public void setShowWhenLocked(boolean);
    public void setTaskDescription(android.app.ActivityManager$TaskDescription);
    public void setTheme(int);
    public void setTitle(java.lang.CharSequence);
    public void setTitle(int);
    public void setTitleColor(int);
    public void setTurnScreenOn(boolean);
    public void setVisible(boolean);
    public void setVolumeControlStream(int);
    public void setVrModeEnabled(boolean, android.content.ComponentName);
    public boolean shouldShowRequestPermissionRationale(java.lang.String);
    public boolean shouldUpRecreateTask(android.content.Intent);
    public boolean showAssist(android.os.Bundle);
    public void showDialog(int);
    public boolean showDialog(int, android.os.Bundle);
    public void showLockTaskEscapeMessage();
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback, int);
    public void startActivities(android.content.Intent[]);
    public void startActivities(android.content.Intent[], android.os.Bundle);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsCaller(android.content.Intent, android.os.Bundle, boolean, int);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public void startActivityAsUserFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResult(android.content.Intent, int);
    public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
    public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
    public void startActivityForResultAsUser(android.content.Intent, int, android.os.UserHandle);
    public void startActivityForResultAsUser(android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResultAsUser(android.content.Intent, java.lang.String, int, android.os.Bundle, android.os.UserHandle);
    public void startActivityFromChild(android.app.Activity, android.content.Intent, int);
    public void startActivityFromChild(android.app.Activity, android.content.Intent, int, android.os.Bundle);
    public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int);
    public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
    public boolean startActivityIfNeeded(android.content.Intent, int);
    public boolean startActivityIfNeeded(android.content.Intent, int, android.os.Bundle);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int);
    public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int);
    public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startIntentSenderFromChildFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startLocalVoiceInteraction(android.os.Bundle);
    public void startLockTask();
    public void startManagingCursor(android.database.Cursor);
    public boolean startNextMatchingActivity(android.content.Intent);
    public boolean startNextMatchingActivity(android.content.Intent, android.os.Bundle);
    public void startPostponedEnterTransition();
    public void startSearch(java.lang.String, boolean, android.os.Bundle, boolean);
    public void stopLocalVoiceInteraction();
    public void stopLockTask();
    public void stopManagingCursor(android.database.Cursor);
    public void takeKeyEvents(boolean);
    public void triggerSearch(java.lang.String, android.os.Bundle);
    public void unregisterForContextMenu(android.view.View);


    public static int DEFAULT_KEYS_DIALER;
    public static int DEFAULT_KEYS_DISABLE;
    public static int DEFAULT_KEYS_SEARCH_GLOBAL;
    public static int DEFAULT_KEYS_SEARCH_LOCAL;
    public static int DEFAULT_KEYS_SHORTCUT;
    public static int DONT_FINISH_TASK_WITH_ACTIVITY;
    public static int FINISH_TASK_WITH_ACTIVITY;
    public static int FINISH_TASK_WITH_ROOT_ACTIVITY;
    protected static int[] FOCUSED_STATE_SET;
    public static int RESULT_CANCELED;
    public static int RESULT_FIRST_USER;
    public static int RESULT_OK;
}

-keep class android.app.Activity$NonConfigurationInstances {



}

-keep class android.app.Activity$TranslucentConversionListener {

    public abstract void onTranslucentConversionComplete(boolean);


}

-keep class android.app.ActivityManager {

    public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager$TaskDescription, android.graphics.Bitmap);
    public void addOnUidImportanceListener(android.app.ActivityManager$OnUidImportanceListener, int);
    public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
    public static void broadcastStickyIntent(android.content.Intent, int);
    public static void broadcastStickyIntent(android.content.Intent, int, int);
    public static int checkComponentPermission(java.lang.String, int, int, boolean);
    public static int checkUidPermission(java.lang.String, int);
    public boolean clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver);
    public boolean clearApplicationUserData();
    public void clearGrantedUriPermissions(java.lang.String);
    public void clearWatchHeapLimit();
    public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
    public static void dumpPackageStateStatic(java.io.FileDescriptor, java.lang.String);
    public void forceStopPackage(java.lang.String);
    public void forceStopPackageAsUser(java.lang.String, int);
    public android.util.Size getAppTaskThumbnailSize();
    public java.util.List getAppTasks();
    public static int getCurrentUser();
    public static int getDefaultAppRecentsLimitStatic();
    public android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
    public int getFrontActivityScreenCompatMode();
    public android.content.pm.ParceledListSlice getGrantedUriPermissions(java.lang.String);
    public int getLargeMemoryClass();
    public int getLauncherLargeIconDensity();
    public int getLauncherLargeIconSize();
    public int getLockTaskModeState();
    public static int getMaxAppRecentsLimitStatic();
    public static int getMaxNumPictureInPictureActions();
    public static int getMaxRecentTasksStatic();
    public int getMemoryClass();
    public void getMemoryInfo(android.app.ActivityManager$MemoryInfo);
    public static void getMyMemoryState(android.app.ActivityManager$RunningAppProcessInfo);
    public boolean getPackageAskScreenCompat(java.lang.String);
    public int getPackageImportance(java.lang.String);
    public int getPackageScreenCompatMode(java.lang.String);
    public android.os.Debug$MemoryInfo[] getProcessMemoryInfo(int[]);
    public java.util.List getProcessesInErrorState();
    public java.util.List getRecentTasks(int, int);
    public java.util.List getRunningAppProcesses();
    public java.util.List getRunningExternalApplications();
    public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName);
    public java.util.List getRunningServices(int);
    public java.util.List getRunningTasks(int);
    public static android.app.IActivityManager getService();
    public long getTotalRam();
    public int getUidImportance(int);
    public static int handleIncomingUser(int, int, int, boolean, boolean, java.lang.String, java.lang.String);
    public boolean isBackgroundRestricted();
    public static boolean isHighEndGfx();
    public boolean isInLockTaskMode();
    public boolean isLowRamDevice();
    public static boolean isLowRamDeviceStatic();
    public static boolean isProcStateBackground(int);
    public static boolean isRunningInTestHarness();
    public static boolean isSmallBatteryDevice();
    public static boolean isStartResultFatalError(int);
    public static boolean isStartResultSuccessful(int);
    public static boolean isSystemReady();
    public static boolean isUserAMonkey();
    public boolean isUserRunning(int);
    public boolean isVrModePackageEnabled(android.content.ComponentName);
    public void killBackgroundProcesses(java.lang.String);
    public void killUid(int, java.lang.String);
    public static void logoutCurrentUser();
    public void moveTaskToFront(int, int);
    public void moveTaskToFront(int, int, android.os.Bundle);
    public static void noteAlarmFinish(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String);
    public static void noteAlarmStart(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String);
    public static void noteWakeupAlarm(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String, java.lang.String);
    public static int processStateAmToProto(int);
    public void removeOnUidImportanceListener(android.app.ActivityManager$OnUidImportanceListener);
    public void removeStacksInWindowingModes(int[]);
    public void removeStacksWithActivityTypes(int[]);
    public void resizeStack(int, android.graphics.Rect);
    public void restartPackage(java.lang.String);
    public void setFrontActivityScreenCompatMode(int);
    public void setPackageAskScreenCompat(java.lang.String, boolean);
    public void setPackageScreenCompatMode(java.lang.String, int);
    public static void setPersistentVrThread(int);
    public boolean setProcessMemoryTrimLevel(java.lang.String, int, int);
    public void setTaskWindowingMode(int, int, boolean);
    public void setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean);
    public static void setVrThread(int);
    public void setWatchHeapLimit(long);
    public static int staticGetLargeMemoryClass();
    public static int staticGetMemoryClass();
    public static boolean supportsMultiWindow(android.content.Context);
    public static boolean supportsSplitScreenMultiWindow(android.content.Context);
    public boolean switchUser(int);


    public static java.lang.String ACTION_REPORT_HEAP_LIMIT;
    public static int APP_START_MODE_DELAYED;
    public static int APP_START_MODE_DELAYED_RIGID;
    public static int APP_START_MODE_DISABLED;
    public static int APP_START_MODE_NORMAL;
    public static int ASSIST_CONTEXT_AUTOFILL;
    public static int ASSIST_CONTEXT_BASIC;
    public static int ASSIST_CONTEXT_FULL;
    public static int BROADCAST_FAILED_USER_STOPPED;
    public static int BROADCAST_STICKY_CANT_HAVE_PERMISSION;
    public static int BROADCAST_SUCCESS;
    public static int BUGREPORT_OPTION_FULL;
    public static int BUGREPORT_OPTION_INTERACTIVE;
    public static int BUGREPORT_OPTION_REMOTE;
    public static int BUGREPORT_OPTION_TELEPHONY;
    public static int BUGREPORT_OPTION_WEAR;
    public static int BUGREPORT_OPTION_WIFI;
    public static int COMPAT_MODE_ALWAYS;
    public static int COMPAT_MODE_DISABLED;
    public static int COMPAT_MODE_ENABLED;
    public static int COMPAT_MODE_NEVER;
    public static int COMPAT_MODE_TOGGLE;
    public static int COMPAT_MODE_UNKNOWN;
    public static int FLAG_AND_LOCKED;
    public static int FLAG_AND_UNLOCKED;
    public static int FLAG_AND_UNLOCKING_OR_UNLOCKED;
    public static int FLAG_OR_STOPPED;
    public static int INTENT_SENDER_ACTIVITY;
    public static int INTENT_SENDER_ACTIVITY_RESULT;
    public static int INTENT_SENDER_BROADCAST;
    public static int INTENT_SENDER_FOREGROUND_SERVICE;
    public static int INTENT_SENDER_SERVICE;
    public static int LOCK_TASK_MODE_LOCKED;
    public static int LOCK_TASK_MODE_NONE;
    public static int LOCK_TASK_MODE_PINNED;
    public static int MAX_PROCESS_STATE;
    public static java.lang.String META_HOME_ALTERNATE;
    public static int MIN_PROCESS_STATE;
    public static int MOVE_TASK_NO_USER_ACTION;
    public static int MOVE_TASK_WITH_HOME;
    public static int PROCESS_STATE_BACKUP;
    public static int PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
    public static int PROCESS_STATE_CACHED_ACTIVITY;
    public static int PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
    public static int PROCESS_STATE_CACHED_EMPTY;
    public static int PROCESS_STATE_CACHED_RECENT;
    public static int PROCESS_STATE_FOREGROUND_SERVICE;
    public static int PROCESS_STATE_HEAVY_WEIGHT;
    public static int PROCESS_STATE_HOME;
    public static int PROCESS_STATE_IMPORTANT_BACKGROUND;
    public static int PROCESS_STATE_IMPORTANT_FOREGROUND;
    public static int PROCESS_STATE_LAST_ACTIVITY;
    public static int PROCESS_STATE_NONEXISTENT;
    public static int PROCESS_STATE_PERSISTENT;
    public static int PROCESS_STATE_PERSISTENT_UI;
    public static int PROCESS_STATE_RECEIVER;
    public static int PROCESS_STATE_SERVICE;
    public static int PROCESS_STATE_TOP;
    public static int PROCESS_STATE_TOP_SLEEPING;
    public static int PROCESS_STATE_TRANSIENT_BACKGROUND;
    public static int PROCESS_STATE_UNKNOWN;
    public static int RECENT_IGNORE_UNAVAILABLE;
    public static int RECENT_WITH_EXCLUDED;
    public static int RESIZE_MODE_FORCED;
    public static int RESIZE_MODE_PRESERVE_WINDOW;
    public static int RESIZE_MODE_SYSTEM;
    public static int RESIZE_MODE_SYSTEM_SCREEN_ROTATION;
    public static int RESIZE_MODE_USER;
    public static int RESIZE_MODE_USER_FORCED;
    public static int SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
    public static int SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
    public static int START_ABORTED;
    public static int START_ASSISTANT_HIDDEN_SESSION;
    public static int START_ASSISTANT_NOT_ACTIVE_SESSION;
    public static int START_CANCELED;
    public static int START_CLASS_NOT_FOUND;
    public static int START_DELIVERED_TO_TOP;
    public static int START_FLAG_DEBUG;
    public static int START_FLAG_NATIVE_DEBUGGING;
    public static int START_FLAG_ONLY_IF_NEEDED;
    public static int START_FLAG_TRACK_ALLOCATION;
    public static int START_FORWARD_AND_REQUEST_CONFLICT;
    public static int START_INTENT_NOT_RESOLVED;
    public static int START_NOT_ACTIVITY;
    public static int START_NOT_CURRENT_USER_ACTIVITY;
    public static int START_NOT_VOICE_COMPATIBLE;
    public static int START_PERMISSION_DENIED;
    public static int START_RETURN_INTENT_TO_CALLER;
    public static int START_RETURN_LOCK_TASK_MODE_VIOLATION;
    public static int START_SUCCESS;
    public static int START_SWITCHES_CANCELED;
    public static int START_TASK_TO_FRONT;
    public static int START_VOICE_HIDDEN_SESSION;
    public static int START_VOICE_NOT_ACTIVE_SESSION;
    public static int UID_OBSERVER_ACTIVE;
    public static int UID_OBSERVER_CACHED;
    public static int UID_OBSERVER_GONE;
    public static int UID_OBSERVER_IDLE;
    public static int UID_OBSERVER_PROCSTATE;
    public static int USER_OP_ERROR_IS_SYSTEM;
    public static int USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
    public static int USER_OP_IS_CURRENT;
    public static int USER_OP_SUCCESS;
    public static int USER_OP_UNKNOWN_USER;
}

-keep class android.app.ActivityManager$AppTask {
    <init>(android.app.IAppTask);

    public void finishAndRemoveTask();
    public android.app.ActivityManager$RecentTaskInfo getTaskInfo();
    public void moveToFront();
    public void setExcludeFromRecents(boolean);
    public void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);


}

-keep class android.app.ActivityManager$MemoryInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public long availMem;
    public long foregroundAppThreshold;
    public long hiddenAppThreshold;
    public boolean lowMemory;
    public long secondaryServerThreshold;
    public long threshold;
    public long totalMem;
    public long visibleAppThreshold;
}

-keep class android.app.ActivityManager$OnUidImportanceListener {

    public abstract void onUidImportance(int, int);


}

-keep class android.app.ActivityManager$ProcessErrorStateInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static int CRASHED;
    public static android.os.Parcelable$Creator CREATOR;
    public static int NOT_RESPONDING;
    public static int NO_ERROR;
    public int condition;
    public byte[] crashData;
    public java.lang.String longMsg;
    public int pid;
    public java.lang.String processName;
    public java.lang.String shortMsg;
    public java.lang.String stackTrace;
    public java.lang.String tag;
    public int uid;
}

-keep class android.app.ActivityManager$RecentTaskInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int affiliatedTaskColor;
    public int affiliatedTaskId;
    public android.content.ComponentName baseActivity;
    public android.content.Intent baseIntent;
    public android.graphics.Rect bounds;
    public android.content.res.Configuration configuration;
    public java.lang.CharSequence description;
    public long firstActiveTime;
    public int id;
    public long lastActiveTime;
    public int numActivities;
    public android.content.ComponentName origActivity;
    public int persistentId;
    public android.content.ComponentName realActivity;
    public int resizeMode;
    public int stackId;
    public boolean supportsSplitScreenMultiWindow;
    public android.app.ActivityManager$TaskDescription taskDescription;
    public android.content.ComponentName topActivity;
    public int userId;
}

-keep class android.app.ActivityManager$RunningAppProcessInfo {
    <init>();
    <init>(java.lang.String, int, java.lang.String[]);

    public int describeContents();
    public static int importanceToProcState(int);
    public static int procStateToImportance(int);
    public static int procStateToImportanceForClient(int, android.content.Context);
    public static int procStateToImportanceForTargetSdk(int, int);
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_CANT_SAVE_STATE;
    public static int FLAG_HAS_ACTIVITIES;
    public static int FLAG_PERSISTENT;
    public static int IMPORTANCE_BACKGROUND;
    public static int IMPORTANCE_CACHED;
    public static int IMPORTANCE_CANT_SAVE_STATE;
    public static int IMPORTANCE_CANT_SAVE_STATE_PRE_26;
    public static int IMPORTANCE_EMPTY;
    public static int IMPORTANCE_FOREGROUND;
    public static int IMPORTANCE_FOREGROUND_SERVICE;
    public static int IMPORTANCE_GONE;
    public static int IMPORTANCE_PERCEPTIBLE;
    public static int IMPORTANCE_PERCEPTIBLE_PRE_26;
    public static int IMPORTANCE_SERVICE;
    public static int IMPORTANCE_TOP_SLEEPING;
    public static int IMPORTANCE_TOP_SLEEPING_PRE_28;
    public static int IMPORTANCE_VISIBLE;
    public static int REASON_PROVIDER_IN_USE;
    public static int REASON_SERVICE_IN_USE;
    public static int REASON_UNKNOWN;
    public int flags;
    public int importance;
    public int importanceReasonCode;
    public android.content.ComponentName importanceReasonComponent;
    public int importanceReasonImportance;
    public int importanceReasonPid;
    public int lastTrimLevel;
    public int lru;
    public int pid;
    public java.lang.String[] pkgList;
    public java.lang.String processName;
    public int processState;
    public int uid;
}

-keep class android.app.ActivityManager$RunningServiceInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_FOREGROUND;
    public static int FLAG_PERSISTENT_PROCESS;
    public static int FLAG_STARTED;
    public static int FLAG_SYSTEM_PROCESS;
    public long activeSince;
    public int clientCount;
    public int clientLabel;
    public java.lang.String clientPackage;
    public int crashCount;
    public int flags;
    public boolean foreground;
    public long lastActivityTime;
    public int pid;
    public java.lang.String process;
    public long restarting;
    public android.content.ComponentName service;
    public boolean started;
    public int uid;
}

-keep class android.app.ActivityManager$RunningTaskInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.ComponentName baseActivity;
    public android.content.res.Configuration configuration;
    public java.lang.CharSequence description;
    public int id;
    public long lastActiveTime;
    public int numActivities;
    public int numRunning;
    public int resizeMode;
    public int stackId;
    public boolean supportsSplitScreenMultiWindow;
    public android.graphics.Bitmap thumbnail;
    public android.content.ComponentName topActivity;
}

-keep class android.app.ActivityManager$StackInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public java.lang.String toString(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.graphics.Rect bounds;
    public android.content.res.Configuration configuration;
    public int displayId;
    public int position;
    public int stackId;
    public android.graphics.Rect[] taskBounds;
    public int[] taskIds;
    public java.lang.String[] taskNames;
    public int[] taskUserIds;
    public android.content.ComponentName topActivity;
    public int userId;
    public boolean visible;
}

-keep class android.app.ActivityManager$TaskDescription {
    <init>(java.lang.String, android.graphics.Bitmap, int);
    <init>(java.lang.String, int, int);
    <init>(java.lang.String, android.graphics.Bitmap);
    <init>(java.lang.String, int);
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, android.graphics.Bitmap, int, java.lang.String, int, int, int, int);
    <init>(android.app.ActivityManager$TaskDescription);

    public void copyFrom(android.app.ActivityManager$TaskDescription);
    public void copyFromPreserveHiddenFields(android.app.ActivityManager$TaskDescription);
    public int describeContents();
    public int getBackgroundColor();
    public android.graphics.Bitmap getIcon();
    public java.lang.String getIconFilename();
    public int getIconResource();
    public android.graphics.Bitmap getInMemoryIcon();
    public java.lang.String getLabel();
    public int getNavigationBarColor();
    public int getPrimaryColor();
    public int getStatusBarColor();
    public static android.graphics.Bitmap loadTaskDescriptionIcon(java.lang.String, int);
    public void readFromParcel(android.os.Parcel);
    public void restoreFromXml(java.lang.String, java.lang.String);
    public void saveToXml(org.xmlpull.v1.XmlSerializer);
    public void setBackgroundColor(int);
    public void setIcon(android.graphics.Bitmap);
    public void setIcon(int);
    public void setIconFilename(java.lang.String);
    public void setLabel(java.lang.String);
    public void setNavigationBarColor(int);
    public void setPrimaryColor(int);
    public void setStatusBarColor(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static java.lang.String ATTR_TASKDESCRIPTION_PREFIX;
    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ActivityManager$TaskSnapshot {
    <init>(android.graphics.GraphicBuffer, int, android.graphics.Rect, boolean, float, boolean, int, int, boolean);

    public int describeContents();
    public android.graphics.Rect getContentInsets();
    public int getOrientation();
    public float getScale();
    public android.graphics.GraphicBuffer getSnapshot();
    public int getSystemUiVisibility();
    public int getWindowingMode();
    public boolean isRealSnapshot();
    public boolean isReducedResolution();
    public boolean isTranslucent();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ActivityOptions {
    <init>(android.os.Bundle);

    public void abort();
    public static void abort(android.app.ActivityOptions);
    public boolean canTaskOverlayResume();
    public boolean disallowEnterPictureInPictureWhileLaunching();
    public android.app.ActivityOptions forTargetActivity();
    public static android.app.ActivityOptions fromBundle(android.os.Bundle);
    public android.view.AppTransitionAnimationSpec[] getAnimSpecs();
    public android.os.IRemoteCallback getAnimationFinishedListener();
    public int getAnimationType();
    public boolean getAvoidMoveToFront();
    public int getCustomEnterResId();
    public int getCustomExitResId();
    public int getCustomInPlaceResId();
    public int getExitCoordinatorKey();
    public int getHeight();
    public int getLaunchActivityType();
    public android.graphics.Rect getLaunchBounds();
    public int getLaunchDisplayId();
    public boolean getLaunchTaskBehind();
    public int getLaunchTaskId();
    public int getLaunchWindowingMode();
    public boolean getLockTaskMode();
    public android.os.IRemoteCallback getOnAnimationStartListener();
    public java.lang.String getPackageName();
    public android.view.RemoteAnimationAdapter getRemoteAnimationAdapter();
    public int getResultCode();
    public android.content.Intent getResultData();
    public android.os.ResultReceiver getResultReceiver();
    public int getRotationAnimationHint();
    public java.util.ArrayList getSharedElementNames();
    public android.view.IAppTransitionAnimationSpecsFuture getSpecsFuture();
    public int getSplitScreenCreateMode();
    public int getStartX();
    public int getStartY();
    public boolean getTaskOverlay();
    public android.graphics.GraphicBuffer getThumbnail();
    public android.app.PendingIntent getUsageTimeReport();
    public int getWidth();
    public boolean isReturning();
    public static android.app.ActivityOptions makeBasic();
    public static android.app.ActivityOptions makeClipRevealAnimation(android.view.View, int, int, int, int);
    public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int);
    public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int, android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener);
    public static android.app.ActivityOptions makeCustomInPlaceAnimation(android.content.Context, int);
    public static android.app.ActivityOptions makeMultiThumbFutureAspectScaleAnimation(android.content.Context, android.os.Handler, android.view.IAppTransitionAnimationSpecsFuture, android.app.ActivityOptions$OnAnimationStartedListener, boolean);
    public static android.app.ActivityOptions makeOpenCrossProfileAppsAnimation();
    public static android.app.ActivityOptions makeRemoteAnimation(android.view.RemoteAnimationAdapter);
    public static android.app.ActivityOptions makeScaleUpAnimation(android.view.View, int, int, int, int);
    public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
    public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.util.Pair[]);
    public static android.app.ActivityOptions makeTaskLaunchBehind();
    public static android.app.ActivityOptions makeThumbnailAspectScaleDownAnimation(android.view.View, android.graphics.Bitmap, int, int, int, int, android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener);
    public static android.app.ActivityOptions makeThumbnailAspectScaleDownAnimation(android.view.View, android.view.AppTransitionAnimationSpec[], android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener, android.app.ActivityOptions$OnAnimationFinishedListener);
    public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
    public android.os.Bundle popAppVerificationBundle();
    public void requestUsageTimeReport(android.app.PendingIntent);
    public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
    public void setAvoidMoveToFront();
    public void setDisallowEnterPictureInPictureWhileLaunching(boolean);
    public void setLaunchActivityType(int);
    public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
    public android.app.ActivityOptions setLaunchDisplayId(int);
    public void setLaunchTaskId(int);
    public void setLaunchWindowingMode(int);
    public android.app.ActivityOptions setLockTaskEnabled(boolean);
    public void setRemoteAnimationAdapter(android.view.RemoteAnimationAdapter);
    public void setRotationAnimationHint(int);
    public void setSplitScreenCreateMode(int);
    public void setTaskOverlay(boolean, boolean);
    public static android.app.ActivityOptions startSharedElementAnimation(android.view.Window, android.util.Pair[]);
    public static void stopSharedElementAnimation(android.view.Window);
    public android.os.Bundle toBundle();
    public java.lang.String toString();
    public void update(android.app.ActivityOptions);


    public static int ANIM_CLIP_REVEAL;
    public static int ANIM_CUSTOM;
    public static int ANIM_CUSTOM_IN_PLACE;
    public static int ANIM_DEFAULT;
    public static int ANIM_LAUNCH_TASK_BEHIND;
    public static int ANIM_NONE;
    public static int ANIM_OPEN_CROSS_PROFILE_APPS;
    public static int ANIM_REMOTE_ANIMATION;
    public static int ANIM_SCALE_UP;
    public static int ANIM_SCENE_TRANSITION;
    public static int ANIM_THUMBNAIL_ASPECT_SCALE_DOWN;
    public static int ANIM_THUMBNAIL_ASPECT_SCALE_UP;
    public static int ANIM_THUMBNAIL_SCALE_DOWN;
    public static int ANIM_THUMBNAIL_SCALE_UP;
    public static java.lang.String EXTRA_USAGE_TIME_REPORT;
    public static java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES;
    public static java.lang.String KEY_ANIM_ENTER_RES_ID;
    public static java.lang.String KEY_ANIM_EXIT_RES_ID;
    public static java.lang.String KEY_ANIM_HEIGHT;
    public static java.lang.String KEY_ANIM_IN_PLACE_RES_ID;
    public static java.lang.String KEY_ANIM_START_LISTENER;
    public static java.lang.String KEY_ANIM_START_X;
    public static java.lang.String KEY_ANIM_START_Y;
    public static java.lang.String KEY_ANIM_THUMBNAIL;
    public static java.lang.String KEY_ANIM_TYPE;
    public static java.lang.String KEY_ANIM_WIDTH;
    public static java.lang.String KEY_LAUNCH_BOUNDS;
    public static java.lang.String KEY_PACKAGE_NAME;
}

-keep class android.app.ActivityOptions$OnAnimationFinishedListener {

    public abstract void onAnimationFinished();


}

-keep class android.app.ActivityOptions$OnAnimationStartedListener {

    public abstract void onAnimationStarted();


}

-keep class android.app.ActivityThread {

    public android.content.IContentProvider acquireExistingProvider(android.content.Context, java.lang.String, int, boolean);
    public android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String, int, boolean);
    public void applyConfigurationToResources(android.content.res.Configuration);
    public static android.app.ActivityThread currentActivityThread();
    public static android.app.Application currentApplication();
    public static java.lang.String currentOpPackageName();
    public static java.lang.String currentPackageName();
    public static java.lang.String currentProcessName();
    public static void dumpMemInfoTable(java.io.PrintWriter, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, int, java.lang.String, long, long, long, long, long, long);
    public static void dumpMemInfoTable(android.util.proto.ProtoOutputStream, android.os.Debug$MemoryInfo, boolean, boolean, long, long, long, long, long, long);
    public android.app.Activity getActivity(android.os.IBinder);
    public android.app.ActivityThread$ActivityClientRecord getActivityClient(android.os.IBinder);
    public android.app.Application getApplication();
    public android.app.ActivityThread$ApplicationThread getApplicationThread();
    public java.util.concurrent.Executor getExecutor();
    public android.app.Instrumentation getInstrumentation();
    public int getIntCoreSetting(java.lang.String, int);
    public static android.content.Intent getIntentBeingBroadcast();
    public android.os.Looper getLooper();
    public android.app.LoadedApk getPackageInfo(java.lang.String, android.content.res.CompatibilityInfo, int);
    public android.app.LoadedApk getPackageInfo(java.lang.String, android.content.res.CompatibilityInfo, int, int);
    public android.app.LoadedApk getPackageInfo(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
    public android.app.LoadedApk getPackageInfoNoCheck(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public static android.content.pm.IPackageManager getPackageManager();
    public java.lang.String getProcessName();
    public java.lang.String getProfileFilePath();
    public android.app.ContextImpl getSystemContext();
    public android.app.ContextImpl getSystemUiContext();
    public void handleActivityConfigurationChanged(android.os.IBinder, android.content.res.Configuration, int);
    public void handleConfigurationChanged(android.content.res.Configuration);
    public void handleDestroyActivity(android.os.IBinder, boolean, int, boolean, java.lang.String);
    public void handleInstallProvider(android.content.pm.ProviderInfo);
    public android.app.Activity handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent);
    public void handleMultiWindowModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public void handleNewIntent(android.os.IBinder, java.util.List, boolean);
    public void handlePauseActivity(android.os.IBinder, boolean, boolean, int, android.app.servertransaction.PendingTransactionActions, java.lang.String);
    public void handlePictureInPictureModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public void handleRelaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public void handleRequestAssistContextExtras(android.app.ActivityThread$RequestAssistContextExtras);
    public void handleResumeActivity(android.os.IBinder, boolean, boolean, java.lang.String);
    public void handleSendResult(android.os.IBinder, java.util.List, java.lang.String);
    public void handleStartActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public void handleStopActivity(android.os.IBinder, boolean, int, android.app.servertransaction.PendingTransactionActions, boolean, java.lang.String);
    public void handleTranslucentConversionComplete(android.os.IBinder, boolean);
    public void handleWindowVisibility(android.os.IBinder, boolean);
    public void installSystemApplicationInfo(android.content.pm.ApplicationInfo, java.lang.ClassLoader);
    public void installSystemProviders(java.util.List);
    public boolean isProfiling();
    public static boolean isSystem();
    public static void main(java.lang.String[]);
    public void onNewActivityOptions(android.os.IBinder, android.app.ActivityOptions);
    public android.app.LoadedApk peekPackageInfo(java.lang.String, boolean);
    public void performRestartActivity(android.os.IBinder, boolean);
    public android.app.ActivityThread$ActivityClientRecord performResumeActivity(android.os.IBinder, boolean, java.lang.String);
    public android.app.ActivityThread$ActivityClientRecord prepareRelaunchActivity(android.os.IBinder, java.util.List, java.util.List, int, android.util.MergedConfiguration, boolean);
    public void registerOnActivityPausedListener(android.app.Activity, android.app.OnActivityPausedListener);
    public boolean releaseProvider(android.content.IContentProvider, boolean);
    public void reportRelaunch(android.os.IBinder, android.app.servertransaction.PendingTransactionActions);
    public void reportStop(android.app.servertransaction.PendingTransactionActions);
    public android.content.pm.ActivityInfo resolveActivityInfo(android.content.Intent);
    public void sendActivityResult(android.os.IBinder, java.lang.String, int, int, android.content.Intent);
    public android.app.Activity startActivityNow(android.app.Activity, java.lang.String, android.content.Intent, android.content.pm.ActivityInfo, android.os.IBinder, android.os.Bundle, android.app.Activity$NonConfigurationInstances);
    public void stopProfiling();
    public static android.app.ActivityThread systemMain();
    public void unregisterOnActivityPausedListener(android.app.Activity, android.app.OnActivityPausedListener);
    public void updatePendingConfiguration(android.content.res.Configuration);
    public void updateProcessState(int, boolean);


    public static boolean DEBUG_BROADCAST;
    public static boolean DEBUG_CONFIGURATION;
    public static boolean DEBUG_MEMORY_TRIM;
    public static boolean DEBUG_ORDER;
    public static long INVALID_PROC_STATE_SEQ;
    public static java.lang.String PROC_START_SEQ_IDENT;
    public static int SERVICE_DONE_EXECUTING_ANON;
    public static int SERVICE_DONE_EXECUTING_START;
    public static int SERVICE_DONE_EXECUTING_STOP;
    public static java.lang.String TAG;
}

-keep class android.app.ActivityThread$ActivityClientRecord {
    <init>();
    <init>(android.os.IBinder, android.content.Intent, int, android.content.pm.ActivityInfo, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.lang.String, com.android.internal.app.IVoiceInteractor, android.os.Bundle, android.os.PersistableBundle, java.util.List, java.util.List, boolean, android.app.ProfilerInfo, android.app.ClientTransactionHandler);

    public int getLifecycleState();
    public java.lang.String getStateString();
    public boolean isPersistable();
    public boolean isVisibleFromServer();
    public void setState(int);
    public java.lang.String toString();


    public boolean isForward;
    public android.app.LoadedApk packageInfo;
    public android.os.IBinder token;
}

-keep class android.app.ActivityThread$ApplicationThread {

    public void attachAgent(java.lang.String);
    public void bindApplication(java.lang.String, android.content.pm.ApplicationInfo, java.util.List, android.content.ComponentName, android.app.ProfilerInfo, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, boolean, boolean, boolean, boolean, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.util.Map, android.os.Bundle, java.lang.String, boolean);
    public void clearDnsCache();
    public void dispatchPackageBroadcast(int, java.lang.String[]);
    public void dumpActivity(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String, java.lang.String[]);
    public void dumpDbInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public void dumpGfxInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public void dumpHeap(boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
    public void dumpMemInfo(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, boolean, java.lang.String[]);
    public void dumpMemInfoProto(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, java.lang.String[]);
    public void dumpProvider(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public void dumpService(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public void handleTrustStorageUpdate();
    public void notifyCleartextNetwork(byte[]);
    public void processInBackground();
    public void profilerControl(boolean, android.app.ProfilerInfo, int);
    public void requestAssistContextExtras(android.os.IBinder, android.os.IBinder, int, int, int);
    public void runIsolatedEntryPoint(java.lang.String, java.lang.String[]);
    public void scheduleApplicationInfoChanged(android.content.pm.ApplicationInfo);
    public void scheduleBindService(android.os.IBinder, android.content.Intent, boolean, int);
    public void scheduleCrash(java.lang.String);
    public void scheduleCreateBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
    public void scheduleCreateService(android.os.IBinder, android.content.pm.ServiceInfo, android.content.res.CompatibilityInfo, int);
    public void scheduleDestroyBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public void scheduleEnterAnimationComplete(android.os.IBinder);
    public void scheduleExit();
    public void scheduleInstallProvider(android.content.pm.ProviderInfo);
    public void scheduleLocalVoiceInteractionStarted(android.os.IBinder, com.android.internal.app.IVoiceInteractor);
    public void scheduleLowMemory();
    public void scheduleOnNewActivityOptions(android.os.IBinder, android.os.Bundle);
    public void scheduleReceiver(android.content.Intent, android.content.pm.ActivityInfo, android.content.res.CompatibilityInfo, int, java.lang.String, android.os.Bundle, boolean, int, int);
    public void scheduleRegisteredReceiver(android.content.IIntentReceiver, android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int, int);
    public void scheduleServiceArgs(android.os.IBinder, android.content.pm.ParceledListSlice);
    public void scheduleSleeping(android.os.IBinder, boolean);
    public void scheduleStopService(android.os.IBinder);
    public void scheduleSuicide();
    public void scheduleTransaction(android.app.servertransaction.ClientTransaction);
    public void scheduleTranslucentConversionComplete(android.os.IBinder, boolean);
    public void scheduleTrimMemory(int);
    public void scheduleUnbindService(android.os.IBinder, android.content.Intent);
    public void setCoreSettings(android.os.Bundle);
    public void setHttpProxy(java.lang.String, java.lang.String, java.lang.String, android.net.Uri);
    public void setNetworkBlockSeq(long);
    public void setProcessState(int);
    public void setSchedulingGroup(int);
    public void startBinderTracking();
    public void stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
    public void unstableProviderDied(android.os.IBinder);
    public void updatePackageCompatibilityInfo(java.lang.String, android.content.res.CompatibilityInfo);
    public void updateProcessState(int, boolean);
    public void updateTimePrefs(int);
    public void updateTimeZone();


}

-keep class android.app.ActivityThread$RequestAssistContextExtras {



}

-keep class android.app.AppComponentFactory {
    <init>();

    public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
    public android.app.Application instantiateApplication(java.lang.ClassLoader, java.lang.String);
    public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
    public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
    public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);


    public static android.app.AppComponentFactory DEFAULT;
}

-keep class android.app.AppOpsManager {

    public int checkAudioOp(int, int, int, java.lang.String);
    public int checkAudioOpNoThrow(int, int, int, java.lang.String);
    public int checkOp(java.lang.String, int, java.lang.String);
    public int checkOp(int, int, java.lang.String);
    public int checkOpNoThrow(java.lang.String, int, java.lang.String);
    public int checkOpNoThrow(int, int, java.lang.String);
    public void checkPackage(int, java.lang.String);
    public void finishOp(java.lang.String, int, java.lang.String);
    public void finishOp(int, int, java.lang.String);
    public void finishOp(int);
    public static int getNumOps();
    public static java.lang.String[] getOpStrs();
    public java.util.List getOpsForPackage(int, java.lang.String, int[]);
    public java.util.List getPackagesForOps(int[]);
    public static android.os.IBinder getToken(com.android.internal.app.IAppOpsService);
    public boolean isOperationActive(int, int, java.lang.String);
    public static long maxTime(long[], int, int);
    public static java.lang.String modeToName(int);
    public int noteOp(java.lang.String, int, java.lang.String);
    public int noteOp(int, int, java.lang.String);
    public int noteOp(int);
    public int noteOpNoThrow(java.lang.String, int, java.lang.String);
    public int noteOpNoThrow(int, int, java.lang.String);
    public int noteProxyOp(java.lang.String, java.lang.String);
    public int noteProxyOp(int, java.lang.String);
    public int noteProxyOpNoThrow(java.lang.String, java.lang.String);
    public int noteProxyOpNoThrow(int, java.lang.String);
    public static boolean opAllowSystemBypassRestriction(int);
    public static boolean opAllowsReset(int);
    public static int opToDefaultMode(int);
    public static java.lang.String opToName(int);
    public static java.lang.String opToPermission(int);
    public static java.lang.String opToRestriction(int);
    public static int opToSwitch(int);
    public static java.lang.String permissionToOp(java.lang.String);
    public static int permissionToOpCode(java.lang.String);
    public void resetAllModes();
    public void setMode(int, int, java.lang.String, int);
    public void setMode(java.lang.String, int, java.lang.String, int);
    public void setRestriction(int, int, int, java.lang.String[]);
    public void setUidMode(int, int, int);
    public void setUidMode(java.lang.String, int, int);
    public void setUserRestriction(int, boolean, android.os.IBinder);
    public void setUserRestriction(int, boolean, android.os.IBinder, java.lang.String[]);
    public void setUserRestrictionForUser(int, boolean, android.os.IBinder, java.lang.String[], int);
    public int startOp(java.lang.String, int, java.lang.String);
    public int startOp(int);
    public int startOp(int, int, java.lang.String);
    public int startOp(int, int, java.lang.String, boolean);
    public int startOpNoThrow(java.lang.String, int, java.lang.String);
    public int startOpNoThrow(int, int, java.lang.String);
    public int startOpNoThrow(int, int, java.lang.String, boolean);
    public void startWatchingActive(int[], android.app.AppOpsManager$OnOpActiveChangedListener);
    public void startWatchingMode(java.lang.String, java.lang.String, android.app.AppOpsManager$OnOpChangedListener);
    public void startWatchingMode(java.lang.String, java.lang.String, int, android.app.AppOpsManager$OnOpChangedListener);
    public void startWatchingMode(int, java.lang.String, android.app.AppOpsManager$OnOpChangedListener);
    public void startWatchingMode(int, java.lang.String, int, android.app.AppOpsManager$OnOpChangedListener);
    public void stopWatchingActive(android.app.AppOpsManager$OnOpActiveChangedListener);
    public void stopWatchingMode(android.app.AppOpsManager$OnOpChangedListener);
    public static int strDebugOpToOp(java.lang.String);
    public static int strOpToOp(java.lang.String);
    public int unsafeCheckOpRaw(java.lang.String, int, java.lang.String);


    public static int MODE_ALLOWED;
    public static int MODE_DEFAULT;
    public static int MODE_ERRORED;
    public static int MODE_FOREGROUND;
    public static int MODE_IGNORED;
    public static java.lang.String[] MODE_NAMES;
    public static java.lang.String OPSTR_ACCEPT_HANDOVER;
    public static java.lang.String OPSTR_ACCESS_NOTIFICATIONS;
    public static java.lang.String OPSTR_ACTIVATE_VPN;
    public static java.lang.String OPSTR_ADD_VOICEMAIL;
    public static java.lang.String OPSTR_ANSWER_PHONE_CALLS;
    public static java.lang.String OPSTR_ASSIST_SCREENSHOT;
    public static java.lang.String OPSTR_ASSIST_STRUCTURE;
    public static java.lang.String OPSTR_AUDIO_ACCESSIBILITY_VOLUME;
    public static java.lang.String OPSTR_AUDIO_ALARM_VOLUME;
    public static java.lang.String OPSTR_AUDIO_BLUETOOTH_VOLUME;
    public static java.lang.String OPSTR_AUDIO_MASTER_VOLUME;
    public static java.lang.String OPSTR_AUDIO_MEDIA_VOLUME;
    public static java.lang.String OPSTR_AUDIO_NOTIFICATION_VOLUME;
    public static java.lang.String OPSTR_AUDIO_RING_VOLUME;
    public static java.lang.String OPSTR_AUDIO_VOICE_VOLUME;
    public static java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE;
    public static java.lang.String OPSTR_BLUETOOTH_SCAN;
    public static java.lang.String OPSTR_BODY_SENSORS;
    public static java.lang.String OPSTR_CALL_PHONE;
    public static java.lang.String OPSTR_CAMERA;
    public static java.lang.String OPSTR_CHANGE_WIFI_STATE;
    public static java.lang.String OPSTR_COARSE_LOCATION;
    public static java.lang.String OPSTR_FINE_LOCATION;
    public static java.lang.String OPSTR_GET_ACCOUNTS;
    public static java.lang.String OPSTR_GET_USAGE_STATS;
    public static java.lang.String OPSTR_GPS;
    public static java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND;
    public static java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS;
    public static java.lang.String OPSTR_MOCK_LOCATION;
    public static java.lang.String OPSTR_MONITOR_HIGH_POWER_LOCATION;
    public static java.lang.String OPSTR_MONITOR_LOCATION;
    public static java.lang.String OPSTR_MUTE_MICROPHONE;
    public static java.lang.String OPSTR_NEIGHBORING_CELLS;
    public static java.lang.String OPSTR_PICTURE_IN_PICTURE;
    public static java.lang.String OPSTR_PLAY_AUDIO;
    public static java.lang.String OPSTR_POST_NOTIFICATION;
    public static java.lang.String OPSTR_PROCESS_OUTGOING_CALLS;
    public static java.lang.String OPSTR_PROJECT_MEDIA;
    public static java.lang.String OPSTR_READ_CALENDAR;
    public static java.lang.String OPSTR_READ_CALL_LOG;
    public static java.lang.String OPSTR_READ_CELL_BROADCASTS;
    public static java.lang.String OPSTR_READ_CLIPBOARD;
    public static java.lang.String OPSTR_READ_CONTACTS;
    public static java.lang.String OPSTR_READ_EXTERNAL_STORAGE;
    public static java.lang.String OPSTR_READ_ICC_SMS;
    public static java.lang.String OPSTR_READ_PHONE_NUMBERS;
    public static java.lang.String OPSTR_READ_PHONE_STATE;
    public static java.lang.String OPSTR_READ_SMS;
    public static java.lang.String OPSTR_RECEIVE_EMERGENCY_BROADCAST;
    public static java.lang.String OPSTR_RECEIVE_MMS;
    public static java.lang.String OPSTR_RECEIVE_SMS;
    public static java.lang.String OPSTR_RECEIVE_WAP_PUSH;
    public static java.lang.String OPSTR_RECORD_AUDIO;
    public static java.lang.String OPSTR_REQUEST_DELETE_PACKAGES;
    public static java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES;
    public static java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND;
    public static java.lang.String OPSTR_RUN_IN_BACKGROUND;
    public static java.lang.String OPSTR_SEND_SMS;
    public static java.lang.String OPSTR_START_FOREGROUND;
    public static java.lang.String OPSTR_SYSTEM_ALERT_WINDOW;
    public static java.lang.String OPSTR_TAKE_AUDIO_FOCUS;
    public static java.lang.String OPSTR_TAKE_MEDIA_BUTTONS;
    public static java.lang.String OPSTR_TOAST_WINDOW;
    public static java.lang.String OPSTR_TURN_SCREEN_ON;
    public static java.lang.String OPSTR_USE_FINGERPRINT;
    public static java.lang.String OPSTR_USE_SIP;
    public static java.lang.String OPSTR_VIBRATE;
    public static java.lang.String OPSTR_WAKE_LOCK;
    public static java.lang.String OPSTR_WIFI_SCAN;
    public static java.lang.String OPSTR_WRITE_CALENDAR;
    public static java.lang.String OPSTR_WRITE_CALL_LOG;
    public static java.lang.String OPSTR_WRITE_CLIPBOARD;
    public static java.lang.String OPSTR_WRITE_CONTACTS;
    public static java.lang.String OPSTR_WRITE_EXTERNAL_STORAGE;
    public static java.lang.String OPSTR_WRITE_ICC_SMS;
    public static java.lang.String OPSTR_WRITE_SETTINGS;
    public static java.lang.String OPSTR_WRITE_SMS;
    public static java.lang.String OPSTR_WRITE_WALLPAPER;
    public static int OP_ACCEPT_HANDOVER;
    public static int OP_ACCESS_NOTIFICATIONS;
    public static int OP_ACTIVATE_VPN;
    public static int OP_ADD_VOICEMAIL;
    public static int OP_ANSWER_PHONE_CALLS;
    public static int OP_ASSIST_SCREENSHOT;
    public static int OP_ASSIST_STRUCTURE;
    public static int OP_AUDIO_ACCESSIBILITY_VOLUME;
    public static int OP_AUDIO_ALARM_VOLUME;
    public static int OP_AUDIO_BLUETOOTH_VOLUME;
    public static int OP_AUDIO_MASTER_VOLUME;
    public static int OP_AUDIO_MEDIA_VOLUME;
    public static int OP_AUDIO_NOTIFICATION_VOLUME;
    public static int OP_AUDIO_RING_VOLUME;
    public static int OP_AUDIO_VOICE_VOLUME;
    public static int OP_BIND_ACCESSIBILITY_SERVICE;
    public static int OP_BLUETOOTH_SCAN;
    public static int OP_BODY_SENSORS;
    public static int OP_CALL_PHONE;
    public static int OP_CAMERA;
    public static int OP_CHANGE_WIFI_STATE;
    public static int OP_COARSE_LOCATION;
    public static int OP_FINE_LOCATION;
    public static int OP_GET_ACCOUNTS;
    public static int OP_GET_USAGE_STATS;
    public static int OP_GPS;
    public static int OP_INSTANT_APP_START_FOREGROUND;
    public static int OP_MANAGE_IPSEC_TUNNELS;
    public static int OP_MOCK_LOCATION;
    public static int OP_MONITOR_HIGH_POWER_LOCATION;
    public static int OP_MONITOR_LOCATION;
    public static int OP_MUTE_MICROPHONE;
    public static int OP_NEIGHBORING_CELLS;
    public static int OP_NONE;
    public static int OP_PICTURE_IN_PICTURE;
    public static int OP_PLAY_AUDIO;
    public static int OP_POST_NOTIFICATION;
    public static int OP_PROCESS_OUTGOING_CALLS;
    public static int OP_PROJECT_MEDIA;
    public static int OP_READ_CALENDAR;
    public static int OP_READ_CALL_LOG;
    public static int OP_READ_CELL_BROADCASTS;
    public static int OP_READ_CLIPBOARD;
    public static int OP_READ_CONTACTS;
    public static int OP_READ_EXTERNAL_STORAGE;
    public static int OP_READ_ICC_SMS;
    public static int OP_READ_PHONE_NUMBERS;
    public static int OP_READ_PHONE_STATE;
    public static int OP_READ_SMS;
    public static int OP_RECEIVE_EMERGECY_SMS;
    public static int OP_RECEIVE_MMS;
    public static int OP_RECEIVE_SMS;
    public static int OP_RECEIVE_WAP_PUSH;
    public static int OP_RECORD_AUDIO;
    public static int OP_REQUEST_DELETE_PACKAGES;
    public static int OP_REQUEST_INSTALL_PACKAGES;
    public static int OP_RUN_ANY_IN_BACKGROUND;
    public static int OP_RUN_IN_BACKGROUND;
    public static int OP_SEND_SMS;
    public static int OP_START_FOREGROUND;
    public static int OP_SYSTEM_ALERT_WINDOW;
    public static int OP_TAKE_AUDIO_FOCUS;
    public static int OP_TAKE_MEDIA_BUTTONS;
    public static int OP_TOAST_WINDOW;
    public static int OP_TURN_SCREEN_ON;
    public static int OP_USE_FINGERPRINT;
    public static int OP_USE_SIP;
    public static int OP_VIBRATE;
    public static int OP_WAKE_LOCK;
    public static int OP_WIFI_SCAN;
    public static int OP_WRITE_CALENDAR;
    public static int OP_WRITE_CALL_LOG;
    public static int OP_WRITE_CLIPBOARD;
    public static int OP_WRITE_CONTACTS;
    public static int OP_WRITE_EXTERNAL_STORAGE;
    public static int OP_WRITE_ICC_SMS;
    public static int OP_WRITE_SETTINGS;
    public static int OP_WRITE_SMS;
    public static int OP_WRITE_WALLPAPER;
    public static int UID_STATE_BACKGROUND;
    public static int UID_STATE_CACHED;
    public static int UID_STATE_FOREGROUND;
    public static int UID_STATE_FOREGROUND_SERVICE;
    public static int UID_STATE_LAST_NON_RESTRICTED;
    public static int UID_STATE_PERSISTENT;
    public static int UID_STATE_TOP;
    public static int WATCH_FOREGROUND_CHANGES;
    public static int _NUM_OP;
    public static int _NUM_UID_STATE;
}

-keep class android.app.AppOpsManager$OnOpActiveChangedListener {

    public abstract void onOpActiveChanged(int, int, java.lang.String, boolean);


}

-keep class android.app.AppOpsManager$OnOpChangedListener {

    public abstract void onOpChanged(java.lang.String, java.lang.String);


}

-keep class android.app.AppOpsManager$OpEntry {
    <init>(int, int, long, long, int, int, java.lang.String);
    <init>(int, int, long[], long[], int, boolean, int, java.lang.String);
    <init>(int, int, long[], long[], int, int, java.lang.String);

    public int describeContents();
    public int getDuration();
    public long getLastAccessBackgroundTime();
    public long getLastAccessForegroundTime();
    public long getLastAccessTime();
    public long getLastRejectBackgroundTime();
    public long getLastRejectForegroundTime();
    public long getLastRejectTime();
    public long getLastRejectTimeFor(int);
    public long getLastTimeFor(int);
    public int getMode();
    public int getOp();
    public java.lang.String getProxyPackageName();
    public int getProxyUid();
    public long getRejectTime();
    public long getTime();
    public boolean isRunning();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.AppOpsManager$PackageOps {
    <init>(java.lang.String, int, java.util.List);

    public int describeContents();
    public java.util.List getOps();
    public java.lang.String getPackageName();
    public int getUid();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.Application {
    <init>();

    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public static java.lang.String getProcessName();
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onCreate();
    public void onLowMemory();
    public void onTerminate();
    public void onTrimMemory(int);
    public void registerActivityLifecycleCallbacks(android.app.Application$ActivityLifecycleCallbacks);
    public void registerComponentCallbacks(android.content.ComponentCallbacks);
    public void registerOnProvideAssistDataListener(android.app.Application$OnProvideAssistDataListener);
    public void unregisterActivityLifecycleCallbacks(android.app.Application$ActivityLifecycleCallbacks);
    public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
    public void unregisterOnProvideAssistDataListener(android.app.Application$OnProvideAssistDataListener);


    public android.app.LoadedApk mLoadedApk;
}

-keep class android.app.Application$ActivityLifecycleCallbacks {

    public abstract void onActivityCreated(android.app.Activity, android.os.Bundle);
    public abstract void onActivityDestroyed(android.app.Activity);
    public abstract void onActivityPaused(android.app.Activity);
    public abstract void onActivityResumed(android.app.Activity);
    public abstract void onActivitySaveInstanceState(android.app.Activity, android.os.Bundle);
    public abstract void onActivityStarted(android.app.Activity);
    public abstract void onActivityStopped(android.app.Activity);


}

-keep class android.app.Application$OnProvideAssistDataListener {

    public abstract void onProvideAssistData(android.app.Activity, android.os.Bundle);


}

-keep class android.app.ApplicationErrorReport {
    <init>();

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public static android.content.ComponentName getErrorReportReceiver(android.content.Context, java.lang.String, int);
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int TYPE_ANR;
    public static int TYPE_BATTERY;
    public static int TYPE_CRASH;
    public static int TYPE_NONE;
    public static int TYPE_RUNNING_SERVICE;
    public android.app.ApplicationErrorReport$AnrInfo anrInfo;
    public android.app.ApplicationErrorReport$BatteryInfo batteryInfo;
    public android.app.ApplicationErrorReport$CrashInfo crashInfo;
    public java.lang.String installerPackageName;
    public java.lang.String packageName;
    public java.lang.String processName;
    public android.app.ApplicationErrorReport$RunningServiceInfo runningServiceInfo;
    public boolean systemApp;
    public long time;
    public int type;
}

-keep class android.app.ApplicationErrorReport$AnrInfo {
    <init>();
    <init>(android.os.Parcel);

    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public java.lang.String activity;
    public java.lang.String cause;
    public java.lang.String info;
}

-keep class android.app.ApplicationErrorReport$BatteryInfo {
    <init>();
    <init>(android.os.Parcel);

    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public java.lang.String checkinDetails;
    public long durationMicros;
    public java.lang.String usageDetails;
    public int usagePercent;
}

-keep class android.app.ApplicationErrorReport$CrashInfo {
    <init>();
    <init>(java.lang.Throwable);
    <init>(android.os.Parcel);

    public void appendStackTrace(java.lang.String);
    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public java.lang.String exceptionClassName;
    public java.lang.String exceptionMessage;
    public java.lang.String stackTrace;
    public java.lang.String throwClassName;
    public java.lang.String throwFileName;
    public int throwLineNumber;
    public java.lang.String throwMethodName;
}

-keep class android.app.ApplicationErrorReport$ParcelableCrashInfo {
    <init>();
    <init>(java.lang.Throwable);
    <init>(android.os.Parcel);

    public int describeContents();


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ApplicationErrorReport$RunningServiceInfo {
    <init>();
    <init>(android.os.Parcel);

    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public long durationMillis;
    public java.lang.String serviceDetails;
}

-keep class android.app.ClientTransactionHandler {
    <init>();

    public void executeTransaction(android.app.servertransaction.ClientTransaction);
    public abstract android.app.ActivityThread$ActivityClientRecord getActivityClient(android.os.IBinder);
    public abstract android.app.LoadedApk getPackageInfoNoCheck(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public abstract void handleActivityConfigurationChanged(android.os.IBinder, android.content.res.Configuration, int);
    public abstract void handleConfigurationChanged(android.content.res.Configuration);
    public abstract void handleDestroyActivity(android.os.IBinder, boolean, int, boolean, java.lang.String);
    public abstract android.app.Activity handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent);
    public abstract void handleMultiWindowModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public abstract void handleNewIntent(android.os.IBinder, java.util.List, boolean);
    public abstract void handlePauseActivity(android.os.IBinder, boolean, boolean, int, android.app.servertransaction.PendingTransactionActions, java.lang.String);
    public abstract void handlePictureInPictureModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public abstract void handleRelaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public abstract void handleResumeActivity(android.os.IBinder, boolean, boolean, java.lang.String);
    public abstract void handleSendResult(android.os.IBinder, java.util.List, java.lang.String);
    public abstract void handleStartActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public abstract void handleStopActivity(android.os.IBinder, boolean, int, android.app.servertransaction.PendingTransactionActions, boolean, java.lang.String);
    public abstract void handleWindowVisibility(android.os.IBinder, boolean);
    public abstract void performRestartActivity(android.os.IBinder, boolean);
    public abstract android.app.ActivityThread$ActivityClientRecord prepareRelaunchActivity(android.os.IBinder, java.util.List, java.util.List, int, android.util.MergedConfiguration, boolean);
    public abstract void reportRelaunch(android.os.IBinder, android.app.servertransaction.PendingTransactionActions);
    public abstract void reportStop(android.app.servertransaction.PendingTransactionActions);
    public abstract void updatePendingConfiguration(android.content.res.Configuration);
    public abstract void updateProcessState(int, boolean);


}

-keep class android.app.ContentProviderHolder {
    <init>(android.content.pm.ProviderInfo);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.os.IBinder connection;
    public android.content.pm.ProviderInfo info;
    public boolean noReleaseNeeded;
    public android.content.IContentProvider provider;
}

-keep class android.app.ContextImpl {

    public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
    public boolean canLoadUnsafeResources();
    public int checkCallingOrSelfPermission(java.lang.String);
    public int checkCallingOrSelfUriPermission(android.net.Uri, int);
    public int checkCallingPermission(java.lang.String);
    public int checkCallingUriPermission(android.net.Uri, int);
    public int checkPermission(java.lang.String, int, int);
    public int checkPermission(java.lang.String, int, int, android.os.IBinder);
    public int checkSelfPermission(java.lang.String);
    public int checkUriPermission(android.net.Uri, int, int, int);
    public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
    public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
    public void clearWallpaper();
    public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
    public android.content.Context createConfigurationContext(android.content.res.Configuration);
    public android.content.Context createContextForSplit(java.lang.String);
    public android.content.Context createCredentialProtectedStorageContext();
    public android.content.Context createDeviceProtectedStorageContext();
    public android.content.Context createDisplayContext(android.view.Display);
    public android.content.Context createPackageContext(java.lang.String, int);
    public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
    public java.lang.String[] databaseList();
    public boolean deleteDatabase(java.lang.String);
    public boolean deleteFile(java.lang.String);
    public boolean deleteSharedPreferences(java.lang.String);
    public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
    public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
    public void enforceCallingPermission(java.lang.String, java.lang.String);
    public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
    public void enforcePermission(java.lang.String, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
    public java.lang.String[] fileList();
    public android.os.IBinder getActivityToken();
    public android.content.Context getApplicationContext();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public android.content.res.AssetManager getAssets();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public java.lang.String getBasePackageName();
    public java.io.File getCacheDir();
    public java.lang.ClassLoader getClassLoader();
    public java.io.File getCodeCacheDir();
    public android.content.ContentResolver getContentResolver();
    public java.io.File getDataDir();
    public java.io.File getDatabasePath(java.lang.String);
    public java.io.File getDir(java.lang.String, int);
    public android.view.Display getDisplay();
    public android.view.DisplayAdjustments getDisplayAdjustments(int);
    public java.io.File getExternalCacheDir();
    public java.io.File[] getExternalCacheDirs();
    public java.io.File getExternalFilesDir(java.lang.String);
    public java.io.File[] getExternalFilesDirs(java.lang.String);
    public java.io.File[] getExternalMediaDirs();
    public java.io.File getFileStreamPath(java.lang.String);
    public java.io.File getFilesDir();
    public android.app.IApplicationThread getIApplicationThread();
    public java.util.concurrent.Executor getMainExecutor();
    public android.os.Looper getMainLooper();
    public android.os.Handler getMainThreadHandler();
    public java.io.File getNoBackupFilesDir();
    public java.io.File getObbDir();
    public java.io.File[] getObbDirs();
    public java.lang.String getOpPackageName();
    public java.lang.String getPackageCodePath();
    public android.content.pm.PackageManager getPackageManager();
    public java.lang.String getPackageName();
    public java.lang.String getPackageResourcePath();
    public java.io.File getPreloadsFileCache();
    public android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
    public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
    public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
    public java.io.File getSharedPreferencesPath(java.lang.String);
    public java.lang.Object getSystemService(java.lang.String);
    public java.lang.String getSystemServiceName(java.lang.Class);
    public android.content.res.Resources$Theme getTheme();
    public int getThemeResId();
    public android.os.UserHandle getUser();
    public int getUserId();
    public android.graphics.drawable.Drawable getWallpaper();
    public int getWallpaperDesiredMinimumHeight();
    public int getWallpaperDesiredMinimumWidth();
    public void grantUriPermission(java.lang.String, android.net.Uri, int);
    public boolean isAutofillCompatibilityEnabled();
    public boolean isCredentialProtectedStorage();
    public boolean isDeviceProtectedStorage();
    public boolean isRestricted();
    public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
    public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
    public java.io.FileInputStream openFileInput(java.lang.String);
    public java.io.FileOutputStream openFileOutput(java.lang.String, int);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public android.graphics.drawable.Drawable peekWallpaper();
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
    public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public void reloadSharedPreferences();
    public void removeStickyBroadcast(android.content.Intent);
    public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void revokeUriPermission(android.net.Uri, int);
    public void revokeUriPermission(java.lang.String, android.net.Uri, int);
    public void sendBroadcast(android.content.Intent);
    public void sendBroadcast(android.content.Intent, java.lang.String);
    public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
    public void sendBroadcast(android.content.Intent, java.lang.String, int);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
    public void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
    public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public 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 void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyBroadcast(android.content.Intent);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
    public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
    public void setAutofillCompatibilityEnabled(boolean);
    public void setTheme(int);
    public void setWallpaper(android.graphics.Bitmap);
    public void setWallpaper(java.io.InputStream);
    public void startActivities(android.content.Intent[]);
    public void startActivities(android.content.Intent[], android.os.Bundle);
    public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public android.content.ComponentName startForegroundService(android.content.Intent);
    public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public android.content.ComponentName startService(android.content.Intent);
    public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean stopService(android.content.Intent);
    public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
    public void unbindService(android.content.ServiceConnection);
    public void unregisterReceiver(android.content.BroadcastReceiver);
    public void updateDisplay(int);


}

-keep class android.app.Dialog {
    <init>(android.content.Context);
    <init>(android.content.Context, int);
    <init>(android.content.Context, boolean, android.os.Message);
    <init>(android.content.Context, boolean, android.content.DialogInterface$OnCancelListener);

    public void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void cancel();
    public void closeOptionsMenu();
    public void create();
    public void dismiss();
    public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public android.view.View findViewById(int);
    public android.app.ActionBar getActionBar();
    public android.content.Context getContext();
    public android.view.View getCurrentFocus();
    public android.view.LayoutInflater getLayoutInflater();
    public android.app.Activity getOwnerActivity();
    public android.view.SearchEvent getSearchEvent();
    public int getVolumeControlStream();
    public android.view.Window getWindow();
    public void hide();
    public void invalidateOptionsMenu();
    public boolean isShowing();
    public void onActionModeFinished(android.view.ActionMode);
    public void onActionModeStarted(android.view.ActionMode);
    public void onAttachedToWindow();
    public void onBackPressed();
    public void onContentChanged();
    public boolean onContextItemSelected(android.view.MenuItem);
    public void onContextMenuClosed(android.view.Menu);
    protected void onCreate(android.os.Bundle);
    public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
    public boolean onCreateOptionsMenu(android.view.Menu);
    public boolean onCreatePanelMenu(int, android.view.Menu);
    public android.view.View onCreatePanelView(int);
    public void onDetachedFromWindow();
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public boolean onKeyDown(int, android.view.KeyEvent);
    public boolean onKeyLongPress(int, android.view.KeyEvent);
    public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onKeyUp(int, android.view.KeyEvent);
    public boolean onMenuItemSelected(int, android.view.MenuItem);
    public boolean onMenuOpened(int, android.view.Menu);
    public boolean onOptionsItemSelected(android.view.MenuItem);
    public void onOptionsMenuClosed(android.view.Menu);
    public void onPanelClosed(int, android.view.Menu);
    public boolean onPrepareOptionsMenu(android.view.Menu);
    public boolean onPreparePanel(int, android.view.View, android.view.Menu);
    public void onRestoreInstanceState(android.os.Bundle);
    public android.os.Bundle onSaveInstanceState();
    public boolean onSearchRequested(android.view.SearchEvent);
    public boolean onSearchRequested();
    protected void onStart();
    protected void onStop();
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean onTrackballEvent(android.view.MotionEvent);
    public void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public void onWindowDismissed(boolean, boolean);
    public void onWindowFocusChanged(boolean);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);
    public void openContextMenu(android.view.View);
    public void openOptionsMenu();
    public void registerForContextMenu(android.view.View);
    public boolean requestWindowFeature(int);
    public android.view.View requireViewById(int);
    public void setCancelMessage(android.os.Message);
    public void setCancelable(boolean);
    public void setCanceledOnTouchOutside(boolean);
    public void setContentView(int);
    public void setContentView(android.view.View);
    public void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void setDismissMessage(android.os.Message);
    public void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    public void setFeatureDrawableAlpha(int, int);
    public void setFeatureDrawableResource(int, int);
    public void setFeatureDrawableUri(int, android.net.Uri);
    public void setOnCancelListener(android.content.DialogInterface$OnCancelListener);
    public void setOnDismissListener(android.content.DialogInterface$OnDismissListener);
    public void setOnKeyListener(android.content.DialogInterface$OnKeyListener);
    public void setOnShowListener(android.content.DialogInterface$OnShowListener);
    public void setOwnerActivity(android.app.Activity);
    public void setTitle(java.lang.CharSequence);
    public void setTitle(int);
    public void setVolumeControlStream(int);
    public void show();
    public boolean takeCancelAndDismissListeners(java.lang.String, android.content.DialogInterface$OnCancelListener, android.content.DialogInterface$OnDismissListener);
    public void takeKeyEvents(boolean);
    public void unregisterForContextMenu(android.view.View);


    protected boolean mCancelable;
}

-keep class android.app.Fragment {
    <init>();

    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public boolean equals(java.lang.Object);
    public android.app.Activity getActivity();
    public boolean getAllowEnterTransitionOverlap();
    public boolean getAllowReturnTransitionOverlap();
    public android.os.Bundle getArguments();
    public android.app.FragmentManager getChildFragmentManager();
    public android.content.Context getContext();
    public android.transition.Transition getEnterTransition();
    public android.transition.Transition getExitTransition();
    public android.app.FragmentManager getFragmentManager();
    public java.lang.Object getHost();
    public int getId();
    public android.view.LayoutInflater getLayoutInflater();
    public android.app.LoaderManager getLoaderManager();
    public android.app.Fragment getParentFragment();
    public android.transition.Transition getReenterTransition();
    public android.content.res.Resources getResources();
    public boolean getRetainInstance();
    public android.transition.Transition getReturnTransition();
    public android.transition.Transition getSharedElementEnterTransition();
    public android.transition.Transition getSharedElementReturnTransition();
    public java.lang.String getString(int);
    public java.lang.String getString(int, java.lang.Object[]);
    public java.lang.String getTag();
    public android.app.Fragment getTargetFragment();
    public int getTargetRequestCode();
    public java.lang.CharSequence getText(int);
    public boolean getUserVisibleHint();
    public android.view.View getView();
    public int hashCode();
    public static android.app.Fragment instantiate(android.content.Context, java.lang.String);
    public static android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
    public boolean isAdded();
    public boolean isDetached();
    public boolean isHidden();
    public boolean isInLayout();
    public boolean isRemoving();
    public boolean isResumed();
    public boolean isStateSaved();
    public boolean isVisible();
    public void onActivityCreated(android.os.Bundle);
    public void onActivityResult(int, int, android.content.Intent);
    public void onAttach(android.content.Context);
    public void onAttach(android.app.Activity);
    public void onAttachFragment(android.app.Fragment);
    public void onConfigurationChanged(android.content.res.Configuration);
    public boolean onContextItemSelected(android.view.MenuItem);
    public void onCreate(android.os.Bundle);
    public android.animation.Animator onCreateAnimator(int, boolean, int);
    public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
    public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
    public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
    public void onDestroy();
    public void onDestroyOptionsMenu();
    public void onDestroyView();
    public void onDetach();
    public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
    public void onHiddenChanged(boolean);
    public void onInflate(android.util.AttributeSet, android.os.Bundle);
    public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
    public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
    public void onLowMemory();
    public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
    public void onMultiWindowModeChanged(boolean);
    public boolean onOptionsItemSelected(android.view.MenuItem);
    public void onOptionsMenuClosed(android.view.Menu);
    public void onPause();
    public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
    public void onPictureInPictureModeChanged(boolean);
    public void onPrepareOptionsMenu(android.view.Menu);
    public void onRequestPermissionsResult(int, java.lang.String[], int[]);
    public void onResume();
    public void onSaveInstanceState(android.os.Bundle);
    public void onStart();
    public void onStop();
    public void onTrimMemory(int);
    public void onViewCreated(android.view.View, android.os.Bundle);
    public void onViewStateRestored(android.os.Bundle);
    public void postponeEnterTransition();
    public void registerForContextMenu(android.view.View);
    public void requestPermissions(java.lang.String[], int);
    public void setAllowEnterTransitionOverlap(boolean);
    public void setAllowReturnTransitionOverlap(boolean);
    public void setArguments(android.os.Bundle);
    public void setEnterSharedElementCallback(android.app.SharedElementCallback);
    public void setEnterTransition(android.transition.Transition);
    public void setExitSharedElementCallback(android.app.SharedElementCallback);
    public void setExitTransition(android.transition.Transition);
    public void setHasOptionsMenu(boolean);
    public void setInitialSavedState(android.app.Fragment$SavedState);
    public void setMenuVisibility(boolean);
    public void setReenterTransition(android.transition.Transition);
    public void setRetainInstance(boolean);
    public void setReturnTransition(android.transition.Transition);
    public void setSharedElementEnterTransition(android.transition.Transition);
    public void setSharedElementReturnTransition(android.transition.Transition);
    public void setTargetFragment(android.app.Fragment, int);
    public void setUserVisibleHint(boolean);
    public boolean shouldShowRequestPermissionRationale(java.lang.String);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityForResult(android.content.Intent, int);
    public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
    public void startActivityForResultAsUser(android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startPostponedEnterTransition();
    public java.lang.String toString();
    public void unregisterForContextMenu(android.view.View);


}

-keep class android.app.Fragment$SavedState {

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$ClassLoaderCreator CREATOR;
}

-keep class android.app.FragmentContainer {
    <init>();

    public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
    public abstract android.view.View onFindViewById(int);
    public abstract boolean onHasView();


}

-keep class android.app.FragmentHostCallback {
    <init>(android.content.Context, android.os.Handler, int);

    public void onAttachFragment(android.app.Fragment);
    public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public android.view.View onFindViewById(int);
    public abstract java.lang.Object onGetHost();
    public android.view.LayoutInflater onGetLayoutInflater();
    public int onGetWindowAnimations();
    public boolean onHasView();
    public boolean onHasWindowAnimations();
    public void onInvalidateOptionsMenu();
    public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
    public boolean onShouldSaveFragmentState(android.app.Fragment);
    public void onStartActivityAsUserFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
    public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public boolean onUseFragmentManagerInflaterFactory();


}

-keep class android.app.FragmentManager {
    <init>();

    public abstract void addOnBackStackChangedListener(android.app.FragmentManager$OnBackStackChangedListener);
    public abstract android.app.FragmentTransaction beginTransaction();
    public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public static void enableDebugLogging(boolean);
    public abstract boolean executePendingTransactions();
    public abstract android.app.Fragment findFragmentById(int);
    public abstract android.app.Fragment findFragmentByTag(java.lang.String);
    public abstract android.app.FragmentManager$BackStackEntry getBackStackEntryAt(int);
    public abstract int getBackStackEntryCount();
    public abstract android.app.Fragment getFragment(android.os.Bundle, java.lang.String);
    public abstract java.util.List getFragments();
    public abstract android.app.Fragment getPrimaryNavigationFragment();
    public void invalidateOptionsMenu();
    public abstract boolean isDestroyed();
    public abstract boolean isStateSaved();
    public android.app.FragmentTransaction openTransaction();
    public abstract void popBackStack();
    public abstract void popBackStack(java.lang.String, int);
    public abstract void popBackStack(int, int);
    public abstract boolean popBackStackImmediate();
    public abstract boolean popBackStackImmediate(java.lang.String, int);
    public abstract boolean popBackStackImmediate(int, int);
    public abstract void putFragment(android.os.Bundle, java.lang.String, android.app.Fragment);
    public abstract void registerFragmentLifecycleCallbacks(android.app.FragmentManager$FragmentLifecycleCallbacks, boolean);
    public abstract void removeOnBackStackChangedListener(android.app.FragmentManager$OnBackStackChangedListener);
    public abstract android.app.Fragment$SavedState saveFragmentInstanceState(android.app.Fragment);
    public abstract void unregisterFragmentLifecycleCallbacks(android.app.FragmentManager$FragmentLifecycleCallbacks);


    public static int POP_BACK_STACK_INCLUSIVE;
}

-keep class android.app.FragmentManager$BackStackEntry {

    public abstract java.lang.CharSequence getBreadCrumbShortTitle();
    public abstract int getBreadCrumbShortTitleRes();
    public abstract java.lang.CharSequence getBreadCrumbTitle();
    public abstract int getBreadCrumbTitleRes();
    public abstract int getId();
    public abstract java.lang.String getName();


}

-keep class android.app.FragmentManager$FragmentLifecycleCallbacks {
    <init>();

    public void onFragmentActivityCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
    public void onFragmentCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentDestroyed(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
    public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentStopped(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentViewCreated(android.app.FragmentManager, android.app.Fragment, android.view.View, android.os.Bundle);
    public void onFragmentViewDestroyed(android.app.FragmentManager, android.app.Fragment);


}

-keep class android.app.FragmentManager$OnBackStackChangedListener {

    public abstract void onBackStackChanged();


}

-keep class android.app.FragmentTransaction {
    <init>();

    public abstract android.app.FragmentTransaction add(android.app.Fragment, java.lang.String);
    public abstract android.app.FragmentTransaction add(int, android.app.Fragment);
    public abstract android.app.FragmentTransaction add(int, android.app.Fragment, java.lang.String);
    public abstract android.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
    public abstract android.app.FragmentTransaction addToBackStack(java.lang.String);
    public abstract android.app.FragmentTransaction attach(android.app.Fragment);
    public abstract int commit();
    public abstract int commitAllowingStateLoss();
    public abstract void commitNow();
    public abstract void commitNowAllowingStateLoss();
    public abstract android.app.FragmentTransaction detach(android.app.Fragment);
    public abstract android.app.FragmentTransaction disallowAddToBackStack();
    public abstract android.app.FragmentTransaction hide(android.app.Fragment);
    public abstract boolean isAddToBackStackAllowed();
    public abstract boolean isEmpty();
    public abstract android.app.FragmentTransaction remove(android.app.Fragment);
    public abstract android.app.FragmentTransaction replace(int, android.app.Fragment);
    public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String);
    public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable);
    public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int);
    public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
    public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
    public abstract android.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
    public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
    public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
    public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
    public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
    public abstract android.app.FragmentTransaction setTransition(int);
    public abstract android.app.FragmentTransaction setTransitionStyle(int);
    public abstract android.app.FragmentTransaction show(android.app.Fragment);


    public static int TRANSIT_ENTER_MASK;
    public static int TRANSIT_EXIT_MASK;
    public static int TRANSIT_FRAGMENT_CLOSE;
    public static int TRANSIT_FRAGMENT_FADE;
    public static int TRANSIT_FRAGMENT_OPEN;
    public static int TRANSIT_NONE;
    public static int TRANSIT_UNSET;
}

-keep class android.app.GrantedUriPermission {
    <init>(android.net.Uri, java.lang.String);

    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 packageName;
    public android.net.Uri uri;
}

-keep class android.app.IActivityController {

    public abstract boolean activityResuming(java.lang.String);
    public abstract boolean activityStarting(android.content.Intent, java.lang.String);
    public abstract boolean appCrashed(java.lang.String, int, java.lang.String, java.lang.String, long, java.lang.String);
    public abstract int appEarlyNotResponding(java.lang.String, int, java.lang.String);
    public abstract int appNotResponding(java.lang.String, int, java.lang.String);
    public abstract int systemNotResponding(java.lang.String);


}

-keep class android.app.IActivityManager {

    public abstract void activityDestroyed(android.os.IBinder);
    public abstract void activityIdle(android.os.IBinder, android.content.res.Configuration, boolean);
    public abstract void activityPaused(android.os.IBinder);
    public abstract void activityRelaunched(android.os.IBinder);
    public abstract void activityResumed(android.os.IBinder);
    public abstract void activitySlept(android.os.IBinder);
    public abstract void activityStopped(android.os.IBinder, android.os.Bundle, android.os.PersistableBundle, java.lang.CharSequence);
    public abstract int addAppTask(android.os.IBinder, android.content.Intent, android.app.ActivityManager$TaskDescription, android.graphics.Bitmap);
    public abstract void addInstrumentationResults(android.app.IApplicationThread, android.os.Bundle);
    public abstract void addPackageDependency(java.lang.String);
    public abstract void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
    public abstract void appNotRespondingViaProvider(android.os.IBinder);
    public abstract void attachApplication(android.app.IApplicationThread, long);
    public abstract void backgroundWhitelistUid(int);
    public abstract void backupAgentCreated(java.lang.String, android.os.IBinder);
    public abstract boolean bindBackupAgent(java.lang.String, int, int);
    public abstract int bindService(android.app.IApplicationThread, android.os.IBinder, android.content.Intent, java.lang.String, android.app.IServiceConnection, int, java.lang.String, int);
    public abstract void bootAnimationComplete();
    public abstract int broadcastIntent(android.app.IApplicationThread, android.content.Intent, java.lang.String, android.content.IIntentReceiver, int, java.lang.String, android.os.Bundle, java.lang.String[], int, android.os.Bundle, boolean, boolean, int);
    public abstract void cancelIntentSender(android.content.IIntentSender);
    public abstract void cancelRecentsAnimation(boolean);
    public abstract void cancelTaskWindowTransition(int);
    public abstract int checkGrantUriPermission(int, java.lang.String, android.net.Uri, int, int);
    public abstract int checkPermission(java.lang.String, int, int);
    public abstract int checkPermissionWithToken(java.lang.String, int, int, android.os.IBinder);
    public abstract int checkUriPermission(android.net.Uri, int, int, int, int, android.os.IBinder);
    public abstract boolean clearApplicationUserData(java.lang.String, boolean, android.content.pm.IPackageDataObserver, int);
    public abstract void clearGrantedUriPermissions(java.lang.String, int);
    public abstract void clearPendingBackup();
    public abstract void closeSystemDialogs(java.lang.String);
    public abstract boolean convertFromTranslucent(android.os.IBinder);
    public abstract boolean convertToTranslucent(android.os.IBinder, android.os.Bundle);
    public abstract void crashApplication(int, int, java.lang.String, int, java.lang.String);
    public abstract int createStackOnDisplay(int);
    public abstract void dismissKeyguard(android.os.IBinder, com.android.internal.policy.IKeyguardDismissCallback, java.lang.CharSequence);
    public abstract void dismissPip(boolean, int);
    public abstract void dismissSplitScreenMode(boolean);
    public abstract boolean dumpHeap(java.lang.String, int, boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
    public abstract void dumpHeapFinished(java.lang.String);
    public abstract boolean enterPictureInPictureMode(android.os.IBinder, android.app.PictureInPictureParams);
    public abstract void enterSafeMode();
    public abstract void exitFreeformMode(android.os.IBinder);
    public abstract boolean finishActivity(android.os.IBinder, int, android.content.Intent, int);
    public abstract boolean finishActivityAffinity(android.os.IBinder);
    public abstract void finishHeavyWeightApp();
    public abstract void finishInstrumentation(android.app.IApplicationThread, int, android.os.Bundle);
    public abstract void finishReceiver(android.os.IBinder, int, java.lang.String, android.os.Bundle, boolean, int);
    public abstract void finishSubActivity(android.os.IBinder, java.lang.String, int);
    public abstract void finishVoiceTask(android.service.voice.IVoiceInteractionSession);
    public abstract void forceStopPackage(java.lang.String, int);
    public abstract android.content.ComponentName getActivityClassForToken(android.os.IBinder);
    public abstract int getActivityDisplayId(android.os.IBinder);
    public abstract android.os.Bundle getActivityOptions(android.os.IBinder);
    public abstract java.util.List getAllStackInfos();
    public abstract android.graphics.Point getAppTaskThumbnailSize();
    public abstract java.util.List getAppTasks(java.lang.String);
    public abstract android.os.Bundle getAssistContextExtras(int);
    public abstract android.content.ComponentName getCallingActivity(android.os.IBinder);
    public abstract java.lang.String getCallingPackage(android.os.IBinder);
    public abstract android.content.res.Configuration getConfiguration();
    public abstract android.app.ContentProviderHolder getContentProvider(android.app.IApplicationThread, java.lang.String, int, boolean);
    public abstract android.app.ContentProviderHolder getContentProviderExternal(java.lang.String, int, android.os.IBinder);
    public abstract android.content.pm.UserInfo getCurrentUser();
    public abstract android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
    public abstract java.util.List getFilteredTasks(int, int, int);
    public abstract android.app.ActivityManager$StackInfo getFocusedStackInfo();
    public abstract int getFrontActivityScreenCompatMode();
    public abstract android.content.pm.ParceledListSlice getGrantedUriPermissions(java.lang.String, int);
    public abstract android.content.Intent getIntentForIntentSender(android.content.IIntentSender);
    public abstract android.content.IIntentSender getIntentSender(int, java.lang.String, android.os.IBinder, java.lang.String, int, android.content.Intent[], java.lang.String[], int, android.os.Bundle, int);
    public abstract int getLastResumedActivityUserId();
    public abstract java.lang.String getLaunchedFromPackage(android.os.IBinder);
    public abstract int getLaunchedFromUid(android.os.IBinder);
    public abstract int getLockTaskModeState();
    public abstract int getMaxNumPictureInPictureActions(android.os.IBinder);
    public abstract void getMemoryInfo(android.app.ActivityManager$MemoryInfo);
    public abstract int getMemoryTrimLevel();
    public abstract void getMyMemoryState(android.app.ActivityManager$RunningAppProcessInfo);
    public abstract boolean getPackageAskScreenCompat(java.lang.String);
    public abstract java.lang.String getPackageForIntentSender(android.content.IIntentSender);
    public abstract java.lang.String getPackageForToken(android.os.IBinder);
    public abstract int getPackageProcessState(java.lang.String, java.lang.String);
    public abstract int getPackageScreenCompatMode(java.lang.String);
    public abstract android.content.pm.ParceledListSlice getPersistedUriPermissions(java.lang.String, boolean);
    public abstract int getProcessLimit();
    public abstract android.os.Debug$MemoryInfo[] getProcessMemoryInfo(int[]);
    public abstract long[] getProcessPss(int[]);
    public abstract java.util.List getProcessesInErrorState();
    public abstract java.lang.String getProviderMimeType(android.net.Uri, int);
    public abstract android.content.pm.ParceledListSlice getRecentTasks(int, int, int);
    public abstract int getRequestedOrientation(android.os.IBinder);
    public abstract java.util.List getRunningAppProcesses();
    public abstract java.util.List getRunningExternalApplications();
    public abstract android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName);
    public abstract int[] getRunningUserIds();
    public abstract java.util.List getServices(int, int);
    public abstract android.app.ActivityManager$StackInfo getStackInfo(int, int);
    public abstract java.lang.String getTagForIntentSender(android.content.IIntentSender, java.lang.String);
    public abstract android.graphics.Rect getTaskBounds(int);
    public abstract android.app.ActivityManager$TaskDescription getTaskDescription(int);
    public abstract android.graphics.Bitmap getTaskDescriptionIcon(java.lang.String, int);
    public abstract int getTaskForActivity(android.os.IBinder, boolean);
    public abstract android.app.ActivityManager$TaskSnapshot getTaskSnapshot(int, boolean);
    public abstract java.util.List getTasks(int);
    public abstract int getUidForIntentSender(android.content.IIntentSender);
    public abstract int getUidProcessState(int, java.lang.String);
    public abstract android.os.IBinder getUriPermissionOwnerForActivity(android.os.IBinder);
    public abstract void grantUriPermission(android.app.IApplicationThread, java.lang.String, android.net.Uri, int, int);
    public abstract void grantUriPermissionFromOwner(android.os.IBinder, int, java.lang.String, android.net.Uri, int, int, int);
    public abstract void handleApplicationCrash(android.os.IBinder, android.app.ApplicationErrorReport$ParcelableCrashInfo);
    public abstract void handleApplicationStrictModeViolation(android.os.IBinder, int, android.os.StrictMode$ViolationInfo);
    public abstract boolean handleApplicationWtf(android.os.IBinder, java.lang.String, boolean, android.app.ApplicationErrorReport$ParcelableCrashInfo);
    public abstract int handleIncomingUser(int, int, int, boolean, boolean, java.lang.String, java.lang.String);
    public abstract void hang(android.os.IBinder, boolean);
    public abstract long inputDispatchingTimedOut(int, boolean, java.lang.String);
    public abstract boolean isAppForeground(int);
    public abstract boolean isAppStartModeDisabled(int, java.lang.String);
    public abstract boolean isAssistDataAllowedOnCurrentActivity();
    public abstract boolean isBackgroundRestricted(java.lang.String);
    public abstract boolean isImmersive(android.os.IBinder);
    public abstract boolean isInLockTaskMode();
    public abstract boolean isInMultiWindowMode(android.os.IBinder);
    public abstract boolean isInPictureInPictureMode(android.os.IBinder);
    public abstract boolean isIntentSenderAForegroundService(android.content.IIntentSender);
    public abstract boolean isIntentSenderAnActivity(android.content.IIntentSender);
    public abstract boolean isIntentSenderTargetedToPackage(android.content.IIntentSender);
    public abstract boolean isRootVoiceInteraction(android.os.IBinder);
    public abstract boolean isTopActivityImmersive();
    public abstract boolean isTopOfTask(android.os.IBinder);
    public abstract boolean isUidActive(int, java.lang.String);
    public abstract boolean isUserAMonkey();
    public abstract boolean isUserRunning(int, int);
    public abstract boolean isVrModePackageEnabled(android.content.ComponentName);
    public abstract void keyguardGoingAway(int);
    public abstract void killAllBackgroundProcesses();
    public abstract void killApplication(java.lang.String, int, int, java.lang.String);
    public abstract void killApplicationProcess(java.lang.String, int);
    public abstract void killBackgroundProcesses(java.lang.String, int);
    public abstract void killPackageDependents(java.lang.String, int);
    public abstract boolean killPids(int[], java.lang.String, boolean);
    public abstract boolean killProcessesBelowForeground(java.lang.String);
    public abstract void killUid(int, int, java.lang.String);
    public abstract boolean launchAssistIntent(android.content.Intent, int, java.lang.String, int, android.os.Bundle);
    public abstract void makePackageIdle(java.lang.String, int);
    public abstract boolean moveActivityTaskToBack(android.os.IBinder, boolean);
    public abstract void moveStackToDisplay(int, int);
    public abstract void moveTaskBackwards(int);
    public abstract void moveTaskToFront(int, int, android.os.Bundle);
    public abstract void moveTaskToStack(int, int, boolean);
    public abstract void moveTasksToFullscreenStack(int, boolean);
    public abstract boolean moveTopActivityToPinnedStack(int, android.graphics.Rect);
    public abstract boolean navigateUpTo(android.os.IBinder, android.content.Intent, int, android.content.Intent);
    public abstract android.os.IBinder newUriPermissionOwner(java.lang.String);
    public abstract void noteAlarmFinish(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String);
    public abstract void noteAlarmStart(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String);
    public abstract void noteWakeupAlarm(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String, java.lang.String);
    public abstract void notifyActivityDrawn(android.os.IBinder);
    public abstract void notifyCleartextNetwork(int, byte[]);
    public abstract void notifyEnterAnimationComplete(android.os.IBinder);
    public abstract void notifyLaunchTaskBehindComplete(android.os.IBinder);
    public abstract void notifyLockedProfile(int);
    public abstract void notifyPinnedStackAnimationEnded();
    public abstract void notifyPinnedStackAnimationStarted();
    public abstract android.os.ParcelFileDescriptor openContentUri(java.lang.String);
    public abstract void overridePendingTransition(android.os.IBinder, java.lang.String, int, int);
    public abstract android.os.IBinder peekService(android.content.Intent, java.lang.String, java.lang.String);
    public abstract void performIdleMaintenance();
    public abstract void positionTaskInStack(int, int, int);
    public abstract boolean profileControl(java.lang.String, int, boolean, android.app.ProfilerInfo, int);
    public abstract void publishContentProviders(android.app.IApplicationThread, java.util.List);
    public abstract void publishService(android.os.IBinder, android.content.Intent, android.os.IBinder);
    public abstract boolean refContentProvider(android.os.IBinder, int, int);
    public abstract void registerIntentSenderCancelListener(android.content.IIntentSender, com.android.internal.os.IResultReceiver);
    public abstract void registerProcessObserver(android.app.IProcessObserver);
    public abstract android.content.Intent registerReceiver(android.app.IApplicationThread, java.lang.String, android.content.IIntentReceiver, android.content.IntentFilter, java.lang.String, int, int);
    public abstract void registerRemoteAnimationForNextActivityStart(java.lang.String, android.view.RemoteAnimationAdapter);
    public abstract void registerRemoteAnimations(android.os.IBinder, android.view.RemoteAnimationDefinition);
    public abstract void registerTaskStackListener(android.app.ITaskStackListener);
    public abstract void registerUidObserver(android.app.IUidObserver, int, int, java.lang.String);
    public abstract void registerUserSwitchObserver(android.app.IUserSwitchObserver, java.lang.String);
    public abstract boolean releaseActivityInstance(android.os.IBinder);
    public abstract void releasePersistableUriPermission(android.net.Uri, int, java.lang.String, int);
    public abstract void releaseSomeActivities(android.app.IApplicationThread);
    public abstract void removeContentProvider(android.os.IBinder, boolean);
    public abstract void removeContentProviderExternal(java.lang.String, android.os.IBinder);
    public abstract void removeStack(int);
    public abstract void removeStacksInWindowingModes(int[]);
    public abstract void removeStacksWithActivityTypes(int[]);
    public abstract boolean removeTask(int);
    public abstract void reportActivityFullyDrawn(android.os.IBinder, boolean);
    public abstract void reportAssistContextExtras(android.os.IBinder, android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent, android.net.Uri);
    public abstract void reportSizeConfigurations(android.os.IBinder, int[], int[], int[]);
    public abstract boolean requestAssistContextExtras(int, android.app.IAssistDataReceiver, android.os.Bundle, android.os.IBinder, boolean, boolean);
    public abstract boolean requestAutofillData(android.app.IAssistDataReceiver, android.os.Bundle, android.os.IBinder, int);
    public abstract void requestBugReport(int);
    public abstract void requestTelephonyBugReport(java.lang.String, java.lang.String);
    public abstract void requestWifiBugReport(java.lang.String, java.lang.String);
    public abstract void resizeDockedStack(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect);
    public abstract void resizePinnedStack(android.graphics.Rect, android.graphics.Rect);
    public abstract void resizeStack(int, android.graphics.Rect, boolean, boolean, boolean, int);
    public abstract void resizeTask(int, android.graphics.Rect, int);
    public abstract void restart();
    public abstract int restartUserInBackground(int);
    public abstract void resumeAppSwitches();
    public abstract void revokeUriPermission(android.app.IApplicationThread, java.lang.String, android.net.Uri, int, int);
    public abstract void revokeUriPermissionFromOwner(android.os.IBinder, android.net.Uri, int, int);
    public abstract void scheduleApplicationInfoChanged(java.util.List, int);
    public abstract void sendIdleJobTrigger();
    public abstract int sendIntentSender(android.content.IIntentSender, android.os.IBinder, int, android.content.Intent, java.lang.String, android.content.IIntentReceiver, java.lang.String, android.os.Bundle);
    public abstract void serviceDoneExecuting(android.os.IBinder, int, int, int);
    public abstract void setActivityController(android.app.IActivityController, boolean);
    public abstract void setAgentApp(java.lang.String, java.lang.String);
    public abstract void setAlwaysFinish(boolean);
    public abstract void setDebugApp(java.lang.String, boolean, boolean);
    public abstract void setDisablePreviewScreenshots(android.os.IBinder, boolean);
    public abstract void setDumpHeapDebugLimit(java.lang.String, int, long, java.lang.String);
    public abstract void setFocusedStack(int);
    public abstract void setFocusedTask(int);
    public abstract void setFrontActivityScreenCompatMode(int);
    public abstract void setHasTopUi(boolean);
    public abstract void setImmersive(android.os.IBinder, boolean);
    public abstract void setLockScreenShown(boolean, boolean, int);
    public abstract void setPackageAskScreenCompat(java.lang.String, boolean);
    public abstract void setPackageScreenCompatMode(java.lang.String, int);
    public abstract void setPersistentVrThread(int);
    public abstract void setPictureInPictureParams(android.os.IBinder, android.app.PictureInPictureParams);
    public abstract void setProcessImportant(android.os.IBinder, int, boolean, java.lang.String);
    public abstract void setProcessLimit(int);
    public abstract boolean setProcessMemoryTrimLevel(java.lang.String, int, int);
    public abstract void setRenderThread(int);
    public abstract void setRequestedOrientation(android.os.IBinder, int);
    public abstract void setServiceForeground(android.content.ComponentName, android.os.IBinder, int, android.app.Notification, int);
    public abstract void setShowWhenLocked(android.os.IBinder, boolean);
    public abstract void setSplitScreenResizing(boolean);
    public abstract void setTaskDescription(android.os.IBinder, android.app.ActivityManager$TaskDescription);
    public abstract void setTaskResizeable(int, int);
    public abstract void setTaskWindowingMode(int, int, boolean);
    public abstract boolean setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean);
    public abstract void setTurnScreenOn(android.os.IBinder, boolean);
    public abstract void setUserIsMonkey(boolean);
    public abstract void setVoiceKeepAwake(android.service.voice.IVoiceInteractionSession, boolean);
    public abstract int setVrMode(android.os.IBinder, boolean, android.content.ComponentName);
    public abstract void setVrThread(int);
    public abstract boolean shouldUpRecreateTask(android.os.IBinder, java.lang.String);
    public abstract boolean showAssistFromActivity(android.os.IBinder, android.os.Bundle);
    public abstract void showBootMessage(java.lang.CharSequence, boolean);
    public abstract void showLockTaskEscapeMessage(android.os.IBinder);
    public abstract void showWaitingForDebugger(android.app.IApplicationThread, boolean);
    public abstract boolean shutdown(int);
    public abstract void signalPersistentProcesses(int);
    public abstract int startActivities(android.app.IApplicationThread, java.lang.String, android.content.Intent[], java.lang.String[], android.os.IBinder, android.os.Bundle, int);
    public abstract int startActivity(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle);
    public abstract android.app.WaitResult startActivityAndWait(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, int);
    public abstract int startActivityAsCaller(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, boolean, int);
    public abstract int startActivityAsUser(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, int);
    public abstract int startActivityFromRecents(int, android.os.Bundle);
    public abstract int startActivityIntentSender(android.app.IApplicationThread, android.content.IIntentSender, android.os.IBinder, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle);
    public abstract int startActivityWithConfig(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.content.res.Configuration, android.os.Bundle, int);
    public abstract int startAssistantActivity(java.lang.String, int, int, android.content.Intent, java.lang.String, android.os.Bundle, int);
    public abstract boolean startBinderTracking();
    public abstract void startConfirmDeviceCredentialIntent(android.content.Intent, android.os.Bundle);
    public abstract void startInPlaceAnimationOnFrontMostApplication(android.os.Bundle);
    public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, int, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, java.lang.String);
    public abstract void startLocalVoiceInteraction(android.os.IBinder, android.os.Bundle);
    public abstract void startLockTaskModeByToken(android.os.IBinder);
    public abstract boolean startNextMatchingActivity(android.os.IBinder, android.content.Intent, android.os.Bundle);
    public abstract void startRecentsActivity(android.content.Intent, android.app.IAssistDataReceiver, android.view.IRecentsAnimationRunner);
    public abstract android.content.ComponentName startService(android.app.IApplicationThread, android.content.Intent, java.lang.String, boolean, java.lang.String, int);
    public abstract void startSystemLockTaskMode(int);
    public abstract boolean startUserInBackground(int);
    public abstract boolean startUserInBackgroundWithListener(int, android.os.IProgressListener);
    public abstract int startVoiceActivity(java.lang.String, int, int, android.content.Intent, java.lang.String, android.service.voice.IVoiceInteractionSession, com.android.internal.app.IVoiceInteractor, int, android.app.ProfilerInfo, android.os.Bundle, int);
    public abstract void stopAppSwitches();
    public abstract boolean stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
    public abstract void stopLocalVoiceInteraction(android.os.IBinder);
    public abstract void stopLockTaskModeByToken(android.os.IBinder);
    public abstract int stopService(android.app.IApplicationThread, android.content.Intent, java.lang.String, int);
    public abstract boolean stopServiceToken(android.content.ComponentName, android.os.IBinder, int);
    public abstract void stopSystemLockTaskMode();
    public abstract int stopUser(int, boolean, android.app.IStopUserCallback);
    public abstract boolean supportsLocalVoiceInteraction();
    public abstract void suppressResizeConfigChanges(boolean);
    public abstract boolean switchUser(int);
    public abstract void takePersistableUriPermission(android.net.Uri, int, java.lang.String, int);
    public abstract void unbindBackupAgent(android.content.pm.ApplicationInfo);
    public abstract void unbindFinished(android.os.IBinder, android.content.Intent, boolean);
    public abstract boolean unbindService(android.app.IServiceConnection);
    public abstract void unbroadcastIntent(android.app.IApplicationThread, android.content.Intent, int);
    public abstract void unhandledBack();
    public abstract boolean unlockUser(int, byte[], byte[], android.os.IProgressListener);
    public abstract void unregisterIntentSenderCancelListener(android.content.IIntentSender, com.android.internal.os.IResultReceiver);
    public abstract void unregisterProcessObserver(android.app.IProcessObserver);
    public abstract void unregisterReceiver(android.content.IIntentReceiver);
    public abstract void unregisterTaskStackListener(android.app.ITaskStackListener);
    public abstract void unregisterUidObserver(android.app.IUidObserver);
    public abstract void unregisterUserSwitchObserver(android.app.IUserSwitchObserver);
    public abstract void unstableProviderDied(android.os.IBinder);
    public abstract boolean updateConfiguration(android.content.res.Configuration);
    public abstract void updateDeviceOwner(java.lang.String);
    public abstract boolean updateDisplayOverrideConfiguration(android.content.res.Configuration, int);
    public abstract void updateLockTaskFeatures(int, int);
    public abstract void updateLockTaskPackages(int, java.lang.String[]);
    public abstract void updatePersistentConfiguration(android.content.res.Configuration);
    public abstract void waitForNetworkStateUpdate(long);
    public abstract boolean willActivityBeVisible(android.os.IBinder);


}

-keep class android.app.IAppTask {

    public abstract void finishAndRemoveTask();
    public abstract android.app.ActivityManager$RecentTaskInfo getTaskInfo();
    public abstract void moveToFront();
    public abstract void setExcludeFromRecents(boolean);
    public abstract int startActivity(android.os.IBinder, java.lang.String, android.content.Intent, java.lang.String, android.os.Bundle);


}

-keep class android.app.IApplicationThread {

    public abstract void attachAgent(java.lang.String);
    public abstract void bindApplication(java.lang.String, android.content.pm.ApplicationInfo, java.util.List, android.content.ComponentName, android.app.ProfilerInfo, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, boolean, boolean, boolean, boolean, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.util.Map, android.os.Bundle, java.lang.String, boolean);
    public abstract void clearDnsCache();
    public abstract void dispatchPackageBroadcast(int, java.lang.String[]);
    public abstract void dumpActivity(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String, java.lang.String[]);
    public abstract void dumpDbInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public abstract void dumpGfxInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public abstract void dumpHeap(boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
    public abstract void dumpMemInfo(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, boolean, java.lang.String[]);
    public abstract void dumpMemInfoProto(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, java.lang.String[]);
    public abstract void dumpProvider(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public abstract void dumpService(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public abstract void handleTrustStorageUpdate();
    public abstract void notifyCleartextNetwork(byte[]);
    public abstract void processInBackground();
    public abstract void profilerControl(boolean, android.app.ProfilerInfo, int);
    public abstract void requestAssistContextExtras(android.os.IBinder, android.os.IBinder, int, int, int);
    public abstract void runIsolatedEntryPoint(java.lang.String, java.lang.String[]);
    public abstract void scheduleApplicationInfoChanged(android.content.pm.ApplicationInfo);
    public abstract void scheduleBindService(android.os.IBinder, android.content.Intent, boolean, int);
    public abstract void scheduleCrash(java.lang.String);
    public abstract void scheduleCreateBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
    public abstract void scheduleCreateService(android.os.IBinder, android.content.pm.ServiceInfo, android.content.res.CompatibilityInfo, int);
    public abstract void scheduleDestroyBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public abstract void scheduleEnterAnimationComplete(android.os.IBinder);
    public abstract void scheduleExit();
    public abstract void scheduleInstallProvider(android.content.pm.ProviderInfo);
    public abstract void scheduleLocalVoiceInteractionStarted(android.os.IBinder, com.android.internal.app.IVoiceInteractor);
    public abstract void scheduleLowMemory();
    public abstract void scheduleOnNewActivityOptions(android.os.IBinder, android.os.Bundle);
    public abstract void scheduleReceiver(android.content.Intent, android.content.pm.ActivityInfo, android.content.res.CompatibilityInfo, int, java.lang.String, android.os.Bundle, boolean, int, int);
    public abstract void scheduleRegisteredReceiver(android.content.IIntentReceiver, android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int, int);
    public abstract void scheduleServiceArgs(android.os.IBinder, android.content.pm.ParceledListSlice);
    public abstract void scheduleSleeping(android.os.IBinder, boolean);
    public abstract void scheduleStopService(android.os.IBinder);
    public abstract void scheduleSuicide();
    public abstract void scheduleTransaction(android.app.servertransaction.ClientTransaction);
    public abstract void scheduleTranslucentConversionComplete(android.os.IBinder, boolean);
    public abstract void scheduleTrimMemory(int);
    public abstract void scheduleUnbindService(android.os.IBinder, android.content.Intent);
    public abstract void setCoreSettings(android.os.Bundle);
    public abstract void setHttpProxy(java.lang.String, java.lang.String, java.lang.String, android.net.Uri);
    public abstract void setNetworkBlockSeq(long);
    public abstract void setProcessState(int);
    public abstract void setSchedulingGroup(int);
    public abstract void startBinderTracking();
    public abstract void stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
    public abstract void unstableProviderDied(android.os.IBinder);
    public abstract void updatePackageCompatibilityInfo(java.lang.String, android.content.res.CompatibilityInfo);
    public abstract void updateTimePrefs(int);
    public abstract void updateTimeZone();


}

-keep class android.app.IApplicationThread$Stub {
    <init>();

    public android.os.IBinder asBinder();
    public static android.app.IApplicationThread asInterface(android.os.IBinder);
    public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);


}

-keep class android.app.IAssistDataReceiver {

    public abstract void onHandleAssistData(android.os.Bundle);
    public abstract void onHandleAssistScreenshot(android.graphics.Bitmap);


}

-keep class android.app.IInstrumentationWatcher {

    public abstract void instrumentationFinished(android.content.ComponentName, int, android.os.Bundle);
    public abstract void instrumentationStatus(android.content.ComponentName, int, android.os.Bundle);


}

-keep class android.app.IProcessObserver {

    public abstract void onForegroundActivitiesChanged(int, int, boolean);
    public abstract void onProcessDied(int, int);


}

-keep class android.app.IServiceConnection {

    public abstract void connected(android.content.ComponentName, android.os.IBinder, boolean);


}

-keep class android.app.IStopUserCallback {

    public abstract void userStopAborted(int);
    public abstract void userStopped(int);


}

-keep class android.app.ITaskStackListener {

    public abstract void onActivityDismissingDockedStack();
    public abstract void onActivityForcedResizable(java.lang.String, int, int);
    public abstract void onActivityLaunchOnSecondaryDisplayFailed();
    public abstract void onActivityPinned(java.lang.String, int, int, int);
    public abstract void onActivityRequestedOrientationChanged(int, int);
    public abstract void onActivityUnpinned();
    public abstract void onPinnedActivityRestartAttempt(boolean);
    public abstract void onPinnedStackAnimationEnded();
    public abstract void onPinnedStackAnimationStarted();
    public abstract void onTaskCreated(int, android.content.ComponentName);
    public abstract void onTaskDescriptionChanged(int, android.app.ActivityManager$TaskDescription);
    public abstract void onTaskMovedToFront(int);
    public abstract void onTaskProfileLocked(int, int);
    public abstract void onTaskRemovalStarted(int);
    public abstract void onTaskRemoved(int);
    public abstract void onTaskSnapshotChanged(int, android.app.ActivityManager$TaskSnapshot);
    public abstract void onTaskStackChanged();


    public static int FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY;
    public static int FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
}

-keep class android.app.IUiAutomationConnection {

    public abstract void clearWindowAnimationFrameStats();
    public abstract boolean clearWindowContentFrameStats(int);
    public abstract void connect(android.accessibilityservice.IAccessibilityServiceClient, int);
    public abstract void disconnect();
    public abstract void executeShellCommand(java.lang.String, android.os.ParcelFileDescriptor, android.os.ParcelFileDescriptor);
    public abstract android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
    public abstract android.view.WindowContentFrameStats getWindowContentFrameStats(int);
    public abstract void grantRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean injectInputEvent(android.view.InputEvent, boolean);
    public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean setRotation(int);
    public abstract void shutdown();
    public abstract android.graphics.Bitmap takeScreenshot(android.graphics.Rect, int);


}

-keep class android.app.IUidObserver {

    public abstract void onUidActive(int);
    public abstract void onUidCachedChanged(int, boolean);
    public abstract void onUidGone(int, boolean);
    public abstract void onUidIdle(int, boolean);
    public abstract void onUidStateChanged(int, int, long);


}

-keep class android.app.IUserSwitchObserver {

    public abstract void onForegroundProfileSwitch(int);
    public abstract void onLockedBootComplete(int);
    public abstract void onUserSwitchComplete(int);
    public abstract void onUserSwitching(int, android.os.IRemoteCallback);


}

-keep class android.app.Instrumentation {
    <init>();

    public android.os.TestLooperManager acquireLooperManager(android.os.Looper);
    public void addMonitor(android.app.Instrumentation$ActivityMonitor);
    public android.app.Instrumentation$ActivityMonitor addMonitor(android.content.IntentFilter, android.app.Instrumentation$ActivityResult, boolean);
    public android.app.Instrumentation$ActivityMonitor addMonitor(java.lang.String, android.app.Instrumentation$ActivityResult, boolean);
    public void addResults(android.os.Bundle);
    public void callActivityOnCreate(android.app.Activity, android.os.Bundle);
    public void callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnDestroy(android.app.Activity);
    public void callActivityOnNewIntent(android.app.Activity, android.content.Intent);
    public void callActivityOnNewIntent(android.app.Activity, com.android.internal.content.ReferrerIntent);
    public void callActivityOnPause(android.app.Activity);
    public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle);
    public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnRestart(android.app.Activity);
    public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle);
    public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnResume(android.app.Activity);
    public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle);
    public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnStart(android.app.Activity);
    public void callActivityOnStop(android.app.Activity);
    public void callActivityOnUserLeaving(android.app.Activity);
    public void callApplicationOnCreate(android.app.Application);
    public boolean checkMonitorHit(android.app.Instrumentation$ActivityMonitor, int);
    public static void checkStartActivityResult(int, java.lang.Object);
    public void endPerformanceSnapshot();
    public void execStartActivities(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent[], android.os.Bundle);
    public int execStartActivitiesAsUser(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent[], android.os.Bundle, int);
    public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent, int, android.os.Bundle);
    public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, java.lang.String, android.content.Intent, int, android.os.Bundle);
    public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, java.lang.String, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public android.app.Instrumentation$ActivityResult execStartActivityAsCaller(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent, int, android.os.Bundle, boolean, int);
    public void execStartActivityFromAppTask(android.content.Context, android.os.IBinder, android.app.IAppTask, android.content.Intent, android.os.Bundle);
    public void finish(int, android.os.Bundle);
    public android.os.Bundle getAllocCounts();
    public android.os.Bundle getBinderCounts();
    public android.content.ComponentName getComponentName();
    public android.content.Context getContext();
    public java.lang.String getProcessName();
    public android.content.Context getTargetContext();
    public android.app.UiAutomation getUiAutomation();
    public android.app.UiAutomation getUiAutomation(int);
    public boolean invokeContextMenuAction(android.app.Activity, int, int);
    public boolean invokeMenuActionSync(android.app.Activity, int, int);
    public boolean isProfiling();
    public android.app.Activity newActivity(java.lang.Class, android.content.Context, android.os.IBinder, android.app.Application, android.content.Intent, android.content.pm.ActivityInfo, java.lang.CharSequence, android.app.Activity, java.lang.String, java.lang.Object);
    public android.app.Activity newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
    public android.app.Application newApplication(java.lang.ClassLoader, java.lang.String, android.content.Context);
    public static android.app.Application newApplication(java.lang.Class, android.content.Context);
    public void onCreate(android.os.Bundle);
    public void onDestroy();
    public boolean onException(java.lang.Object, java.lang.Throwable);
    public void onStart();
    public void removeMonitor(android.app.Instrumentation$ActivityMonitor);
    public void runOnMainSync(java.lang.Runnable);
    public void sendCharacterSync(int);
    public void sendKeyDownUpSync(int);
    public void sendKeySync(android.view.KeyEvent);
    public void sendPointerSync(android.view.MotionEvent);
    public void sendStatus(int, android.os.Bundle);
    public void sendStringSync(java.lang.String);
    public void sendTrackballEventSync(android.view.MotionEvent);
    public void setAutomaticPerformanceSnapshots();
    public void setInTouchMode(boolean);
    public void start();
    public android.app.Activity startActivitySync(android.content.Intent);
    public android.app.Activity startActivitySync(android.content.Intent, android.os.Bundle);
    public void startAllocCounting();
    public void startPerformanceSnapshot();
    public void startProfiling();
    public void stopAllocCounting();
    public void stopProfiling();
    public void waitForIdle(java.lang.Runnable);
    public void waitForIdleSync();
    public android.app.Activity waitForMonitor(android.app.Instrumentation$ActivityMonitor);
    public android.app.Activity waitForMonitorWithTimeout(android.app.Instrumentation$ActivityMonitor, long);


    public static java.lang.String REPORT_KEY_IDENTIFIER;
    public static java.lang.String REPORT_KEY_STREAMRESULT;
}

-keep class android.app.Instrumentation$ActivityMonitor {
    <init>(android.content.IntentFilter, android.app.Instrumentation$ActivityResult, boolean);
    <init>(java.lang.String, android.app.Instrumentation$ActivityResult, boolean);
    <init>();

    public android.content.IntentFilter getFilter();
    public int getHits();
    public android.app.Activity getLastActivity();
    public android.app.Instrumentation$ActivityResult getResult();
    public boolean isBlocking();
    public android.app.Instrumentation$ActivityResult onStartActivity(android.content.Intent);
    public android.app.Activity waitForActivity();
    public android.app.Activity waitForActivityWithTimeout(long);


}

-keep class android.app.Instrumentation$ActivityResult {
    <init>(int, android.content.Intent);

    public int getResultCode();
    public android.content.Intent getResultData();


}

-keep class android.app.LoadedApk {
    <init>(android.app.ActivityThread, android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, java.lang.ClassLoader, boolean, boolean, boolean);

    public android.content.IIntentReceiver forgetReceiverDispatcher(android.content.Context, android.content.BroadcastReceiver);
    public android.app.IServiceConnection forgetServiceDispatcher(android.content.Context, android.content.ServiceConnection);
    public java.lang.String getAppDir();
    public android.app.AppComponentFactory getAppFactory();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public android.content.res.AssetManager getAssets();
    public java.lang.ClassLoader getClassLoader();
    public android.content.res.CompatibilityInfo getCompatibilityInfo();
    public java.io.File getCredentialProtectedDataDirFile();
    public java.lang.String getDataDir();
    public java.io.File getDataDirFile();
    public java.io.File getDeviceProtectedDataDirFile();
    public java.lang.String getLibDir();
    public java.lang.String[] getOverlayDirs();
    public java.lang.String getPackageName();
    public android.content.IIntentReceiver getReceiverDispatcher(android.content.BroadcastReceiver, android.content.Context, android.os.Handler, android.app.Instrumentation, boolean);
    public java.lang.String getResDir();
    public android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.content.Context, android.os.Handler, int);
    public java.lang.String[] getSplitAppDirs();
    public java.lang.String[] getSplitResDirs();
    public int getTargetSdkVersion();
    public boolean isSecurityViolation();
    public android.app.Application makeApplication(boolean, android.app.Instrumentation);
    public static void makePaths(android.app.ActivityThread, android.content.pm.ApplicationInfo, java.util.List);
    public static void makePaths(android.app.ActivityThread, boolean, android.content.pm.ApplicationInfo, java.util.List, java.util.List);
    public void removeContextRegistrations(android.content.Context, java.lang.String, java.lang.String);
    public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
    public void updateApplicationInfo(android.content.pm.ApplicationInfo, java.util.List);


}

-keep class android.app.LoaderManager {
    <init>();

    public abstract void destroyLoader(int);
    public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public static void enableDebugLogging(boolean);
    public android.app.FragmentHostCallback getFragmentHostCallback();
    public abstract android.content.Loader getLoader(int);
    public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager$LoaderCallbacks);
    public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager$LoaderCallbacks);


}

-keep class android.app.LoaderManager$LoaderCallbacks {

    public abstract android.content.Loader onCreateLoader(int, android.os.Bundle);
    public abstract void onLoadFinished(android.content.Loader, java.lang.Object);
    public abstract void onLoaderReset(android.content.Loader);


}

-keep class android.app.Notification {
    <init>();
    <init>(android.content.Context, int, java.lang.CharSequence, long, java.lang.CharSequence, java.lang.CharSequence, android.content.Intent);
    <init>(int, java.lang.CharSequence, long);
    <init>(android.os.Parcel);

    public static void addFieldsFromContext(android.content.Context, android.app.Notification);
    public static void addFieldsFromContext(android.content.pm.ApplicationInfo, android.app.Notification);
    public static boolean areActionsVisiblyDifferent(android.app.Notification, android.app.Notification);
    public static boolean areRemoteViewsChanged(android.app.Notification$Builder, android.app.Notification$Builder);
    public static boolean areStyledNotificationsVisiblyDifferent(android.app.Notification$Builder, android.app.Notification$Builder);
    public android.app.Notification clone();
    public java.lang.Object clone();
    public void cloneInto(android.app.Notification, boolean);
    public int describeContents();
    public int getBadgeIconType();
    public java.lang.String getChannel();
    public java.lang.String getChannelId();
    public java.lang.String getGroup();
    public int getGroupAlertBehavior();
    public android.graphics.drawable.Icon getLargeIcon();
    public java.lang.Class getNotificationStyle();
    public static java.lang.Class getNotificationStyleClass(java.lang.String);
    public java.lang.CharSequence getSettingsText();
    public java.lang.String getShortcutId();
    public android.graphics.drawable.Icon getSmallIcon();
    public java.lang.String getSortKey();
    public long getTimeout();
    public long getTimeoutAfter();
    public boolean hasCompletedProgress();
    public boolean hasMediaSession();
    public boolean isColorized();
    public boolean isColorizedMedia();
    public boolean isGroupChild();
    public boolean isGroupSummary();
    public boolean isMediaNotification();
    public void lightenPayload();
    public static java.lang.String priorityToString(int);
    public static java.lang.CharSequence safeCharSequence(java.lang.CharSequence);
    public void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
    public void setSmallIcon(android.graphics.drawable.Icon);
    public boolean showsChronometer();
    public boolean showsTime();
    public boolean suppressAlertingDueToGrouping();
    public java.lang.String toString();
    public static java.lang.String visibilityToString(int);
    public void visitUris(java.util.function.Consumer);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
    public static int BADGE_ICON_LARGE;
    public static int BADGE_ICON_NONE;
    public static int BADGE_ICON_SMALL;
    public static java.lang.String CATEGORY_ALARM;
    public static java.lang.String CATEGORY_CALL;
    public static java.lang.String CATEGORY_CAR_EMERGENCY;
    public static java.lang.String CATEGORY_CAR_INFORMATION;
    public static java.lang.String CATEGORY_CAR_WARNING;
    public static java.lang.String CATEGORY_EMAIL;
    public static java.lang.String CATEGORY_ERROR;
    public static java.lang.String CATEGORY_EVENT;
    public static java.lang.String CATEGORY_MESSAGE;
    public static java.lang.String CATEGORY_NAVIGATION;
    public static java.lang.String CATEGORY_PROGRESS;
    public static java.lang.String CATEGORY_PROMO;
    public static java.lang.String CATEGORY_RECOMMENDATION;
    public static java.lang.String CATEGORY_REMINDER;
    public static java.lang.String CATEGORY_SERVICE;
    public static java.lang.String CATEGORY_SOCIAL;
    public static java.lang.String CATEGORY_STATUS;
    public static java.lang.String CATEGORY_SYSTEM;
    public static java.lang.String CATEGORY_TRANSPORT;
    public static int COLOR_DEFAULT;
    public static int COLOR_INVALID;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DEFAULT_ALL;
    public static int DEFAULT_LIGHTS;
    public static int DEFAULT_SOUND;
    public static int DEFAULT_VIBRATE;
    public static java.lang.String EXTRA_ALLOW_DURING_SETUP;
    public static java.lang.String EXTRA_AUDIO_CONTENTS_URI;
    public static java.lang.String EXTRA_BACKGROUND_IMAGE_URI;
    public static java.lang.String EXTRA_BIG_TEXT;
    public static java.lang.String EXTRA_BUILDER_APPLICATION_INFO;
    public static java.lang.String EXTRA_CHANNEL_GROUP_ID;
    public static java.lang.String EXTRA_CHANNEL_ID;
    public static java.lang.String EXTRA_CHRONOMETER_COUNT_DOWN;
    public static java.lang.String EXTRA_COLORIZED;
    public static java.lang.String EXTRA_COMPACT_ACTIONS;
    public static java.lang.String EXTRA_CONTAINS_CUSTOM_VIEW;
    public static java.lang.String EXTRA_CONVERSATION_TITLE;
    public static java.lang.String EXTRA_FOREGROUND_APPS;
    public static java.lang.String EXTRA_HIDE_SMART_REPLIES;
    public static java.lang.String EXTRA_HISTORIC_MESSAGES;
    public static java.lang.String EXTRA_INFO_TEXT;
    public static java.lang.String EXTRA_IS_GROUP_CONVERSATION;
    public static java.lang.String EXTRA_LARGE_ICON;
    public static java.lang.String EXTRA_LARGE_ICON_BIG;
    public static java.lang.String EXTRA_MEDIA_SESSION;
    public static java.lang.String EXTRA_MESSAGES;
    public static java.lang.String EXTRA_MESSAGING_PERSON;
    public static java.lang.String EXTRA_NOTIFICATION_ID;
    public static java.lang.String EXTRA_NOTIFICATION_TAG;
    public static java.lang.String EXTRA_PEOPLE;
    public static java.lang.String EXTRA_PEOPLE_LIST;
    public static java.lang.String EXTRA_PICTURE;
    public static java.lang.String EXTRA_PROGRESS;
    public static java.lang.String EXTRA_PROGRESS_INDETERMINATE;
    public static java.lang.String EXTRA_PROGRESS_MAX;
    public static java.lang.String EXTRA_REDUCED_IMAGES;
    public static java.lang.String EXTRA_REMOTE_INPUT_DRAFT;
    public static java.lang.String EXTRA_REMOTE_INPUT_HISTORY;
    public static java.lang.String EXTRA_SELF_DISPLAY_NAME;
    public static java.lang.String EXTRA_SHOW_CHRONOMETER;
    public static java.lang.String EXTRA_SHOW_REMOTE_INPUT_SPINNER;
    public static java.lang.String EXTRA_SHOW_WHEN;
    public static java.lang.String EXTRA_SMALL_ICON;
    public static java.lang.String EXTRA_SUBSTITUTE_APP_NAME;
    public static java.lang.String EXTRA_SUB_TEXT;
    public static java.lang.String EXTRA_SUMMARY_TEXT;
    public static java.lang.String EXTRA_TEMPLATE;
    public static java.lang.String EXTRA_TEXT;
    public static java.lang.String EXTRA_TEXT_LINES;
    public static java.lang.String EXTRA_TITLE;
    public static java.lang.String EXTRA_TITLE_BIG;
    public static int FLAG_AUTOGROUP_SUMMARY;
    public static int FLAG_AUTO_CANCEL;
    public static int FLAG_CAN_COLORIZE;
    public static int FLAG_FOREGROUND_SERVICE;
    public static int FLAG_GROUP_SUMMARY;
    public static int FLAG_HIGH_PRIORITY;
    public static int FLAG_INSISTENT;
    public static int FLAG_LOCAL_ONLY;
    public static int FLAG_NO_CLEAR;
    public static int FLAG_ONGOING_EVENT;
    public static int FLAG_ONLY_ALERT_ONCE;
    public static int FLAG_SHOW_LIGHTS;
    public static int GROUP_ALERT_ALL;
    public static int GROUP_ALERT_CHILDREN;
    public static int GROUP_ALERT_SUMMARY;
    public static java.lang.String INTENT_CATEGORY_NOTIFICATION_PREFERENCES;
    public static int PRIORITY_DEFAULT;
    public static int PRIORITY_HIGH;
    public static int PRIORITY_LOW;
    public static int PRIORITY_MAX;
    public static int PRIORITY_MIN;
    public static int STREAM_DEFAULT;
    public static int VISIBILITY_PRIVATE;
    public static int VISIBILITY_PUBLIC;
    public static int VISIBILITY_SECRET;
    public android.app.Notification$Action[] actions;
    public android.util.ArraySet allPendingIntents;
    public android.media.AudioAttributes audioAttributes;
    public int audioStreamType;
    public android.widget.RemoteViews bigContentView;
    public java.lang.String category;
    public int color;
    public android.app.PendingIntent contentIntent;
    public android.widget.RemoteViews contentView;
    public int defaults;
    public android.app.PendingIntent deleteIntent;
    public android.os.Bundle extras;
    public int flags;
    public android.app.PendingIntent fullScreenIntent;
    public android.widget.RemoteViews headsUpContentView;
    public int icon;
    public int iconLevel;
    public android.graphics.Bitmap largeIcon;
    public int ledARGB;
    public int ledOffMS;
    public int ledOnMS;
    public int number;
    public int priority;
    public static android.os.IBinder processWhitelistToken;
    public android.app.Notification publicVersion;
    public android.net.Uri sound;
    public java.lang.CharSequence tickerText;
    public android.widget.RemoteViews tickerView;
    public long[] vibrate;
    public int visibility;
    public long when;
}

-keep class android.app.Notification$Action {
    <init>(int, java.lang.CharSequence, android.app.PendingIntent);

    public android.app.Notification$Action clone();
    public java.lang.Object clone();
    public int describeContents();
    public boolean getAllowGeneratedReplies();
    public android.app.RemoteInput[] getDataOnlyRemoteInputs();
    public android.os.Bundle getExtras();
    public android.graphics.drawable.Icon getIcon();
    public android.app.RemoteInput[] getRemoteInputs();
    public int getSemanticAction();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int SEMANTIC_ACTION_ARCHIVE;
    public static int SEMANTIC_ACTION_CALL;
    public static int SEMANTIC_ACTION_DELETE;
    public static int SEMANTIC_ACTION_MARK_AS_READ;
    public static int SEMANTIC_ACTION_MARK_AS_UNREAD;
    public static int SEMANTIC_ACTION_MUTE;
    public static int SEMANTIC_ACTION_NONE;
    public static int SEMANTIC_ACTION_REPLY;
    public static int SEMANTIC_ACTION_THUMBS_DOWN;
    public static int SEMANTIC_ACTION_THUMBS_UP;
    public static int SEMANTIC_ACTION_UNMUTE;
    public android.app.PendingIntent actionIntent;
    public int icon;
    public java.lang.CharSequence title;
}

-keep class android.app.Notification$Builder {
    <init>(android.content.Context, java.lang.String);
    <init>(android.content.Context);
    <init>(android.content.Context, android.app.Notification);

    public android.app.Notification$Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
    public android.app.Notification$Builder addAction(android.app.Notification$Action);
    public android.app.Notification$Builder addExtras(android.os.Bundle);
    public android.app.Notification$Builder addPerson(java.lang.String);
    public android.app.Notification$Builder addPerson(android.app.Person);
    public android.app.Notification build();
    public android.app.Notification buildInto(android.app.Notification);
    public android.app.Notification buildUnstyled();
    public android.widget.RemoteViews createBigContentView();
    public android.widget.RemoteViews createContentView();
    public android.widget.RemoteViews createContentView(boolean);
    public android.widget.RemoteViews createHeadsUpContentView(boolean);
    public android.widget.RemoteViews createHeadsUpContentView();
    public android.app.Notification$Builder extend(android.app.Notification$Extender);
    public android.os.Bundle getExtras();
    public java.lang.CharSequence getHeadsUpStatusBarText(boolean);
    public android.app.Notification getNotification();
    public int getPrimaryTextColor();
    public int getSecondaryTextColor();
    public android.app.Notification$Style getStyle();
    public java.lang.String loadHeaderAppName();
    public android.widget.RemoteViews makeAmbientNotification();
    public static void makeHeaderExpanded(android.widget.RemoteViews);
    public android.widget.RemoteViews makeLowPriorityContentView(boolean);
    public android.widget.RemoteViews makeNotificationHeader(boolean);
    public android.widget.RemoteViews makePublicAmbientNotification();
    public android.widget.RemoteViews makePublicContentView();
    public static android.app.Notification maybeCloneStrippedForDelivery(android.app.Notification, boolean, android.content.Context);
    public static android.app.Notification$Builder recoverBuilder(android.content.Context, android.app.Notification);
    public android.app.Notification$Builder setActions(android.app.Notification$Action[]);
    public android.app.Notification$Builder setAutoCancel(boolean);
    public android.app.Notification$Builder setBadgeIconType(int);
    public android.app.Notification$Builder setCategory(java.lang.String);
    public android.app.Notification$Builder setChannel(java.lang.String);
    public android.app.Notification$Builder setChannelId(java.lang.String);
    public android.app.Notification$Builder setChronometerCountDown(boolean);
    public android.app.Notification$Builder setColor(int);
    public void setColorPalette(int, int);
    public android.app.Notification$Builder setColorized(boolean);
    public android.app.Notification$Builder setContent(android.widget.RemoteViews);
    public android.app.Notification$Builder setContentInfo(java.lang.CharSequence);
    public android.app.Notification$Builder setContentIntent(android.app.PendingIntent);
    public android.app.Notification$Builder setContentText(java.lang.CharSequence);
    public android.app.Notification$Builder setContentTitle(java.lang.CharSequence);
    public android.app.Notification$Builder setCustomBigContentView(android.widget.RemoteViews);
    public android.app.Notification$Builder setCustomContentView(android.widget.RemoteViews);
    public android.app.Notification$Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
    public android.app.Notification$Builder setDefaults(int);
    public android.app.Notification$Builder setDeleteIntent(android.app.PendingIntent);
    public android.app.Notification$Builder setExtras(android.os.Bundle);
    public android.app.Notification$Builder setFlag(int, boolean);
    public android.app.Notification$Builder setFullScreenIntent(android.app.PendingIntent, boolean);
    public android.app.Notification$Builder setGroup(java.lang.String);
    public android.app.Notification$Builder setGroupAlertBehavior(int);
    public android.app.Notification$Builder setGroupSummary(boolean);
    public android.app.Notification$Builder setHideSmartReplies(boolean);
    public android.app.Notification$Builder setLargeIcon(android.graphics.Bitmap);
    public android.app.Notification$Builder setLargeIcon(android.graphics.drawable.Icon);
    public android.app.Notification$Builder setLights(int, int, int);
    public android.app.Notification$Builder setLocalOnly(boolean);
    public android.app.Notification$Builder setNumber(int);
    public android.app.Notification$Builder setOngoing(boolean);
    public android.app.Notification$Builder setOnlyAlertOnce(boolean);
    public android.app.Notification$Builder setPriority(int);
    public android.app.Notification$Builder setProgress(int, int, boolean);
    public android.app.Notification$Builder setPublicVersion(android.app.Notification);
    public void setRebuildStyledRemoteViews(boolean);
    public android.app.Notification$Builder setRemoteInputHistory(java.lang.CharSequence[]);
    public android.app.Notification$Builder setSettingsText(java.lang.CharSequence);
    public android.app.Notification$Builder setShortcutId(java.lang.String);
    public android.app.Notification$Builder setShowRemoteInputSpinner(boolean);
    public android.app.Notification$Builder setShowWhen(boolean);
    public android.app.Notification$Builder setSmallIcon(int);
    public android.app.Notification$Builder setSmallIcon(int, int);
    public android.app.Notification$Builder setSmallIcon(android.graphics.drawable.Icon);
    public android.app.Notification$Builder setSortKey(java.lang.String);
    public android.app.Notification$Builder setSound(android.net.Uri);
    public android.app.Notification$Builder setSound(android.net.Uri, int);
    public android.app.Notification$Builder setSound(android.net.Uri, android.media.AudioAttributes);
    public android.app.Notification$Builder setStyle(android.app.Notification$Style);
    public android.app.Notification$Builder setSubText(java.lang.CharSequence);
    public android.app.Notification$Builder setTicker(java.lang.CharSequence);
    public android.app.Notification$Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
    public android.app.Notification$Builder setTimeout(long);
    public android.app.Notification$Builder setTimeoutAfter(long);
    public android.app.Notification$Builder setUsesChronometer(boolean);
    public android.app.Notification$Builder setVibrate(long[]);
    public android.app.Notification$Builder setVisibility(int);
    public android.app.Notification$Builder setWhen(long);
    public boolean usesStandardHeader();


    public static java.lang.String EXTRA_REBUILD_BIG_CONTENT_VIEW_ACTION_COUNT;
    public static java.lang.String EXTRA_REBUILD_CONTENT_VIEW_ACTION_COUNT;
    public static java.lang.String EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT;
}

-keep class android.app.Notification$Extender {

    public abstract android.app.Notification$Builder extend(android.app.Notification$Builder);


}

-keep class android.app.Notification$Style {
    <init>();

    public void addExtras(android.os.Bundle);
    public abstract boolean areNotificationsVisiblyDifferent(android.app.Notification$Style);
    public android.app.Notification build();
    public android.app.Notification buildStyled(android.app.Notification);
    protected void checkBuilder();
    public boolean displayCustomViewInline();
    public java.lang.CharSequence getHeadsUpStatusBarText();
    protected android.widget.RemoteViews getStandardView(int);
    protected android.widget.RemoteViews getStandardView(int, android.app.Notification$TemplateBindResult);
    protected boolean hasProgress();
    public boolean hasSummaryInHeader();
    protected void internalSetBigContentTitle(java.lang.CharSequence);
    protected void internalSetSummaryText(java.lang.CharSequence);
    public android.widget.RemoteViews makeBigContentView();
    public android.widget.RemoteViews makeContentView(boolean);
    public android.widget.RemoteViews makeHeadsUpContentView(boolean);
    public void purgeResources();
    public void reduceImageSizes(android.content.Context);
    protected void restoreFromExtras(android.os.Bundle);
    public void setBuilder(android.app.Notification$Builder);
    public void validate(android.content.Context);


    protected android.app.Notification$Builder mBuilder;
    protected java.lang.CharSequence mSummaryText;
    protected boolean mSummaryTextSet;
}

-keep class android.app.Notification$TemplateBindResult {

    public int getIconMarginEnd();
    public void setIconMarginEnd(int);


}

-keep class android.app.OnActivityPausedListener {

    public abstract void onPaused(android.app.Activity);


}

-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 getActivitiesAsUser(android.content.Context, int, android.content.Intent[], int, android.os.Bundle, android.os.UserHandle);
    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 getActivityAsUser(android.content.Context, int, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
    public static android.app.PendingIntent getBroadcastAsUser(android.content.Context, int, android.content.Intent, int, android.os.UserHandle);
    public java.lang.String getCreatorPackage();
    public int getCreatorUid();
    public android.os.UserHandle getCreatorUserHandle();
    public static android.app.PendingIntent getForegroundService(android.content.Context, int, android.content.Intent, int);
    public android.content.Intent getIntent();
    public android.content.IntentSender getIntentSender();
    public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
    public java.lang.String getTag(java.lang.String);
    public android.content.IIntentSender getTarget();
    public java.lang.String getTargetPackage();
    public android.os.IBinder getWhitelistToken();
    public int hashCode();
    public boolean isActivity();
    public boolean isForegroundService();
    public boolean isTargetedToPackage();
    public static android.app.PendingIntent readPendingIntentOrNullFromParcel(android.os.Parcel);
    public void registerCancelListener(android.app.PendingIntent$CancelListener);
    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 int sendAndReturnResult(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String, android.os.Bundle);
    public static void setOnMarshaledListener(android.app.PendingIntent$OnMarshaledListener);
    public java.lang.String toString();
    public void unregisterCancelListener(android.app.PendingIntent$CancelListener);
    public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    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$CancelListener {

    public abstract void onCancelled(android.app.PendingIntent);


}

-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.app.PendingIntent$OnMarshaledListener {

    public abstract void onMarshaled(android.app.PendingIntent, android.os.Parcel, int);


}

-keep class android.app.Person {

    public int describeContents();
    public android.graphics.drawable.Icon getIcon();
    public java.lang.String getKey();
    public java.lang.CharSequence getName();
    public java.lang.String getUri();
    public boolean isBot();
    public boolean isImportant();
    public java.lang.String resolveToLegacyUri();
    public android.app.Person$Builder toBuilder();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.Person$Builder {
    <init>();

    public android.app.Person build();
    public android.app.Person$Builder setBot(boolean);
    public android.app.Person$Builder setIcon(android.graphics.drawable.Icon);
    public android.app.Person$Builder setImportant(boolean);
    public android.app.Person$Builder setKey(java.lang.String);
    public android.app.Person$Builder setName(java.lang.CharSequence);
    public android.app.Person$Builder setUri(java.lang.String);


}

-keep class android.app.PictureInPictureArgs {
    <init>();
    <init>(float, java.util.List);

    public static android.app.PictureInPictureArgs convert(android.app.PictureInPictureParams);
    public static android.app.PictureInPictureParams convert(android.app.PictureInPictureArgs);
    public void copyOnlySet(android.app.PictureInPictureArgs);
    public int describeContents();
    public java.util.List getActions();
    public float getAspectRatio();
    public android.util.Rational getAspectRatioRational();
    public android.graphics.Rect getSourceRectHint();
    public android.graphics.Rect getSourceRectHintInsets();
    public boolean hasSetActions();
    public boolean hasSetAspectRatio();
    public boolean hasSourceBoundsHint();
    public boolean hasSourceBoundsHintInsets();
    public void setActions(java.util.List);
    public void setAspectRatio(float);
    public void setSourceRectHint(android.graphics.Rect);
    public void setSourceRectHintInsets(android.graphics.Rect);
    public void truncateActions(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.PictureInPictureParams {

    public void copyOnlySet(android.app.PictureInPictureParams);
    public int describeContents();
    public java.util.List getActions();
    public float getAspectRatio();
    public android.util.Rational getAspectRatioRational();
    public android.graphics.Rect getSourceRectHint();
    public boolean hasSetActions();
    public boolean hasSetAspectRatio();
    public boolean hasSourceBoundsHint();
    public void truncateActions(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ProfilerInfo {
    <init>(java.lang.String, android.os.ParcelFileDescriptor, int, boolean, boolean, java.lang.String, boolean);
    <init>(android.app.ProfilerInfo);

    public void closeFd();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public android.app.ProfilerInfo setAgent(java.lang.String, boolean);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String agent;
    public boolean attachAgentDuringBind;
    public boolean autoStopProfiler;
    public android.os.ParcelFileDescriptor profileFd;
    public java.lang.String profileFile;
    public int samplingInterval;
    public boolean streamingOutput;
}

-keep class android.app.RemoteAction {
    <init>(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);

    public android.app.RemoteAction clone();
    public java.lang.Object clone();
    public int describeContents();
    public void dump(java.lang.String, java.io.PrintWriter);
    public android.app.PendingIntent getActionIntent();
    public java.lang.CharSequence getContentDescription();
    public android.graphics.drawable.Icon getIcon();
    public java.lang.CharSequence getTitle();
    public boolean isEnabled();
    public void setEnabled(boolean);
    public void setShouldShowIcon(boolean);
    public boolean shouldShowIcon();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.RemoteInput {

    public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map);
    public static void addResultsToIntent(android.app.RemoteInput[], android.content.Intent, android.os.Bundle);
    public int describeContents();
    public boolean getAllowFreeFormInput();
    public java.util.Set getAllowedDataTypes();
    public java.lang.CharSequence[] getChoices();
    public static java.util.Map getDataResultsFromIntent(android.content.Intent, java.lang.String);
    public android.os.Bundle getExtras();
    public java.lang.CharSequence getLabel();
    public java.lang.String getResultKey();
    public static android.os.Bundle getResultsFromIntent(android.content.Intent);
    public static int getResultsSource(android.content.Intent);
    public boolean isDataOnly();
    public static void setResultsSource(android.content.Intent, int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_RESULTS_DATA;
    public static java.lang.String RESULTS_CLIP_LABEL;
    public static int SOURCE_CHOICE;
    public static int SOURCE_FREE_FORM_INPUT;
}

-keep class android.app.ResultInfo {
    <init>(java.lang.String, int, int, android.content.Intent);
    <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 android.content.Intent mData;
    public int mRequestCode;
    public int mResultCode;
    public java.lang.String mResultWho;
}

-keep class android.app.Service {
    <init>();

    public void attach(android.content.Context, android.app.ActivityThread, java.lang.String, android.os.IBinder, android.app.Application, java.lang.Object);
    public void detachAndCleanUp();
    protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public android.app.Application getApplication();
    public abstract android.os.IBinder onBind(android.content.Intent);
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onCreate();
    public void onDestroy();
    public void onLowMemory();
    public void onRebind(android.content.Intent);
    public void onStart(android.content.Intent, int);
    public int onStartCommand(android.content.Intent, int, int);
    public void onTaskRemoved(android.content.Intent);
    public void onTrimMemory(int);
    public boolean onUnbind(android.content.Intent);
    public void setForeground(boolean);
    public void startForeground(int, android.app.Notification);
    public void stopForeground(boolean);
    public void stopForeground(int);
    public void stopSelf();
    public void stopSelf(int);
    public boolean stopSelfResult(int);


    public static int START_CONTINUATION_MASK;
    public static int START_FLAG_REDELIVERY;
    public static int START_FLAG_RETRY;
    public static int START_NOT_STICKY;
    public static int START_REDELIVER_INTENT;
    public static int START_STICKY;
    public static int START_STICKY_COMPATIBILITY;
    public static int START_TASK_REMOVED_COMPLETE;
    public static int STOP_FOREGROUND_DETACH;
    public static int STOP_FOREGROUND_REMOVE;
}

-keep class android.app.SharedElementCallback {
    <init>();

    public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
    public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
    public void onMapSharedElements(java.util.List, java.util.Map);
    public void onRejectSharedElements(java.util.List);
    public void onSharedElementEnd(java.util.List, java.util.List, java.util.List);
    public void onSharedElementStart(java.util.List, java.util.List, java.util.List);
    public void onSharedElementsArrived(java.util.List, java.util.List, android.app.SharedElementCallback$OnSharedElementsReadyListener);


}

-keep class android.app.SharedElementCallback$OnSharedElementsReadyListener {

    public abstract void onSharedElementsReady();


}

-keep class android.app.TaskStackBuilder {

    public android.app.TaskStackBuilder addNextIntent(android.content.Intent);
    public android.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
    public android.app.TaskStackBuilder addParentStack(android.app.Activity);
    public android.app.TaskStackBuilder addParentStack(java.lang.Class);
    public android.app.TaskStackBuilder addParentStack(android.content.ComponentName);
    public static android.app.TaskStackBuilder create(android.content.Context);
    public android.content.Intent editIntentAt(int);
    public int getIntentCount();
    public android.content.Intent[] getIntents();
    public android.app.PendingIntent getPendingIntent(int, int);
    public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
    public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle, android.os.UserHandle);
    public void startActivities();
    public int startActivities(android.os.Bundle, android.os.UserHandle);
    public void startActivities(android.os.Bundle);


}

-keep class android.app.UiAutomation {
    <init>(android.os.Looper, android.app.IUiAutomationConnection);

    public void clearWindowAnimationFrameStats();
    public boolean clearWindowContentFrameStats(int);
    public void connect();
    public void connect(int);
    public void destroy();
    public void disconnect();
    public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, android.app.UiAutomation$AccessibilityEventFilter, long);
    public android.os.ParcelFileDescriptor executeShellCommand(java.lang.String);
    public android.os.ParcelFileDescriptor[] executeShellCommandRw(java.lang.String);
    public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    public int getConnectionId();
    public int getFlags();
    public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
    public android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
    public android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
    public android.view.WindowContentFrameStats getWindowContentFrameStats(int);
    public java.util.List getWindows();
    public void grantRuntimePermission(java.lang.String, java.lang.String);
    public boolean grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public void grantRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
    public boolean injectInputEvent(android.view.InputEvent, boolean);
    public boolean isDestroyed();
    public boolean performGlobalAction(int);
    public void revokeRuntimePermission(java.lang.String, java.lang.String);
    public boolean revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public void revokeRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
    public void setOnAccessibilityEventListener(android.app.UiAutomation$OnAccessibilityEventListener);
    public boolean setRotation(int);
    public void setRunAsMonkey(boolean);
    public void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
    public android.graphics.Bitmap takeScreenshot();
    public void waitForIdle(long, long);


    public static int FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES;
    public static int ROTATION_FREEZE_0;
    public static int ROTATION_FREEZE_180;
    public static int ROTATION_FREEZE_270;
    public static int ROTATION_FREEZE_90;
    public static int ROTATION_FREEZE_CURRENT;
    public static int ROTATION_UNFREEZE;
}

-keep class android.app.UiAutomation$AccessibilityEventFilter {

    public abstract boolean accept(android.view.accessibility.AccessibilityEvent);


}

-keep class android.app.UiAutomation$OnAccessibilityEventListener {

    public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);


}

-keep class android.app.VoiceInteractor {

    public android.app.VoiceInteractor$Request getActiveRequest(java.lang.String);
    public android.app.VoiceInteractor$Request[] getActiveRequests();
    public boolean submitRequest(android.app.VoiceInteractor$Request);
    public boolean submitRequest(android.app.VoiceInteractor$Request, java.lang.String);
    public boolean[] supportsCommands(java.lang.String[]);


}

-keep class android.app.VoiceInteractor$PickOptionRequest {
    <init>(android.app.VoiceInteractor$Prompt, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
    <init>(java.lang.CharSequence, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);

    public void onPickOptionResult(boolean, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);


}

-keep class android.app.VoiceInteractor$PickOptionRequest$Option {
    <init>(java.lang.CharSequence);
    <init>(java.lang.CharSequence, int);

    public android.app.VoiceInteractor$PickOptionRequest$Option addSynonym(java.lang.CharSequence);
    public int countSynonyms();
    public int describeContents();
    public android.os.Bundle getExtras();
    public int getIndex();
    public java.lang.CharSequence getLabel();
    public java.lang.CharSequence getSynonymAt(int);
    public void setExtras(android.os.Bundle);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.VoiceInteractor$Prompt {
    <init>(java.lang.CharSequence[], java.lang.CharSequence);
    <init>(java.lang.CharSequence);

    public int countVoicePrompts();
    public int describeContents();
    public java.lang.CharSequence getVisualPrompt();
    public java.lang.CharSequence getVoicePromptAt(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.VoiceInteractor$Request {

    public void cancel();
    public android.app.Activity getActivity();
    public android.content.Context getContext();
    public java.lang.String getName();
    public void onAttached(android.app.Activity);
    public void onCancel();
    public void onDetached();
    public java.lang.String toString();


}

-keep class android.app.WaitResult {
    <init>();

    public int describeContents();
    public void dump(java.io.PrintWriter, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int result;
    public long thisTime;
    public boolean timeout;
    public long totalTime;
    public android.content.ComponentName who;
}

-keep class android.app.WindowConfiguration {
    <init>();
    <init>(android.app.WindowConfiguration);

    public static java.lang.String activityTypeToString(int);
    public boolean canReceiveKeys();
    public boolean canResizeTask();
    public int compareTo(android.app.WindowConfiguration);
    public int compareTo(java.lang.Object);
    public int describeContents();
    public long diff(android.app.WindowConfiguration, boolean);
    public boolean equals(java.lang.Object);
    public int getActivityType();
    public android.graphics.Rect getAppBounds();
    public android.graphics.Rect getBounds();
    public int getWindowingMode();
    public boolean hasMovementAnimations();
    public boolean hasWindowDecorCaption();
    public boolean hasWindowShadow();
    public int hashCode();
    public boolean isAlwaysOnTop();
    public static boolean isFloating(int);
    public boolean keepVisibleDeadAppWindowOnScreen();
    public boolean persistTaskBounds();
    public void setActivityType(int);
    public void setAppBounds(android.graphics.Rect);
    public void setAppBounds(int, int, int, int);
    public void setBounds(android.graphics.Rect);
    public void setTo(android.app.WindowConfiguration);
    public void setToDefaults();
    public void setWindowingMode(int);
    public boolean supportSplitScreenWindowingMode();
    public static boolean supportSplitScreenWindowingMode(int);
    public boolean tasksAreFloating();
    public java.lang.String toString();
    public void unset();
    public int updateFrom(android.app.WindowConfiguration);
    public boolean useWindowFrameForBackdrop();
    public static java.lang.String windowingModeToString(int);
    public boolean windowsAreScaleable();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int ACTIVITY_TYPE_ASSISTANT;
    public static int ACTIVITY_TYPE_HOME;
    public static int ACTIVITY_TYPE_RECENTS;
    public static int ACTIVITY_TYPE_STANDARD;
    public static int ACTIVITY_TYPE_UNDEFINED;
    public static android.os.Parcelable$Creator CREATOR;
    public static int PINNED_WINDOWING_MODE_ELEVATION_IN_DIP;
    public static int WINDOWING_MODE_FREEFORM;
    public static int WINDOWING_MODE_FULLSCREEN;
    public static int WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
    public static int WINDOWING_MODE_PINNED;
    public static int WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
    public static int WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
    public static int WINDOWING_MODE_UNDEFINED;
    public static int WINDOW_CONFIG_ACTIVITY_TYPE;
    public static int WINDOW_CONFIG_APP_BOUNDS;
    public static int WINDOW_CONFIG_BOUNDS;
    public static int WINDOW_CONFIG_WINDOWING_MODE;
}

-keep class android.app.assist.AssistContent {
    <init>();

    public int describeContents();
    public android.content.ClipData getClipData();
    public android.os.Bundle getExtras();
    public android.content.Intent getIntent();
    public java.lang.String getStructuredData();
    public android.net.Uri getWebUri();
    public boolean isAppProvidedIntent();
    public boolean isAppProvidedWebUri();
    public void setClipData(android.content.ClipData);
    public void setDefaultIntent(android.content.Intent);
    public void setIntent(android.content.Intent);
    public void setStructuredData(java.lang.String);
    public void setWebUri(android.net.Uri);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.assist.AssistStructure {
    <init>(android.app.Activity, boolean, int);
    <init>();
    <init>(android.os.Parcel);

    public void clearSendChannel();
    public int describeContents();
    public void dump(boolean);
    public void ensureData();
    public long getAcquisitionEndTime();
    public long getAcquisitionStartTime();
    public android.content.ComponentName getActivityComponent();
    public int getFlags();
    public android.app.assist.AssistStructure$WindowNode getWindowNodeAt(int);
    public int getWindowNodeCount();
    public boolean isHomeActivity();
    public void sanitizeForParceling(boolean);
    public void setAcquisitionEndTime(long);
    public void setAcquisitionStartTime(long);
    public void setActivityComponent(android.content.ComponentName);
    public void setHomeActivity(boolean);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.assist.AssistStructure$AutofillOverlay {
    <init>();



    public boolean focused;
    public android.view.autofill.AutofillValue value;
}

-keep class android.app.assist.AssistStructure$ViewNode {

    public float getAlpha();
    public java.lang.String[] getAutofillHints();
    public android.view.autofill.AutofillId getAutofillId();
    public java.lang.CharSequence[] getAutofillOptions();
    public int getAutofillType();
    public android.view.autofill.AutofillValue getAutofillValue();
    public android.app.assist.AssistStructure$ViewNode getChildAt(int);
    public int getChildCount();
    public java.lang.String getClassName();
    public java.lang.CharSequence getContentDescription();
    public float getElevation();
    public android.os.Bundle getExtras();
    public int getHeight();
    public java.lang.String getHint();
    public android.view.ViewStructure$HtmlInfo getHtmlInfo();
    public int getId();
    public java.lang.String getIdEntry();
    public java.lang.String getIdPackage();
    public java.lang.String getIdType();
    public int getImportantForAutofill();
    public int getInputType();
    public int getLeft();
    public android.os.LocaleList getLocaleList();
    public int getMaxTextEms();
    public int getMaxTextLength();
    public int getMinTextEms();
    public int getScrollX();
    public int getScrollY();
    public java.lang.CharSequence getText();
    public int getTextBackgroundColor();
    public int getTextColor();
    public java.lang.String getTextIdEntry();
    public int[] getTextLineBaselines();
    public int[] getTextLineCharOffsets();
    public int getTextSelectionEnd();
    public int getTextSelectionStart();
    public float getTextSize();
    public int getTextStyle();
    public int getTop();
    public android.graphics.Matrix getTransformation();
    public int getVisibility();
    public java.lang.String getWebDomain();
    public java.lang.String getWebScheme();
    public int getWidth();
    public boolean isAccessibilityFocused();
    public boolean isActivated();
    public boolean isAssistBlocked();
    public boolean isCheckable();
    public boolean isChecked();
    public boolean isClickable();
    public boolean isContextClickable();
    public boolean isEnabled();
    public boolean isFocusable();
    public boolean isFocused();
    public boolean isLongClickable();
    public boolean isOpaque();
    public boolean isSanitized();
    public boolean isSelected();
    public void setAutofillOverlay(android.app.assist.AssistStructure$AutofillOverlay);
    public void setWebDomain(java.lang.String);
    public void updateAutofillValue(android.view.autofill.AutofillValue);


    public static int TEXT_COLOR_UNDEFINED;
    public static int TEXT_STYLE_BOLD;
    public static int TEXT_STYLE_ITALIC;
    public static int TEXT_STYLE_STRIKE_THRU;
    public static int TEXT_STYLE_UNDERLINE;
}

-keep class android.app.assist.AssistStructure$WindowNode {

    public int getDisplayId();
    public int getHeight();
    public int getLeft();
    public android.app.assist.AssistStructure$ViewNode getRootViewNode();
    public java.lang.CharSequence getTitle();
    public int getTop();
    public int getWidth();


}

-keep class android.app.servertransaction.ActivityLifecycleItem {
    <init>();

    public abstract int getTargetState();
    public void recycle();


    public static int ON_CREATE;
    public static int ON_DESTROY;
    public static int ON_PAUSE;
    public static int ON_RESTART;
    public static int ON_RESUME;
    public static int ON_START;
    public static int ON_STOP;
    public static int PRE_ON_CREATE;
    public static int UNDEFINED;
}

-keep class android.app.servertransaction.ClientTransaction {

    public void addCallback(android.app.servertransaction.ClientTransactionItem);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.os.IBinder getActivityToken();
    public android.app.IApplicationThread getClient();
    public android.app.servertransaction.ActivityLifecycleItem getLifecycleStateRequest();
    public int hashCode();
    public static android.app.servertransaction.ClientTransaction obtain(android.app.IApplicationThread, android.os.IBinder);
    public void preExecute(android.app.ClientTransactionHandler);
    public void recycle();
    public void schedule();
    public void setLifecycleStateRequest(android.app.servertransaction.ActivityLifecycleItem);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.servertransaction.ClientTransactionItem {
    <init>();

    public int describeContents();
    public int getPostExecutionState();


}

-keep class android.app.servertransaction.PendingTransactionActions {
    <init>();

    public void clear();
    public android.os.Bundle getOldState();
    public android.app.servertransaction.PendingTransactionActions$StopInfo getStopInfo();
    public void setCallOnPostCreate(boolean);
    public void setOldState(android.os.Bundle);
    public void setReportRelaunchToWindowManager(boolean);
    public void setRestoreInstanceState(boolean);
    public void setStopInfo(android.app.servertransaction.PendingTransactionActions$StopInfo);
    public boolean shouldCallOnPostCreate();
    public boolean shouldReportRelaunchToWindowManager();
    public boolean shouldRestoreInstanceState();


}

-keep class android.app.servertransaction.PendingTransactionActions$StopInfo {
    <init>();

    public void run();
    public void setActivity(android.app.ActivityThread$ActivityClientRecord);
    public void setDescription(java.lang.CharSequence);
    public void setPersistentState(android.os.PersistableBundle);
    public void setState(android.os.Bundle);


}

-keep class android.content.BroadcastReceiver {
    <init>();

    public void abortBroadcast();
    public void clearAbortBroadcast();
    public boolean getAbortBroadcast();
    public boolean getDebugUnregister();
    public android.content.BroadcastReceiver$PendingResult getPendingResult();
    public int getResultCode();
    public java.lang.String getResultData();
    public android.os.Bundle getResultExtras(boolean);
    public int getSendingUserId();
    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 setPendingResult(android.content.BroadcastReceiver$PendingResult);
    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 {
    <init>(int, java.lang.String, android.os.Bundle, int, boolean, boolean, android.os.IBinder, int, int);

    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 int getSendingUserId();
    public void sendFinished(android.app.IActivityManager);
    public void setExtrasClassLoader(java.lang.ClassLoader);
    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);


    public static int TYPE_COMPONENT;
    public static int TYPE_REGISTERED;
    public static int TYPE_UNREGISTERED;
}

-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.ClipDescription, java.util.ArrayList);
    <init>(android.content.ClipData);

    public void addItem(android.content.ClipData$Item);
    public void addItem(android.content.ClipData$Item, android.content.ContentResolver);
    public void addItem(android.content.ContentResolver, android.content.ClipData$Item);
    public void collectUris(java.util.List);
    public int describeContents();
    public void fixUris(int);
    public void fixUrisLight(int);
    public android.content.ClipDescription getDescription();
    public android.graphics.Bitmap getIcon();
    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 void prepareToEnterProcess();
    public void prepareToLeaveProcess(boolean);
    public void prepareToLeaveProcess(boolean, int);
    public void setItemAt(int, android.content.ClipData$Item);
    public void toShortString(java.lang.StringBuilder);
    public void toShortStringShortItems(java.lang.StringBuilder, boolean);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.ClipData$Item {
    <init>(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 void toShortString(java.lang.StringBuilder);
    public void toShortSummaryString(java.lang.StringBuilder);
    public java.lang.String toString();
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


}

-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 android.os.PersistableBundle getExtras();
    public java.lang.CharSequence getLabel();
    public java.lang.String getMimeType(int);
    public int getMimeTypeCount();
    public long getTimestamp();
    public boolean hasMimeType(java.lang.String);
    public void setExtras(android.os.PersistableBundle);
    public void setTimestamp(long);
    public boolean toShortString(java.lang.StringBuilder);
    public boolean toShortStringTypesOnly(java.lang.StringBuilder);
    public java.lang.String toString();
    public void validate();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_TARGET_COMPONENT_NAME;
    public static java.lang.String EXTRA_USER_SERIAL_NUMBER;
    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 void appendShortString(java.lang.StringBuilder);
    public static void appendShortString(java.lang.StringBuilder, java.lang.String, java.lang.String);
    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 void printShortString(java.io.PrintWriter, java.lang.String, java.lang.String);
    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 void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.ContentProvider {
    <init>();
    <init>(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);

    public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
    public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
    public void attachInfoForTesting(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 static android.content.ContentProvider coerceToLocalContentProvider(android.content.IContentProvider);
    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[]);
    protected int enforceReadPermissionInner(android.net.Uri, java.lang.String, android.os.IBinder);
    protected int enforceWritePermissionInner(android.net.Uri, java.lang.String, android.os.IBinder);
    public android.app.AppOpsManager getAppOpsManager();
    public static java.lang.String getAuthorityWithoutUserId(java.lang.String);
    public java.lang.String getCallingPackage();
    public android.content.Context getContext();
    public android.content.IContentProvider getIContentProvider();
    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 static android.net.Uri getUriWithoutUserId(android.net.Uri);
    public static int getUserIdFromAuthority(java.lang.String, int);
    public static int getUserIdFromAuthority(java.lang.String);
    public static int getUserIdFromUri(android.net.Uri, int);
    public static int getUserIdFromUri(android.net.Uri);
    public java.lang.String getWritePermission();
    public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    protected boolean isTemporary();
    protected boolean matchesOurAuthorities(java.lang.String);
    public static android.net.Uri maybeAddUserId(android.net.Uri, int);
    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);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    public android.net.Uri rejectInsert(android.net.Uri, android.content.ContentValues);
    public void setAppOps(int, int);
    protected void setAuthorities(java.lang.String);
    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[]);
    public static boolean uriHasUserId(android.net.Uri);


}

-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 {
    <init>(android.content.ContentResolver, android.content.IContentProvider, boolean);

    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 void close();
    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 android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    public boolean release();
    public static void releaseQuietly(android.content.ContentProviderClient);
    public void setDetectNotResponding(long);
    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 {
    <init>(android.content.ContentProviderOperation, boolean);

    public android.content.ContentProviderResult apply(android.content.ContentProvider, android.content.ContentProviderResult[], int);
    public int describeContents();
    public int getType();
    public android.net.Uri getUri();
    public android.content.ContentProviderOperation getWithoutUserIdInUri();
    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;
    public static int TYPE_ASSERT;
    public static int TYPE_DELETE;
    public static int TYPE_INSERT;
    public static int TYPE_UPDATE;
}

-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);
    <init>(android.content.ContentProviderResult, int);

    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);
    protected android.content.IContentProvider acquireExistingProvider(android.content.Context, java.lang.String);
    public android.content.IContentProvider acquireExistingProvider(android.net.Uri);
    protected abstract android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String);
    public android.content.IContentProvider acquireProvider(android.net.Uri);
    public android.content.IContentProvider acquireProvider(java.lang.String);
    public android.content.ContentProviderClient acquireUnstableContentProviderClient(android.net.Uri);
    public android.content.ContentProviderClient acquireUnstableContentProviderClient(java.lang.String);
    protected abstract android.content.IContentProvider acquireUnstableProvider(android.content.Context, java.lang.String);
    public android.content.IContentProvider acquireUnstableProvider(android.net.Uri);
    public android.content.IContentProvider acquireUnstableProvider(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 void appNotRespondingViaProvider(android.content.IContentProvider);
    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 static void cancelSyncAsUser(android.accounts.Account, java.lang.String, int);
    public android.net.Uri canonicalize(android.net.Uri);
    public static android.os.Bundle createSqlQueryBundle(java.lang.String, java.lang.String[], java.lang.String);
    public static java.lang.String createSqlSortClause(android.os.Bundle);
    public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    public android.os.Bundle getCache(android.net.Uri);
    public static android.content.IContentService getContentService();
    public static android.content.SyncInfo getCurrentSync();
    public static java.util.List getCurrentSyncs();
    public static java.util.List getCurrentSyncsAsUser(int);
    public static int getIsSyncable(android.accounts.Account, java.lang.String);
    public static int getIsSyncableAsUser(android.accounts.Account, java.lang.String, int);
    public static boolean getMasterSyncAutomatically();
    public static boolean getMasterSyncAutomaticallyAsUser(int);
    public java.util.List getOutgoingPersistedUriPermissions();
    public java.lang.String getPackageName();
    public static java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String);
    public java.util.List getPersistedUriPermissions();
    public android.content.ContentResolver$OpenResourceIdResult getResourceId(android.net.Uri);
    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public static java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int);
    public static android.content.SyncAdapterType[] getSyncAdapterTypes();
    public static android.content.SyncAdapterType[] getSyncAdapterTypesAsUser(int);
    public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
    public static boolean getSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, int);
    public static android.content.SyncStatusInfo getSyncStatus(android.accounts.Account, java.lang.String);
    public static android.content.SyncStatusInfo getSyncStatusAsUser(android.accounts.Account, java.lang.String, int);
    public int getTargetSdkVersion();
    public java.lang.String getType(android.net.Uri);
    public android.graphics.drawable.Drawable getTypeDrawable(java.lang.String);
    public int getUserId();
    public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    public static boolean invalidPeriodicExtras(android.os.Bundle);
    public static boolean isSyncActive(android.accounts.Account, java.lang.String);
    public static boolean isSyncPending(android.accounts.Account, java.lang.String);
    public static boolean isSyncPendingAsUser(android.accounts.Account, java.lang.String, int);
    public void notifyChange(android.net.Uri, android.database.ContentObserver);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, int);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean, int);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, int, int);
    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 void putCache(android.net.Uri, android.os.Bundle);
    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 android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
    public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver, int);
    public void releasePersistableUriPermission(android.net.Uri, int);
    public abstract boolean releaseProvider(android.content.IContentProvider);
    public abstract boolean releaseUnstableProvider(android.content.IContentProvider);
    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 requestSyncAsUser(android.accounts.Account, java.lang.String, int, android.os.Bundle);
    public int resolveUserId(android.net.Uri);
    public static void setIsSyncable(android.accounts.Account, java.lang.String, int);
    public static void setMasterSyncAutomatically(boolean);
    public static void setMasterSyncAutomaticallyAsUser(boolean, int);
    public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
    public static void setSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, boolean, int);
    public void startSync(android.net.Uri, android.os.Bundle);
    public static int syncErrorStringToInt(java.lang.String);
    public static java.lang.String syncErrorToString(int);
    public void takePersistableUriPermission(android.net.Uri, int);
    public void takePersistableUriPermission(java.lang.String, android.net.Uri, int);
    public android.net.Uri uncanonicalize(android.net.Uri);
    public void unregisterContentObserver(android.database.ContentObserver);
    public abstract void unstableProviderDied(android.content.IContentProvider);
    public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
    public static void validateSyncExtrasBundle(android.os.Bundle);


    public static android.content.Intent ACTION_SYNC_CONN_STATUS_CHANGED;
    public static java.lang.String ANY_CURSOR_ITEM_TYPE;
    public static java.lang.String CONTENT_SERVICE_NAME;
    public static java.lang.String CURSOR_DIR_BASE_TYPE;
    public static java.lang.String CURSOR_ITEM_BASE_TYPE;
    public static java.lang.String EXTRA_HONORED_ARGS;
    public static java.lang.String EXTRA_REFRESH_SUPPORTED;
    public static java.lang.String EXTRA_SIZE;
    public static java.lang.String EXTRA_TOTAL_COUNT;
    public static int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS;
    public static int NOTIFY_SYNC_TO_NETWORK;
    public static java.lang.String QUERY_ARG_LIMIT;
    public static java.lang.String QUERY_ARG_OFFSET;
    public static java.lang.String QUERY_ARG_SORT_COLLATION;
    public static java.lang.String QUERY_ARG_SORT_COLUMNS;
    public static java.lang.String QUERY_ARG_SORT_DIRECTION;
    public static java.lang.String QUERY_ARG_SQL_SELECTION;
    public static java.lang.String QUERY_ARG_SQL_SELECTION_ARGS;
    public static java.lang.String QUERY_ARG_SQL_SORT_ORDER;
    public static int QUERY_SORT_DIRECTION_ASCENDING;
    public static int QUERY_SORT_DIRECTION_DESCENDING;
    public static java.lang.String SCHEME_ANDROID_RESOURCE;
    public static java.lang.String SCHEME_CONTENT;
    public static java.lang.String SCHEME_FILE;
    public static int SYNC_ERROR_AUTHENTICATION;
    public static int SYNC_ERROR_CONFLICT;
    public static int SYNC_ERROR_INTERNAL;
    public static int SYNC_ERROR_IO;
    public static int SYNC_ERROR_PARSE;
    public static int SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS;
    public static int SYNC_ERROR_TOO_MANY_DELETIONS;
    public static int SYNC_ERROR_TOO_MANY_RETRIES;
    public static int SYNC_EXEMPTION_NONE;
    public static int SYNC_EXEMPTION_PROMOTE_BUCKET;
    public static int SYNC_EXEMPTION_PROMOTE_BUCKET_WITH_TEMP;
    public static java.lang.String SYNC_EXTRAS_ACCOUNT;
    public static java.lang.String SYNC_EXTRAS_DISALLOW_METERED;
    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_EXPECTED_DOWNLOAD;
    public static java.lang.String SYNC_EXTRAS_EXPECTED_UPLOAD;
    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_PRIORITY;
    public static java.lang.String SYNC_EXTRAS_REQUIRE_CHARGING;
    public static java.lang.String SYNC_EXTRAS_UPLOAD;
    public static int SYNC_OBSERVER_TYPE_ACTIVE;
    public static int SYNC_OBSERVER_TYPE_ALL;
    public static int SYNC_OBSERVER_TYPE_PENDING;
    public static int SYNC_OBSERVER_TYPE_SETTINGS;
    public static int SYNC_OBSERVER_TYPE_STATUS;
    public static java.lang.String SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG;
}

-keep class android.content.ContentResolver$OpenResourceIdResult {
    <init>();



    public int id;
    public android.content.res.Resources r;
}

-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 java.util.ArrayList getStringArrayList(java.lang.String);
    public int hashCode();
    public boolean isEmpty();
    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 putStringArrayList(java.lang.String, java.util.ArrayList);
    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 void assertRuntimeOverlayThemable();
    public abstract boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
    public abstract boolean canLoadUnsafeResources();
    public boolean canStartActivityForResult();
    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 checkPermission(java.lang.String, int, int, android.os.IBinder);
    public abstract int checkSelfPermission(java.lang.String);
    public abstract int checkUriPermission(android.net.Uri, int, int, int);
    public abstract int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
    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 createApplicationContext(android.content.pm.ApplicationInfo, int);
    public abstract android.content.Context createConfigurationContext(android.content.res.Configuration);
    public abstract android.content.Context createContextForSplit(java.lang.String);
    public abstract android.content.Context createCredentialProtectedStorageContext();
    public abstract android.content.Context createDeviceProtectedStorageContext();
    public abstract android.content.Context createDisplayContext(android.view.Display);
    public abstract android.content.Context createPackageContext(java.lang.String, int);
    public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
    public abstract java.lang.String[] databaseList();
    public abstract boolean deleteDatabase(java.lang.String);
    public abstract boolean deleteFile(java.lang.String);
    public abstract boolean deleteSharedPreferences(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 android.os.IBinder getActivityToken();
    public abstract android.content.Context getApplicationContext();
    public abstract android.content.pm.ApplicationInfo getApplicationInfo();
    public abstract android.content.res.AssetManager getAssets();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public abstract java.lang.String getBasePackageName();
    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 getDataDir();
    public abstract java.io.File getDatabasePath(java.lang.String);
    public abstract java.io.File getDir(java.lang.String, int);
    public abstract android.view.Display getDisplay();
    public abstract android.view.DisplayAdjustments getDisplayAdjustments(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 android.app.IApplicationThread getIApplicationThread();
    public java.util.concurrent.Executor getMainExecutor();
    public abstract android.os.Looper getMainLooper();
    public android.os.Handler getMainThreadHandler();
    public int getNextAutofillId();
    public abstract java.io.File getNoBackupFilesDir();
    public abstract java.io.File getObbDir();
    public abstract java.io.File[] getObbDirs();
    public abstract java.lang.String getOpPackageName();
    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 java.io.File getPreloadsFileCache();
    public abstract android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
    public abstract android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
    public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
    public abstract java.io.File getSharedPreferencesPath(java.lang.String);
    public java.io.File getSharedPrefsFile(java.lang.String);
    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 int getThemeResId();
    public android.os.UserHandle getUser();
    public int getUserId();
    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 isAutofillCompatibilityEnabled();
    public abstract boolean isCredentialProtectedStorage();
    public abstract boolean isDeviceProtectedStorage();
    public boolean isRestricted();
    public abstract boolean moveDatabaseFrom(android.content.Context, java.lang.String);
    public abstract boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
    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, int);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
    public abstract android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public abstract void reloadSharedPreferences();
    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 revokeUriPermission(java.lang.String, android.net.Uri, int);
    public abstract void sendBroadcast(android.content.Intent);
    public abstract void sendBroadcast(android.content.Intent, java.lang.String);
    public abstract void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
    public abstract void sendBroadcast(android.content.Intent, java.lang.String, int);
    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 sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
    public abstract void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
    public abstract void sendBroadcastMultiplePermissions(android.content.Intent, 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 sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, 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 sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, 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, int, android.os.Bundle, 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 sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
    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 void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
    public void setAutofillCompatibilityEnabled(boolean);
    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 int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
    public abstract void startActivity(android.content.Intent);
    public abstract void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
    public abstract android.content.ComponentName startForegroundService(android.content.Intent);
    public abstract android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
    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 android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
    public abstract boolean stopService(android.content.Intent);
    public abstract boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void unbindService(android.content.ServiceConnection);
    public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
    public abstract void unregisterReceiver(android.content.BroadcastReceiver);
    public abstract void updateDisplay(int);


    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 AUTOFILL_MANAGER_SERVICE;
    public static java.lang.String BACKUP_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_INSTANT;
    public static int BIND_ALLOW_OOM_MANAGEMENT;
    public static int BIND_ALLOW_WHITELIST_MANAGEMENT;
    public static int BIND_AUTO_CREATE;
    public static int BIND_DEBUG_UNBIND;
    public static int BIND_EXTERNAL_SERVICE;
    public static int BIND_FOREGROUND_SERVICE;
    public static int BIND_FOREGROUND_SERVICE_WHILE_AWAKE;
    public static int BIND_IMPORTANT;
    public static int BIND_IMPORTANT_BACKGROUND;
    public static int BIND_NOT_FOREGROUND;
    public static int BIND_NOT_VISIBLE;
    public static int BIND_SHOWING_UI;
    public static int BIND_TREAT_LIKE_ACTIVITY;
    public static int BIND_VISIBLE;
    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 COMPANION_DEVICE_SERVICE;
    public static java.lang.String CONNECTIVITY_SERVICE;
    public static java.lang.String CONSUMER_IR_SERVICE;
    public static java.lang.String CONTEXTHUB_SERVICE;
    public static int CONTEXT_CREDENTIAL_PROTECTED_STORAGE;
    public static int CONTEXT_DEVICE_PROTECTED_STORAGE;
    public static int CONTEXT_IGNORE_SECURITY;
    public static int CONTEXT_INCLUDE_CODE;
    public static int CONTEXT_REGISTER_PACKAGE;
    public static int CONTEXT_RESTRICTED;
    public static java.lang.String COUNTRY_DETECTOR;
    public static java.lang.String CROSS_PROFILE_APPS_SERVICE;
    public static java.lang.String DEVICE_IDENTIFIERS_SERVICE;
    public static java.lang.String DEVICE_IDLE_CONTROLLER;
    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 ETHERNET_SERVICE;
    public static java.lang.String EUICC_CARD_SERVICE;
    public static java.lang.String EUICC_SERVICE;
    public static java.lang.String FINGERPRINT_SERVICE;
    public static java.lang.String GATEKEEPER_SERVICE;
    public static java.lang.String HARDWARE_PROPERTIES_SERVICE;
    public static java.lang.String HDMI_CONTROL_SERVICE;
    public static java.lang.String INCIDENT_SERVICE;
    public static java.lang.String INPUT_METHOD_SERVICE;
    public static java.lang.String INPUT_SERVICE;
    public static java.lang.String IPSEC_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 LOWPAN_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_NO_LOCALIZED_COLLATORS;
    public static int MODE_PRIVATE;
    public static int MODE_WORLD_READABLE;
    public static int MODE_WORLD_WRITEABLE;
    public static java.lang.String NETWORKMANAGEMENT_SERVICE;
    public static java.lang.String NETWORK_POLICY_SERVICE;
    public static java.lang.String NETWORK_SCORE_SERVICE;
    public static java.lang.String NETWORK_STATS_SERVICE;
    public static java.lang.String NETWORK_WATCHLIST_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 OEM_LOCK_SERVICE;
    public static java.lang.String OVERLAY_SERVICE;
    public static java.lang.String PERSISTENT_DATA_BLOCK_SERVICE;
    public static java.lang.String POWER_SERVICE;
    public static java.lang.String PRINT_SERVICE;
    public static java.lang.String RADIO_SERVICE;
    public static int RECEIVER_VISIBLE_TO_INSTANT_APPS;
    public static java.lang.String RECOVERY_SERVICE;
    public static java.lang.String RESTRICTIONS_SERVICE;
    public static java.lang.String SEARCH_SERVICE;
    public static java.lang.String SECURE_ELEMENT_SERVICE;
    public static java.lang.String SENSOR_SERVICE;
    public static java.lang.String SERIAL_SERVICE;
    public static java.lang.String SHORTCUT_SERVICE;
    public static java.lang.String SIP_SERVICE;
    public static java.lang.String SLICE_SERVICE;
    public static java.lang.String SOUND_TRIGGER_SERVICE;
    public static java.lang.String STATS_COMPANION_SERVICE;
    public static java.lang.String STATS_MANAGER;
    public static java.lang.String STATUS_BAR_SERVICE;
    public static java.lang.String STORAGE_SERVICE;
    public static java.lang.String STORAGE_STATS_SERVICE;
    public static java.lang.String SYSTEM_HEALTH_SERVICE;
    public static java.lang.String SYSTEM_UPDATE_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_CLASSIFICATION_SERVICE;
    public static java.lang.String TEXT_SERVICES_MANAGER_SERVICE;
    public static java.lang.String TIME_ZONE_RULES_MANAGER_SERVICE;
    public static java.lang.String TRUST_SERVICE;
    public static java.lang.String TV_INPUT_SERVICE;
    public static java.lang.String UI_MODE_SERVICE;
    public static java.lang.String UPDATE_LOCK_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 VOICE_INTERACTION_MANAGER_SERVICE;
    public static java.lang.String VR_SERVICE;
    public static java.lang.String WALLPAPER_SERVICE;
    public static java.lang.String WIFI_AWARE_SERVICE;
    public static java.lang.String WIFI_P2P_SERVICE;
    public static java.lang.String WIFI_RTT_RANGING_SERVICE;
    public static java.lang.String WIFI_RTT_SERVICE;
    public static java.lang.String WIFI_SCANNING_SERVICE;
    public static java.lang.String WIFI_SERVICE;
    public static java.lang.String WINDOW_SERVICE;
}

-keep class android.content.ContextWrapper {
    <init>(android.content.Context);

    protected void attachBaseContext(android.content.Context);
    public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
    public boolean canLoadUnsafeResources();
    public boolean canStartActivityForResult();
    public int checkCallingOrSelfPermission(java.lang.String);
    public int checkCallingOrSelfUriPermission(android.net.Uri, int);
    public int checkCallingPermission(java.lang.String);
    public int checkCallingUriPermission(android.net.Uri, int);
    public int checkPermission(java.lang.String, int, int);
    public int checkPermission(java.lang.String, int, int, android.os.IBinder);
    public int checkSelfPermission(java.lang.String);
    public int checkUriPermission(android.net.Uri, int, int, int);
    public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
    public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
    public void clearWallpaper();
    public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
    public android.content.Context createConfigurationContext(android.content.res.Configuration);
    public android.content.Context createContextForSplit(java.lang.String);
    public android.content.Context createCredentialProtectedStorageContext();
    public android.content.Context createDeviceProtectedStorageContext();
    public android.content.Context createDisplayContext(android.view.Display);
    public android.content.Context createPackageContext(java.lang.String, int);
    public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
    public java.lang.String[] databaseList();
    public boolean deleteDatabase(java.lang.String);
    public boolean deleteFile(java.lang.String);
    public boolean deleteSharedPreferences(java.lang.String);
    public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
    public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
    public void enforceCallingPermission(java.lang.String, java.lang.String);
    public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
    public void enforcePermission(java.lang.String, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
    public java.lang.String[] fileList();
    public android.os.IBinder getActivityToken();
    public android.content.Context getApplicationContext();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public android.content.res.AssetManager getAssets();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public android.content.Context getBaseContext();
    public java.lang.String getBasePackageName();
    public java.io.File getCacheDir();
    public java.lang.ClassLoader getClassLoader();
    public java.io.File getCodeCacheDir();
    public android.content.ContentResolver getContentResolver();
    public java.io.File getDataDir();
    public java.io.File getDatabasePath(java.lang.String);
    public java.io.File getDir(java.lang.String, int);
    public android.view.Display getDisplay();
    public android.view.DisplayAdjustments getDisplayAdjustments(int);
    public java.io.File getExternalCacheDir();
    public java.io.File[] getExternalCacheDirs();
    public java.io.File getExternalFilesDir(java.lang.String);
    public java.io.File[] getExternalFilesDirs(java.lang.String);
    public java.io.File[] getExternalMediaDirs();
    public java.io.File getFileStreamPath(java.lang.String);
    public java.io.File getFilesDir();
    public android.app.IApplicationThread getIApplicationThread();
    public java.util.concurrent.Executor getMainExecutor();
    public android.os.Looper getMainLooper();
    public android.os.Handler getMainThreadHandler();
    public int getNextAutofillId();
    public java.io.File getNoBackupFilesDir();
    public java.io.File getObbDir();
    public java.io.File[] getObbDirs();
    public java.lang.String getOpPackageName();
    public java.lang.String getPackageCodePath();
    public android.content.pm.PackageManager getPackageManager();
    public java.lang.String getPackageName();
    public java.lang.String getPackageResourcePath();
    public java.io.File getPreloadsFileCache();
    public android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
    public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
    public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
    public java.io.File getSharedPreferencesPath(java.lang.String);
    public java.lang.Object getSystemService(java.lang.String);
    public java.lang.String getSystemServiceName(java.lang.Class);
    public android.content.res.Resources$Theme getTheme();
    public int getThemeResId();
    public int getUserId();
    public android.graphics.drawable.Drawable getWallpaper();
    public int getWallpaperDesiredMinimumHeight();
    public int getWallpaperDesiredMinimumWidth();
    public void grantUriPermission(java.lang.String, android.net.Uri, int);
    public boolean isAutofillCompatibilityEnabled();
    public boolean isCredentialProtectedStorage();
    public boolean isDeviceProtectedStorage();
    public boolean isRestricted();
    public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
    public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
    public java.io.FileInputStream openFileInput(java.lang.String);
    public java.io.FileOutputStream openFileOutput(java.lang.String, int);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public android.graphics.drawable.Drawable peekWallpaper();
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
    public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public void reloadSharedPreferences();
    public void removeStickyBroadcast(android.content.Intent);
    public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void revokeUriPermission(android.net.Uri, int);
    public void revokeUriPermission(java.lang.String, android.net.Uri, int);
    public void sendBroadcast(android.content.Intent);
    public void sendBroadcast(android.content.Intent, java.lang.String);
    public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
    public void sendBroadcast(android.content.Intent, java.lang.String, int);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
    public void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
    public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public 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 void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyBroadcast(android.content.Intent);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
    public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
    public void setAutofillCompatibilityEnabled(boolean);
    public void setTheme(int);
    public void setWallpaper(android.graphics.Bitmap);
    public void setWallpaper(java.io.InputStream);
    public void startActivities(android.content.Intent[]);
    public void startActivities(android.content.Intent[], android.os.Bundle);
    public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
    public android.content.ComponentName startForegroundService(android.content.Intent);
    public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public android.content.ComponentName startService(android.content.Intent);
    public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean stopService(android.content.Intent);
    public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
    public void unbindService(android.content.ServiceConnection);
    public void unregisterReceiver(android.content.BroadcastReceiver);
    public void updateDisplay(int);


}

-keep class android.content.DialogInterface {

    public abstract void cancel();
    public abstract void dismiss();


    public static int BUTTON1;
    public static int BUTTON2;
    public static int BUTTON3;
    public static int BUTTON_NEGATIVE;
    public static int BUTTON_NEUTRAL;
    public static int BUTTON_POSITIVE;
}

-keep class android.content.DialogInterface$OnCancelListener {

    public abstract void onCancel(android.content.DialogInterface);


}

-keep class android.content.DialogInterface$OnDismissListener {

    public abstract void onDismiss(android.content.DialogInterface);


}

-keep class android.content.DialogInterface$OnKeyListener {

    public abstract boolean onKey(android.content.DialogInterface, int, android.view.KeyEvent);


}

-keep class android.content.DialogInterface$OnShowListener {

    public abstract void onShow(android.content.DialogInterface);


}

-keep class android.content.IContentProvider {

    public abstract android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList);
    public abstract int bulkInsert(java.lang.String, android.net.Uri, android.content.ContentValues[]);
    public abstract android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle);
    public abstract android.net.Uri canonicalize(java.lang.String, android.net.Uri);
    public abstract android.os.ICancellationSignal createCancellationSignal();
    public abstract int delete(java.lang.String, android.net.Uri, java.lang.String, java.lang.String[]);
    public abstract java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public abstract java.lang.String getType(android.net.Uri);
    public abstract android.net.Uri insert(java.lang.String, android.net.Uri, android.content.ContentValues);
    public abstract android.content.res.AssetFileDescriptor openAssetFile(java.lang.String, android.net.Uri, java.lang.String, android.os.ICancellationSignal);
    public abstract android.os.ParcelFileDescriptor openFile(java.lang.String, android.net.Uri, java.lang.String, android.os.ICancellationSignal, android.os.IBinder);
    public abstract android.content.res.AssetFileDescriptor openTypedAssetFile(java.lang.String, android.net.Uri, java.lang.String, android.os.Bundle, android.os.ICancellationSignal);
    public abstract android.database.Cursor query(java.lang.String, android.net.Uri, java.lang.String[], android.os.Bundle, android.os.ICancellationSignal);
    public abstract boolean refresh(java.lang.String, android.net.Uri, android.os.Bundle, android.os.ICancellationSignal);
    public abstract android.net.Uri uncanonicalize(java.lang.String, android.net.Uri);
    public abstract int update(java.lang.String, android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);


    public static int APPLY_BATCH_TRANSACTION;
    public static int BULK_INSERT_TRANSACTION;
    public static int CALL_TRANSACTION;
    public static int CANONICALIZE_TRANSACTION;
    public static int CREATE_CANCELATION_SIGNAL_TRANSACTION;
    public static int DELETE_TRANSACTION;
    public static int GET_STREAM_TYPES_TRANSACTION;
    public static int GET_TYPE_TRANSACTION;
    public static int INSERT_TRANSACTION;
    public static int OPEN_ASSET_FILE_TRANSACTION;
    public static int OPEN_FILE_TRANSACTION;
    public static int OPEN_TYPED_ASSET_FILE_TRANSACTION;
    public static int QUERY_TRANSACTION;
    public static int REFRESH_TRANSACTION;
    public static int UNCANONICALIZE_TRANSACTION;
    public static int UPDATE_TRANSACTION;
    public static java.lang.String descriptor;
}

-keep class android.content.IContentService {

    public abstract void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
    public abstract void addStatusChangeListener(int, android.content.ISyncStatusObserver);
    public abstract void cancelRequest(android.content.SyncRequest);
    public abstract void cancelSync(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract void cancelSyncAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
    public abstract android.os.Bundle getCache(java.lang.String, android.net.Uri, int);
    public abstract java.util.List getCurrentSyncs();
    public abstract java.util.List getCurrentSyncsAsUser(int);
    public abstract int getIsSyncable(android.accounts.Account, java.lang.String);
    public abstract int getIsSyncableAsUser(android.accounts.Account, java.lang.String, int);
    public abstract boolean getMasterSyncAutomatically();
    public abstract boolean getMasterSyncAutomaticallyAsUser(int);
    public abstract java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int);
    public abstract android.content.SyncAdapterType[] getSyncAdapterTypes();
    public abstract android.content.SyncAdapterType[] getSyncAdapterTypesAsUser(int);
    public abstract boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
    public abstract boolean getSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, int);
    public abstract android.content.SyncStatusInfo getSyncStatus(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract android.content.SyncStatusInfo getSyncStatusAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
    public abstract boolean isSyncActive(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract boolean isSyncPending(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract boolean isSyncPendingAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
    public abstract void notifyChange(android.net.Uri, android.database.IContentObserver, boolean, int, int, int);
    public abstract void putCache(java.lang.String, android.net.Uri, android.os.Bundle, int);
    public abstract void registerContentObserver(android.net.Uri, boolean, android.database.IContentObserver, int, int);
    public abstract void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public abstract void removeStatusChangeListener(android.content.ISyncStatusObserver);
    public abstract void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public abstract void resetTodayStats();
    public abstract void setIsSyncable(android.accounts.Account, java.lang.String, int);
    public abstract void setMasterSyncAutomatically(boolean);
    public abstract void setMasterSyncAutomaticallyAsUser(boolean, int);
    public abstract void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
    public abstract void setSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, boolean, int);
    public abstract void sync(android.content.SyncRequest);
    public abstract void syncAsUser(android.content.SyncRequest, int);
    public abstract void unregisterContentObserver(android.database.IContentObserver);


}

-keep class android.content.IIntentReceiver {

    public abstract void performReceive(android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int);


}

-keep class android.content.IIntentSender {

    public abstract void send(int, android.content.Intent, java.lang.String, android.os.IBinder, android.content.IIntentReceiver, java.lang.String, android.os.Bundle);


}

-keep class android.content.ISyncStatusObserver {

    public abstract void onStatusChanged(int);


}

-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);
    <init>(android.os.Parcel);

    public android.content.Intent addCategory(java.lang.String);
    public android.content.Intent addFlags(int);
    public boolean canStripForHistory();
    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 static java.lang.String dockStateToString(int);
    public int fillIn(android.content.Intent, int);
    public boolean filterEquals(android.content.Intent);
    public int filterHashCode();
    public void fixUris(int);
    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 int getContentUserHint();
    public android.net.Uri getData();
    public java.lang.String getDataString();
    public double[] getDoubleArrayExtra(java.lang.String);
    public double getDoubleExtra(java.lang.String, double);
    public java.lang.Object getExtra(java.lang.String);
    public java.lang.Object getExtra(java.lang.String, java.lang.Object);
    public android.os.Bundle getExtras();
    public int getFlags();
    public float[] getFloatArrayExtra(java.lang.String);
    public float getFloatExtra(java.lang.String, float);
    public android.os.IBinder getIBinderExtra(java.lang.String);
    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 java.lang.String getLaunchToken();
    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 boolean hasWebURI();
    public static boolean isAccessUriMode(int);
    public boolean isDocument();
    public boolean isExcludingStopped();
    public boolean isWebIntent();
    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 android.content.Intent maybeStripForHistory();
    public boolean migrateExtraStreamToClipData();
    public static java.lang.String normalizeMimeType(java.lang.String);
    public static android.content.Intent parseCommandArgs(android.os.ShellCommand, android.content.Intent$CommandOptionHandler);
    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 void prepareToEnterProcess();
    public void prepareToLeaveProcess(android.content.Context);
    public void prepareToLeaveProcess(boolean);
    public void prepareToLeaveUser(int);
    public static void printIntentArgsHelp(java.io.PrintWriter, java.lang.String);
    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 putExtra(java.lang.String, android.os.IBinder);
    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 void removeFlags(int);
    public void removeUnsafeExtras();
    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 android.content.ComponentName resolveSystemService(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 static android.content.Intent restoreFromXml(org.xmlpull.v1.XmlPullParser);
    public void saveToXml(org.xmlpull.v1.XmlSerializer);
    public android.content.Intent setAction(java.lang.String);
    public void setAllowFds(boolean);
    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 setDefusable(boolean);
    public void setExtrasClassLoader(java.lang.ClassLoader);
    public android.content.Intent setFlags(int);
    public void setLaunchToken(java.lang.String);
    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 toInsecureString();
    public java.lang.String toInsecureStringWithClip();
    public java.lang.String toShortString(boolean, boolean, boolean, boolean);
    public void toShortString(java.lang.StringBuilder, boolean, boolean, boolean, boolean);
    public java.lang.String toString();
    public java.lang.String toURI();
    public java.lang.String toUri(int);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    public void writeToProto(android.util.proto.ProtoOutputStream, long, boolean, boolean, boolean, boolean);


    public static java.lang.String ACTION_ADVANCED_SETTINGS_CHANGED;
    public static java.lang.String ACTION_AIRPLANE_MODE_CHANGED;
    public static java.lang.String ACTION_ALARM_CHANGED;
    public static java.lang.String ACTION_ALL_APPS;
    public static java.lang.String ACTION_ANSWER;
    public static java.lang.String ACTION_APPLICATION_PREFERENCES;
    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_LEVEL_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_CALL_EMERGENCY;
    public static java.lang.String ACTION_CALL_PRIVILEGED;
    public static java.lang.String ACTION_CAMERA_BUTTON;
    public static java.lang.String ACTION_CARRIER_SETUP;
    public static java.lang.String ACTION_CHOOSER;
    public static java.lang.String ACTION_CLEAR_DNS_CACHE;
    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_INITIALIZATION_WIZARD;
    public static java.lang.String ACTION_DEVICE_LOCKED_CHANGED;
    public static java.lang.String ACTION_DEVICE_STORAGE_FULL;
    public static java.lang.String ACTION_DEVICE_STORAGE_LOW;
    public static java.lang.String ACTION_DEVICE_STORAGE_NOT_FULL;
    public static java.lang.String ACTION_DEVICE_STORAGE_OK;
    public static java.lang.String ACTION_DIAL;
    public static java.lang.String ACTION_DISMISS_KEYBOARD_SHORTCUTS;
    public static java.lang.String ACTION_DOCK_ACTIVE;
    public static java.lang.String ACTION_DOCK_EVENT;
    public static java.lang.String ACTION_DOCK_IDLE;
    public static java.lang.String ACTION_DREAMING_STARTED;
    public static java.lang.String ACTION_DREAMING_STOPPED;
    public static java.lang.String ACTION_DYNAMIC_SENSOR_CHANGED;
    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_RESET;
    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_GLOBAL_BUTTON;
    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_IDLE_MAINTENANCE_END;
    public static java.lang.String ACTION_IDLE_MAINTENANCE_START;
    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_FAILURE;
    public static java.lang.String ACTION_INSTALL_INSTANT_APP_PACKAGE;
    public static java.lang.String ACTION_INSTALL_PACKAGE;
    public static java.lang.String ACTION_INSTANT_APP_RESOLVER_SETTINGS;
    public static java.lang.String ACTION_INTENT_FILTER_NEEDS_VERIFICATION;
    public static java.lang.String ACTION_LOCALE_CHANGED;
    public static java.lang.String ACTION_LOCKED_BOOT_COMPLETED;
    public static java.lang.String ACTION_MAIN;
    public static java.lang.String ACTION_MANAGED_PROFILE_ADDED;
    public static java.lang.String ACTION_MANAGED_PROFILE_AVAILABLE;
    public static java.lang.String ACTION_MANAGED_PROFILE_REMOVED;
    public static java.lang.String ACTION_MANAGED_PROFILE_UNAVAILABLE;
    public static java.lang.String ACTION_MANAGED_PROFILE_UNLOCKED;
    public static java.lang.String ACTION_MANAGE_APP_PERMISSIONS;
    public static java.lang.String ACTION_MANAGE_NETWORK_USAGE;
    public static java.lang.String ACTION_MANAGE_PACKAGE_STORAGE;
    public static java.lang.String ACTION_MANAGE_PERMISSIONS;
    public static java.lang.String ACTION_MANAGE_PERMISSION_APPS;
    public static java.lang.String ACTION_MASTER_CLEAR;
    public static java.lang.String ACTION_MASTER_CLEAR_NOTIFICATION;
    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_RESOURCE_GRANTED;
    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_MEDIA_UNSHARED;
    public static java.lang.String ACTION_MY_PACKAGE_REPLACED;
    public static java.lang.String ACTION_MY_PACKAGE_SUSPENDED;
    public static java.lang.String ACTION_MY_PACKAGE_UNSUSPENDED;
    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_OVERLAY_CHANGED;
    public static java.lang.String ACTION_PACKAGES_SUSPENDED;
    public static java.lang.String ACTION_PACKAGES_UNSUSPENDED;
    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_PREFERRED_ACTIVITY_CHANGED;
    public static java.lang.String ACTION_PRE_BOOT_COMPLETED;
    public static java.lang.String ACTION_PROCESS_TEXT;
    public static java.lang.String ACTION_PROVIDER_CHANGED;
    public static java.lang.String ACTION_QUERY_PACKAGE_RESTART;
    public static java.lang.String ACTION_QUICK_CLOCK;
    public static java.lang.String ACTION_QUICK_VIEW;
    public static java.lang.String ACTION_REBOOT;
    public static java.lang.String ACTION_REMOTE_INTENT;
    public static java.lang.String ACTION_REQUEST_SHUTDOWN;
    public static java.lang.String ACTION_RESOLVE_INSTANT_APP_PACKAGE;
    public static java.lang.String ACTION_REVIEW_PERMISSIONS;
    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_SERVICE_STATE;
    public static java.lang.String ACTION_SETTING_RESTORED;
    public static java.lang.String ACTION_SET_WALLPAPER;
    public static java.lang.String ACTION_SHOW_APP_INFO;
    public static java.lang.String ACTION_SHOW_BRIGHTNESS_DIALOG;
    public static java.lang.String ACTION_SHOW_KEYBOARD_SHORTCUTS;
    public static java.lang.String ACTION_SHOW_SUSPENDED_APP_DETAILS;
    public static java.lang.String ACTION_SHUTDOWN;
    public static java.lang.String ACTION_SIM_STATE_CHANGED;
    public static java.lang.String ACTION_SPLIT_CONFIGURATION_CHANGED;
    public static java.lang.String ACTION_SYNC;
    public static java.lang.String ACTION_SYSTEM_TUTORIAL;
    public static java.lang.String ACTION_THERMAL_EVENT;
    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_UPGRADE_SETUP;
    public static java.lang.String ACTION_USER_ADDED;
    public static java.lang.String ACTION_USER_BACKGROUND;
    public static java.lang.String ACTION_USER_FOREGROUND;
    public static java.lang.String ACTION_USER_INFO_CHANGED;
    public static java.lang.String ACTION_USER_INITIALIZE;
    public static java.lang.String ACTION_USER_PRESENT;
    public static java.lang.String ACTION_USER_REMOVED;
    public static java.lang.String ACTION_USER_STARTED;
    public static java.lang.String ACTION_USER_STARTING;
    public static java.lang.String ACTION_USER_STOPPED;
    public static java.lang.String ACTION_USER_STOPPING;
    public static java.lang.String ACTION_USER_SWITCHED;
    public static java.lang.String ACTION_USER_UNLOCKED;
    public static java.lang.String ACTION_VIEW;
    public static java.lang.String ACTION_VOICE_ASSIST;
    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_LAUNCHER;
    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_HOME_MAIN;
    public static java.lang.String CATEGORY_INFO;
    public static java.lang.String CATEGORY_LAUNCHER;
    public static java.lang.String CATEGORY_LAUNCHER_APP;
    public static java.lang.String CATEGORY_LEANBACK_LAUNCHER;
    public static java.lang.String CATEGORY_LEANBACK_SETTINGS;
    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_SETUP_WIZARD;
    public static java.lang.String CATEGORY_TAB;
    public static java.lang.String CATEGORY_TEST;
    public static java.lang.String CATEGORY_TYPED_OPENABLE;
    public static java.lang.String CATEGORY_UNIT_TEST;
    public static java.lang.String CATEGORY_VOICE;
    public static java.lang.String CATEGORY_VR_HOME;
    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_AUTO_LAUNCH_SINGLE_CHOICE;
    public static java.lang.String EXTRA_BCC;
    public static java.lang.String EXTRA_BUG_REPORT;
    public static java.lang.String EXTRA_CALLING_PACKAGE;
    public static java.lang.String EXTRA_CC;
    public static java.lang.String EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR;
    public static java.lang.String EXTRA_CDMA_ROAMING_INDICATOR;
    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_CHOOSER_TARGETS;
    public static java.lang.String EXTRA_CHOSEN_COMPONENT;
    public static java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER;
    public static java.lang.String EXTRA_CLIENT_INTENT;
    public static java.lang.String EXTRA_CLIENT_LABEL;
    public static java.lang.String EXTRA_COMPONENT_NAME;
    public static java.lang.String EXTRA_CONTENT_ANNOTATIONS;
    public static java.lang.String EXTRA_CSS_INDICATOR;
    public static java.lang.String EXTRA_DATA_OPERATOR_ALPHA_LONG;
    public static java.lang.String EXTRA_DATA_OPERATOR_ALPHA_SHORT;
    public static java.lang.String EXTRA_DATA_OPERATOR_NUMERIC;
    public static java.lang.String EXTRA_DATA_RADIO_TECH;
    public static java.lang.String EXTRA_DATA_REG_STATE;
    public static java.lang.String EXTRA_DATA_REMOVED;
    public static java.lang.String EXTRA_DATA_ROAMING_TYPE;
    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_EMERGENCY_ONLY;
    public static java.lang.String EXTRA_EPHEMERAL_FAILURE;
    public static java.lang.String EXTRA_EPHEMERAL_HOSTNAME;
    public static java.lang.String EXTRA_EPHEMERAL_SUCCESS;
    public static java.lang.String EXTRA_EPHEMERAL_TOKEN;
    public static java.lang.String EXTRA_EXCLUDE_COMPONENTS;
    public static java.lang.String EXTRA_FORCE_FACTORY_RESET;
    public static java.lang.String EXTRA_FORCE_MASTER_CLEAR;
    public static java.lang.String EXTRA_FROM_STORAGE;
    public static java.lang.String EXTRA_HTML_TEXT;
    public static java.lang.String EXTRA_INDEX;
    public static java.lang.String EXTRA_INITIAL_INTENTS;
    public static java.lang.String EXTRA_INSTALLER_PACKAGE_NAME;
    public static java.lang.String EXTRA_INSTALL_RESULT;
    public static java.lang.String EXTRA_INSTANT_APP_ACTION;
    public static java.lang.String EXTRA_INSTANT_APP_BUNDLES;
    public static java.lang.String EXTRA_INSTANT_APP_EXTRAS;
    public static java.lang.String EXTRA_INSTANT_APP_FAILURE;
    public static java.lang.String EXTRA_INSTANT_APP_HOSTNAME;
    public static java.lang.String EXTRA_INSTANT_APP_SUCCESS;
    public static java.lang.String EXTRA_INSTANT_APP_TOKEN;
    public static java.lang.String EXTRA_INTENT;
    public static java.lang.String EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION;
    public static java.lang.String EXTRA_IS_USING_CARRIER_AGGREGATION;
    public static java.lang.String EXTRA_KEY_CONFIRM;
    public static java.lang.String EXTRA_KEY_EVENT;
    public static java.lang.String EXTRA_LAUNCHER_EXTRAS;
    public static java.lang.String EXTRA_LOCAL_ONLY;
    public static java.lang.String EXTRA_LONG_VERSION_CODE;
    public static java.lang.String EXTRA_LTE_EARFCN_RSRP_BOOST;
    public static java.lang.String EXTRA_MANUAL;
    public static java.lang.String EXTRA_MEDIA_RESOURCE_TYPE;
    public static int EXTRA_MEDIA_RESOURCE_TYPE_AUDIO_CODEC;
    public static int EXTRA_MEDIA_RESOURCE_TYPE_VIDEO_CODEC;
    public static java.lang.String EXTRA_MIME_TYPES;
    public static java.lang.String EXTRA_NETWORK_ID;
    public static java.lang.String EXTRA_NOT_UNKNOWN_SOURCE;
    public static java.lang.String EXTRA_OPERATOR_ALPHA_LONG;
    public static java.lang.String EXTRA_OPERATOR_ALPHA_SHORT;
    public static java.lang.String EXTRA_OPERATOR_NUMERIC;
    public static java.lang.String EXTRA_ORIGINATING_UID;
    public static java.lang.String EXTRA_ORIGINATING_URI;
    public static java.lang.String EXTRA_PACKAGES;
    public static java.lang.String EXTRA_PACKAGE_NAME;
    public static java.lang.String EXTRA_PERMISSION_NAME;
    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_QUICK_VIEW_ADVANCED;
    public static java.lang.String EXTRA_QUICK_VIEW_FEATURES;
    public static java.lang.String EXTRA_QUIET_MODE;
    public static java.lang.String EXTRA_REASON;
    public static java.lang.String EXTRA_REFERRER;
    public static java.lang.String EXTRA_REFERRER_NAME;
    public static java.lang.String EXTRA_REMOTE_CALLBACK;
    public static java.lang.String EXTRA_REMOTE_INTENT_TOKEN;
    public static java.lang.String EXTRA_REMOVED_FOR_ALL_USERS;
    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_NEEDED;
    public static java.lang.String EXTRA_RESULT_RECEIVER;
    public static java.lang.String EXTRA_RETURN_RESULT;
    public static java.lang.String EXTRA_SETTING_NAME;
    public static java.lang.String EXTRA_SETTING_NEW_VALUE;
    public static java.lang.String EXTRA_SETTING_PREVIOUS_VALUE;
    public static java.lang.String EXTRA_SETTING_RESTORED_FROM_SDK_INT;
    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_SIM_ACTIVATION_RESPONSE;
    public static java.lang.String EXTRA_SPLIT_NAME;
    public static java.lang.String EXTRA_STREAM;
    public static java.lang.String EXTRA_SUBJECT;
    public static java.lang.String EXTRA_SUSPENDED_PACKAGE_EXTRAS;
    public static java.lang.String EXTRA_SYSTEM_ID;
    public static java.lang.String EXTRA_TASK_ID;
    public static java.lang.String EXTRA_TEMPLATE;
    public static java.lang.String EXTRA_TEXT;
    public static java.lang.String EXTRA_THERMAL_STATE;
    public static int EXTRA_THERMAL_STATE_EXCEEDED;
    public static int EXTRA_THERMAL_STATE_NORMAL;
    public static int EXTRA_THERMAL_STATE_WARNING;
    public static java.lang.String EXTRA_TIME_PREF_24_HOUR_FORMAT;
    public static int EXTRA_TIME_PREF_VALUE_USE_12_HOUR;
    public static int EXTRA_TIME_PREF_VALUE_USE_24_HOUR;
    public static int EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT;
    public static java.lang.String EXTRA_TITLE;
    public static java.lang.String EXTRA_UID;
    public static java.lang.String EXTRA_UNINSTALL_ALL_USERS;
    public static java.lang.String EXTRA_UNKNOWN_INSTANT_APP;
    public static java.lang.String EXTRA_USER;
    public static java.lang.String EXTRA_USER_HANDLE;
    public static java.lang.String EXTRA_USER_ID;
    public static java.lang.String EXTRA_USER_REQUESTED_SHUTDOWN;
    public static java.lang.String EXTRA_VERIFICATION_BUNDLE;
    public static java.lang.String EXTRA_VERSION_CODE;
    public static java.lang.String EXTRA_VOICE_RADIO_TECH;
    public static java.lang.String EXTRA_VOICE_REG_STATE;
    public static java.lang.String EXTRA_VOICE_ROAMING_TYPE;
    public static java.lang.String EXTRA_WIPE_ESIMS;
    public static java.lang.String EXTRA_WIPE_EXTERNAL_STORAGE;
    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_LAUNCH_ADJACENT;
    public static int FLAG_ACTIVITY_MATCH_EXTERNAL;
    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_DEBUG_TRIAGED_MISSING;
    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_IGNORE_EPHEMERAL;
    public static int FLAG_INCLUDE_STOPPED_PACKAGES;
    public static int FLAG_RECEIVER_BOOT_UPGRADE;
    public static int FLAG_RECEIVER_EXCLUDE_BACKGROUND;
    public static int FLAG_RECEIVER_FOREGROUND;
    public static int FLAG_RECEIVER_FROM_SHELL;
    public static int FLAG_RECEIVER_INCLUDE_BACKGROUND;
    public static int FLAG_RECEIVER_NO_ABORT;
    public static int FLAG_RECEIVER_REGISTERED_ONLY;
    public static int FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT;
    public static int FLAG_RECEIVER_REPLACE_PENDING;
    public static int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS;
    public static int IMMUTABLE_FLAGS;
    public static java.lang.String METADATA_DOCK_HOME;
    public static java.lang.String METADATA_SETUP_VERSION;
    public static int URI_ALLOW_UNSAFE;
    public static int URI_ANDROID_APP_SCHEME;
    public static int URI_INTENT_SCHEME;
}

-keep class android.content.Intent$CommandOptionHandler {

    public abstract boolean handleOption(java.lang.String, android.os.ShellCommand);


}

-keep class android.content.IntentFilter {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(android.content.IntentFilter);
    <init>(android.os.Parcel);

    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 addDataAuthority(android.content.IntentFilter$AuthorityEntry);
    public void addDataPath(java.lang.String, int);
    public void addDataPath(android.os.PatternMatcher);
    public void addDataScheme(java.lang.String);
    public void addDataSchemeSpecificPart(java.lang.String, int);
    public void addDataSchemeSpecificPart(android.os.PatternMatcher);
    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 boolean debugCheck();
    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public java.lang.String getAction(int);
    public boolean getAutoVerify();
    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 java.lang.String[] getHosts();
    public java.util.ArrayList getHostsList();
    public int getOrder();
    public int getPriority();
    public int getVisibilityToInstantApp();
    public boolean handleAllWebDataURI();
    public boolean handlesWebUris(boolean);
    public boolean hasAction(java.lang.String);
    public boolean hasCategory(java.lang.String);
    public boolean hasDataAuthority(android.net.Uri);
    public boolean hasDataAuthority(android.content.IntentFilter$AuthorityEntry);
    public boolean hasDataPath(java.lang.String);
    public boolean hasDataPath(android.os.PatternMatcher);
    public boolean hasDataScheme(java.lang.String);
    public boolean hasDataSchemeSpecificPart(java.lang.String);
    public boolean hasDataSchemeSpecificPart(android.os.PatternMatcher);
    public boolean hasDataType(java.lang.String);
    public boolean hasExactDataType(java.lang.String);
    public boolean isExplicitlyVisibleToInstantApp();
    public boolean isImplicitlyVisibleToInstantApp();
    public boolean isVerified();
    public boolean isVisibleToInstantApp();
    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 boolean needsVerification();
    public java.util.Iterator pathsIterator();
    public void readFromXml(org.xmlpull.v1.XmlPullParser);
    public java.util.Iterator schemeSpecificPartsIterator();
    public java.util.Iterator schemesIterator();
    public void setAutoVerify(boolean);
    public void setOrder(int);
    public void setPriority(int);
    public void setVerified(boolean);
    public void setVisibilityToInstantApp(int);
    public java.util.Iterator typesIterator();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    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 java.lang.String SCHEME_HTTP;
    public static java.lang.String SCHEME_HTTPS;
    public static int SYSTEM_HIGH_PRIORITY;
    public static int SYSTEM_LOW_PRIORITY;
    public static int VISIBILITY_EXPLICIT;
    public static int VISIBILITY_IMPLICIT;
    public static int VISIBILITY_NONE;
}

-keep class android.content.IntentFilter$AuthorityEntry {
    <init>(java.lang.String, java.lang.String);

    public boolean equals(java.lang.Object);
    public java.lang.String getHost();
    public int getPort();
    public boolean match(android.content.IntentFilter$AuthorityEntry);
    public int match(android.net.Uri);


}

-keep class android.content.IntentFilter$MalformedMimeTypeException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.content.IntentSender {
    <init>(android.content.IIntentSender);
    <init>(android.content.IIntentSender, android.os.IBinder);
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getCreatorPackage();
    public int getCreatorUid();
    public android.os.UserHandle getCreatorUserHandle();
    public android.content.IIntentSender getTarget();
    public java.lang.String getTargetPackage();
    public android.os.IBinder getWhitelistToken();
    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.Loader {
    <init>(android.content.Context);

    public void abandon();
    public boolean cancelLoad();
    public void commitContentChanged();
    public java.lang.String dataToString(java.lang.Object);
    public void deliverCancellation();
    public void deliverResult(java.lang.Object);
    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void forceLoad();
    public android.content.Context getContext();
    public int getId();
    public boolean isAbandoned();
    public boolean isReset();
    public boolean isStarted();
    protected void onAbandon();
    protected boolean onCancelLoad();
    public void onContentChanged();
    protected void onForceLoad();
    protected void onReset();
    protected void onStartLoading();
    protected void onStopLoading();
    public void registerListener(int, android.content.Loader$OnLoadCompleteListener);
    public void registerOnLoadCanceledListener(android.content.Loader$OnLoadCanceledListener);
    public void reset();
    public void rollbackContentChanged();
    public void startLoading();
    public void stopLoading();
    public boolean takeContentChanged();
    public java.lang.String toString();
    public void unregisterListener(android.content.Loader$OnLoadCompleteListener);
    public void unregisterOnLoadCanceledListener(android.content.Loader$OnLoadCanceledListener);


}

-keep class android.content.Loader$OnLoadCanceledListener {

    public abstract void onLoadCanceled(android.content.Loader);


}

-keep class android.content.Loader$OnLoadCompleteListener {

    public abstract void onLoadComplete(android.content.Loader, java.lang.Object);


}

-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);
    <init>(android.content.PeriodicSync);
    <init>(android.accounts.Account, java.lang.String, android.os.Bundle, long, long);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static boolean syncExtrasEquals(android.os.Bundle, android.os.Bundle);
    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 flexTime;
    public long period;
}

-keep class android.content.ServiceConnection {

    public void onBindingDied(android.content.ComponentName);
    public void onNullBinding(android.content.ComponentName);
    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>(java.lang.String, java.lang.String, boolean, boolean, boolean, boolean, java.lang.String, java.lang.String);
    <init>(android.os.Parcel);

    public boolean allowParallelSyncs();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getPackageName();
    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 {
    <init>(int, android.accounts.Account, java.lang.String, long);
    <init>(android.content.SyncInfo);

    public static android.content.SyncInfo createAccountRedacted(int, java.lang.String, long);
    public int describeContents();
    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 int authorityId;
    public long startTime;
}

-keep class android.content.SyncRequest {
    <init>(android.content.SyncRequest$Builder);

    public int describeContents();
    public android.accounts.Account getAccount();
    public android.os.Bundle getBundle();
    public java.lang.String getProvider();
    public long getSyncFlexTime();
    public long getSyncRunTime();
    public boolean isExpedited();
    public boolean isPeriodic();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.SyncRequest$Builder {
    <init>();

    public android.content.SyncRequest build();
    public android.content.SyncRequest$Builder setDisallowMetered(boolean);
    public android.content.SyncRequest$Builder setExpedited(boolean);
    public android.content.SyncRequest$Builder setExtras(android.os.Bundle);
    public android.content.SyncRequest$Builder setIgnoreBackoff(boolean);
    public android.content.SyncRequest$Builder setIgnoreSettings(boolean);
    public android.content.SyncRequest$Builder setManual(boolean);
    public android.content.SyncRequest$Builder setNoRetry(boolean);
    public android.content.SyncRequest$Builder setRequiresCharging(boolean);
    public android.content.SyncRequest$Builder setSyncAdapter(android.accounts.Account, java.lang.String);
    public android.content.SyncRequest$Builder syncOnce();
    public android.content.SyncRequest$Builder syncPeriodic(long, long);


}

-keep class android.content.SyncStatusInfo {
    <init>(int);
    <init>(android.os.Parcel);
    <init>(android.content.SyncStatusInfo);

    public void addEvent(java.lang.String);
    public int describeContents();
    public java.lang.String getEvent(int);
    public int getEventCount();
    public long getEventTime(int);
    public int getLastFailureMesgAsInt(int);
    public long getPeriodicSyncTime(int);
    public void maybeResetTodayStats(boolean, boolean);
    public void removePeriodicSyncTime(int);
    public void setLastFailure(int, long, java.lang.String);
    public void setLastSuccess(int, long);
    public void setPeriodicSyncTime(int, long);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int authorityId;
    public long initialFailureTime;
    public boolean initialize;
    public java.lang.String lastFailureMesg;
    public int lastFailureSource;
    public long lastFailureTime;
    public int lastSuccessSource;
    public long lastSuccessTime;
    public long lastTodayResetTime;
    public boolean pending;
    public long[] perSourceLastFailureTimes;
    public long[] perSourceLastSuccessTimes;
    public android.content.SyncStatusInfo$Stats todayStats;
    public android.content.SyncStatusInfo$Stats totalStats;
    public android.content.SyncStatusInfo$Stats yesterdayStats;
}

-keep class android.content.SyncStatusInfo$Stats {
    <init>();

    public void clear();
    public void copyTo(android.content.SyncStatusInfo$Stats);
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel);


    public int numCancels;
    public int numFailures;
    public int numSourceFeed;
    public int numSourceLocal;
    public int numSourceOther;
    public int numSourcePeriodic;
    public int numSourcePoll;
    public int numSourceUser;
    public int numSyncs;
    public long totalElapsedTime;
}

-keep class android.content.SyncStatusObserver {

    public abstract void onStatusChanged(int);


}

-keep class android.content.UriPermission {
    <init>(android.net.Uri, int, long);
    <init>(android.os.Parcel);

    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 static int activityInfoConfigJavaToNative(int);
    public static int activityInfoConfigNativeToJava(int);
    public static java.lang.String colorModeToString(int);
    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, int);
    public int getRealConfigChanged();
    public int getThemeResource();
    public static boolean isFixedOrientationLandscape(int);
    public static boolean isFixedOrientationPortrait(int);
    public static boolean isPreserveOrientationMode(int);
    public static boolean isResizeableMode(int);
    public static boolean isTranslucentOrFloating(android.content.res.TypedArray);
    public static java.lang.String lockTaskLaunchModeToString(int);
    public static java.lang.String resizeModeToString(int);
    public static java.lang.String screenOrientationToString(int);
    public boolean supportsPictureInPicture();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int COLOR_MODE_DEFAULT;
    public static int COLOR_MODE_HDR;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT;
    public static int CONFIG_ASSETS_PATHS;
    public static int CONFIG_COLOR_MODE;
    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_NATIVE_BITS;
    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 int CONFIG_WINDOW_CONFIGURATION;
    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_EMBEDDED;
    public static int FLAG_ALLOW_TASK_REPARENTING;
    public static int FLAG_ALWAYS_FOCUSABLE;
    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_ENABLE_VR_MODE;
    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_IMPLICITLY_VISIBLE_TO_INSTANT_APP;
    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_SHOW_FOR_ALL_USERS;
    public static int FLAG_SHOW_WHEN_LOCKED;
    public static int FLAG_SINGLE_USER;
    public static int FLAG_STATE_NOT_NEEDED;
    public static int FLAG_SUPPORTS_PICTURE_IN_PICTURE;
    public static int FLAG_SYSTEM_USER_ONLY;
    public static int FLAG_TURN_SCREEN_ON;
    public static int FLAG_VISIBLE_TO_INSTANT_APP;
    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 LOCK_TASK_LAUNCH_MODE_ALWAYS;
    public static int LOCK_TASK_LAUNCH_MODE_DEFAULT;
    public static int LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED;
    public static int LOCK_TASK_LAUNCH_MODE_NEVER;
    public static int PERSIST_ACROSS_REBOOTS;
    public static int PERSIST_NEVER;
    public static int PERSIST_ROOT_ONLY;
    public static int RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY;
    public static int RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY;
    public static int RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION;
    public static int RESIZE_MODE_FORCE_RESIZEABLE;
    public static int RESIZE_MODE_RESIZEABLE;
    public static int RESIZE_MODE_RESIZEABLE_AND_PIPABLE_DEPRECATED;
    public static int RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
    public static int RESIZE_MODE_UNRESIZEABLE;
    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_UNSET;
    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 colorMode;
    public int configChanges;
    public int documentLaunchMode;
    public int flags;
    public int launchMode;
    public java.lang.String launchToken;
    public int lockTaskLaunchMode;
    public float maxAspectRatio;
    public int maxRecents;
    public java.lang.String parentActivityName;
    public java.lang.String permission;
    public int persistableMode;
    public java.lang.String requestedVrComponent;
    public int resizeMode;
    public int rotationAnimation;
    public int screenOrientation;
    public int softInputMode;
    public java.lang.String targetActivity;
    public java.lang.String taskAffinity;
    public int theme;
    public int uiOptions;
    public android.content.pm.ActivityInfo$WindowLayout windowLayout;
}

-keep class android.content.pm.ActivityInfo$WindowLayout {
    <init>(int, float, int, float, int, int, int);



    public int gravity;
    public int height;
    public float heightFraction;
    public int minHeight;
    public int minWidth;
    public int width;
    public float widthFraction;
}

-keep class android.content.pm.ApplicationInfo {
    <init>();
    <init>(android.content.pm.ApplicationInfo);

    public int describeContents();
    public void disableCompatibilityMode();
    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, int);
    protected android.content.pm.ApplicationInfo getApplicationInfo();
    public java.lang.String getBaseCodePath();
    public java.lang.String getBaseResourcePath();
    public static java.lang.CharSequence getCategoryTitle(android.content.Context, int);
    public java.lang.String getCodePath();
    public int getHiddenApiEnforcementPolicy();
    public java.lang.String getResourcePath();
    public java.lang.String[] getSplitCodePaths();
    public java.lang.String[] getSplitResourcePaths();
    public boolean hasCode();
    public boolean hasRtlSupport();
    public void initForUser(int);
    public boolean isDefaultToDeviceProtectedStorage();
    public boolean isDirectBootAware();
    public boolean isEncryptionAware();
    public boolean isExternal();
    public boolean isExternalAsec();
    public boolean isForwardLocked();
    public boolean isInstantApp();
    public boolean isInternal();
    public boolean isOem();
    public boolean isPartiallyDirectBootAware();
    public boolean isPrivilegedApp();
    public boolean isProduct();
    public boolean isRequiredForSystemUser();
    public boolean isSignedWithPlatformKey();
    public boolean isStaticSharedLibrary();
    public boolean isSystemApp();
    public boolean isUpdatedSystemApp();
    public static boolean isValidHiddenApiEnforcementPolicy(int);
    public boolean isVendor();
    public boolean isVirtualPreload();
    public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public void maybeUpdateHiddenApiEnforcementPolicy(int, int);
    public boolean requestsIsolatedSplitLoading();
    public void setBaseCodePath(java.lang.String);
    public void setBaseResourcePath(java.lang.String);
    public void setCodePath(java.lang.String);
    public void setHiddenApiEnforcementPolicy(int);
    public void setResourcePath(java.lang.String);
    public void setSplitCodePaths(java.lang.String[]);
    public void setSplitResourcePaths(java.lang.String[]);
    public void setVersionCode(long);
    public java.lang.String toString();
    public boolean usesCompatibilityMode();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long, int);


    public static int CATEGORY_AUDIO;
    public static int CATEGORY_GAME;
    public static int CATEGORY_IMAGE;
    public static int CATEGORY_MAPS;
    public static int CATEGORY_NEWS;
    public static int CATEGORY_PRODUCTIVITY;
    public static int CATEGORY_SOCIAL;
    public static int CATEGORY_UNDEFINED;
    public static int CATEGORY_VIDEO;
    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_SUSPENDED;
    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 static int HIDDEN_API_ENFORCEMENT_BLACK;
    public static int HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK;
    public static int HIDDEN_API_ENFORCEMENT_DEFAULT;
    public static int HIDDEN_API_ENFORCEMENT_JUST_WARN;
    public static int HIDDEN_API_ENFORCEMENT_NONE;
    public static java.lang.String METADATA_PRELOADED_FONTS;
    public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE;
    public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
    public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE;
    public static int PRIVATE_FLAG_BACKUP_IN_FOREGROUND;
    public static int PRIVATE_FLAG_CANT_SAVE_STATE;
    public static int PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
    public static int PRIVATE_FLAG_DIRECT_BOOT_AWARE;
    public static int PRIVATE_FLAG_FORWARD_LOCK;
    public static int PRIVATE_FLAG_HAS_DOMAIN_URLS;
    public static int PRIVATE_FLAG_HIDDEN;
    public static int PRIVATE_FLAG_INSTANT;
    public static int PRIVATE_FLAG_ISOLATED_SPLIT_LOADING;
    public static int PRIVATE_FLAG_OEM;
    public static int PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE;
    public static int PRIVATE_FLAG_PRIVILEGED;
    public static int PRIVATE_FLAG_PRODUCT;
    public static int PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER;
    public static int PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY;
    public static int PRIVATE_FLAG_STATIC_SHARED_LIBRARY;
    public static int PRIVATE_FLAG_VENDOR;
    public static int PRIVATE_FLAG_VIRTUAL_PRELOAD;
    public java.lang.String appComponentFactory;
    public java.lang.String backupAgentName;
    public int category;
    public java.lang.String classLoaderName;
    public java.lang.String className;
    public int compatibleWidthLimitDp;
    public int compileSdkVersion;
    public java.lang.String compileSdkVersionCodename;
    public java.lang.String credentialProtectedDataDir;
    public java.lang.String dataDir;
    public int descriptionRes;
    public java.lang.String deviceProtectedDataDir;
    public boolean enabled;
    public int enabledSetting;
    public int flags;
    public int fullBackupContent;
    public boolean hiddenUntilInstalled;
    public int installLocation;
    public int largestWidthLimitDp;
    public long longVersionCode;
    public java.lang.String manageSpaceActivityName;
    public float maxAspectRatio;
    public int minSdkVersion;
    public java.lang.String nativeLibraryDir;
    public java.lang.String nativeLibraryRootDir;
    public boolean nativeLibraryRootRequiresIsa;
    public int networkSecurityConfigRes;
    public java.lang.String permission;
    public java.lang.String primaryCpuAbi;
    public int privateFlags;
    public java.lang.String processName;
    public java.lang.String publicSourceDir;
    public int requiresSmallestWidthDp;
    public java.lang.String[] resourceDirs;
    public java.lang.String scanPublicSourceDir;
    public java.lang.String scanSourceDir;
    public java.lang.String seInfo;
    public java.lang.String seInfoUser;
    public java.lang.String secondaryCpuAbi;
    public java.lang.String secondaryNativeLibraryDir;
    public java.lang.String[] sharedLibraryFiles;
    public java.lang.String sourceDir;
    public java.lang.String[] splitClassLoaderNames;
    public android.util.SparseArray splitDependencies;
    public java.lang.String[] splitNames;
    public java.lang.String[] splitPublicSourceDirs;
    public java.lang.String[] splitSourceDirs;
    public java.util.UUID storageUuid;
    public int targetSandboxVersion;
    public int targetSdkVersion;
    public java.lang.String taskAffinity;
    public int theme;
    public int uiOptions;
    public int uid;
    public int versionCode;
    public java.lang.String volumeUuid;
}

-keep class android.content.pm.AuxiliaryResolveInfo {
    <init>(java.lang.String, boolean, android.content.Intent, java.util.List);
    <init>(android.content.ComponentName, android.content.Intent, java.util.List);
    <init>(android.content.ComponentName, java.lang.String, long, java.lang.String);



    public android.content.Intent failureIntent;
    public java.util.List filters;
    public android.content.ComponentName installFailureActivity;
    public boolean needsPhaseTwo;
    public java.lang.String token;
}

-keep class android.content.pm.AuxiliaryResolveInfo$AuxiliaryFilter {
    <init>(android.content.IntentFilter, android.content.pm.InstantAppResolveInfo, java.lang.String, android.os.Bundle);
    <init>(android.content.pm.InstantAppResolveInfo, java.lang.String, android.os.Bundle);
    <init>(java.lang.String, long, java.lang.String);

    public java.lang.String toString();


    public android.os.Bundle extras;
    public java.lang.String packageName;
    public android.content.pm.InstantAppResolveInfo resolveInfo;
    public java.lang.String splitName;
    public long versionCode;
}

-keep class android.content.pm.BaseParceledListSlice {
    <init>(java.util.List);

    public java.util.List getList();
    protected abstract android.os.Parcelable$Creator readParcelableCreator(android.os.Parcel, java.lang.ClassLoader);
    public void setInlineCountLimit(int);
    protected abstract void writeElement(java.lang.Object, android.os.Parcel, int);
    protected abstract void writeParcelableCreator(java.lang.Object, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


}

-keep class android.content.pm.ChangedPackages {
    <init>(int, java.util.List);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.util.List getPackageNames();
    public int getSequenceNumber();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-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);
    protected android.content.pm.ApplicationInfo getApplicationInfo();
    public int getBannerResource();
    public android.content.ComponentName getComponentName();
    public int getIconResource();
    public int getLogoResource();
    public boolean isEnabled();
    protected android.graphics.drawable.Drawable loadDefaultBanner(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
    protected android.graphics.drawable.Drawable loadDefaultLogo(android.content.pm.PackageManager);
    public java.lang.CharSequence loadUnsafeLabel(android.content.pm.PackageManager);
    public void writeToParcel(android.os.Parcel, int);


    public android.content.pm.ApplicationInfo applicationInfo;
    public int descriptionRes;
    public boolean directBootAware;
    public boolean enabled;
    public boolean encryptionAware;
    public boolean exported;
    public java.lang.String processName;
    public java.lang.String splitName;
}

-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 void writeToProto(android.util.proto.ProtoOutputStream, long);


    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;
    public int version;
}

-keep class android.content.pm.IDexModuleRegisterCallback {

    public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);


}

-keep class android.content.pm.IOnPermissionsChangeListener {

    public abstract void onPermissionsChanged(int);


}

-keep class android.content.pm.IPackageDataObserver {

    public abstract void onRemoveCompleted(java.lang.String, boolean);


}

-keep class android.content.pm.IPackageDeleteObserver {

    public abstract void packageDeleted(java.lang.String, int);


}

-keep class android.content.pm.IPackageDeleteObserver2 {

    public abstract void onPackageDeleted(java.lang.String, int, java.lang.String);
    public abstract void onUserActionRequired(android.content.Intent);


}

-keep class android.content.pm.IPackageInstaller {

    public abstract void abandonSession(int);
    public abstract int createSession(android.content.pm.PackageInstaller$SessionParams, java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getAllSessions(int);
    public abstract android.content.pm.ParceledListSlice getMySessions(java.lang.String, int);
    public abstract android.content.pm.PackageInstaller$SessionInfo getSessionInfo(int);
    public abstract android.content.pm.IPackageInstallerSession openSession(int);
    public abstract void registerCallback(android.content.pm.IPackageInstallerCallback, int);
    public abstract void setPermissionsResult(int, boolean);
    public abstract void uninstall(android.content.pm.VersionedPackage, java.lang.String, int, android.content.IntentSender, int);
    public abstract void unregisterCallback(android.content.pm.IPackageInstallerCallback);
    public abstract void updateSessionAppIcon(int, android.graphics.Bitmap);
    public abstract void updateSessionAppLabel(int, java.lang.String);


}

-keep class android.content.pm.IPackageInstallerCallback {

    public abstract void onSessionActiveChanged(int, boolean);
    public abstract void onSessionBadgingChanged(int);
    public abstract void onSessionCreated(int);
    public abstract void onSessionFinished(int, boolean);
    public abstract void onSessionProgressChanged(int, float);


}

-keep class android.content.pm.IPackageInstallerSession {

    public abstract void abandon();
    public abstract void addClientProgress(float);
    public abstract void close();
    public abstract void commit(android.content.IntentSender, boolean);
    public abstract java.lang.String[] getNames();
    public abstract android.os.ParcelFileDescriptor openRead(java.lang.String);
    public abstract android.os.ParcelFileDescriptor openWrite(java.lang.String, long, long);
    public abstract void removeSplit(java.lang.String);
    public abstract void setClientProgress(float);
    public abstract void transfer(java.lang.String);
    public abstract void write(java.lang.String, long, long, android.os.ParcelFileDescriptor);


}

-keep class android.content.pm.IPackageManager {

    public abstract boolean activitySupportsIntent(android.content.ComponentName, android.content.Intent, java.lang.String);
    public abstract void addCrossProfileIntentFilter(android.content.IntentFilter, java.lang.String, int, int, int);
    public abstract void addOnPermissionsChangeListener(android.content.pm.IOnPermissionsChangeListener);
    public abstract boolean addPermission(android.content.pm.PermissionInfo);
    public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
    public abstract void addPersistentPreferredActivity(android.content.IntentFilter, android.content.ComponentName, int);
    public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public abstract boolean canForwardTo(android.content.Intent, java.lang.String, int, int);
    public abstract boolean canRequestPackageInstalls(java.lang.String, int);
    public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
    public abstract void checkPackageStartable(java.lang.String, int);
    public abstract int checkPermission(java.lang.String, java.lang.String, int);
    public abstract int checkSignatures(java.lang.String, java.lang.String);
    public abstract int checkUidPermission(java.lang.String, int);
    public abstract int checkUidSignatures(int, int);
    public abstract void clearApplicationProfileData(java.lang.String);
    public abstract void clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver, int);
    public abstract void clearCrossProfileIntentFilters(int, java.lang.String);
    public abstract void clearPackagePersistentPreferredActivities(java.lang.String, int);
    public abstract void clearPackagePreferredActivities(java.lang.String);
    public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
    public abstract void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver);
    public abstract void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver);
    public abstract void deletePackageAsUser(java.lang.String, int, android.content.pm.IPackageDeleteObserver, int, int);
    public abstract void deletePackageVersioned(android.content.pm.VersionedPackage, android.content.pm.IPackageDeleteObserver2, int, int);
    public abstract void deletePreloadsFileCache();
    public abstract void dumpProfiles(java.lang.String);
    public abstract void enterSafeMode();
    public abstract void extendVerificationTimeout(int, int, long);
    public abstract android.content.pm.ResolveInfo findPersistentPreferredActivity(android.content.Intent, int);
    public abstract void finishPackageInstall(int, boolean);
    public abstract void flushPackageRestrictionsAsUser(int);
    public abstract void forceDexOpt(java.lang.String);
    public abstract void freeStorage(java.lang.String, long, int, android.content.IntentSender);
    public abstract void freeStorageAndNotify(java.lang.String, long, int, android.content.pm.IPackageDataObserver);
    public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int, int);
    public abstract android.content.pm.ParceledListSlice getAllIntentFilters(java.lang.String);
    public abstract java.util.List getAllPackages();
    public abstract android.content.pm.ParceledListSlice getAllPermissionGroups(int);
    public abstract java.lang.String[] getAppOpPermissionPackages(java.lang.String);
    public abstract int getApplicationEnabledSetting(java.lang.String, int);
    public abstract boolean getApplicationHiddenSettingAsUser(java.lang.String, int);
    public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int, int);
    public abstract android.content.pm.dex.IArtManager getArtManager();
    public abstract boolean getBlockUninstallForUser(java.lang.String, int);
    public abstract android.content.pm.ChangedPackages getChangedPackages(int, int);
    public abstract int getComponentEnabledSetting(android.content.ComponentName, int);
    public abstract byte[] getDefaultAppsBackup(int);
    public abstract java.lang.String getDefaultBrowserPackageName(int);
    public abstract int getFlagsForUid(int);
    public abstract java.lang.CharSequence getHarmfulAppWarning(java.lang.String, int);
    public abstract android.content.ComponentName getHomeActivities(java.util.List);
    public abstract int getInstallLocation();
    public abstract int getInstallReason(java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getInstalledApplications(int, int);
    public abstract android.content.pm.ParceledListSlice getInstalledPackages(int, int);
    public abstract java.lang.String getInstallerPackageName(java.lang.String);
    public abstract java.lang.String getInstantAppAndroidId(java.lang.String, int);
    public abstract byte[] getInstantAppCookie(java.lang.String, int);
    public abstract android.graphics.Bitmap getInstantAppIcon(java.lang.String, int);
    public abstract android.content.ComponentName getInstantAppInstallerComponent();
    public abstract android.content.ComponentName getInstantAppResolverComponent();
    public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
    public abstract android.content.pm.ParceledListSlice getInstantApps(int);
    public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
    public abstract byte[] getIntentFilterVerificationBackup(int);
    public abstract android.content.pm.ParceledListSlice getIntentFilterVerifications(java.lang.String);
    public abstract int getIntentVerificationStatus(java.lang.String, int);
    public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
    public abstract android.content.pm.ResolveInfo getLastChosenActivity(android.content.Intent, java.lang.String, int);
    public abstract int getMoveStatus(int);
    public abstract java.lang.String getNameForUid(int);
    public abstract java.lang.String[] getNamesForUids(int[]);
    public abstract int[] getPackageGids(java.lang.String, int, int);
    public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int, int);
    public abstract android.content.pm.PackageInfo getPackageInfoVersioned(android.content.pm.VersionedPackage, int, int);
    public abstract android.content.pm.IPackageInstaller getPackageInstaller();
    public abstract void getPackageSizeInfo(java.lang.String, int, android.content.pm.IPackageStatsObserver);
    public abstract int getPackageUid(java.lang.String, int, int);
    public abstract java.lang.String[] getPackagesForUid(int);
    public abstract android.content.pm.ParceledListSlice getPackagesHoldingPermissions(java.lang.String[], int, int);
    public abstract java.lang.String getPermissionControllerPackageName();
    public abstract int getPermissionFlags(java.lang.String, java.lang.String, int);
    public abstract byte[] getPermissionGrantBackup(int);
    public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int);
    public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getPersistentApplications(int);
    public abstract int getPreferredActivities(java.util.List, java.util.List, java.lang.String);
    public abstract byte[] getPreferredActivityBackup(int);
    public abstract int getPrivateFlagsForUid(int);
    public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int, int);
    public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int, int);
    public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int, int);
    public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
    public abstract android.content.pm.ParceledListSlice getSharedLibraries(java.lang.String, int, int);
    public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
    public abstract android.content.pm.KeySet getSigningKeySet(java.lang.String);
    public abstract android.os.PersistableBundle getSuspendedPackageAppExtras(java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getSystemAvailableFeatures();
    public abstract java.lang.String[] getSystemSharedLibraryNames();
    public abstract java.lang.String getSystemTextClassifierPackageName();
    public abstract int getUidForSharedUser(java.lang.String);
    public abstract android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity();
    public abstract void grantDefaultPermissionsToActiveLuiApp(java.lang.String, int);
    public abstract void grantDefaultPermissionsToEnabledCarrierApps(java.lang.String[], int);
    public abstract void grantDefaultPermissionsToEnabledImsServices(java.lang.String[], int);
    public abstract void grantDefaultPermissionsToEnabledTelephonyDataServices(java.lang.String[], int);
    public abstract void grantRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean hasSigningCertificate(java.lang.String, byte[], int);
    public abstract boolean hasSystemFeature(java.lang.String, int);
    public abstract boolean hasSystemUidErrors();
    public abstract boolean hasUidSigningCertificate(int, byte[], int);
    public abstract int installExistingPackageAsUser(java.lang.String, int, int, int);
    public abstract boolean isFirstBoot();
    public abstract boolean isInstantApp(java.lang.String, int);
    public abstract boolean isOnlyCoreApps();
    public abstract boolean isPackageAvailable(java.lang.String, int);
    public abstract boolean isPackageDeviceAdminOnAnyUser(java.lang.String);
    public abstract boolean isPackageSignedByKeySet(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isPackageSignedByKeySetExactly(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isPackageStateProtected(java.lang.String, int);
    public abstract boolean isPackageSuspendedForUser(java.lang.String, int);
    public abstract boolean isPermissionEnforced(java.lang.String);
    public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String, int);
    public abstract boolean isProtectedBroadcast(java.lang.String);
    public abstract boolean isSafeMode();
    public abstract boolean isStorageLow();
    public abstract boolean isUidPrivileged(int);
    public abstract boolean isUpgrade();
    public abstract void logAppProcessStartIfNeeded(java.lang.String, int, java.lang.String, java.lang.String, int);
    public abstract int movePackage(java.lang.String, java.lang.String);
    public abstract int movePrimaryStorage(java.lang.String);
    public abstract android.content.pm.PackageCleanItem nextPackageToClean(android.content.pm.PackageCleanItem);
    public abstract void notifyDexLoad(java.lang.String, java.util.List, java.util.List, java.lang.String);
    public abstract void notifyPackageUse(java.lang.String, int);
    public abstract boolean performDexOptMode(java.lang.String, boolean, java.lang.String, boolean, boolean, java.lang.String);
    public abstract boolean performDexOptSecondary(java.lang.String, java.lang.String, boolean);
    public abstract void performFstrimIfNeeded();
    public abstract android.content.pm.ParceledListSlice queryContentProviders(java.lang.String, int, int, java.lang.String);
    public abstract android.content.pm.ParceledListSlice queryInstrumentation(java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice queryIntentActivities(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], java.lang.String[], android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentContentProviders(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentReceivers(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentServices(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryPermissionsByGroup(java.lang.String, int);
    public abstract void querySyncProviders(java.util.List, java.util.List);
    public abstract void reconcileSecondaryDexFiles(java.lang.String);
    public abstract void registerDexModule(java.lang.String, java.lang.String, boolean, android.content.pm.IDexModuleRegisterCallback);
    public abstract void registerMoveCallback(android.content.pm.IPackageMoveObserver);
    public abstract void removeOnPermissionsChangeListener(android.content.pm.IOnPermissionsChangeListener);
    public abstract void removePermission(java.lang.String);
    public abstract void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public abstract void resetApplicationPreferences(int);
    public abstract void resetRuntimePermissions();
    public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int, int);
    public abstract android.content.pm.ResolveInfo resolveIntent(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, java.lang.String, int, int);
    public abstract void restoreDefaultApps(byte[], int);
    public abstract void restoreIntentFilterVerification(byte[], int);
    public abstract void restorePermissionGrants(byte[], int);
    public abstract void restorePreferredActivities(byte[], int);
    public abstract void revokeDefaultPermissionsFromDisabledTelephonyDataServices(java.lang.String[], int);
    public abstract void revokeDefaultPermissionsFromLuiApps(java.lang.String[], int);
    public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean runBackgroundDexoptJob(java.util.List);
    public abstract void setApplicationCategoryHint(java.lang.String, int, java.lang.String);
    public abstract void setApplicationEnabledSetting(java.lang.String, int, int, int, java.lang.String);
    public abstract boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, int);
    public abstract boolean setBlockUninstallForUser(java.lang.String, boolean, int);
    public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int, int);
    public abstract boolean setDefaultBrowserPackageName(java.lang.String, int);
    public abstract void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence, int);
    public abstract void setHomeActivity(android.content.ComponentName, int);
    public abstract boolean setInstallLocation(int);
    public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
    public abstract boolean setInstantAppCookie(java.lang.String, byte[], int);
    public abstract void setLastChosenActivity(android.content.Intent, java.lang.String, int, android.content.IntentFilter, int, android.content.ComponentName);
    public abstract void setPackageStoppedState(java.lang.String, boolean, int);
    public abstract java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String, java.lang.String, int);
    public abstract void setPermissionEnforced(java.lang.String, boolean);
    public abstract boolean setRequiredForSystemUser(java.lang.String, boolean);
    public abstract void setSystemAppHiddenUntilInstalled(java.lang.String, boolean);
    public abstract boolean setSystemAppInstallState(java.lang.String, boolean, int);
    public abstract void setUpdateAvailable(java.lang.String, boolean);
    public abstract boolean shouldShowRequestPermissionRationale(java.lang.String, java.lang.String, int);
    public abstract void systemReady();
    public abstract void unregisterMoveCallback(android.content.pm.IPackageMoveObserver);
    public abstract boolean updateIntentVerificationStatus(java.lang.String, int, int);
    public abstract void updatePackagesIfNeeded();
    public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, int);
    public abstract void updatePermissionFlagsForAllApps(int, int, int);
    public abstract void verifyIntentFilter(int, int, java.util.List);
    public abstract void verifyPendingInstall(int, int);


}

-keep class android.content.pm.IPackageMoveObserver {

    public abstract void onCreated(int, android.os.Bundle);
    public abstract void onStatusChanged(int, int, long);


}

-keep class android.content.pm.IPackageStatsObserver {

    public abstract void onGetStatsCompleted(android.content.pm.PackageStats, boolean);


}

-keep class android.content.pm.InstantAppInfo {
    <init>(android.content.pm.ApplicationInfo, java.lang.String[], java.lang.String[]);
    <init>(java.lang.String, java.lang.CharSequence, java.lang.String[], java.lang.String[]);

    public int describeContents();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public java.lang.String[] getGrantedPermissions();
    public java.lang.String getPackageName();
    public java.lang.String[] getRequestedPermissions();
    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.InstantAppIntentFilter {
    <init>(java.lang.String, java.util.List);

    public int describeContents();
    public java.util.List getFilters();
    public java.lang.String getSplitName();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.InstantAppResolveInfo {
    <init>(android.content.pm.InstantAppResolveInfo$InstantAppDigest, java.lang.String, java.util.List, int);
    <init>(android.content.pm.InstantAppResolveInfo$InstantAppDigest, java.lang.String, java.util.List, long, android.os.Bundle);
    <init>(java.lang.String, java.lang.String, java.util.List);
    <init>(android.os.Bundle);

    public int describeContents();
    public byte[] getDigestBytes();
    public int getDigestPrefix();
    public android.os.Bundle getExtras();
    public java.util.List getIntentFilters();
    public long getLongVersionCode();
    public java.lang.String getPackageName();
    public int getVersionCode();
    public boolean shouldLetInstallerDecide();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.InstantAppResolveInfo$InstantAppDigest {
    <init>(java.lang.String);
    <init>(java.lang.String, int);

    public int describeContents();
    public byte[][] getDigestBytes();
    public int[] getDigestPrefix();
    public int[] getDigestPrefixSecure();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.content.pm.InstantAppResolveInfo$InstantAppDigest UNDEFINED;
}

-keep class android.content.pm.InstrumentationInfo {
    <init>();
    <init>(android.content.pm.InstrumentationInfo);

    public void copyTo(android.content.pm.ApplicationInfo);
    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 credentialProtectedDataDir;
    public java.lang.String dataDir;
    public java.lang.String deviceProtectedDataDir;
    public boolean functionalTest;
    public boolean handleProfiling;
    public java.lang.String nativeLibraryDir;
    public java.lang.String primaryCpuAbi;
    public java.lang.String publicSourceDir;
    public java.lang.String secondaryCpuAbi;
    public java.lang.String secondaryNativeLibraryDir;
    public java.lang.String sourceDir;
    public android.util.SparseArray splitDependencies;
    public java.lang.String[] splitNames;
    public java.lang.String[] splitPublicSourceDirs;
    public java.lang.String[] splitSourceDirs;
    public java.lang.String targetPackage;
    public java.lang.String targetProcesses;
}

-keep class android.content.pm.IntentFilterVerificationInfo {
    <init>();
    <init>(java.lang.String, android.util.ArraySet);
    <init>(org.xmlpull.v1.XmlPullParser);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.util.Set getDomains();
    public java.lang.String getDomainsString();
    public java.lang.String getPackageName();
    public int getStatus();
    public java.lang.String getStatusString();
    public static java.lang.String getStatusStringFromValue(long);
    public void readFromXml(org.xmlpull.v1.XmlPullParser);
    public void setDomains(android.util.ArraySet);
    public void setStatus(int);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToXml(org.xmlpull.v1.XmlSerializer);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.KeySet {
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.os.IBinder getToken();
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.PackageCleanItem {
    <init>(int, java.lang.String, boolean);

    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;
    public boolean andCode;
    public java.lang.String packageName;
    public int userId;
}

-keep class android.content.pm.PackageInfo {
    <init>();

    public static long composeLongVersionCode(int, int);
    public int describeContents();
    public long getLongVersionCode();
    public boolean isOverlayPackage();
    public boolean isStaticOverlayPackage();
    public void setLongVersionCode(long);
    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 INSTALL_LOCATION_UNSPECIFIED;
    public static int REQUESTED_PERMISSION_GRANTED;
    public static int REQUESTED_PERMISSION_REQUIRED;
    public android.content.pm.ActivityInfo[] activities;
    public android.content.pm.ApplicationInfo applicationInfo;
    public int baseRevisionCode;
    public int compileSdkVersion;
    public java.lang.String compileSdkVersionCodename;
    public android.content.pm.ConfigurationInfo[] configPreferences;
    public boolean coreApp;
    public android.content.pm.FeatureGroupInfo[] featureGroups;
    public long firstInstallTime;
    public int[] gids;
    public int installLocation;
    public android.content.pm.InstrumentationInfo[] instrumentation;
    public boolean isStub;
    public long lastUpdateTime;
    public java.lang.String overlayCategory;
    public int overlayPriority;
    public java.lang.String overlayTarget;
    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 java.lang.String requiredAccountType;
    public boolean requiredForAllUsers;
    public java.lang.String restrictedAccountType;
    public android.content.pm.ServiceInfo[] services;
    public java.lang.String sharedUserId;
    public int sharedUserLabel;
    public android.content.pm.Signature[] signatures;
    public android.content.pm.SigningInfo signingInfo;
    public java.lang.String[] splitNames;
    public int[] splitRevisionCodes;
    public int versionCode;
    public int versionCodeMajor;
    public java.lang.String versionName;
}

-keep class android.content.pm.PackageInstaller {
    <init>(android.content.pm.IPackageInstaller, java.lang.String, int);

    public void abandonSession(int);
    public void addSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void addSessionCallback(android.content.pm.PackageInstaller$SessionCallback, android.os.Handler);
    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 removeSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void setPermissionsResult(int, boolean);
    public void uninstall(java.lang.String, android.content.IntentSender);
    public void uninstall(java.lang.String, int, android.content.IntentSender);
    public void uninstall(android.content.pm.VersionedPackage, android.content.IntentSender);
    public void uninstall(android.content.pm.VersionedPackage, int, 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_CONFIRM_PERMISSIONS;
    public static java.lang.String ACTION_SESSION_COMMITTED;
    public static java.lang.String ACTION_SESSION_DETAILS;
    public static boolean ENABLE_REVOCABLE_FD;
    public static java.lang.String EXTRA_CALLBACK;
    public static java.lang.String EXTRA_LEGACY_BUNDLE;
    public static java.lang.String EXTRA_LEGACY_STATUS;
    public static java.lang.String EXTRA_OTHER_PACKAGE_NAME;
    public static java.lang.String EXTRA_PACKAGE_NAME;
    public static java.lang.String EXTRA_PACKAGE_NAMES;
    public static java.lang.String EXTRA_SESSION;
    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 {
    <init>(android.content.pm.IPackageInstallerSession);

    public void abandon();
    public void addProgress(float);
    public void close();
    public void commit(android.content.IntentSender);
    public void commitTransferred(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 removeSplit(java.lang.String);
    public void setProgress(float);
    public void setStagingProgress(float);
    public void transfer(java.lang.String);
    public void write(java.lang.String, long, long, android.os.ParcelFileDescriptor);


}

-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 {
    <init>();
    <init>(android.os.Parcel);

    public android.content.Intent createDetailsIntent();
    public int describeContents();
    public boolean getAllocateAggressive();
    public boolean getAllowDowngrade();
    public android.graphics.Bitmap getAppIcon();
    public java.lang.CharSequence getAppLabel();
    public java.lang.String getAppPackageName();
    public android.content.Intent getDetailsIntent();
    public boolean getDontKillApp();
    public java.lang.String[] getGrantedRuntimePermissions();
    public boolean getInstallAsFullApp(boolean);
    public boolean getInstallAsInstantApp(boolean);
    public boolean getInstallAsVirtualPreload();
    public int getInstallLocation();
    public int getInstallReason();
    public java.lang.String getInstallerPackageName();
    public int getMode();
    public int getOriginatingUid();
    public android.net.Uri getOriginatingUri();
    public float getProgress();
    public android.net.Uri getReferrerUri();
    public int getSessionId();
    public long getSize();
    public boolean isActive();
    public boolean isOpen();
    public boolean isSealed();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public boolean active;
    public android.graphics.Bitmap appIcon;
    public java.lang.CharSequence appLabel;
    public java.lang.String appPackageName;
    public java.lang.String[] grantedRuntimePermissions;
    public int installFlags;
    public int installLocation;
    public int installReason;
    public java.lang.String installerPackageName;
    public int mode;
    public int originatingUid;
    public android.net.Uri originatingUri;
    public float progress;
    public android.net.Uri referrerUri;
    public java.lang.String resolvedBaseCodePath;
    public boolean sealed;
    public int sessionId;
    public long sizeBytes;
}

-keep class android.content.pm.PackageInstaller$SessionParams {
    <init>(int);
    <init>(android.os.Parcel);

    public boolean areHiddenOptionsSet();
    public int describeContents();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public void setAllocateAggressive(boolean);
    public void setAllowDowngrade(boolean);
    public void setAppIcon(android.graphics.Bitmap);
    public void setAppLabel(java.lang.CharSequence);
    public void setAppPackageName(java.lang.String);
    public void setDontKillApp(boolean);
    public void setGrantedRuntimePermissions(java.lang.String[]);
    public void setInstallAsInstantApp(boolean);
    public void setInstallAsVirtualPreload();
    public void setInstallFlagsExternal();
    public void setInstallFlagsForcePermissionPrompt();
    public void setInstallFlagsInternal();
    public void setInstallLocation(int);
    public void setInstallReason(int);
    public void setInstallerPackageName(java.lang.String);
    public void setOriginatingUid(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;
    public static int MODE_INVALID;
    public static int UID_UNKNOWN;
    public java.lang.String abiOverride;
    public android.graphics.Bitmap appIcon;
    public long appIconLastModified;
    public java.lang.String appLabel;
    public java.lang.String appPackageName;
    public java.lang.String[] grantedRuntimePermissions;
    public int installFlags;
    public int installLocation;
    public int installReason;
    public java.lang.String installerPackageName;
    public int mode;
    public int originatingUid;
    public android.net.Uri originatingUri;
    public android.net.Uri referrerUri;
    public long sizeBytes;
    public java.lang.String volumeUuid;
}

-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);
    protected android.content.pm.ApplicationInfo getApplicationInfo();
    public android.graphics.drawable.Drawable loadBanner(android.content.pm.PackageManager);
    protected android.graphics.drawable.Drawable loadDefaultBanner(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
    protected android.graphics.drawable.Drawable loadDefaultLogo(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 java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager);
    public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager, float, int);
    public android.graphics.drawable.Drawable loadUnbadgedIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadUnsafeLabel(android.content.pm.PackageManager);
    public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, java.lang.String);
    public static void setForceSafeLabels(boolean);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static float DEFAULT_MAX_LABEL_SIZE_PX;
    public static int DUMP_FLAG_ALL;
    public static int DUMP_FLAG_APPLICATION;
    public static int DUMP_FLAG_DETAILS;
    public static int SAFE_LABEL_FLAG_FIRST_LINE;
    public static int SAFE_LABEL_FLAG_SINGLE_LINE;
    public static int SAFE_LABEL_FLAG_TRIM;
    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;
    public int showUserIcon;
}

-keep class android.content.pm.PackageManager {
    <init>();

    public abstract void addCrossProfileIntentFilter(android.content.IntentFilter, int, int, int);
    public abstract void addOnPermissionsChangeListener(android.content.pm.PackageManager$OnPermissionsChangedListener);
    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 void addPreferredActivityAsUser(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public android.content.Intent buildRequestPermissionsIntent(java.lang.String[]);
    public abstract boolean canRequestPackageInstalls();
    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 clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver);
    public abstract void clearCrossProfileIntentFilters(int);
    public abstract void clearInstantAppCookie();
    public abstract void clearPackagePreferredActivities(java.lang.String);
    public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
    public abstract void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver);
    public abstract void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver);
    public abstract void deletePackage(java.lang.String, android.content.pm.IPackageDeleteObserver, int);
    public abstract void deletePackageAsUser(java.lang.String, android.content.pm.IPackageDeleteObserver, int, int);
    public static int deleteStatusToPublicStatus(int);
    public static java.lang.String deleteStatusToString(int, java.lang.String);
    public static java.lang.String deleteStatusToString(int);
    public abstract void extendVerificationTimeout(int, int, long);
    public abstract void flushPackageRestrictionsAsUser(int);
    public void freeStorage(long, android.content.IntentSender);
    public abstract void freeStorage(java.lang.String, long, android.content.IntentSender);
    public void freeStorageAndNotify(long, android.content.pm.IPackageDataObserver);
    public abstract void freeStorageAndNotify(java.lang.String, long, android.content.pm.IPackageDataObserver);
    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 getAllIntentFilters(java.lang.String);
    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 boolean getApplicationHiddenSettingAsUser(java.lang.String, android.os.UserHandle);
    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 android.content.pm.ApplicationInfo getApplicationInfoAsUser(java.lang.String, int, 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 android.content.pm.dex.ArtManager getArtManager();
    public abstract android.content.Intent getCarLaunchIntentForPackage(java.lang.String);
    public abstract android.content.pm.ChangedPackages getChangedPackages(int);
    public abstract int getComponentEnabledSetting(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getDefaultActivityIcon();
    public abstract java.lang.String getDefaultBrowserPackageNameAsUser(int);
    public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
    public java.lang.CharSequence getHarmfulAppWarning(java.lang.String);
    public abstract android.content.ComponentName getHomeActivities(java.util.List);
    public abstract int getInstallReason(java.lang.String, android.os.UserHandle);
    public abstract java.util.List getInstalledApplications(int);
    public abstract java.util.List getInstalledApplicationsAsUser(int, int);
    public abstract java.util.List getInstalledPackages(int);
    public abstract java.util.List getInstalledPackagesAsUser(int, int);
    public abstract java.lang.String getInstallerPackageName(java.lang.String);
    public abstract java.lang.String getInstantAppAndroidId(java.lang.String, android.os.UserHandle);
    public abstract byte[] getInstantAppCookie();
    public abstract int getInstantAppCookieMaxBytes();
    public abstract int getInstantAppCookieMaxSize();
    public abstract android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String);
    public abstract android.content.ComponentName getInstantAppInstallerComponent();
    public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
    public abstract java.util.List getInstantApps();
    public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
    public abstract java.util.List getIntentFilterVerifications(java.lang.String);
    public abstract int getIntentVerificationStatusAsUser(java.lang.String, int);
    public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
    public abstract android.content.Intent getLaunchIntentForPackage(java.lang.String);
    public abstract android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
    public abstract int getMoveStatus(int);
    public abstract java.lang.String getNameForUid(int);
    public abstract java.lang.String[] getNamesForUids(int[]);
    public android.content.pm.PackageInfo getPackageArchiveInfo(java.lang.String, int);
    public abstract java.util.List getPackageCandidateVolumes(android.content.pm.ApplicationInfo);
    public abstract android.os.storage.VolumeInfo getPackageCurrentVolume(android.content.pm.ApplicationInfo);
    public abstract int[] getPackageGids(java.lang.String);
    public abstract int[] getPackageGids(java.lang.String, int);
    public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int);
    public abstract android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int);
    public abstract android.content.pm.PackageInfo getPackageInfoAsUser(java.lang.String, int, int);
    public abstract android.content.pm.PackageInstaller getPackageInstaller();
    public void getPackageSizeInfo(java.lang.String, android.content.pm.IPackageStatsObserver);
    public abstract void getPackageSizeInfoAsUser(java.lang.String, int, android.content.pm.IPackageStatsObserver);
    public abstract int getPackageUid(java.lang.String, int);
    public abstract int getPackageUidAsUser(java.lang.String, int);
    public abstract int getPackageUidAsUser(java.lang.String, int, int);
    public abstract java.lang.String[] getPackagesForUid(int);
    public abstract java.util.List getPackagesHoldingPermissions(java.lang.String[], int);
    public abstract java.lang.String getPermissionControllerPackageName();
    public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
    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 java.util.List getPrimaryStorageCandidateVolumes();
    public abstract android.os.storage.VolumeInfo getPrimaryStorageCurrentVolume();
    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.res.Resources getResourcesForApplicationAsUser(java.lang.String, int);
    public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int);
    public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
    public abstract java.util.List getSharedLibraries(int);
    public abstract java.util.List getSharedLibrariesAsUser(int, int);
    public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
    public abstract android.content.pm.KeySet getSigningKeySet(java.lang.String);
    public android.os.Bundle getSuspendedPackageAppExtras();
    public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
    public abstract java.lang.String[] getSystemSharedLibraryNames();
    public java.lang.String getSystemTextClassifierPackageName();
    public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
    public abstract int getUidForSharedUser(java.lang.String);
    public abstract android.graphics.drawable.Drawable getUserBadgeForDensity(android.os.UserHandle, int);
    public abstract android.graphics.drawable.Drawable getUserBadgeForDensityNoBackground(android.os.UserHandle, int);
    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 int getUserId();
    public abstract android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity();
    public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
    public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public boolean hasSigningCertificate(java.lang.String, byte[], int);
    public boolean hasSigningCertificate(int, byte[], int);
    public abstract boolean hasSystemFeature(java.lang.String);
    public abstract boolean hasSystemFeature(java.lang.String, int);
    public abstract int installExistingPackage(java.lang.String);
    public abstract int installExistingPackage(java.lang.String, int);
    public abstract int installExistingPackageAsUser(java.lang.String, int);
    public static int installStatusToPublicStatus(int);
    public static java.lang.String installStatusToString(int, java.lang.String);
    public static java.lang.String installStatusToString(int);
    public abstract boolean isInstantApp();
    public abstract boolean isInstantApp(java.lang.String);
    public static boolean isMoveStatusFinished(int);
    public abstract boolean isPackageAvailable(java.lang.String);
    public boolean isPackageStateProtected(java.lang.String, int);
    public boolean isPackageSuspended(java.lang.String);
    public boolean isPackageSuspended();
    public abstract boolean isPackageSuspendedForUser(java.lang.String, int);
    public abstract boolean isPermissionReviewModeEnabled();
    public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
    public abstract boolean isSafeMode();
    public abstract boolean isSignedBy(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isSignedByExactly(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isUpgrade();
    public abstract android.graphics.drawable.Drawable loadItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable loadUnbadgedItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
    public abstract int movePackage(java.lang.String, android.os.storage.VolumeInfo);
    public abstract int movePrimaryStorage(android.os.storage.VolumeInfo);
    public static java.lang.String permissionFlagToString(int);
    public abstract java.util.List queryBroadcastReceivers(android.content.Intent, int);
    public java.util.List queryBroadcastReceivers(android.content.Intent, int, int);
    public java.util.List queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
    public abstract java.util.List queryBroadcastReceiversAsUser(android.content.Intent, int, int);
    public abstract java.util.List queryContentProviders(java.lang.String, int, int);
    public java.util.List queryContentProviders(java.lang.String, int, int, java.lang.String);
    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 queryIntentActivitiesAsUser(android.content.Intent, int, 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 queryIntentContentProvidersAsUser(android.content.Intent, int, int);
    public abstract java.util.List queryIntentServices(android.content.Intent, int);
    public abstract java.util.List queryIntentServicesAsUser(android.content.Intent, int, int);
    public abstract java.util.List queryPermissionsByGroup(java.lang.String, int);
    public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager$DexModuleRegisterCallback);
    public abstract void registerMoveCallback(android.content.pm.PackageManager$MoveCallback, android.os.Handler);
    public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager$OnPermissionsChangedListener);
    public abstract void removePackageFromPreferred(java.lang.String);
    public abstract void removePermission(java.lang.String);
    public abstract void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
    public void replacePreferredActivityAsUser(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
    public abstract android.content.pm.ResolveInfo resolveActivityAsUser(android.content.Intent, int, int);
    public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
    public abstract android.content.pm.ProviderInfo resolveContentProviderAsUser(java.lang.String, int, int);
    public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
    public abstract android.content.pm.ResolveInfo resolveServiceAsUser(android.content.Intent, int, int);
    public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public abstract void setApplicationCategoryHint(java.lang.String, int);
    public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
    public abstract boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, android.os.UserHandle);
    public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
    public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
    public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
    public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
    public abstract boolean setInstantAppCookie(byte[]);
    public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
    public abstract void setUpdateAvailable(java.lang.String, boolean);
    public abstract boolean shouldShowRequestPermissionRationale(java.lang.String);
    public abstract void unregisterMoveCallback(android.content.pm.PackageManager$MoveCallback);
    public abstract void updateInstantAppCookie(byte[]);
    public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
    public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
    public abstract void verifyIntentFilter(int, int, java.util.List);
    public abstract void verifyPendingInstall(int, int);


    public static java.lang.String ACTION_CLEAN_EXTERNAL_STORAGE;
    public static java.lang.String ACTION_REQUEST_PERMISSIONS;
    public static boolean APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
    public static int CERT_INPUT_RAW_X509;
    public static int CERT_INPUT_SHA256;
    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 DELETE_ALL_USERS;
    public static int DELETE_CHATTY;
    public static int DELETE_DONT_KILL_APP;
    public static int DELETE_FAILED_ABORTED;
    public static int DELETE_FAILED_DEVICE_POLICY_MANAGER;
    public static int DELETE_FAILED_INTERNAL_ERROR;
    public static int DELETE_FAILED_OWNER_BLOCKED;
    public static int DELETE_FAILED_USED_SHARED_LIBRARY;
    public static int DELETE_FAILED_USER_RESTRICTED;
    public static int DELETE_KEEP_DATA;
    public static int DELETE_SUCCEEDED;
    public static int DELETE_SYSTEM_APP;
    public static int DONT_KILL_APP;
    public static java.lang.String EXTRA_FAILURE_EXISTING_PACKAGE;
    public static java.lang.String EXTRA_FAILURE_EXISTING_PERMISSION;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_HOSTS;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_ID;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_PACKAGE_NAME;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_URI_SCHEME;
    public static java.lang.String EXTRA_MOVE_ID;
    public static java.lang.String EXTRA_REQUEST_PERMISSIONS_NAMES;
    public static java.lang.String EXTRA_REQUEST_PERMISSIONS_RESULTS;
    public static java.lang.String EXTRA_VERIFICATION_ID;
    public static java.lang.String EXTRA_VERIFICATION_INSTALLER_PACKAGE;
    public static java.lang.String EXTRA_VERIFICATION_INSTALLER_UID;
    public static java.lang.String EXTRA_VERIFICATION_INSTALL_FLAGS;
    public static java.lang.String EXTRA_VERIFICATION_LONG_VERSION_CODE;
    public static java.lang.String EXTRA_VERIFICATION_PACKAGE_NAME;
    public static java.lang.String EXTRA_VERIFICATION_RESULT;
    public static java.lang.String EXTRA_VERIFICATION_URI;
    public static java.lang.String EXTRA_VERIFICATION_VERSION_CODE;
    public static java.lang.String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
    public static java.lang.String FEATURE_ADOPTABLE_STORAGE;
    public static java.lang.String FEATURE_APP_WIDGETS;
    public static java.lang.String FEATURE_ASSIST_GESTURE;
    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_AUTOFILL;
    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_BROADCAST_RADIO;
    public static java.lang.String FEATURE_CAMERA;
    public static java.lang.String FEATURE_CAMERA_ANY;
    public static java.lang.String FEATURE_CAMERA_AR;
    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_CANT_SAVE_STATE;
    public static java.lang.String FEATURE_COMPANION_DEVICE_SETUP;
    public static java.lang.String FEATURE_CONNECTION_SERVICE;
    public static java.lang.String FEATURE_CONSUMER_IR;
    public static java.lang.String FEATURE_CTS;
    public static java.lang.String FEATURE_DEVICE_ADMIN;
    public static java.lang.String FEATURE_DEVICE_ID_ATTESTATION;
    public static java.lang.String FEATURE_EMBEDDED;
    public static java.lang.String FEATURE_ETHERNET;
    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_FILE_BASED_ENCRYPTION;
    public static java.lang.String FEATURE_FINGERPRINT;
    public static java.lang.String FEATURE_FREEFORM_WINDOW_MANAGEMENT;
    public static java.lang.String FEATURE_GAMEPAD;
    public static java.lang.String FEATURE_HDMI_CEC;
    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_LEANBACK_ONLY;
    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_LOWPAN;
    public static java.lang.String FEATURE_MANAGED_PROFILES;
    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_ANY;
    public static java.lang.String FEATURE_NFC_HCE;
    public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION;
    public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF;
    public static java.lang.String FEATURE_OPENGLES_EXTENSION_PACK;
    public static java.lang.String FEATURE_PC;
    public static java.lang.String FEATURE_PICTURE_IN_PICTURE;
    public static java.lang.String FEATURE_PRINTING;
    public static java.lang.String FEATURE_RAM_LOW;
    public static java.lang.String FEATURE_RAM_NORMAL;
    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_STRONGBOX_KEYSTORE;
    public static java.lang.String FEATURE_TELEPHONY;
    public static java.lang.String FEATURE_TELEPHONY_CARRIERLOCK;
    public static java.lang.String FEATURE_TELEPHONY_CDMA;
    public static java.lang.String FEATURE_TELEPHONY_EUICC;
    public static java.lang.String FEATURE_TELEPHONY_GSM;
    public static java.lang.String FEATURE_TELEPHONY_MBMS;
    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_VOICE_RECOGNIZERS;
    public static java.lang.String FEATURE_VR_HEADTRACKING;
    public static java.lang.String FEATURE_VR_MODE;
    public static java.lang.String FEATURE_VR_MODE_HIGH_PERFORMANCE;
    public static java.lang.String FEATURE_VULKAN_HARDWARE_COMPUTE;
    public static java.lang.String FEATURE_VULKAN_HARDWARE_LEVEL;
    public static java.lang.String FEATURE_VULKAN_HARDWARE_VERSION;
    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_AWARE;
    public static java.lang.String FEATURE_WIFI_DIRECT;
    public static java.lang.String FEATURE_WIFI_PASSPOINT;
    public static java.lang.String FEATURE_WIFI_RTT;
    public static int FLAG_PERMISSION_GRANTED_BY_DEFAULT;
    public static int FLAG_PERMISSION_POLICY_FIXED;
    public static int FLAG_PERMISSION_REVIEW_REQUIRED;
    public static int FLAG_PERMISSION_REVOKE_ON_UPGRADE;
    public static int FLAG_PERMISSION_SYSTEM_FIXED;
    public static int FLAG_PERMISSION_USER_FIXED;
    public static int FLAG_PERMISSION_USER_SET;
    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_SIGNING_CERTIFICATES;
    public static int GET_UNINSTALLED_PACKAGES;
    public static int GET_URI_PERMISSION_PATTERNS;
    public static int INSTALL_ALLOCATE_AGGRESSIVE;
    public static int INSTALL_ALLOW_DOWNGRADE;
    public static int INSTALL_ALLOW_TEST;
    public static int INSTALL_ALL_USERS;
    public static int INSTALL_DONT_KILL_APP;
    public static int INSTALL_EXTERNAL;
    public static int INSTALL_FAILED_ABORTED;
    public static int INSTALL_FAILED_ALREADY_EXISTS;
    public static int INSTALL_FAILED_BAD_DEX_METADATA;
    public static int INSTALL_FAILED_CONFLICTING_PROVIDER;
    public static int INSTALL_FAILED_CONTAINER_ERROR;
    public static int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE;
    public static int INSTALL_FAILED_DEXOPT;
    public static int INSTALL_FAILED_DUPLICATE_PACKAGE;
    public static int INSTALL_FAILED_DUPLICATE_PERMISSION;
    public static int INSTALL_FAILED_INSTANT_APP_INVALID;
    public static int INSTALL_FAILED_INSUFFICIENT_STORAGE;
    public static int INSTALL_FAILED_INTERNAL_ERROR;
    public static int INSTALL_FAILED_INVALID_APK;
    public static int INSTALL_FAILED_INVALID_INSTALL_LOCATION;
    public static int INSTALL_FAILED_INVALID_URI;
    public static int INSTALL_FAILED_MEDIA_UNAVAILABLE;
    public static int INSTALL_FAILED_MISSING_FEATURE;
    public static int INSTALL_FAILED_MISSING_SHARED_LIBRARY;
    public static int INSTALL_FAILED_NEWER_SDK;
    public static int INSTALL_FAILED_NO_MATCHING_ABIS;
    public static int INSTALL_FAILED_NO_SHARED_USER;
    public static int INSTALL_FAILED_OLDER_SDK;
    public static int INSTALL_FAILED_PACKAGE_CHANGED;
    public static int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE;
    public static int INSTALL_FAILED_REPLACE_COULDNT_DELETE;
    public static int INSTALL_FAILED_SANDBOX_VERSION_DOWNGRADE;
    public static int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
    public static int INSTALL_FAILED_TEST_ONLY;
    public static int INSTALL_FAILED_UID_CHANGED;
    public static int INSTALL_FAILED_UPDATE_INCOMPATIBLE;
    public static int INSTALL_FAILED_USER_RESTRICTED;
    public static int INSTALL_FAILED_VERIFICATION_FAILURE;
    public static int INSTALL_FAILED_VERIFICATION_TIMEOUT;
    public static int INSTALL_FAILED_VERSION_DOWNGRADE;
    public static int INSTALL_FORCE_PERMISSION_PROMPT;
    public static int INSTALL_FORCE_SDK;
    public static int INSTALL_FORCE_VOLUME_UUID;
    public static int INSTALL_FORWARD_LOCK;
    public static int INSTALL_FROM_ADB;
    public static int INSTALL_FULL_APP;
    public static int INSTALL_GRANT_RUNTIME_PERMISSIONS;
    public static int INSTALL_INSTANT_APP;
    public static int INSTALL_INTERNAL;
    public static int INSTALL_PARSE_FAILED_BAD_MANIFEST;
    public static int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
    public static int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
    public static int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
    public static int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
    public static int INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
    public static int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
    public static int INSTALL_PARSE_FAILED_NOT_APK;
    public static int INSTALL_PARSE_FAILED_NO_CERTIFICATES;
    public static int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
    public static int INSTALL_REASON_DEVICE_RESTORE;
    public static int INSTALL_REASON_DEVICE_SETUP;
    public static int INSTALL_REASON_POLICY;
    public static int INSTALL_REASON_UNKNOWN;
    public static int INSTALL_REASON_USER;
    public static int INSTALL_REPLACE_EXISTING;
    public static int INSTALL_SUCCEEDED;
    public static int INSTALL_VIRTUAL_PRELOAD;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
    public static int INTENT_FILTER_VERIFICATION_FAILURE;
    public static int INTENT_FILTER_VERIFICATION_SUCCESS;
    public static int MASK_PERMISSION_FLAGS;
    public static int MATCH_ALL;
    public static int MATCH_ANY_USER;
    public static int MATCH_DEBUG_TRIAGED_MISSING;
    public static int MATCH_DEFAULT_ONLY;
    public static int MATCH_DIRECT_BOOT_AWARE;
    public static int MATCH_DIRECT_BOOT_UNAWARE;
    public static int MATCH_DISABLED_COMPONENTS;
    public static int MATCH_DISABLED_UNTIL_USED_COMPONENTS;
    public static int MATCH_EXPLICITLY_VISIBLE_ONLY;
    public static int MATCH_FACTORY_ONLY;
    public static int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
    public static int MATCH_INSTANT;
    public static int MATCH_KNOWN_PACKAGES;
    public static int MATCH_STATIC_SHARED_LIBRARIES;
    public static int MATCH_SYSTEM_ONLY;
    public static int MATCH_UNINSTALLED_PACKAGES;
    public static int MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
    public static long MAXIMUM_VERIFICATION_TIMEOUT;
    public static int MOVE_EXTERNAL_MEDIA;
    public static int MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL;
    public static int MOVE_FAILED_DEVICE_ADMIN;
    public static int MOVE_FAILED_DOESNT_EXIST;
    public static int MOVE_FAILED_FORWARD_LOCKED;
    public static int MOVE_FAILED_INSUFFICIENT_STORAGE;
    public static int MOVE_FAILED_INTERNAL_ERROR;
    public static int MOVE_FAILED_INVALID_LOCATION;
    public static int MOVE_FAILED_LOCKED_USER;
    public static int MOVE_FAILED_OPERATION_PENDING;
    public static int MOVE_FAILED_SYSTEM_PACKAGE;
    public static int MOVE_INTERNAL;
    public static int MOVE_SUCCEEDED;
    public static int NOTIFY_PACKAGE_USE_ACTIVITY;
    public static int NOTIFY_PACKAGE_USE_BACKUP;
    public static int NOTIFY_PACKAGE_USE_BROADCAST_RECEIVER;
    public static int NOTIFY_PACKAGE_USE_CONTENT_PROVIDER;
    public static int NOTIFY_PACKAGE_USE_CROSS_PACKAGE;
    public static int NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE;
    public static int NOTIFY_PACKAGE_USE_INSTRUMENTATION;
    public static int NOTIFY_PACKAGE_USE_REASONS_COUNT;
    public static int NOTIFY_PACKAGE_USE_SERVICE;
    public static int NO_NATIVE_LIBRARIES;
    public static int ONLY_IF_NO_MATCH_FOUND;
    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 SKIP_CURRENT_PROFILE;
    public static java.lang.String SYSTEM_SHARED_LIBRARY_SERVICES;
    public static java.lang.String SYSTEM_SHARED_LIBRARY_SHARED;
    public static int VERIFICATION_ALLOW;
    public static int VERIFICATION_ALLOW_WITHOUT_SUFFICIENT;
    public static int VERIFICATION_REJECT;
    public static int VERSION_CODE_HIGHEST;
}

-keep class android.content.pm.PackageManager$DexModuleRegisterCallback {
    <init>();

    public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);


}

-keep class android.content.pm.PackageManager$MoveCallback {
    <init>();

    public void onCreated(int, android.os.Bundle);
    public abstract void onStatusChanged(int, int, long);


}

-keep class android.content.pm.PackageManager$NameNotFoundException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.content.pm.PackageManager$OnPermissionsChangedListener {

    public abstract void onPermissionsChanged(int);


}

-keep class android.content.pm.PackageParser {
    <init>();

    public static void collectCertificates(android.content.pm.PackageParser$Package, boolean);
    public static int computeMinSdkVersion(int, java.lang.String, int, java.lang.String[], java.lang.String[]);
    public static int computeTargetSdkVersion(int, java.lang.String, java.lang.String[], java.lang.String[], boolean);
    protected android.content.pm.PackageParser$Package fromCacheEntry(byte[]);
    public static android.content.pm.PackageParser$Package fromCacheEntryStatic(byte[]);
    public static android.content.pm.ActivityInfo generateActivityInfo(android.content.pm.PackageParser$Activity, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ActivityInfo generateActivityInfo(android.content.pm.ActivityInfo, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.PackageParser$Package, int, android.content.pm.PackageUserState);
    public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.PackageParser$Package, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.ApplicationInfo, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.InstrumentationInfo generateInstrumentationInfo(android.content.pm.PackageParser$Instrumentation, int);
    public static android.content.pm.PackageInfo generatePackageInfo(android.content.pm.PackageParser$Package, int[], int, long, long, java.util.Set, android.content.pm.PackageUserState);
    public static android.content.pm.PackageInfo generatePackageInfo(android.content.pm.PackageParser$Package, int[], int, long, long, java.util.Set, android.content.pm.PackageUserState, int);
    public static android.content.pm.PermissionGroupInfo generatePermissionGroupInfo(android.content.pm.PackageParser$PermissionGroup, int);
    public static android.content.pm.PermissionInfo generatePermissionInfo(android.content.pm.PackageParser$Permission, int);
    public static android.content.pm.ProviderInfo generateProviderInfo(android.content.pm.PackageParser$Provider, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ServiceInfo generateServiceInfo(android.content.pm.PackageParser$Service, int, android.content.pm.PackageUserState, int);
    public static int getActivityConfigChanges(int, int);
    public static boolean isApkFile(java.io.File);
    public static boolean isApkPath(java.lang.String);
    public static boolean isAvailable(android.content.pm.PackageUserState);
    public static android.content.pm.PackageParser$ApkLite parseApkLite(java.io.File, int);
    public static android.content.pm.PackageParser$ApkLite parseApkLite(java.io.FileDescriptor, java.lang.String, int);
    public android.content.pm.PackageParser$Package parseMonolithicPackage(java.io.File, int);
    public android.content.pm.PackageParser$Package parsePackage(java.io.File, int, boolean);
    public android.content.pm.PackageParser$Package parsePackage(java.io.File, int);
    public static android.content.pm.PackageParser$PackageLite parsePackageLite(java.io.File, int);
    public static java.security.PublicKey parsePublicKey(java.lang.String);
    public void setCacheDir(java.io.File);
    public void setCallback(android.content.pm.PackageParser$Callback);
    public static void setCompatibilityModeEnabled(boolean);
    public void setDisplayMetrics(android.util.DisplayMetrics);
    public void setOnlyCoreApps(boolean);
    public void setSeparateProcesses(java.lang.String[]);
    protected byte[] toCacheEntry(android.content.pm.PackageParser$Package);
    public static byte[] toCacheEntryStatic(android.content.pm.PackageParser$Package);
    public static android.util.ArraySet toSigningKeys(android.content.pm.Signature[]);


    public static java.lang.String ANDROID_MANIFEST_FILENAME;
    public static java.lang.String APK_FILE_EXTENSION;
    public static android.content.pm.PackageParser$NewPermissionInfo[] NEW_PERMISSIONS;
    public static int PARSE_CHATTY;
    public static int PARSE_COLLECT_CERTIFICATES;
    public static int PARSE_ENFORCE_CODE;
    public static int PARSE_EXTERNAL_STORAGE;
    public static int PARSE_FORCE_SDK;
    public static int PARSE_FORWARD_LOCK;
    public static int PARSE_IGNORE_PROCESSES;
    public static int PARSE_IS_SYSTEM_DIR;
    public static int PARSE_MUST_BE_APK;
    public static android.content.pm.PackageParser$SplitPermissionInfo[] SPLIT_PERMISSIONS;
    public static java.util.concurrent.atomic.AtomicInteger sCachedPackageReadCount;
}

-keep class android.content.pm.PackageParser$Activity {
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ActivityInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ActivityInfo info;
}

-keep class android.content.pm.PackageParser$ActivityIntentInfo {
    <init>(android.content.pm.PackageParser$Activity);
    <init>(android.os.Parcel);

    public java.lang.String toString();


    public android.content.pm.PackageParser$Activity activity;
}

-keep class android.content.pm.PackageParser$ApkLite {
    <init>(java.lang.String, java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String, int, int, int, int, java.util.List, android.content.pm.PackageParser$SigningDetails, boolean, boolean, boolean, boolean, boolean, boolean);

    public long getLongVersionCode();


    public java.lang.String codePath;
    public java.lang.String configForSplit;
    public boolean coreApp;
    public boolean debuggable;
    public boolean extractNativeLibs;
    public int installLocation;
    public boolean isFeatureSplit;
    public boolean isolatedSplits;
    public boolean multiArch;
    public java.lang.String packageName;
    public int revisionCode;
    public android.content.pm.PackageParser$SigningDetails signingDetails;
    public java.lang.String splitName;
    public boolean use32bitAbi;
    public java.lang.String usesSplitName;
    public android.content.pm.VerifierInfo[] verifiers;
    public int versionCode;
    public int versionCodeMajor;
}

-keep class android.content.pm.PackageParser$Callback {

    public abstract java.lang.String[] getOverlayApks(java.lang.String);
    public abstract java.lang.String[] getOverlayPaths(java.lang.String, java.lang.String);
    public abstract boolean hasFeature(java.lang.String);


}

-keep class android.content.pm.PackageParser$Component {
    <init>(android.content.pm.PackageParser$Package);
    <init>(android.content.pm.PackageParser$ParsePackageItemArgs, android.content.pm.PackageItemInfo);
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ComponentInfo);
    <init>(android.content.pm.PackageParser$Component);
    <init>(android.os.Parcel);

    public void appendComponentShortName(java.lang.StringBuilder);
    public android.content.ComponentName getComponentName();
    public void printComponentShortName(java.io.PrintWriter);
    public void setPackageName(java.lang.String);
    protected void writeToParcel(android.os.Parcel, int);


    public java.lang.String className;
    public java.util.ArrayList intents;
    public android.os.Bundle metaData;
    public int order;
    public android.content.pm.PackageParser$Package owner;
}

-keep class android.content.pm.PackageParser$Instrumentation {
    <init>(android.content.pm.PackageParser$ParsePackageItemArgs, android.content.pm.InstrumentationInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.InstrumentationInfo info;
}

-keep class android.content.pm.PackageParser$IntentInfo {
    <init>();
    <init>(android.os.Parcel);

    public void writeIntentInfoToParcel(android.os.Parcel, int);


    public int banner;
    public boolean hasDefault;
    public int icon;
    public int labelRes;
    public int logo;
    public java.lang.CharSequence nonLocalizedLabel;
    public int preferred;
}

-keep class android.content.pm.PackageParser$NewPermissionInfo {
    <init>(java.lang.String, int, int);



    public int fileVersion;
    public java.lang.String name;
    public int sdkVersion;
}

-keep class android.content.pm.PackageParser$Package {
    <init>(java.lang.String);
    <init>(android.os.Parcel);

    public boolean canHaveOatDir();
    public int describeContents();
    public java.util.List getAllCodePaths();
    public java.util.List getAllCodePathsExcludingResourceOnly();
    public java.util.List getChildPackageNames();
    public long getLatestForegroundPackageUseTimeInMills();
    public long getLatestPackageUseTimeInMills();
    public long getLongVersionCode();
    public boolean hasChildPackage(java.lang.String);
    public boolean hasComponentClassName(java.lang.String);
    public boolean isExternal();
    public boolean isForwardLocked();
    public boolean isLibrary();
    public boolean isMatch(int);
    public boolean isOem();
    public boolean isPrivileged();
    public boolean isProduct();
    public boolean isSystem();
    public boolean isUpdatedSystemApp();
    public boolean isVendor();
    public void setApplicationInfoBaseCodePath(java.lang.String);
    public void setApplicationInfoBaseResourcePath(java.lang.String);
    public void setApplicationInfoCodePath(java.lang.String);
    public void setApplicationInfoFlags(int, int);
    public void setApplicationInfoResourcePath(java.lang.String);
    public void setApplicationInfoSplitCodePaths(java.lang.String[]);
    public void setApplicationInfoSplitResourcePaths(java.lang.String[]);
    public void setApplicationVolumeUuid(java.lang.String);
    public void setBaseCodePath(java.lang.String);
    public void setCodePath(java.lang.String);
    public void setPackageName(java.lang.String);
    public void setSigningDetails(android.content.pm.PackageParser$SigningDetails);
    public void setSplitCodePaths(java.lang.String[]);
    public void setUse32bitAbi(boolean);
    public void setVolumeUuid(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.util.ArrayList activities;
    public android.content.pm.ApplicationInfo applicationInfo;
    public java.lang.String baseCodePath;
    public boolean baseHardwareAccelerated;
    public int baseRevisionCode;
    public java.util.ArrayList childPackages;
    public java.lang.String codePath;
    public java.util.ArrayList configPreferences;
    public boolean coreApp;
    public java.lang.String cpuAbiOverride;
    public java.util.ArrayList featureGroups;
    public int installLocation;
    public java.util.ArrayList instrumentation;
    public boolean isStub;
    public java.util.ArrayList libraryNames;
    public java.util.ArrayList mAdoptPermissions;
    public android.os.Bundle mAppMetaData;
    public int mCompileSdkVersion;
    public java.lang.String mCompileSdkVersionCodename;
    public java.lang.Object mExtras;
    public android.util.ArrayMap mKeySetMapping;
    public long[] mLastPackageUsageTimeInMills;
    public java.util.ArrayList mOriginalPackages;
    public java.lang.String mOverlayCategory;
    public boolean mOverlayIsStatic;
    public int mOverlayPriority;
    public java.lang.String mOverlayTarget;
    public int mPreferredOrder;
    public java.lang.String mRealPackage;
    public java.lang.String mRequiredAccountType;
    public boolean mRequiredForAllUsers;
    public java.lang.String mRestrictedAccountType;
    public java.lang.String mSharedUserId;
    public int mSharedUserLabel;
    public android.content.pm.PackageParser$SigningDetails mSigningDetails;
    public android.util.ArraySet mUpgradeKeySets;
    public int mVersionCode;
    public int mVersionCodeMajor;
    public java.lang.String mVersionName;
    public java.lang.String manifestPackageName;
    public java.lang.String packageName;
    public android.content.pm.PackageParser$Package parentPackage;
    public java.util.ArrayList permissionGroups;
    public java.util.ArrayList permissions;
    public java.util.ArrayList preferredActivityFilters;
    public java.util.ArrayList protectedBroadcasts;
    public java.util.ArrayList providers;
    public java.util.ArrayList receivers;
    public java.util.ArrayList reqFeatures;
    public java.util.ArrayList requestedPermissions;
    public byte[] restrictUpdateHash;
    public java.util.ArrayList services;
    public java.lang.String[] splitCodePaths;
    public int[] splitFlags;
    public java.lang.String[] splitNames;
    public int[] splitPrivateFlags;
    public int[] splitRevisionCodes;
    public java.lang.String staticSharedLibName;
    public long staticSharedLibVersion;
    public boolean use32bitAbi;
    public java.util.ArrayList usesLibraries;
    public java.lang.String[] usesLibraryFiles;
    public java.util.ArrayList usesOptionalLibraries;
    public java.util.ArrayList usesStaticLibraries;
    public java.lang.String[][] usesStaticLibrariesCertDigests;
    public long[] usesStaticLibrariesVersions;
    public boolean visibleToInstantApps;
    public java.lang.String volumeUuid;
}

-keep class android.content.pm.PackageParser$PackageLite {
    <init>(java.lang.String, android.content.pm.PackageParser$ApkLite, java.lang.String[], boolean[], java.lang.String[], java.lang.String[], java.lang.String[], int[]);

    public java.util.List getAllCodePaths();


    public java.lang.String baseCodePath;
    public int baseRevisionCode;
    public java.lang.String codePath;
    public java.lang.String[] configForSplit;
    public boolean coreApp;
    public boolean debuggable;
    public boolean extractNativeLibs;
    public int installLocation;
    public boolean[] isFeatureSplits;
    public boolean isolatedSplits;
    public boolean multiArch;
    public java.lang.String packageName;
    public java.lang.String[] splitCodePaths;
    public java.lang.String[] splitNames;
    public int[] splitRevisionCodes;
    public boolean use32bitAbi;
    public java.lang.String[] usesSplitNames;
    public android.content.pm.VerifierInfo[] verifiers;
    public int versionCode;
    public int versionCodeMajor;
}

-keep class android.content.pm.PackageParser$PackageParserException {
    <init>(int, java.lang.String);
    <init>(int, java.lang.String, java.lang.Throwable);



    public int error;
}

-keep class android.content.pm.PackageParser$ParseComponentArgs {
    <init>(android.content.pm.PackageParser$Package, java.lang.String[], int, int, int, int, int, int, java.lang.String[], int, int, int);



}

-keep class android.content.pm.PackageParser$ParsePackageItemArgs {



}

-keep class android.content.pm.PackageParser$Permission {
    <init>(android.content.pm.PackageParser$Package);
    <init>(android.content.pm.PackageParser$Package, android.content.pm.PermissionInfo);

    public int describeContents();
    public boolean isAppOp();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.PackageParser$PermissionGroup group;
    public android.content.pm.PermissionInfo info;
    public boolean tree;
}

-keep class android.content.pm.PackageParser$PermissionGroup {
    <init>(android.content.pm.PackageParser$Package);
    <init>(android.content.pm.PackageParser$Package, android.content.pm.PermissionGroupInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.PermissionGroupInfo info;
}

-keep class android.content.pm.PackageParser$Provider {
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ProviderInfo);
    <init>(android.content.pm.PackageParser$Provider);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ProviderInfo info;
    public boolean syncable;
}

-keep class android.content.pm.PackageParser$Service {
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ServiceInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ServiceInfo info;
}

-keep class android.content.pm.PackageParser$SigningDetails {
    <init>(android.content.pm.Signature[], int, android.util.ArraySet, android.content.pm.Signature[], int[]);
    <init>(android.content.pm.Signature[], int, android.content.pm.Signature[], int[]);
    <init>(android.content.pm.Signature[], int);
    <init>(android.content.pm.PackageParser$SigningDetails);
    <init>(android.os.Parcel);

    public boolean checkCapability(android.content.pm.PackageParser$SigningDetails, int);
    public boolean checkCapability(java.lang.String, int);
    public boolean checkCapabilityRecover(android.content.pm.PackageParser$SigningDetails, int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public boolean hasAncestor(android.content.pm.PackageParser$SigningDetails);
    public boolean hasAncestorOrSelf(android.content.pm.PackageParser$SigningDetails);
    public boolean hasCertificate(android.content.pm.Signature);
    public boolean hasCertificate(android.content.pm.Signature, int);
    public boolean hasCertificate(byte[]);
    public boolean hasPastSigningCertificates();
    public boolean hasSha256Certificate(byte[]);
    public boolean hasSha256Certificate(byte[], int);
    public boolean hasSignatures();
    public int hashCode();
    public boolean signaturesMatchExactly(android.content.pm.PackageParser$SigningDetails);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.content.pm.PackageParser$SigningDetails UNKNOWN;
    public android.content.pm.Signature[] pastSigningCertificates;
    public int[] pastSigningCertificatesFlags;
    public android.util.ArraySet publicKeys;
    public int signatureSchemeVersion;
    public android.content.pm.Signature[] signatures;
}

-keep class android.content.pm.PackageParser$SplitPermissionInfo {
    <init>(java.lang.String, java.lang.String[], int);



    public java.lang.String[] newPerms;
    public java.lang.String rootPerm;
    public int targetSdk;
}

-keep class android.content.pm.PackageStats {
    <init>(java.lang.String);
    <init>(java.lang.String, int);
    <init>(android.os.Parcel);
    <init>(android.content.pm.PackageStats);

    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 long cacheSize;
    public long codeSize;
    public long dataSize;
    public long externalCacheSize;
    public long externalCodeSize;
    public long externalDataSize;
    public long externalMediaSize;
    public long externalObbSize;
    public java.lang.String packageName;
    public int userHandle;
}

-keep class android.content.pm.PackageUserState {
    <init>();
    <init>(android.content.pm.PackageUserState);

    public boolean equals(java.lang.Object);
    public boolean isAvailable(int);
    public boolean isEnabled(android.content.pm.ComponentInfo, int);
    public boolean isMatch(android.content.pm.ComponentInfo, int);


    public int appLinkGeneration;
    public int categoryHint;
    public long ceDataInode;
    public java.lang.String dialogMessage;
    public android.util.ArraySet disabledComponents;
    public int domainVerificationStatus;
    public int enabled;
    public android.util.ArraySet enabledComponents;
    public java.lang.String harmfulAppWarning;
    public boolean hidden;
    public int installReason;
    public boolean installed;
    public boolean instantApp;
    public java.lang.String lastDisableAppCaller;
    public boolean notLaunched;
    public java.lang.String[] overlayPaths;
    public boolean stopped;
    public boolean suspended;
    public android.os.PersistableBundle suspendedAppExtras;
    public android.os.PersistableBundle suspendedLauncherExtras;
    public java.lang.String suspendingPackage;
    public boolean virtualPreload;
}

-keep class android.content.pm.ParceledListSlice {
    <init>(java.util.List);

    public int describeContents();
    public static android.content.pm.ParceledListSlice emptyList();
    public java.util.List getList();
    protected android.os.Parcelable$Creator readParcelableCreator(android.os.Parcel, java.lang.ClassLoader);
    public void setInlineCountLimit(int);
    protected void writeElement(android.os.Parcelable, android.os.Parcel, int);
    protected void writeElement(java.lang.Object, android.os.Parcel, int);
    protected void writeParcelableCreator(android.os.Parcelable, android.os.Parcel);
    protected void writeParcelableCreator(java.lang.Object, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$ClassLoaderCreator CREATOR;
}

-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;
    public int requestRes;
}

-keep class android.content.pm.PermissionInfo {
    <init>();
    <init>(android.content.pm.PermissionInfo);

    public int calculateFootprint();
    public int describeContents();
    public static int fixProtectionLevel(int);
    public int getProtection();
    public int getProtectionFlags();
    public boolean isAppOp();
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public static java.lang.String protectionToString(int);
    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 FLAG_REMOVED;
    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_INSTANT;
    public static int PROTECTION_FLAG_OEM;
    public static int PROTECTION_FLAG_PRE23;
    public static int PROTECTION_FLAG_PREINSTALLED;
    public static int PROTECTION_FLAG_PRIVILEGED;
    public static int PROTECTION_FLAG_RUNTIME_ONLY;
    public static int PROTECTION_FLAG_SETUP;
    public static int PROTECTION_FLAG_SYSTEM;
    public static int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER;
    public static int PROTECTION_FLAG_VENDOR_PRIVILEGED;
    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;
    public int requestRes;
}

-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 void dump(android.util.Printer, java.lang.String, int);
    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 static int FLAG_VISIBLE_TO_INSTANT_APP;
    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 void dump(android.util.Printer, java.lang.String, int);
    public android.content.pm.ComponentInfo getComponentInfo();
    public int getIconResource();
    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public int resolveIconResId();
    public int resolveLabelResId();
    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.pm.AuxiliaryResolveInfo auxiliaryInfo;
    public android.content.IntentFilter filter;
    public boolean handleAllWebDataURI;
    public int icon;
    public int iconResourceId;
    public boolean instantAppAvailable;
    public boolean isDefault;
    public boolean isInstantAppAvailable;
    public int labelRes;
    public int match;
    public boolean noResourceId;
    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;
    public boolean system;
    public int targetUserId;
}

-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_EXTERNAL_SERVICE;
    public static int FLAG_ISOLATED_PROCESS;
    public static int FLAG_SINGLE_USER;
    public static int FLAG_STOP_WITH_TASK;
    public static int FLAG_VISIBLE_TO_INSTANT_APP;
    public int flags;
    public java.lang.String permission;
}

-keep class android.content.pm.SharedLibraryInfo {
    <init>(java.lang.String, long, int, android.content.pm.VersionedPackage, java.util.List);

    public int describeContents();
    public android.content.pm.VersionedPackage getDeclaringPackage();
    public java.util.List getDependentPackages();
    public long getLongVersion();
    public java.lang.String getName();
    public int getType();
    public int getVersion();
    public boolean isBuiltin();
    public boolean isDynamic();
    public boolean isStatic();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int TYPE_BUILTIN;
    public static int TYPE_DYNAMIC;
    public static int TYPE_STATIC;
    public static int VERSION_UNDEFINED;
}

-keep class android.content.pm.Signature {
    <init>(byte[]);
    <init>(java.security.cert.Certificate[]);
    <init>(java.lang.String);

    public static boolean areEffectiveMatch(android.content.pm.Signature[], android.content.pm.Signature[]);
    public static boolean areEffectiveMatch(android.content.pm.Signature, android.content.pm.Signature);
    public static boolean areExactMatch(android.content.pm.Signature[], android.content.pm.Signature[]);
    public static android.content.pm.Signature bounce(java.security.cert.CertificateFactory, android.content.pm.Signature);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.content.pm.Signature[] getChainSignatures();
    public java.security.PublicKey getPublicKey();
    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.pm.SigningInfo {
    <init>();
    <init>(android.content.pm.PackageParser$SigningDetails);
    <init>(android.content.pm.SigningInfo);

    public int describeContents();
    public android.content.pm.Signature[] getApkContentsSigners();
    public android.content.pm.Signature[] getSigningCertificateHistory();
    public boolean hasMultipleSigners();
    public boolean hasPastSigningCertificates();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.UserInfo {
    <init>(int, java.lang.String, int);
    <init>(int, java.lang.String, java.lang.String, int);
    <init>();
    <init>(android.content.pm.UserInfo);

    public boolean canHaveProfile();
    public int describeContents();
    public android.os.UserHandle getUserHandle();
    public boolean isAdmin();
    public boolean isDemo();
    public boolean isEnabled();
    public boolean isEphemeral();
    public boolean isGuest();
    public boolean isInitialized();
    public boolean isManagedProfile();
    public boolean isPrimary();
    public boolean isQuietModeEnabled();
    public boolean isRestricted();
    public boolean isSystemOnly();
    public static boolean isSystemOnly(int);
    public boolean supportsSwitchTo();
    public boolean supportsSwitchToByUser();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_ADMIN;
    public static int FLAG_DEMO;
    public static int FLAG_DISABLED;
    public static int FLAG_EPHEMERAL;
    public static int FLAG_GUEST;
    public static int FLAG_INITIALIZED;
    public static int FLAG_MANAGED_PROFILE;
    public static int FLAG_MASK_USER_TYPE;
    public static int FLAG_PRIMARY;
    public static int FLAG_QUIET_MODE;
    public static int FLAG_RESTRICTED;
    public static int NO_PROFILE_GROUP_ID;
    public long creationTime;
    public int flags;
    public boolean guestToRemove;
    public java.lang.String iconPath;
    public int id;
    public java.lang.String lastLoggedInFingerprint;
    public long lastLoggedInTime;
    public java.lang.String name;
    public boolean partial;
    public int profileBadge;
    public int profileGroupId;
    public int restrictedProfileParentId;
    public int serialNumber;
}

-keep class android.content.pm.VerifierDeviceIdentity {
    <init>(long);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.content.pm.VerifierDeviceIdentity generate();
    public int hashCode();
    public static android.content.pm.VerifierDeviceIdentity parse(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.VerifierInfo {
    <init>(java.lang.String, java.security.PublicKey);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String packageName;
    public java.security.PublicKey publicKey;
}

-keep class android.content.pm.VersionedPackage {
    <init>(java.lang.String, int);
    <init>(java.lang.String, long);

    public int describeContents();
    public long getLongVersionCode();
    public java.lang.String getPackageName();
    public int getVersionCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.dex.ArtManager {
    <init>(android.content.Context, android.content.pm.dex.IArtManager);

    public static java.lang.String getCurrentProfilePath(java.lang.String, int, java.lang.String);
    public static java.lang.String getProfileName(java.lang.String);
    public static java.io.File getProfileSnapshotFileForName(java.lang.String, java.lang.String);
    public boolean isRuntimeProfilingEnabled(int);
    public void snapshotRuntimeProfile(int, java.lang.String, java.lang.String, java.util.concurrent.Executor, android.content.pm.dex.ArtManager$SnapshotRuntimeProfileCallback);


    public static int PROFILE_APPS;
    public static int PROFILE_BOOT_IMAGE;
    public static int SNAPSHOT_FAILED_CODE_PATH_NOT_FOUND;
    public static int SNAPSHOT_FAILED_INTERNAL_ERROR;
    public static int SNAPSHOT_FAILED_PACKAGE_NOT_FOUND;
}

-keep class android.content.pm.dex.ArtManager$SnapshotRuntimeProfileCallback {
    <init>();

    public abstract void onError(int);
    public abstract void onSuccess(android.os.ParcelFileDescriptor);


}

-keep class android.content.pm.dex.IArtManager {

    public abstract boolean isRuntimeProfilingEnabled(int, java.lang.String);
    public abstract void snapshotRuntimeProfile(int, java.lang.String, java.lang.String, android.content.pm.dex.ISnapshotRuntimeProfileCallback, java.lang.String);


}

-keep class android.content.pm.dex.ISnapshotRuntimeProfileCallback {

    public abstract void onError(int);
    public abstract void onSuccess(android.os.ParcelFileDescriptor);


}

-keep class android.content.res.ApkAssets {

    protected void finalize();
    public java.lang.String getAssetPath();
    public boolean isUpToDate();
    public static android.content.res.ApkAssets loadFromFd(java.io.FileDescriptor, java.lang.String, boolean, boolean);
    public static android.content.res.ApkAssets loadFromPath(java.lang.String);
    public static android.content.res.ApkAssets loadFromPath(java.lang.String, boolean);
    public static android.content.res.ApkAssets loadFromPath(java.lang.String, boolean, boolean);
    public static android.content.res.ApkAssets loadOverlayFromPath(java.lang.String, boolean);
    public android.content.res.XmlResourceParser openXml(java.lang.String);
    public java.lang.String toString();


}

-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 {
    <init>();

    public int addAssetPath(java.lang.String);
    public int addAssetPathAsSharedLibrary(java.lang.String);
    public int addOverlayPath(java.lang.String);
    public void close();
    protected void finalize();
    public int findCookieForPath(java.lang.String);
    public android.content.res.ApkAssets[] getApkAssets();
    public static java.lang.String getAssetAllocations();
    public android.util.SparseArray getAssignedPackageIdentifiers();
    public static int getGlobalAssetCount();
    public static int getGlobalAssetManagerCount();
    public java.lang.String[] getLocales();
    public java.lang.String[] getNonSystemLocales();
    public static android.content.res.AssetManager getSystem();
    public boolean isUpToDate();
    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 java.io.InputStream openNonAsset(java.lang.String);
    public java.io.InputStream openNonAsset(java.lang.String, int);
    public java.io.InputStream openNonAsset(int, java.lang.String);
    public java.io.InputStream openNonAsset(int, java.lang.String, int);
    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 void setApkAssets(android.content.res.ApkAssets[], boolean);
    public void setConfiguration(int, int, java.lang.String, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);


    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 boolean canApplyTheme();
    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[] getColors();
    public android.content.res.ConstantState getConstantState();
    public int getDefaultColor();
    public int[][] getStates();
    public boolean hasFocusStateSpecified();
    public boolean hasState(int);
    public boolean isOpaque();
    public boolean isStateful();
    public android.content.res.ColorStateList obtainForTheme(android.content.res.Resources$Theme);
    public android.content.res.ComplexColor obtainForTheme(android.content.res.Resources$Theme);
    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.CompatibilityInfo {
    <init>(android.content.pm.ApplicationInfo, int, int, boolean);

    public boolean alwaysSupportsScreen();
    public void applyToConfiguration(int, android.content.res.Configuration);
    public void applyToDisplayMetrics(android.util.DisplayMetrics);
    public static float computeCompatibleScaling(android.util.DisplayMetrics, android.util.DisplayMetrics);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.content.res.CompatibilityInfo$Translator getTranslator();
    public int hashCode();
    public boolean isScalingRequired();
    public boolean needsCompatResources();
    public boolean neverSupportsScreen();
    public boolean supportsScreen();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.content.res.CompatibilityInfo DEFAULT_COMPATIBILITY_INFO;
    public static int DEFAULT_NORMAL_SHORT_DIMENSION;
    public static float MAXIMUM_ASPECT_RATIO;
    public int applicationDensity;
    public float applicationInvertedScale;
    public float applicationScale;
}

-keep class android.content.res.CompatibilityInfo$Translator {

    public android.graphics.Rect getTranslatedContentInsets(android.graphics.Rect);
    public android.graphics.Region getTranslatedTouchableArea(android.graphics.Region);
    public android.graphics.Rect getTranslatedVisibleInsets(android.graphics.Rect);
    public void translateCanvas(android.graphics.Canvas);
    public void translateEventInScreenToAppWindow(android.view.MotionEvent);
    public void translateLayoutParamsInAppWindowToScreen(android.view.WindowManager$LayoutParams);
    public void translatePointInScreenToAppWindow(android.graphics.PointF);
    public void translateRectInAppWindowToScreen(android.graphics.Rect);
    public void translateRectInScreenToAppWinFrame(android.graphics.Rect);
    public void translateRectInScreenToAppWindow(android.graphics.Rect);
    public void translateRegionInWindowToScreen(android.graphics.Region);
    public void translateWindowLayout(android.view.WindowManager$LayoutParams);


    public float applicationInvertedScale;
    public float applicationScale;
}

-keep class android.content.res.ComplexColor {
    <init>();

    public abstract boolean canApplyTheme();
    public int getChangingConfigurations();
    public abstract android.content.res.ConstantState getConstantState();
    public abstract int getDefaultColor();
    public boolean isStateful();
    public abstract android.content.res.ComplexColor obtainForTheme(android.content.res.Resources$Theme);


}

-keep class android.content.res.Configuration {
    <init>();
    <init>(android.content.res.Configuration);

    public void clearLocales();
    public int compareTo(android.content.res.Configuration);
    public int compareTo(java.lang.Object);
    public static java.lang.String configurationDiffToString(int);
    public int describeContents();
    public int diff(android.content.res.Configuration);
    public int diff(android.content.res.Configuration, boolean, boolean);
    public int diffPublicOnly(android.content.res.Configuration);
    public boolean equals(android.content.res.Configuration);
    public boolean equals(java.lang.Object);
    public static android.content.res.Configuration generateDelta(android.content.res.Configuration, android.content.res.Configuration);
    public int getLayoutDirection();
    public android.os.LocaleList getLocales();
    public int hashCode();
    public boolean isLayoutSizeAtLeast(int);
    public boolean isOtherSeqNewer(android.content.res.Configuration);
    public boolean isScreenHdr();
    public boolean isScreenRound();
    public boolean isScreenWideColorGamut();
    public static java.lang.String localesToResourceQualifier(android.os.LocaleList);
    public void makeDefault();
    public static boolean needNewResources(int, int);
    public void readFromParcel(android.os.Parcel);
    public static void readXmlAttrs(org.xmlpull.v1.XmlPullParser, android.content.res.Configuration);
    public static int reduceScreenLayout(int, int, int);
    public static int resetScreenLayout(int);
    public static java.lang.String resourceQualifierString(android.content.res.Configuration);
    public static java.lang.String resourceQualifierString(android.content.res.Configuration, android.util.DisplayMetrics);
    public void setLayoutDirection(java.util.Locale);
    public void setLocale(java.util.Locale);
    public void setLocales(android.os.LocaleList);
    public void setTo(android.content.res.Configuration);
    public void setToDefaults();
    public java.lang.String toString();
    public static java.lang.String uiModeToString(int);
    public void unset();
    public int updateFrom(android.content.res.Configuration);
    public void writeResConfigToProto(android.util.proto.ProtoOutputStream, long, android.util.DisplayMetrics);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    public static void writeXmlAttrs(org.xmlpull.v1.XmlSerializer, android.content.res.Configuration);


    public static int ASSETS_SEQ_UNDEFINED;
    public static int COLOR_MODE_HDR_MASK;
    public static int COLOR_MODE_HDR_NO;
    public static int COLOR_MODE_HDR_SHIFT;
    public static int COLOR_MODE_HDR_UNDEFINED;
    public static int COLOR_MODE_HDR_YES;
    public static int COLOR_MODE_UNDEFINED;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_MASK;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_NO;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_UNDEFINED;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_YES;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DENSITY_DPI_ANY;
    public static int DENSITY_DPI_NONE;
    public static int DENSITY_DPI_UNDEFINED;
    public static android.content.res.Configuration EMPTY;
    public static int HARDKEYBOARDHIDDEN_NO;
    public static int HARDKEYBOARDHIDDEN_UNDEFINED;
    public static int HARDKEYBOARDHIDDEN_YES;
    public static int KEYBOARDHIDDEN_NO;
    public static int KEYBOARDHIDDEN_SOFT;
    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 NATIVE_CONFIG_COLOR_MODE;
    public static int NATIVE_CONFIG_DENSITY;
    public static int NATIVE_CONFIG_KEYBOARD;
    public static int NATIVE_CONFIG_KEYBOARD_HIDDEN;
    public static int NATIVE_CONFIG_LAYOUTDIR;
    public static int NATIVE_CONFIG_LOCALE;
    public static int NATIVE_CONFIG_MCC;
    public static int NATIVE_CONFIG_MNC;
    public static int NATIVE_CONFIG_NAVIGATION;
    public static int NATIVE_CONFIG_ORIENTATION;
    public static int NATIVE_CONFIG_SCREEN_LAYOUT;
    public static int NATIVE_CONFIG_SCREEN_SIZE;
    public static int NATIVE_CONFIG_SMALLEST_SCREEN_SIZE;
    public static int NATIVE_CONFIG_TOUCHSCREEN;
    public static int NATIVE_CONFIG_UI_MODE;
    public static int NATIVE_CONFIG_VERSION;
    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_COMPAT_NEEDED;
    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_SHIFT;
    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_VR_HEADSET;
    public static int UI_MODE_TYPE_WATCH;
    public int assetsSeq;
    public int colorMode;
    public int compatScreenHeightDp;
    public int compatScreenWidthDp;
    public int compatSmallestScreenWidthDp;
    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 seq;
    public int smallestScreenWidthDp;
    public int touchscreen;
    public int uiMode;
    public boolean userSetLocale;
    public android.app.WindowConfiguration windowConfiguration;
}

-keep class android.content.res.ConfigurationBoundResourceCache {
    <init>();

    public java.lang.Object getInstance(long, android.content.res.Resources, android.content.res.Resources$Theme);
    public void onConfigurationChange(int);
    public boolean shouldInvalidateEntry(android.content.res.ConstantState, int);
    public boolean shouldInvalidateEntry(java.lang.Object, int);


}

-keep class android.content.res.ConstantState {
    <init>();

    public abstract int getChangingConfigurations();
    public abstract java.lang.Object newInstance();
    public java.lang.Object newInstance(android.content.res.Resources);
    public java.lang.Object newInstance(android.content.res.Resources, android.content.res.Resources$Theme);


}

-keep class android.content.res.FontResourcesParser {
    <init>();

    public static android.content.res.FontResourcesParser$FamilyResourceEntry parse(org.xmlpull.v1.XmlPullParser, android.content.res.Resources);


}

-keep class android.content.res.FontResourcesParser$FamilyResourceEntry {



}

-keep class android.content.res.Resources {
    <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
    <init>(java.lang.ClassLoader);

    public int calcConfigChanges(android.content.res.Configuration);
    public void finishPreloading();
    public void flushLayoutCache();
    public android.content.res.XmlResourceParser getAnimation(int);
    public android.content.res.ConfigurationBoundResourceCache getAnimatorCache();
    public android.content.res.AssetManager getAssets();
    public boolean getBoolean(int);
    public java.lang.ClassLoader getClassLoader();
    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.CompatibilityInfo getCompatibilityInfo();
    public android.content.res.Configuration getConfiguration();
    public float getDimension(int);
    public int getDimensionPixelOffset(int);
    public int getDimensionPixelSize(int);
    public android.view.DisplayAdjustments getDisplayAdjustments();
    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 android.graphics.drawable.DrawableInflater getDrawableInflater();
    public float getFloat(int);
    public android.graphics.Typeface getFont(int);
    public float getFraction(int, int, int);
    public int getIdentifier(java.lang.String, java.lang.String, java.lang.String);
    public android.content.res.ResourcesImpl getImpl();
    public int[] getIntArray(int);
    public int getInteger(int);
    public android.content.res.XmlResourceParser getLayout(int);
    public android.graphics.Movie getMovie(int);
    public android.util.LongSparseArray getPreloadedDrawables();
    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 android.content.res.Configuration[] getSizeConfigurations();
    public android.content.res.ConfigurationBoundResourceCache getStateListAnimatorCache();
    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.ComplexColor loadComplexColor(android.util.TypedValue, int, android.content.res.Resources$Theme);
    public android.content.res.Resources$Theme newTheme();
    public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
    public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources$Theme, 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 preloadFonts(int);
    public static boolean resourceHasPackage(int);
    public static int selectDefaultTheme(int, int);
    public static int selectSystemTheme(int, int, int, int, int, int);
    public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
    public void setImpl(android.content.res.ResourcesImpl);
    public void startPreloading();
    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);
    public static void updateSystemConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);


}

-keep class android.content.res.Resources$NotFoundException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Exception);



}

-keep class android.content.res.Resources$Theme {

    public void applyStyle(int, boolean);
    public void dump(int, java.lang.String, java.lang.String);
    public void encode(android.view.ViewHierarchyEncoder);
    public int[] getAllAttributes();
    public int getChangingConfigurations();
    public android.graphics.drawable.Drawable getDrawable(int);
    public android.content.res.Resources$ThemeKey getKey();
    public android.content.res.Resources getResources();
    public java.lang.String[] getTheme();
    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 void rebase();
    public boolean resolveAttribute(int, android.util.TypedValue, boolean);
    public android.content.res.TypedArray resolveAttributes(int[], int[]);
    public void setTo(android.content.res.Resources$Theme);


}

-keep class android.content.res.Resources$ThemeKey {

    public void append(int, boolean);
    public android.content.res.Resources$ThemeKey clone();
    public java.lang.Object clone();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void setTo(android.content.res.Resources$ThemeKey);


}

-keep class android.content.res.ResourcesImpl {
    <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration, android.view.DisplayAdjustments);

    public int calcConfigChanges(android.content.res.Configuration);
    public void flushLayoutCache();
    public android.content.res.AssetManager getAssets();
    public android.view.DisplayAdjustments getDisplayAdjustments();
    public android.graphics.Typeface loadFont(android.content.res.Resources, android.util.TypedValue, int);
    public void startPreloading();
    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);


    public static boolean TRACE_FOR_DETAILED_PRELOAD;
}

-keep class android.content.res.ThemedResourceCache {

    public java.lang.Object get(long, android.content.res.Resources$Theme);
    public void onConfigurationChange(int);
    public void put(long, android.content.res.Resources$Theme, java.lang.Object);
    public void put(long, android.content.res.Resources$Theme, java.lang.Object, boolean);
    protected abstract boolean shouldInvalidateEntry(java.lang.Object, int);


}

-keep class android.content.res.TypedArray {
    <init>(android.content.res.Resources);

    public int[] extractThemeAttrs();
    public int[] extractThemeAttrs(int[]);
    public boolean getBoolean(int, boolean);
    public int getChangingConfigurations();
    public int getColor(int, int);
    public android.content.res.ColorStateList getColorStateList(int);
    public android.content.res.ComplexColor getComplexColor(int);
    public float getDimension(int, float);
    public int getDimensionPixelOffset(int, int);
    public int getDimensionPixelSize(int, int);
    public android.graphics.drawable.Drawable getDrawable(int);
    public android.graphics.drawable.Drawable getDrawableForDensity(int, int);
    public float getFloat(int, float);
    public android.graphics.Typeface getFont(int);
    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 getNonConfigurationString(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 getThemeAttributeId(int, 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();
    public abstract java.lang.String getAttributeNamespace(int);


}

-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 android.database.IContentObserver getContentObserver();
    public void onChange(boolean);
    public void onChange(boolean, android.net.Uri);
    public void onChange(boolean, android.net.Uri, int);
    public android.database.IContentObserver releaseContentObserver();


}

-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.CursorWindow {
    <init>(java.lang.String);
    <init>(java.lang.String, long);
    <init>(boolean);

    public boolean allocRow();
    public void clear();
    public void copyStringToBuffer(int, int, android.database.CharArrayBuffer);
    public int describeContents();
    protected void finalize();
    public void freeLastRow();
    public byte[] getBlob(int, int);
    public double getDouble(int, int);
    public float getFloat(int, int);
    public int getInt(int, int);
    public long getLong(int, int);
    public java.lang.String getName();
    public int getNumRows();
    public short getShort(int, int);
    public int getStartPosition();
    public java.lang.String getString(int, int);
    public int getType(int, int);
    public boolean isBlob(int, int);
    public boolean isFloat(int, int);
    public boolean isLong(int, int);
    public boolean isNull(int, int);
    public boolean isString(int, int);
    public static android.database.CursorWindow newFromParcel(android.os.Parcel);
    protected void onAllReferencesReleased();
    public boolean putBlob(byte[], int, int);
    public boolean putDouble(double, int, int);
    public boolean putLong(long, int, int);
    public boolean putNull(int, int);
    public boolean putString(java.lang.String, int, int);
    public boolean setNumColumns(int);
    public void setStartPosition(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public long mWindowPtr;
}

-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.IContentObserver {

    public abstract void onChange(boolean, android.net.Uri, int);


}

-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.SQLiteConnection {

    public void dump(android.util.Printer, boolean);
    public void execute(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor executeForBlobFileDescriptor(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public int executeForChangedRowCount(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public int executeForCursorWindow(java.lang.String, java.lang.Object[], android.database.CursorWindow, int, int, boolean, android.os.CancellationSignal);
    public long executeForLastInsertedRowId(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public long executeForLong(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public java.lang.String executeForString(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    protected void finalize();
    public int getConnectionId();
    public boolean isPrimaryConnection();
    public void onCancel();
    public void prepare(java.lang.String, android.database.sqlite.SQLiteStatementInfo);
    public java.lang.String toString();


}

-keep class android.database.sqlite.SQLiteConnectionPool {

    public android.database.sqlite.SQLiteConnection acquireConnection(java.lang.String, int, android.os.CancellationSignal);
    public void close();
    public void collectDbStats(java.util.ArrayList);
    public void dump(android.util.Printer, boolean);
    protected void finalize();
    public static android.database.sqlite.SQLiteConnectionPool open(android.database.sqlite.SQLiteDatabaseConfiguration);
    public void reconfigure(android.database.sqlite.SQLiteDatabaseConfiguration);
    public void releaseConnection(android.database.sqlite.SQLiteConnection);
    public void setupIdleConnectionHandler(android.os.Looper, long);
    public boolean shouldYieldConnection(android.database.sqlite.SQLiteConnection, int);
    public java.lang.String toString();


    public static int CONNECTION_FLAG_INTERACTIVE;
    public static int CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY;
    public static int CONNECTION_FLAG_READ_ONLY;
}

-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.SQLiteCustomFunction {
    <init>(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CustomFunction);



    public android.database.sqlite.SQLiteDatabase$CustomFunction callback;
    public java.lang.String name;
    public int numArgs;
}

-keep class android.database.sqlite.SQLiteDatabase {

    public void addCustomFunction(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CustomFunction);
    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 static android.database.sqlite.SQLiteDatabase createInMemory(android.database.sqlite.SQLiteDatabase$OpenParams);
    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 isInMemoryDatabase();
    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.io.File, android.database.sqlite.SQLiteDatabase$OpenParams);
    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 void reopenReadWrite();
    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 void validateSql(java.lang.String, android.os.CancellationSignal);
    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 DISABLE_COMPATIBILITY_WAL;
    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.SQLiteDatabase$CustomFunction {

    public abstract void callback(java.lang.String[]);


}

-keep class android.database.sqlite.SQLiteDatabase$OpenParams {

    public android.database.sqlite.SQLiteDatabase$CursorFactory getCursorFactory();
    public android.database.DatabaseErrorHandler getErrorHandler();
    public long getIdleConnectionTimeout();
    public java.lang.String getJournalMode();
    public int getLookasideSlotCount();
    public int getLookasideSlotSize();
    public int getOpenFlags();
    public java.lang.String getSynchronousMode();
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder toBuilder();


}

-keep class android.database.sqlite.SQLiteDatabase$OpenParams$Builder {
    <init>();
    <init>(android.database.sqlite.SQLiteDatabase$OpenParams);

    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder addOpenFlags(int);
    public android.database.sqlite.SQLiteDatabase$OpenParams build();
    public boolean isWriteAheadLoggingEnabled();
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder removeOpenFlags(int);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setCursorFactory(android.database.sqlite.SQLiteDatabase$CursorFactory);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setErrorHandler(android.database.DatabaseErrorHandler);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setIdleConnectionTimeout(long);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setJournalMode(java.lang.String);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setLookasideConfig(int, int);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setOpenFlags(int);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setSynchronousMode(java.lang.String);
    public void setWriteAheadLoggingEnabled(boolean);


}

-keep class android.database.sqlite.SQLiteDatabaseConfiguration {
    <init>(java.lang.String, int);
    <init>(android.database.sqlite.SQLiteDatabaseConfiguration);

    public boolean isInMemoryDb();
    public void updateParametersFrom(android.database.sqlite.SQLiteDatabaseConfiguration);


    public static java.lang.String MEMORY_DB_PATH;
    public java.util.ArrayList customFunctions;
    public boolean foreignKeyConstraintsEnabled;
    public long idleConnectionTimeoutMs;
    public java.lang.String journalMode;
    public java.lang.String label;
    public java.util.Locale locale;
    public int lookasideSlotCount;
    public int lookasideSlotSize;
    public int maxSqlCacheSize;
    public int openFlags;
    public java.lang.String path;
    public java.lang.String syncMode;
}

-keep class android.database.sqlite.SQLiteDebug {

    public static void dump(android.util.Printer, java.lang.String[]);
    public static android.database.sqlite.SQLiteDebug$PagerStats getDatabaseInfo();
    public static boolean shouldLogSlowQuery(long);


    public static boolean DEBUG_LOG_SLOW_QUERIES;
    public static boolean DEBUG_SQL_LOG;
    public static boolean DEBUG_SQL_STATEMENTS;
    public static boolean DEBUG_SQL_TIME;
}

-keep class android.database.sqlite.SQLiteDebug$DbStats {
    <init>(java.lang.String, long, long, int, int, int, int);



    public java.lang.String cache;
    public java.lang.String dbName;
    public long dbSize;
    public int lookaside;
    public long pageSize;
}

-keep class android.database.sqlite.SQLiteDebug$PagerStats {
    <init>();



    public java.util.ArrayList dbStats;
    public int largestMemAlloc;
    public int memoryUsed;
    public int pageCacheOverflow;
}

-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();
    protected int getConnectionFlags();
    protected android.database.sqlite.SQLiteSession getSession();
    public int getUniqueId();
    protected void onAllReferencesReleased();
    protected void onCorruption();


}

-keep class android.database.sqlite.SQLiteQuery {

    public java.lang.String toString();


}

-keep class android.database.sqlite.SQLiteSession {
    <init>(android.database.sqlite.SQLiteConnectionPool);

    public void beginTransaction(int, android.database.sqlite.SQLiteTransactionListener, int, android.os.CancellationSignal);
    public void endTransaction(android.os.CancellationSignal);
    public void execute(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor executeForBlobFileDescriptor(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public int executeForChangedRowCount(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public int executeForCursorWindow(java.lang.String, java.lang.Object[], android.database.CursorWindow, int, int, boolean, int, android.os.CancellationSignal);
    public long executeForLastInsertedRowId(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public long executeForLong(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public java.lang.String executeForString(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public boolean hasConnection();
    public boolean hasNestedTransaction();
    public boolean hasTransaction();
    public void prepare(java.lang.String, int, android.os.CancellationSignal, android.database.sqlite.SQLiteStatementInfo);
    public void setTransactionSuccessful();
    public boolean yieldTransaction(long, boolean, android.os.CancellationSignal);


    public static int TRANSACTION_MODE_DEFERRED;
    public static int TRANSACTION_MODE_EXCLUSIVE;
    public static int TRANSACTION_MODE_IMMEDIATE;
}

-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.SQLiteStatementInfo {
    <init>();



    public java.lang.String[] columnNames;
    public int numParameters;
    public boolean readOnly;
}

-keep class android.database.sqlite.SQLiteTransactionListener {

    public abstract void onBegin();
    public abstract void onCommit();
    public abstract void onRollback();


}

-keep class android.graphics.BaseCanvas {
    <init>();

    protected static void checkRange(int, int, int);
    public void drawARGB(int, int, int, int);
    public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
    public void drawArc(android.graphics.RectF, 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.Matrix, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, 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 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(float, float, float, float, android.graphics.Paint);
    public void drawOval(android.graphics.RectF, android.graphics.Paint);
    public void drawPaint(android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, android.graphics.Paint);
    public void drawPath(android.graphics.Path, android.graphics.Paint);
    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(float, float, float, float, android.graphics.Paint);
    public void drawRect(android.graphics.Rect, android.graphics.Paint);
    public void drawRect(android.graphics.RectF, android.graphics.Paint);
    public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
    public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
    public void drawText(char[], int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.CharSequence, 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 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 isHardwareAccelerated();
    public boolean isHwBitmapsInSwModeEnabled();
    protected void onHwBitmapInSwMode();
    public void setHwBitmapsInSwModeEnabled(boolean);
    protected void throwIfCannotDraw(android.graphics.Bitmap);


    protected int mDensity;
    protected long mNativeCanvasWrapper;
    protected int mScreenDensity;
}

-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 android.graphics.Bitmap createAshmemBitmap();
    public android.graphics.Bitmap createAshmemBitmap(android.graphics.Bitmap$Config);
    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, android.graphics.Bitmap$Config, boolean);
    public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config, boolean, android.graphics.ColorSpace);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config, boolean);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config, boolean, android.graphics.ColorSpace);
    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 createBitmap(android.graphics.Picture);
    public static android.graphics.Bitmap createBitmap(android.graphics.Picture, int, int, android.graphics.Bitmap$Config);
    public android.graphics.GraphicBuffer createGraphicBufferHandle();
    public static android.graphics.Bitmap createHardwareBitmap(android.graphics.GraphicBuffer);
    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.ColorSpace getColorSpace();
    public android.graphics.Bitmap$Config getConfig();
    public int getDensity();
    public int getGenerationId();
    public int getHeight();
    public long getNativeInstance();
    public byte[] getNinePatchChunk();
    public android.graphics.NinePatch$InsetStruct getNinePatchInsets();
    public void getOpticalInsets(android.graphics.Rect);
    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 static int scaleFromDensity(int, int, int);
    public void setConfig(android.graphics.Bitmap$Config);
    public static void setDefaultDensity(int);
    public void setDensity(int);
    public void setHasAlpha(boolean);
    public void setHasMipMap(boolean);
    public void setHeight(int);
    public void setImmutable();
    public void setNinePatchChunk(byte[]);
    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;
    public int mDensity;
    public static volatile int sPreloadTracingNumInstantiatedBitmaps;
    public static volatile long sPreloadTracingTotalBitmapsSize;
}

-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 HARDWARE;
    public static android.graphics.Bitmap$Config RGBA_F16;
    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.ColorSpace inPreferredColorSpace;
    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 android.graphics.ColorSpace outColorSpace;
    public android.graphics.Bitmap$Config outConfig;
    public int outHeight;
    public java.lang.String outMimeType;
    public int outWidth;
}

-keep class android.graphics.Canvas {
    <init>();
    <init>(android.graphics.Bitmap);
    <init>(long);

    public boolean clipOutPath(android.graphics.Path);
    public boolean clipOutRect(android.graphics.RectF);
    public boolean clipOutRect(android.graphics.Rect);
    public boolean clipOutRect(float, float, float, float);
    public boolean clipOutRect(int, int, int, int);
    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 clipRectUnion(android.graphics.Rect);
    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 drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, 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 static void freeCaches();
    public static void freeTextLayoutCaches();
    public boolean getClipBounds(android.graphics.Rect);
    public android.graphics.Rect getClipBounds();
    public int getDensity();
    public android.graphics.DrawFilter getDrawFilter();
    protected javax.microedition.khronos.opengles.GL getGL();
    public int getHeight();
    public void getMatrix(android.graphics.Matrix);
    public android.graphics.Matrix getMatrix();
    public int getMaximumBitmapHeight();
    public int getMaximumBitmapWidth();
    public long getNativeCanvasWrapper();
    public int getSaveCount();
    public int getWidth();
    public void insertInorderBarrier();
    public void insertReorderBarrier();
    public boolean isHardwareAccelerated();
    public boolean isOpaque();
    public boolean isRecordingFor(java.lang.Object);
    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 release();
    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 int saveUnclippedLayer(int, int, int, int);
    public void scale(float, float);
    public void scale(float, float, float, float);
    public void setBitmap(android.graphics.Bitmap);
    public static void setCompatibilityVersion(int);
    public void setDensity(int);
    public void setDrawFilter(android.graphics.DrawFilter);
    public void setMatrix(android.graphics.Matrix);
    public void setScreenDensity(int);
    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;
    public static boolean sCompatibilityRestore;
    public static boolean sCompatibilitySetBitmap;
}

-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;

    public int nativeInt;
}

-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;

    public int nativeInt;
}

-keep class android.graphics.CanvasProperty {

    public static android.graphics.CanvasProperty createFloat(float);
    public static android.graphics.CanvasProperty createPaint(android.graphics.Paint);
    public long getNativeContainer();


}

-keep class android.graphics.ColorFilter {
    <init>();

    public long getNativeInstance();


}

-keep class android.graphics.ColorSpace {

    public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[]);
    public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[], android.graphics.ColorSpace$Adaptation);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace, android.graphics.ColorSpace$RenderIntent);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace$RenderIntent);
    public static android.graphics.ColorSpace$Renderer createRenderer();
    public boolean equals(java.lang.Object);
    public float[] fromXyz(float, float, float);
    public abstract float[] fromXyz(float[]);
    public static android.graphics.ColorSpace get(android.graphics.ColorSpace$Named);
    public int getComponentCount();
    public int getId();
    public abstract float getMaxValue(int);
    public abstract float getMinValue(int);
    public android.graphics.ColorSpace$Model getModel();
    public java.lang.String getName();
    public int hashCode();
    public boolean isSrgb();
    public abstract boolean isWideGamut();
    public static android.graphics.ColorSpace match(float[], android.graphics.ColorSpace$Rgb$TransferParameters);
    public java.lang.String toString();
    public float[] toXyz(float, float, float);
    public abstract float[] toXyz(float[]);


    public static float[] ILLUMINANT_A;
    public static float[] ILLUMINANT_B;
    public static float[] ILLUMINANT_C;
    public static float[] ILLUMINANT_D50;
    public static float[] ILLUMINANT_D55;
    public static float[] ILLUMINANT_D60;
    public static float[] ILLUMINANT_D65;
    public static float[] ILLUMINANT_D75;
    public static float[] ILLUMINANT_E;
    public static int MAX_ID;
    public static int MIN_ID;
}

-keep class android.graphics.ColorSpace$Adaptation {

    public static android.graphics.ColorSpace$Adaptation valueOf(java.lang.String);
    public static android.graphics.ColorSpace$Adaptation[] values();

    public static android.graphics.ColorSpace$Adaptation BRADFORD;
    public static android.graphics.ColorSpace$Adaptation CIECAT02;
    public static android.graphics.ColorSpace$Adaptation VON_KRIES;

}

-keep class android.graphics.ColorSpace$Connector {

    public android.graphics.ColorSpace getDestination();
    public android.graphics.ColorSpace$RenderIntent getRenderIntent();
    public android.graphics.ColorSpace getSource();
    public float[] transform(float, float, float);
    public float[] transform(float[]);


}

-keep class android.graphics.ColorSpace$Model {

    public int getComponentCount();
    public static android.graphics.ColorSpace$Model valueOf(java.lang.String);
    public static android.graphics.ColorSpace$Model[] values();

    public static android.graphics.ColorSpace$Model CMYK;
    public static android.graphics.ColorSpace$Model LAB;
    public static android.graphics.ColorSpace$Model RGB;
    public static android.graphics.ColorSpace$Model XYZ;

}

-keep class android.graphics.ColorSpace$Named {

    public static android.graphics.ColorSpace$Named valueOf(java.lang.String);
    public static android.graphics.ColorSpace$Named[] values();

    public static android.graphics.ColorSpace$Named ACES;
    public static android.graphics.ColorSpace$Named ACESCG;
    public static android.graphics.ColorSpace$Named ADOBE_RGB;
    public static android.graphics.ColorSpace$Named BT2020;
    public static android.graphics.ColorSpace$Named BT709;
    public static android.graphics.ColorSpace$Named CIE_LAB;
    public static android.graphics.ColorSpace$Named CIE_XYZ;
    public static android.graphics.ColorSpace$Named DCI_P3;
    public static android.graphics.ColorSpace$Named DISPLAY_P3;
    public static android.graphics.ColorSpace$Named EXTENDED_SRGB;
    public static android.graphics.ColorSpace$Named LINEAR_EXTENDED_SRGB;
    public static android.graphics.ColorSpace$Named LINEAR_SRGB;
    public static android.graphics.ColorSpace$Named NTSC_1953;
    public static android.graphics.ColorSpace$Named PRO_PHOTO_RGB;
    public static android.graphics.ColorSpace$Named SMPTE_C;
    public static android.graphics.ColorSpace$Named SRGB;

}

-keep class android.graphics.ColorSpace$RenderIntent {

    public static android.graphics.ColorSpace$RenderIntent valueOf(java.lang.String);
    public static android.graphics.ColorSpace$RenderIntent[] values();

    public static android.graphics.ColorSpace$RenderIntent ABSOLUTE;
    public static android.graphics.ColorSpace$RenderIntent PERCEPTUAL;
    public static android.graphics.ColorSpace$RenderIntent RELATIVE;
    public static android.graphics.ColorSpace$RenderIntent SATURATION;

}

-keep class android.graphics.ColorSpace$Renderer {

    public android.graphics.ColorSpace$Renderer add(android.graphics.ColorSpace, int);
    public android.graphics.ColorSpace$Renderer add(android.graphics.ColorSpace, float, float, float, int);
    public android.graphics.ColorSpace$Renderer clip(boolean);
    public android.graphics.Bitmap render();
    public android.graphics.ColorSpace$Renderer showWhitePoint(boolean);
    public android.graphics.ColorSpace$Renderer size(int);
    public android.graphics.ColorSpace$Renderer uniformChromaticityScale(boolean);


}

-keep class android.graphics.ColorSpace$Rgb {
    <init>(java.lang.String, float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator);
    <init>(java.lang.String, float[], float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator, float, float);
    <init>(java.lang.String, float[], android.graphics.ColorSpace$Rgb$TransferParameters);
    <init>(java.lang.String, float[], float[], android.graphics.ColorSpace$Rgb$TransferParameters);
    <init>(java.lang.String, float[], double);
    <init>(java.lang.String, float[], float[], double);

    public boolean equals(java.lang.Object);
    public float[] fromLinear(float, float, float);
    public float[] fromLinear(float[]);
    public float[] fromXyz(float[]);
    public java.util.function.DoubleUnaryOperator getEotf();
    public float[] getInverseTransform(float[]);
    public float[] getInverseTransform();
    public float getMaxValue(int);
    public float getMinValue(int);
    public java.util.function.DoubleUnaryOperator getOetf();
    public float[] getPrimaries(float[]);
    public float[] getPrimaries();
    public android.graphics.ColorSpace$Rgb$TransferParameters getTransferParameters();
    public float[] getTransform(float[]);
    public float[] getTransform();
    public float[] getWhitePoint(float[]);
    public float[] getWhitePoint();
    public int hashCode();
    public boolean isSrgb();
    public boolean isWideGamut();
    public float[] toLinear(float, float, float);
    public float[] toLinear(float[]);
    public float[] toXyz(float[]);


}

-keep class android.graphics.ColorSpace$Rgb$TransferParameters {
    <init>(double, double, double, double, double);
    <init>(double, double, double, double, double, double, double);

    public boolean equals(java.lang.Object);
    public int hashCode();


    public double a;
    public double b;
    public double c;
    public double d;
    public double e;
    public double f;
    public double g;
}

-keep class android.graphics.DrawFilter {
    <init>();

    protected void finalize();


    public long mNativeInt;
}

-keep class android.graphics.FontFamily {
    <init>();
    <init>(java.lang.String[], int);

    public void abortCreation();
    public boolean addFont(java.lang.String, int, android.graphics.fonts.FontVariationAxis[], int, int);
    public boolean addFontFromAssetManager(android.content.res.AssetManager, java.lang.String, int, boolean, int, int, int, android.graphics.fonts.FontVariationAxis[]);
    public boolean addFontFromBuffer(java.nio.ByteBuffer, int, android.graphics.fonts.FontVariationAxis[], int, int);
    public boolean freeze();


    public long mNativePtr;
}

-keep class android.graphics.GraphicBuffer {

    public static android.graphics.GraphicBuffer create(int, int, int, int);
    public static android.graphics.GraphicBuffer createFromExisting(int, int, int, int, long);
    public int describeContents();
    public void destroy();
    protected void finalize();
    public int getFormat();
    public int getHeight();
    public int getUsage();
    public int getWidth();
    public boolean isDestroyed();
    public android.graphics.Canvas lockCanvas();
    public android.graphics.Canvas lockCanvas(android.graphics.Rect);
    public void unlockCanvasAndPost(android.graphics.Canvas);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int USAGE_HW_2D;
    public static int USAGE_HW_COMPOSER;
    public static int USAGE_HW_MASK;
    public static int USAGE_HW_RENDER;
    public static int USAGE_HW_TEXTURE;
    public static int USAGE_HW_VIDEO_ENCODER;
    public static int USAGE_PROTECTED;
    public static int USAGE_SOFTWARE_MASK;
    public static int USAGE_SW_READ_MASK;
    public static int USAGE_SW_READ_NEVER;
    public static int USAGE_SW_READ_OFTEN;
    public static int USAGE_SW_READ_RARELY;
    public static int USAGE_SW_WRITE_MASK;
    public static int USAGE_SW_WRITE_NEVER;
    public static int USAGE_SW_WRITE_OFTEN;
    public static int USAGE_SW_WRITE_RARELY;
}

-keep class android.graphics.Insets {

    public boolean equals(java.lang.Object);
    public int hashCode();
    public static android.graphics.Insets of(int, int, int, int);
    public static android.graphics.Insets of(android.graphics.Rect);
    public java.lang.String toString();


    public static android.graphics.Insets NONE;
    public int bottom;
    public int left;
    public int right;
    public int top;
}

-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);
    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 long ni();
    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 void printShortString(java.io.PrintWriter);
    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 void toShortString(java.lang.StringBuilder);
    public java.lang.String toString();


    public static android.graphics.Matrix IDENTITY_MATRIX;
    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;
    public long native_instance;
}

-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.NinePatch {
    <init>(android.graphics.Bitmap, byte[]);
    <init>(android.graphics.Bitmap, byte[], java.lang.String);
    <init>(android.graphics.NinePatch);

    public void draw(android.graphics.Canvas, android.graphics.RectF);
    public void draw(android.graphics.Canvas, android.graphics.Rect);
    public void draw(android.graphics.Canvas, android.graphics.Rect, android.graphics.Paint);
    protected void finalize();
    public android.graphics.Bitmap getBitmap();
    public int getDensity();
    public int getHeight();
    public java.lang.String getName();
    public android.graphics.Paint getPaint();
    public android.graphics.Region getTransparentRegion(android.graphics.Rect);
    public int getWidth();
    public boolean hasAlpha();
    public static boolean isNinePatchChunk(byte[]);
    public void setPaint(android.graphics.Paint);


    public long mNativeChunk;
}

-keep class android.graphics.NinePatch$InsetStruct {

    public static android.graphics.Rect scaleInsets(int, int, int, int, float);


    public android.graphics.Rect opticalRect;
    public float outlineAlpha;
    public float outlineRadius;
    public android.graphics.Rect outlineRect;
}

-keep class android.graphics.Outline {
    <init>();
    <init>(android.graphics.Outline);

    public boolean canClip();
    public float getAlpha();
    public float getRadius();
    public boolean getRect(android.graphics.Rect);
    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);


    public static int MODE_CONVEX_PATH;
    public static int MODE_EMPTY;
    public static int MODE_ROUND_RECT;
    public float mAlpha;
    public int mMode;
    public android.graphics.Path mPath;
    public float mRadius;
    public android.graphics.Rect mRect;
}

-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();
    public boolean equalsForTextMeasurement(android.graphics.Paint);
    public int getAlpha();
    public int getBidiFlags();
    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 java.lang.String getFontVariationSettings();
    public int getHinting();
    public int getHyphenEdit();
    public float getLetterSpacing();
    public android.graphics.MaskFilter getMaskFilter();
    public long getNativeInstance();
    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 float getStrikeThruPosition();
    public float getStrikeThruThickness();
    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(java.lang.CharSequence, int, int, android.graphics.Rect);
    public void getTextBounds(char[], int, int, android.graphics.Rect);
    public java.util.Locale getTextLocale();
    public android.os.LocaleList getTextLocales();
    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 getTextRunAdvances(char[], int, int, int, int, boolean, float[], int);
    public float getTextRunAdvances(java.lang.CharSequence, int, int, int, int, boolean, float[], int);
    public float getTextRunAdvances(java.lang.String, int, int, int, int, boolean, float[], int);
    public int getTextRunCursor(char[], int, int, int, int, int);
    public int getTextRunCursor(java.lang.CharSequence, int, int, int, int, int);
    public int getTextRunCursor(java.lang.String, int, int, int, int, int);
    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 float getUnderlinePosition();
    public float getUnderlineThickness();
    public float getWordSpacing();
    public android.graphics.Xfermode getXfermode();
    public boolean hasEqualAttributes(android.graphics.Paint);
    public boolean hasGlyph(java.lang.String);
    public boolean hasShadowLayer();
    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 setBidiFlags(int);
    public void setColor(int);
    public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
    public void setCompatibilityScaling(float);
    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 boolean setFontVariationSettings(java.lang.String);
    public void setHinting(int);
    public void setHyphenEdit(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 setTextLocales(android.os.LocaleList);
    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 void setWordSpacing(float);
    public android.graphics.Xfermode setXfermode(android.graphics.Xfermode);


    public static int ANTI_ALIAS_FLAG;
    public static int AUTO_HINTING_TEXT_FLAG;
    public static int BIDI_DEFAULT_LTR;
    public static int BIDI_DEFAULT_RTL;
    public static int BIDI_FORCE_LTR;
    public static int BIDI_FORCE_RTL;
    public static int BIDI_LTR;
    public static int BIDI_RTL;
    public static int CURSOR_AFTER;
    public static int CURSOR_AT;
    public static int CURSOR_AT_OR_AFTER;
    public static int CURSOR_AT_OR_BEFORE;
    public static int CURSOR_BEFORE;
    public static int DEV_KERN_TEXT_FLAG;
    public static int DIRECTION_LTR;
    public static int DIRECTION_RTL;
    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 HYPHENEDIT_MASK_END_OF_LINE;
    public static int HYPHENEDIT_MASK_START_OF_LINE;
    public static int LCD_RENDER_TEXT_FLAG;
    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;
    public static int VERTICAL_TEXT_FLAG;
    public int mBidiFlags;
}

-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 float[] approximate(float);
    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);
    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 long readOnlyNI();
    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);


    public boolean isSimplePath;
    public long mNativePath;
    public android.graphics.Region rects;
}

-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 boolean requiresHardwareAcceleration();
    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 printShortString(java.io.PrintWriter);
    public void readFromParcel(android.os.Parcel);
    public void set(int, int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public int x;
    public int y;
}

-keep class android.graphics.PointF {
    <init>();
    <init>(float, float);
    <init>(android.graphics.Point);

    public int describeContents();
    public boolean equals(float, float);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public float length();
    public static float length(float, float);
    public void negate();
    public void offset(float, float);
    public void readFromParcel(android.os.Parcel);
    public void set(float, float);
    public void set(android.graphics.PointF);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float x;
    public float y;
}

-keep class android.graphics.PorterDuff {
    <init>();

    public static android.graphics.PorterDuff$Mode intToMode(int);
    public static int modeToInt(android.graphics.PorterDuff$Mode);


}

-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;

    public int nativeInt;
}

-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 static android.graphics.Rect copyOrNull(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 void inset(android.graphics.Rect);
    public void inset(int, int, int, int);
    public boolean intersect(int, int, int, int);
    public boolean intersect(android.graphics.Rect);
    public void intersectUnchecked(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 printShortString(java.io.PrintWriter);
    public void readFromParcel(android.os.Parcel);
    public void scale(float);
    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 toShortString(java.lang.StringBuilder);
    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 void writeToProto(android.util.proto.ProtoOutputStream, long);


    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 printShortString(java.io.PrintWriter);
    public void readFromParcel(android.os.Parcel);
    public void round(android.graphics.Rect);
    public void roundOut(android.graphics.Rect);
    public void scale(float);
    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 toShortString(java.lang.StringBuilder);
    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 static android.graphics.Region obtain();
    public static android.graphics.Region obtain(android.graphics.Region);
    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 void recycle();
    public void scale(float);
    public void scale(float, 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;
    public long mNativeRegion;
}

-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;

    public int nativeInt;
}

-keep class android.graphics.Shader {
    <init>();

    protected android.graphics.Shader copy();
    protected void copyLocalMatrix(android.graphics.Shader);
    protected void discardNativeInstance();
    public boolean getLocalMatrix(android.graphics.Matrix);
    public long getNativeInstance();
    public void setLocalMatrix(android.graphics.Matrix);
    protected void verifyNativeInstance();


}

-keep class android.graphics.SurfaceTexture {
    <init>(int);
    <init>(int, boolean);
    <init>(boolean);

    public void attachToGLContext(int);
    public void detachFromGLContext();
    protected void finalize();
    public long getTimestamp();
    public void getTransformMatrix(float[]);
    public boolean isReleased();
    public boolean isSingleBuffered();
    public void release();
    public void releaseTexImage();
    public void setDefaultBufferSize(int, int);
    public void setOnFrameAvailableListener(android.graphics.SurfaceTexture$OnFrameAvailableListener);
    public void setOnFrameAvailableListener(android.graphics.SurfaceTexture$OnFrameAvailableListener, android.os.Handler);
    public void updateTexImage();


}

-keep class android.graphics.SurfaceTexture$OnFrameAvailableListener {

    public abstract void onFrameAvailable(android.graphics.SurfaceTexture);


}

-keep class android.graphics.Typeface {

    public static void buildSystemFallback(java.lang.String, java.lang.String, android.util.ArrayMap, android.util.ArrayMap);
    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 create(android.graphics.Typeface, int, boolean);
    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 createFromResources(android.content.res.AssetManager, java.lang.String, int);
    public static android.graphics.Typeface createFromResources(android.content.res.FontResourcesParser$FamilyResourceEntry, android.content.res.AssetManager, java.lang.String);
    public static android.graphics.Typeface createFromTypefaceWithVariation(android.graphics.Typeface, java.util.List);
    public static android.graphics.Typeface defaultFromStyle(int);
    public boolean equals(java.lang.Object);
    public static android.graphics.Typeface findFromCache(android.content.res.AssetManager, java.lang.String);
    public int getStyle();
    public int getWeight();
    public int hashCode();
    public boolean isBold();
    public boolean isItalic();
    public boolean isSupportedAxes(int);


    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 int MAX_WEIGHT;
    public static android.graphics.Typeface MONOSPACE;
    public static int NORMAL;
    public static int RESOLVE_BY_FONT_TABLE;
    public static android.graphics.Typeface SANS_SERIF;
    public static android.graphics.Typeface SERIF;
    public static int STYLE_MASK;
    public long native_instance;
}

-keep class android.graphics.Xfermode {
    <init>();



}

-keep class android.graphics.drawable.Animatable2 {

    public abstract void clearAnimationCallbacks();
    public abstract void registerAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
    public abstract boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);


}

-keep class android.graphics.drawable.Animatable2$AnimationCallback {
    <init>();

    public void onAnimationEnd(android.graphics.drawable.Drawable);
    public void onAnimationStart(android.graphics.drawable.Drawable);


}

-keep class android.graphics.drawable.AnimatedVectorDrawable {
    <init>();

    public void applyTheme(android.content.res.Resources$Theme);
    public boolean canApplyTheme();
    public boolean canReverse();
    public void clearAnimationCallbacks();
    public void clearMutated();
    public void draw(android.graphics.Canvas);
    public void forceAnimationOnUI();
    public int getAlpha();
    public int getChangingConfigurations();
    public android.graphics.ColorFilter getColorFilter();
    public android.graphics.drawable.Drawable$ConstantState getConstantState();
    public int getIntrinsicHeight();
    public int getIntrinsicWidth();
    public int getOpacity();
    public android.graphics.Insets getOpticalInsets();
    public void getOutline(android.graphics.Outline);
    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public boolean isRunning();
    public boolean isStateful();
    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 void registerAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
    public void reset();
    public void reverse();
    public void setAlpha(int);
    public void setColorFilter(android.graphics.ColorFilter);
    public void setHotspot(float, float);
    public void setHotspotBounds(int, int, int, int);
    public void setTintList(android.content.res.ColorStateList);
    public void setTintMode(android.graphics.PorterDuff$Mode);
    public boolean setVisible(boolean, boolean);
    public void start();
    public void stop();
    public boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);


}

-keep class android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT {

    public boolean canReverse();
    public void end();
    public long getAnimatorNativePtr();
    public void init(android.animation.AnimatorSet);
    public boolean isInfinite();
    public boolean isRunning();
    public boolean isStarted();
    public void onDraw(android.graphics.Canvas);
    public void pause();
    protected void recordLastSeenTarget(android.view.DisplayListCanvas);
    public void removeListener(android.animation.Animator$AnimatorListener);
    public void reset();
    public void resume();
    public void reverse();
    public void setListener(android.animation.Animator$AnimatorListener);
    public void start();


}

-keep class android.graphics.drawable.Drawable {
    <init>();

    public void applyTheme(android.content.res.Resources$Theme);
    public boolean canApplyTheme();
    public void clearColorFilter();
    public void clearMutated();
    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 createFromXmlForDensity(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, int, 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 android.graphics.Insets getOpticalInsets();
    public void getOutline(android.graphics.Outline);
    public boolean getPadding(android.graphics.Rect);
    public int[] getState();
    public android.graphics.Region getTransparentRegion();
    public boolean hasFocusStateSpecified();
    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 isProjected();
    public boolean isStateful();
    public boolean isVisible();
    public void jumpToCurrentState();
    public android.graphics.drawable.Drawable mutate();
    protected static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources$Theme, android.util.AttributeSet, int[]);
    protected void onBoundsChange(android.graphics.Rect);
    public boolean onLayoutDirectionChanged(int);
    protected boolean onLevelChange(int);
    protected boolean onStateChange(int[]);
    public static android.graphics.PorterDuff$Mode parseTintMode(int, android.graphics.PorterDuff$Mode);
    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 setXfermode(android.graphics.Xfermode);
    public void unscheduleSelf(java.lang.Runnable);


    protected int mSrcDensityOverride;
}

-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.graphics.drawable.DrawableInflater {
    <init>(android.content.res.Resources, java.lang.ClassLoader);

    public android.graphics.drawable.Drawable inflateFromXml(java.lang.String, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public static android.graphics.drawable.Drawable loadDrawable(android.content.Context, int);
    public static android.graphics.drawable.Drawable loadDrawable(android.content.res.Resources, android.content.res.Resources$Theme, int);


}

-keep class android.graphics.drawable.Icon {

    public void convertToAshmem();
    public static android.graphics.drawable.Icon createFromStream(java.io.InputStream);
    public static android.graphics.drawable.Icon createWithAdaptiveBitmap(android.graphics.Bitmap);
    public static android.graphics.drawable.Icon createWithBitmap(android.graphics.Bitmap);
    public static android.graphics.drawable.Icon createWithContentUri(java.lang.String);
    public static android.graphics.drawable.Icon createWithContentUri(android.net.Uri);
    public static android.graphics.drawable.Icon createWithData(byte[], int, int);
    public static android.graphics.drawable.Icon createWithFilePath(java.lang.String);
    public static android.graphics.drawable.Icon createWithResource(android.content.Context, int);
    public static android.graphics.drawable.Icon createWithResource(android.content.res.Resources, int);
    public static android.graphics.drawable.Icon createWithResource(java.lang.String, int);
    public int describeContents();
    public android.graphics.Bitmap getBitmap();
    public byte[] getDataBytes();
    public int getDataLength();
    public int getDataOffset();
    public int getResId();
    public java.lang.String getResPackage();
    public android.content.res.Resources getResources();
    public int getType();
    public android.net.Uri getUri();
    public java.lang.String getUriString();
    public boolean hasTint();
    public android.graphics.drawable.Drawable loadDrawable(android.content.Context);
    public android.graphics.drawable.Drawable loadDrawableAsUser(android.content.Context, int);
    public void loadDrawableAsync(android.content.Context, android.os.Message);
    public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon$OnDrawableLoadedListener, android.os.Handler);
    public boolean sameAs(android.graphics.drawable.Icon);
    public static android.graphics.Bitmap scaleDownIfNecessary(android.graphics.Bitmap, int, int);
    public void scaleDownIfNecessary(int, int);
    public android.graphics.drawable.Icon setTint(int);
    public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList);
    public android.graphics.drawable.Icon setTintMode(android.graphics.PorterDuff$Mode);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToStream(java.io.OutputStream);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MIN_ASHMEM_ICON_SIZE;
    public static int TYPE_ADAPTIVE_BITMAP;
    public static int TYPE_BITMAP;
    public static int TYPE_DATA;
    public static int TYPE_RESOURCE;
    public static int TYPE_URI;
}

-keep class android.graphics.drawable.Icon$OnDrawableLoadedListener {

    public abstract void onDrawableLoaded(android.graphics.drawable.Drawable);


}

-keep class android.graphics.fonts.FontVariationAxis {
    <init>(java.lang.String, float);

    public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String);
    public int getOpenTypeTagValue();
    public float getStyleValue();
    public java.lang.String getTag();
    public static int makeTag(java.lang.String);
    public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
    public java.lang.String toString();


}

-keep class android.hardware.display.AmbientBrightnessDayStats {
    <init>(java.time.LocalDate, float[]);
    <init>(java.time.LocalDate, float[], float[]);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public float[] getBucketBoundaries();
    public java.time.LocalDate getLocalDate();
    public float[] getStats();
    public int hashCode();
    public void log(float, float);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.hardware.display.BrightnessChangeEvent {
    <init>(android.hardware.display.BrightnessChangeEvent, boolean);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float batteryLevel;
    public float brightness;
    public int colorTemperature;
    public boolean isDefaultBrightnessConfig;
    public boolean isUserSetBrightness;
    public float lastBrightness;
    public long[] luxTimestamps;
    public float[] luxValues;
    public boolean nightMode;
    public java.lang.String packageName;
    public float powerBrightnessFactor;
    public long timeStamp;
    public int userId;
}

-keep class android.hardware.display.BrightnessConfiguration {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.util.Pair getCurve();
    public java.lang.String getDescription();
    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.hardware.display.DisplayManager {
    <init>(android.content.Context);

    public void connectWifiDisplay(java.lang.String);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(android.media.projection.MediaProjection, java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler, java.lang.String);
    public void disconnectWifiDisplay();
    public void forgetWifiDisplay(java.lang.String);
    public java.util.List getAmbientBrightnessStats();
    public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
    public android.hardware.display.BrightnessConfiguration getBrightnessConfigurationForUser(int);
    public java.util.List getBrightnessEvents();
    public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
    public android.view.Display getDisplay(int);
    public android.view.Display[] getDisplays();
    public android.view.Display[] getDisplays(java.lang.String);
    public android.util.Pair getMinimumBrightnessCurve();
    public android.graphics.Point getStableDisplaySize();
    public android.hardware.display.WifiDisplayStatus getWifiDisplayStatus();
    public void pauseWifiDisplay();
    public void registerDisplayListener(android.hardware.display.DisplayManager$DisplayListener, android.os.Handler);
    public void renameWifiDisplay(java.lang.String, java.lang.String);
    public void resumeWifiDisplay();
    public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
    public void setBrightnessConfigurationForUser(android.hardware.display.BrightnessConfiguration, int, java.lang.String);
    public void setSaturationLevel(float);
    public void setTemporaryAutoBrightnessAdjustment(float);
    public void setTemporaryBrightness(int);
    public void startWifiDisplayScan();
    public void stopWifiDisplayScan();
    public void unregisterDisplayListener(android.hardware.display.DisplayManager$DisplayListener);


    public static java.lang.String ACTION_WIFI_DISPLAY_STATUS_CHANGED;
    public static java.lang.String DISPLAY_CATEGORY_PRESENTATION;
    public static java.lang.String EXTRA_WIFI_DISPLAY_STATUS;
    public static int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
    public static int VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
    public static int VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
    public static int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
    public static int VIRTUAL_DISPLAY_FLAG_PRESENTATION;
    public static int VIRTUAL_DISPLAY_FLAG_PUBLIC;
    public static int VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT;
    public static int VIRTUAL_DISPLAY_FLAG_SECURE;
    public static int VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH;
}

-keep class android.hardware.display.DisplayManager$DisplayListener {

    public abstract void onDisplayAdded(int);
    public abstract void onDisplayChanged(int);
    public abstract void onDisplayRemoved(int);


}

-keep class android.hardware.display.DisplayManagerGlobal {

    public void connectWifiDisplay(java.lang.String);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(android.content.Context, android.media.projection.MediaProjection, java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler, java.lang.String);
    public void disconnectWifiDisplay();
    public void forgetWifiDisplay(java.lang.String);
    public java.util.List getAmbientBrightnessStats();
    public android.hardware.display.BrightnessConfiguration getBrightnessConfigurationForUser(int);
    public java.util.List getBrightnessEvents(java.lang.String);
    public android.view.Display getCompatibleDisplay(int, android.view.DisplayAdjustments);
    public android.view.Display getCompatibleDisplay(int, android.content.res.Resources);
    public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
    public int[] getDisplayIds();
    public android.view.DisplayInfo getDisplayInfo(int);
    public static android.hardware.display.DisplayManagerGlobal getInstance();
    public android.util.Pair getMinimumBrightnessCurve();
    public android.view.Display getRealDisplay(int);
    public android.graphics.Point getStableDisplaySize();
    public android.hardware.display.WifiDisplayStatus getWifiDisplayStatus();
    public void pauseWifiDisplay();
    public void registerDisplayListener(android.hardware.display.DisplayManager$DisplayListener, android.os.Handler);
    public void releaseVirtualDisplay(android.hardware.display.IVirtualDisplayCallback);
    public void renameWifiDisplay(java.lang.String, java.lang.String);
    public void requestColorMode(int, int);
    public void resizeVirtualDisplay(android.hardware.display.IVirtualDisplayCallback, int, int, int);
    public void resumeWifiDisplay();
    public void setBrightnessConfigurationForUser(android.hardware.display.BrightnessConfiguration, int, java.lang.String);
    public void setSaturationLevel(float);
    public void setTemporaryAutoBrightnessAdjustment(float);
    public void setTemporaryBrightness(int);
    public void setVirtualDisplaySurface(android.hardware.display.IVirtualDisplayCallback, android.view.Surface);
    public void startWifiDisplayScan();
    public void stopWifiDisplayScan();
    public void unregisterDisplayListener(android.hardware.display.DisplayManager$DisplayListener);


    public static int EVENT_DISPLAY_ADDED;
    public static int EVENT_DISPLAY_CHANGED;
    public static int EVENT_DISPLAY_REMOVED;
}

-keep class android.hardware.display.IVirtualDisplayCallback {

    public abstract void onPaused();
    public abstract void onResumed();
    public abstract void onStopped();


}

-keep class android.hardware.display.VirtualDisplay {

    public android.view.Display getDisplay();
    public android.view.Surface getSurface();
    public void release();
    public void resize(int, int, int);
    public void setSurface(android.view.Surface);
    public java.lang.String toString();


}

-keep class android.hardware.display.VirtualDisplay$Callback {
    <init>();

    public void onPaused();
    public void onResumed();
    public void onStopped();


}

-keep class android.hardware.display.WifiDisplay {
    <init>(java.lang.String, java.lang.String, java.lang.String, boolean, boolean, boolean);

    public boolean canConnect();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public boolean equals(android.hardware.display.WifiDisplay);
    public java.lang.String getDeviceAddress();
    public java.lang.String getDeviceAlias();
    public java.lang.String getDeviceName();
    public java.lang.String getFriendlyDisplayName();
    public boolean hasSameAddress(android.hardware.display.WifiDisplay);
    public int hashCode();
    public boolean isAvailable();
    public boolean isRemembered();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.hardware.display.WifiDisplay[] EMPTY_ARRAY;
}

-keep class android.hardware.display.WifiDisplaySessionInfo {
    <init>();
    <init>(boolean, int, java.lang.String, java.lang.String, java.lang.String);

    public int describeContents();
    public java.lang.String getGroupId();
    public java.lang.String getIP();
    public java.lang.String getPassphrase();
    public int getSessionId();
    public boolean isClient();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.hardware.display.WifiDisplayStatus {
    <init>();
    <init>(int, int, int, android.hardware.display.WifiDisplay, android.hardware.display.WifiDisplay[], android.hardware.display.WifiDisplaySessionInfo);

    public int describeContents();
    public android.hardware.display.WifiDisplay getActiveDisplay();
    public int getActiveDisplayState();
    public android.hardware.display.WifiDisplay[] getDisplays();
    public int getFeatureState();
    public int getScanState();
    public android.hardware.display.WifiDisplaySessionInfo getSessionInfo();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int DISPLAY_STATE_CONNECTED;
    public static int DISPLAY_STATE_CONNECTING;
    public static int DISPLAY_STATE_NOT_CONNECTED;
    public static int FEATURE_STATE_DISABLED;
    public static int FEATURE_STATE_OFF;
    public static int FEATURE_STATE_ON;
    public static int FEATURE_STATE_UNAVAILABLE;
    public static int SCAN_STATE_NOT_SCANNING;
    public static int SCAN_STATE_SCANNING;
}

-keep class android.hardware.input.InputDeviceIdentifier {
    <init>(java.lang.String, int, int);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getDescriptor();
    public int getProductId();
    public int getVendorId();
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.media.AudioAttributes {

    public java.lang.String contentTypeToString();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int getAllFlags();
    public android.os.Bundle getBundle();
    public int getCapturePreset();
    public int getContentType();
    public int getFlags();
    public java.util.Set getTags();
    public int getUsage();
    public int getVolumeControlStream();
    public int hashCode();
    public static int toLegacyStreamType(android.media.AudioAttributes);
    public java.lang.String toString();
    public java.lang.String usageToString();
    public static java.lang.String usageToString(int);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    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_BEACON;
    public static int FLAG_BYPASS_INTERRUPTION_POLICY;
    public static int FLAG_BYPASS_MUTE;
    public static int FLAG_DEEP_BUFFER;
    public static int FLAG_HW_AV_SYNC;
    public static int FLAG_HW_HOTWORD;
    public static int FLAG_LOW_LATENCY;
    public static int FLAG_SCO;
    public static int FLAG_SECURE;
    public static int FLATTEN_TAGS;
    public static int[] SDK_USAGES;
    public static int SUPPRESSIBLE_ALARM;
    public static int SUPPRESSIBLE_CALL;
    public static int SUPPRESSIBLE_MEDIA;
    public static int SUPPRESSIBLE_NEVER;
    public static int SUPPRESSIBLE_NOTIFICATION;
    public static int SUPPRESSIBLE_SYSTEM;
    public static android.util.SparseIntArray SUPPRESSIBLE_USAGES;
    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_ASSISTANT;
    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_VIRTUAL_SOURCE;
    public static int USAGE_VOICE_COMMUNICATION;
    public static int USAGE_VOICE_COMMUNICATION_SIGNALLING;
}

-keep class android.media.AudioDeviceInfo {

    public static int convertDeviceTypeToInternalDevice(int);
    public static int convertInternalDeviceToDeviceType(int);
    public boolean equals(java.lang.Object);
    public java.lang.String getAddress();
    public int[] getChannelCounts();
    public int[] getChannelIndexMasks();
    public int[] getChannelMasks();
    public int[] getEncodings();
    public int getId();
    public android.media.AudioDevicePort getPort();
    public java.lang.CharSequence getProductName();
    public int[] getSampleRates();
    public int getType();
    public int hashCode();
    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_BUS;
    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_HEARING_AID;
    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_USB_HEADSET;
    public static int TYPE_WIRED_HEADPHONES;
    public static int TYPE_WIRED_HEADSET;
}

-keep class android.media.AudioDevicePort {

    public java.lang.String address();
    public android.media.AudioDevicePortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
    public android.media.AudioPortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
    public boolean equals(java.lang.Object);
    public java.lang.String toString();
    public int type();


}

-keep class android.media.AudioDevicePortConfig {

    public android.media.AudioDevicePort port();
    public android.media.AudioPort port();


}

-keep class android.media.AudioFormat {
    <init>();

    public static int channelCountFromInChannelMask(int);
    public static int channelCountFromOutChannelMask(int);
    public static int convertChannelOutMaskToNativeMask(int);
    public static int convertNativeChannelMaskToOutMask(int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static int[] filterPublicFormats(int[]);
    public static int getBytesPerSample(int);
    public int getChannelCount();
    public int getChannelIndexMask();
    public int getChannelMask();
    public int getEncoding();
    public int getPropertySetMask();
    public int getSampleRate();
    public int hashCode();
    public static int inChannelMaskFromOutChannelMask(int);
    public static boolean isEncodingLinearFrames(int);
    public static boolean isEncodingLinearPcm(int);
    public static boolean isPublicEncoding(int);
    public static boolean isValidEncoding(int);
    public static java.lang.String toDisplayName(int);
    public static java.lang.String toLogFriendlyEncoding(int);
    public java.lang.String toLogFriendlyString();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK;
    public static int AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK;
    public static int AUDIO_FORMAT_HAS_PROPERTY_ENCODING;
    public static int AUDIO_FORMAT_HAS_PROPERTY_NONE;
    public static int AUDIO_FORMAT_HAS_PROPERTY_SAMPLE_RATE;
    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_BACK;
    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_5POINT1_SIDE;
    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_QUAD_SIDE;
    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 CHANNEL_OUT_TOP_BACK_CENTER;
    public static int CHANNEL_OUT_TOP_BACK_LEFT;
    public static int CHANNEL_OUT_TOP_BACK_RIGHT;
    public static int CHANNEL_OUT_TOP_CENTER;
    public static int CHANNEL_OUT_TOP_FRONT_CENTER;
    public static int CHANNEL_OUT_TOP_FRONT_LEFT;
    public static int CHANNEL_OUT_TOP_FRONT_RIGHT;
    public static android.os.Parcelable$Creator CREATOR;
    public static int ENCODING_AAC_ELD;
    public static int ENCODING_AAC_HE_V1;
    public static int ENCODING_AAC_HE_V2;
    public static int ENCODING_AAC_LC;
    public static int ENCODING_AAC_XHE;
    public static int ENCODING_AC3;
    public static int ENCODING_AC4;
    public static int ENCODING_DEFAULT;
    public static int ENCODING_DOLBY_TRUEHD;
    public static int ENCODING_DTS;
    public static int ENCODING_DTS_HD;
    public static int ENCODING_E_AC3;
    public static int ENCODING_E_AC3_JOC;
    public static int ENCODING_IEC61937;
    public static int ENCODING_INVALID;
    public static int ENCODING_MP3;
    public static int ENCODING_PCM_16BIT;
    public static int ENCODING_PCM_8BIT;
    public static int ENCODING_PCM_FLOAT;
    public static int SAMPLE_RATE_HZ_MAX;
    public static int SAMPLE_RATE_HZ_MIN;
    public static int SAMPLE_RATE_UNSPECIFIED;
    public static int[] SURROUND_SOUND_ENCODING;
}

-keep class android.media.AudioGain {

    public android.media.AudioGainConfig buildConfig(int, int, int[], int);
    public int channelMask();
    public int defaultValue();
    public int maxValue();
    public int minValue();
    public int mode();
    public int rampDurationMaxMs();
    public int rampDurationMinMs();
    public int stepValue();


    public static int MODE_CHANNELS;
    public static int MODE_JOINT;
    public static int MODE_RAMP;
}

-keep class android.media.AudioGainConfig {

    public int channelMask();
    public int mode();
    public int rampDurationMs();
    public int[] values();


}

-keep class android.media.AudioPort {

    public android.media.AudioPortConfig activeConfig();
    public android.media.AudioPortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
    public int[] channelIndexMasks();
    public int[] channelMasks();
    public boolean equals(java.lang.Object);
    public int[] formats();
    public android.media.AudioGain[] gains();
    public int hashCode();
    public int id();
    public java.lang.String name();
    public int role();
    public int[] samplingRates();
    public java.lang.String toString();


    public static int ROLE_NONE;
    public static int ROLE_SINK;
    public static int ROLE_SOURCE;
    public static int TYPE_DEVICE;
    public static int TYPE_NONE;
    public static int TYPE_SESSION;
    public static int TYPE_SUBMIX;
    protected int mRole;
}

-keep class android.media.AudioPortConfig {

    public int channelMask();
    public int format();
    public android.media.AudioGainConfig gain();
    public android.media.AudioPort port();
    public int samplingRate();
    public java.lang.String toString();


}

-keep class android.media.AudioRecord {
    <init>(int, int, int, int, int);
    <init>(android.media.AudioAttributes, android.media.AudioFormat, int, int);

    public void addOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener, android.os.Handler);
    public void addOnRoutingChangedListener(android.media.AudioRecord$OnRoutingChangedListener, android.os.Handler);
    protected void finalize();
    public java.util.List getActiveMicrophones();
    public int getAudioFormat();
    public int getAudioSessionId();
    public int getAudioSource();
    public int getBufferSizeInFrames();
    public int getChannelConfiguration();
    public int getChannelCount();
    public android.media.AudioFormat getFormat();
    public android.os.PersistableBundle getMetrics();
    public static int getMinBufferSize(int, int, int);
    public int getNotificationMarkerPosition();
    public int getPositionNotificationPeriod();
    public android.media.AudioDeviceInfo getPreferredDevice();
    public int getRecordingState();
    public android.media.AudioDeviceInfo getRoutedDevice();
    public int getSampleRate();
    public int getState();
    public int getTimestamp(android.media.AudioTimestamp, int);
    public void native_release();
    public int read(byte[], int, int);
    public int read(byte[], int, int, int);
    public int read(short[], int, int);
    public int read(short[], int, int, int);
    public int read(float[], int, int, int);
    public int read(java.nio.ByteBuffer, int);
    public int read(java.nio.ByteBuffer, int, int);
    public void release();
    public void removeOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener);
    public void removeOnRoutingChangedListener(android.media.AudioRecord$OnRoutingChangedListener);
    public int setNotificationMarkerPosition(int);
    public int setPositionNotificationPeriod(int);
    public boolean setPreferredDevice(android.media.AudioDeviceInfo);
    public void setRecordPositionUpdateListener(android.media.AudioRecord$OnRecordPositionUpdateListener);
    public void setRecordPositionUpdateListener(android.media.AudioRecord$OnRecordPositionUpdateListener, android.os.Handler);
    public void startRecording();
    public void startRecording(android.media.MediaSyncEvent);
    public void stop();


    public static int ERROR;
    public static int ERROR_BAD_VALUE;
    public static int ERROR_DEAD_OBJECT;
    public static int ERROR_INVALID_OPERATION;
    public static int READ_BLOCKING;
    public static int READ_NON_BLOCKING;
    public static int RECORDSTATE_RECORDING;
    public static int RECORDSTATE_STOPPED;
    public static int STATE_INITIALIZED;
    public static int STATE_UNINITIALIZED;
    public static java.lang.String SUBMIX_FIXED_VOLUME;
    public static int SUCCESS;
}

-keep class android.media.AudioRecord$OnRecordPositionUpdateListener {

    public abstract void onMarkerReached(android.media.AudioRecord);
    public abstract void onPeriodicNotification(android.media.AudioRecord);


}

-keep class android.media.AudioRecord$OnRoutingChangedListener {

    public abstract void onRoutingChanged(android.media.AudioRecord);
    public void onRoutingChanged(android.media.AudioRouting);


}

-keep class android.media.AudioRouting {

    public abstract void addOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener, android.os.Handler);
    public abstract android.media.AudioDeviceInfo getPreferredDevice();
    public abstract android.media.AudioDeviceInfo getRoutedDevice();
    public abstract void removeOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener);
    public abstract boolean setPreferredDevice(android.media.AudioDeviceInfo);


}

-keep class android.media.AudioRouting$OnRoutingChangedListener {

    public abstract void onRoutingChanged(android.media.AudioRouting);


}

-keep class android.media.AudioTimestamp {
    <init>();



    public static int TIMEBASE_BOOTTIME;
    public static int TIMEBASE_MONOTONIC;
    public long framePosition;
    public long nanoTime;
}

-keep class android.media.IRemoteVolumeController {

    public abstract void remoteVolumeChanged(android.media.session.ISessionController, int);
    public abstract void updateRemoteController(android.media.session.ISessionController);


}

-keep class android.media.MediaDescription {

    public int describeContents();
    public boolean equals(java.lang.Object);
    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 long BT_FOLDER_TYPE_ALBUMS;
    public static long BT_FOLDER_TYPE_ARTISTS;
    public static long BT_FOLDER_TYPE_GENRES;
    public static long BT_FOLDER_TYPE_MIXED;
    public static long BT_FOLDER_TYPE_PLAYLISTS;
    public static long BT_FOLDER_TYPE_TITLES;
    public static long BT_FOLDER_TYPE_YEARS;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_BT_FOLDER_TYPE;
}

-keep class android.media.MediaMetadata {

    public boolean containsKey(java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.graphics.Bitmap getBitmap(java.lang.String);
    public android.media.MediaDescription getDescription();
    public static java.lang.String getKeyFromMetadataEditorKey(int);
    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 int hashCode();
    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_BT_FOLDER_TYPE;
    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_MEDIA_URI;
    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.MediaSyncEvent {

    public static android.media.MediaSyncEvent createEvent(int);
    public int getAudioSessionId();
    public int getType();
    public android.media.MediaSyncEvent setAudioSessionId(int);


    public static int SYNC_EVENT_NONE;
    public static int SYNC_EVENT_PRESENTATION_COMPLETE;
}

-keep class android.media.MicrophoneInfo {

    public java.lang.String getAddress();
    public java.util.List getChannelMapping();
    public java.lang.String getDescription();
    public int getDirectionality();
    public java.util.List getFrequencyResponse();
    public int getGroup();
    public int getId();
    public int getIndexInTheGroup();
    public int getInternalDeviceType();
    public int getLocation();
    public float getMaxSpl();
    public float getMinSpl();
    public android.media.MicrophoneInfo$Coordinate3F getOrientation();
    public android.media.MicrophoneInfo$Coordinate3F getPosition();
    public float getSensitivity();
    public int getType();
    public void setChannelMapping(java.util.List);
    public void setId(int);


    public static int CHANNEL_MAPPING_DIRECT;
    public static int CHANNEL_MAPPING_PROCESSED;
    public static int DIRECTIONALITY_BI_DIRECTIONAL;
    public static int DIRECTIONALITY_CARDIOID;
    public static int DIRECTIONALITY_HYPER_CARDIOID;
    public static int DIRECTIONALITY_OMNI;
    public static int DIRECTIONALITY_SUPER_CARDIOID;
    public static int DIRECTIONALITY_UNKNOWN;
    public static int GROUP_UNKNOWN;
    public static int INDEX_IN_THE_GROUP_UNKNOWN;
    public static int LOCATION_MAINBODY;
    public static int LOCATION_MAINBODY_MOVABLE;
    public static int LOCATION_PERIPHERAL;
    public static int LOCATION_UNKNOWN;
    public static android.media.MicrophoneInfo$Coordinate3F ORIENTATION_UNKNOWN;
    public static android.media.MicrophoneInfo$Coordinate3F POSITION_UNKNOWN;
    public static float SENSITIVITY_UNKNOWN;
    public static float SPL_UNKNOWN;
}

-keep class android.media.MicrophoneInfo$Coordinate3F {

    public boolean equals(java.lang.Object);


    public float x;
    public float y;
    public float z;
}

-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.SessionToken2 {
    <init>(android.content.Context, java.lang.String, java.lang.String);
    <init>(android.content.Context, java.lang.String, java.lang.String, int);
    <init>(android.media.update.SessionToken2Provider);

    public boolean equals(java.lang.Object);
    public static android.media.SessionToken2 fromBundle(android.os.Bundle);
    public java.lang.String getId();
    public java.lang.String getPackageName();
    public android.media.update.SessionToken2Provider getProvider();
    public int getType();
    public int getUid();
    public int hashCode();
    public android.os.Bundle toBundle();
    public java.lang.String toString();


    public static int TYPE_LIBRARY_SERVICE;
    public static int TYPE_SESSION;
    public static int TYPE_SESSION_SERVICE;
}

-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 setCallback(android.media.VolumeProvider$Callback);
    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.VolumeProvider$Callback {
    <init>();

    public abstract void onVolumeChanged(android.media.VolumeProvider);


}

-keep class android.media.projection.IMediaProjection {

    public abstract int applyVirtualDisplayFlags(int);
    public abstract boolean canProjectAudio();
    public abstract boolean canProjectSecureVideo();
    public abstract boolean canProjectVideo();
    public abstract void registerCallback(android.media.projection.IMediaProjectionCallback);
    public abstract void start(android.media.projection.IMediaProjectionCallback);
    public abstract void stop();
    public abstract void unregisterCallback(android.media.projection.IMediaProjectionCallback);


}

-keep class android.media.projection.IMediaProjectionCallback {

    public abstract void onStop();


}

-keep class android.media.projection.MediaProjection {
    <init>(android.content.Context, android.media.projection.IMediaProjection);

    public android.media.AudioRecord createAudioRecord(int, int, int, int);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, boolean, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
    public android.media.projection.IMediaProjection getProjection();
    public void registerCallback(android.media.projection.MediaProjection$Callback, android.os.Handler);
    public void stop();
    public void unregisterCallback(android.media.projection.MediaProjection$Callback);


}

-keep class android.media.projection.MediaProjection$Callback {
    <init>();

    public void onStop();


}

-keep class android.media.session.ISession {

    public abstract void destroy();
    public abstract android.media.session.ISessionController getController();
    public abstract void sendEvent(java.lang.String, android.os.Bundle);
    public abstract void setActive(boolean);
    public abstract void setCurrentVolume(int);
    public abstract void setExtras(android.os.Bundle);
    public abstract void setFlags(int);
    public abstract void setLaunchPendingIntent(android.app.PendingIntent);
    public abstract void setMediaButtonReceiver(android.app.PendingIntent);
    public abstract void setMetadata(android.media.MediaMetadata);
    public abstract void setPlaybackState(android.media.session.PlaybackState);
    public abstract void setPlaybackToLocal(android.media.AudioAttributes);
    public abstract void setPlaybackToRemote(int, int);
    public abstract void setQueue(android.content.pm.ParceledListSlice);
    public abstract void setQueueTitle(java.lang.CharSequence);
    public abstract void setRatingType(int);


}

-keep class android.media.session.ISessionCallback {

    public abstract void onAdjustVolume(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public abstract void onCommand(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public abstract void onCustomAction(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onFastForward(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onMediaButton(java.lang.String, int, int, android.content.Intent, int, android.os.ResultReceiver);
    public abstract void onMediaButtonFromController(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.content.Intent);
    public abstract void onNext(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPause(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPlay(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPlayFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPlayFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPlayFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void onPrepare(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPrepareFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPrepareFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPrepareFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void onPrevious(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onRate(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.media.Rating);
    public abstract void onRewind(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onSeekTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public abstract void onSetVolumeTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public abstract void onSkipToTrack(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public abstract void onStop(java.lang.String, int, int, android.media.session.ISessionControllerCallback);


}

-keep class android.media.session.ISessionCallback$Stub {
    <init>();

    public android.os.IBinder asBinder();
    public static android.media.session.ISessionCallback asInterface(android.os.IBinder);
    public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);


}

-keep class android.media.session.ISessionController {

    public abstract void adjustVolume(java.lang.String, android.media.session.ISessionControllerCallback, boolean, int, int);
    public abstract void fastForward(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract android.os.Bundle getExtras();
    public abstract long getFlags();
    public abstract android.app.PendingIntent getLaunchPendingIntent();
    public abstract android.media.MediaMetadata getMetadata();
    public abstract java.lang.String getPackageName();
    public abstract android.media.session.PlaybackState getPlaybackState();
    public abstract android.content.pm.ParceledListSlice getQueue();
    public abstract java.lang.CharSequence getQueueTitle();
    public abstract int getRatingType();
    public abstract java.lang.String getTag();
    public abstract android.media.session.ParcelableVolumeInfo getVolumeAttributes();
    public abstract boolean isTransportControlEnabled();
    public abstract void next(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void pause(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void play(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void playFromMediaId(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void playFromSearch(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void playFromUri(java.lang.String, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void prepare(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void prepareFromMediaId(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void prepareFromSearch(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void prepareFromUri(java.lang.String, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void previous(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void rate(java.lang.String, android.media.session.ISessionControllerCallback, android.media.Rating);
    public abstract void registerCallbackListener(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void rewind(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void seekTo(java.lang.String, android.media.session.ISessionControllerCallback, long);
    public abstract void sendCommand(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public abstract void sendCustomAction(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract boolean sendMediaButton(java.lang.String, android.media.session.ISessionControllerCallback, boolean, android.view.KeyEvent);
    public abstract void setVolumeTo(java.lang.String, android.media.session.ISessionControllerCallback, int, int);
    public abstract void skipToQueueItem(java.lang.String, android.media.session.ISessionControllerCallback, long);
    public abstract void stop(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void unregisterCallbackListener(android.media.session.ISessionControllerCallback);


}

-keep class android.media.session.ISessionControllerCallback {

    public abstract void onEvent(java.lang.String, android.os.Bundle);
    public abstract void onExtrasChanged(android.os.Bundle);
    public abstract void onMetadataChanged(android.media.MediaMetadata);
    public abstract void onPlaybackStateChanged(android.media.session.PlaybackState);
    public abstract void onQueueChanged(android.content.pm.ParceledListSlice);
    public abstract void onQueueTitleChanged(java.lang.CharSequence);
    public abstract void onSessionDestroyed();
    public abstract void onVolumeInfoChanged(android.media.session.ParcelableVolumeInfo);


}

-keep class android.media.session.MediaController {
    <init>(android.content.Context, android.media.session.ISessionController);
    <init>(android.content.Context, android.media.session.MediaSession$Token);

    public void adjustVolume(int, int);
    public boolean controlsSameSession(android.media.session.MediaController);
    public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
    public boolean dispatchMediaButtonEventAsSystemService(android.view.KeyEvent);
    public void dispatchVolumeButtonEventAsSystemService(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 java.lang.String getTag();
    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 {
    <init>(int, android.media.AudioAttributes, int, int, int);

    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 prepare();
    public void prepareFromMediaId(java.lang.String, android.os.Bundle);
    public void prepareFromSearch(java.lang.String, android.os.Bundle);
    public void prepareFromUri(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);
    <init>(android.content.Context, java.lang.String, int);

    public java.lang.String getCallingPackage();
    public android.media.session.MediaController getController();
    public android.media.session.MediaSessionManager$RemoteUserInfo getCurrentControllerInfo();
    public android.media.session.MediaSession$Token getSessionToken();
    public boolean isActive();
    public static boolean isActiveState(int);
    public void notifyRemoteVolumeChanged(android.media.VolumeProvider);
    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_EXCLUSIVE_GLOBAL_PRIORITY;
    public static int FLAG_HANDLES_MEDIA_BUTTONS;
    public static int FLAG_HANDLES_TRANSPORT_CONTROLS;
    public static int INVALID_PID;
    public static int INVALID_UID;
}

-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 onPrepare();
    public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
    public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
    public void onPrepareFromUri(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$CallbackStub {
    <init>(android.media.session.MediaSession);

    public void onAdjustVolume(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public void onCommand(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public void onCustomAction(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onFastForward(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onMediaButton(java.lang.String, int, int, android.content.Intent, int, android.os.ResultReceiver);
    public void onMediaButtonFromController(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.content.Intent);
    public void onNext(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPause(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPlay(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPlayFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPlayFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPlayFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public void onPrepare(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPrepareFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPrepareFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPrepareFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public void onPrevious(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onRate(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.media.Rating);
    public void onRewind(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onSeekTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public void onSetVolumeTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public void onSkipToTrack(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public void onStop(java.lang.String, int, int, android.media.session.ISessionControllerCallback);


}

-keep class android.media.session.MediaSession$QueueItem {
    <init>(android.media.MediaDescription, long);

    public int describeContents();
    public boolean equals(java.lang.Object);
    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 {
    <init>(android.media.session.ISessionController);

    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.MediaSessionManager {
    <init>(android.content.Context);

    public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName);
    public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler);
    public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName, int, android.os.Handler);
    public void addOnSessionTokensChangedListener(java.util.concurrent.Executor, android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
    public void addOnSessionTokensChangedListener(int, java.util.concurrent.Executor, android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
    public android.media.session.ISession createSession(android.media.session.MediaSession$CallbackStub, java.lang.String, int);
    public boolean createSession2(android.media.SessionToken2);
    public void destroySession2(android.media.SessionToken2);
    public void dispatchAdjustVolume(int, int, int);
    public void dispatchMediaKeyEvent(android.view.KeyEvent);
    public void dispatchMediaKeyEvent(android.view.KeyEvent, boolean);
    public void dispatchMediaKeyEventAsSystemService(android.view.KeyEvent);
    public void dispatchVolumeKeyEvent(android.view.KeyEvent, int, boolean);
    public void dispatchVolumeKeyEventAsSystemService(android.view.KeyEvent, int);
    public java.util.List getActiveSessionTokens();
    public java.util.List getActiveSessions(android.content.ComponentName);
    public java.util.List getActiveSessionsForUser(android.content.ComponentName, int);
    public java.util.List getAllSessionTokens();
    public java.util.List getSessionServiceTokens();
    public boolean isGlobalPriorityActive();
    public boolean isTrustedForMediaControl(android.media.session.MediaSessionManager$RemoteUserInfo);
    public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener);
    public void removeOnSessionTokensChangedListener(android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
    public void setCallback(android.media.session.MediaSessionManager$Callback, android.os.Handler);
    public void setOnMediaKeyListener(android.media.session.MediaSessionManager$OnMediaKeyListener, android.os.Handler);
    public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener, android.os.Handler);
    public void setRemoteVolumeController(android.media.IRemoteVolumeController);


    public static int RESULT_MEDIA_KEY_HANDLED;
    public static int RESULT_MEDIA_KEY_NOT_HANDLED;
}

-keep class android.media.session.MediaSessionManager$Callback {
    <init>();

    public abstract void onAddressedPlayerChanged(android.media.session.MediaSession$Token);
    public abstract void onAddressedPlayerChanged(android.content.ComponentName);
    public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.media.session.MediaSession$Token);
    public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.content.ComponentName);


}

-keep class android.media.session.MediaSessionManager$OnActiveSessionsChangedListener {

    public abstract void onActiveSessionsChanged(java.util.List);


}

-keep class android.media.session.MediaSessionManager$OnMediaKeyListener {

    public abstract boolean onMediaKey(android.view.KeyEvent);


}

-keep class android.media.session.MediaSessionManager$OnSessionTokensChangedListener {

    public abstract void onSessionTokensChanged(java.util.List);


}

-keep class android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener {

    public abstract void onVolumeKeyLongPress(android.view.KeyEvent);


}

-keep class android.media.session.MediaSessionManager$RemoteUserInfo {
    <init>(java.lang.String, int, int);
    <init>(java.lang.String, int, int, android.os.IBinder);

    public boolean equals(java.lang.Object);
    public java.lang.String getPackageName();
    public int getPid();
    public int getUid();
    public int hashCode();


}

-keep class android.media.session.ParcelableVolumeInfo {
    <init>(int, android.media.AudioAttributes, int, int, int);
    <init>(android.os.Parcel);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.media.AudioAttributes audioAttrs;
    public int controlType;
    public int currentVolume;
    public int maxVolume;
    public int volumeType;
}

-keep class android.media.session.PlaybackState {

    public int describeContents();
    public long getActions();
    public static long getActionsFromRccControlFlags(int);
    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 static int getRccControlFlagsFromActions(long);
    public static int getRccStateFromState(int);
    public int getState();
    public static int getStateFromRccState(int);
    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_PREPARE;
    public static long ACTION_PREPARE_FROM_MEDIA_ID;
    public static long ACTION_PREPARE_FROM_SEARCH;
    public static long ACTION_PREPARE_FROM_URI;
    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.media.update.SessionToken2Provider {

    public abstract boolean equals_impl(java.lang.Object);
    public abstract java.lang.String getId_imp();
    public abstract java.lang.String getPackageName_impl();
    public abstract int getType_impl();
    public abstract int getUid_impl();
    public abstract int hashCode_impl();
    public abstract android.os.Bundle toBundle_impl();
    public abstract java.lang.String toString_impl();


}

-keep class android.net.Uri {

    public abstract android.net.Uri$Builder buildUpon();
    public void checkContentUriWithoutPermission(java.lang.String, int);
    public void checkFileUriExposed(java.lang.String);
    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 android.net.Uri getCanonicalUri();
    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 boolean isPathPrefixMatch(android.net.Uri);
    public abstract boolean isRelative();
    public android.net.Uri normalizeScheme();
    public static android.net.Uri parse(java.lang.String);
    public java.lang.String toSafeString();
    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 static void dumpStats(com.android.internal.util.IndentingPrintWriter, java.lang.String, java.lang.Object);
    public static void dumpStats(com.android.internal.util.IndentingPrintWriter, android.util.SparseArray);
    public static void dumpStats(com.android.internal.util.IndentingPrintWriter, android.os.BaseBundle);
    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 getPairValue();
    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 boolean isEmptyParcel();
    public boolean isParcelled();
    public java.util.Set keySet();
    public static boolean kindofEquals(android.os.BaseBundle, android.os.BaseBundle);
    public boolean kindofEquals(android.os.BaseBundle);
    public boolean maybeIsEmpty();
    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 static void setShouldDefuse(boolean);
    public int size();


    public int mFlags;
}

-keep class android.os.Binder {
    <init>();

    public static android.os.IBinder allowBlocking(android.os.IBinder);
    public void attachInterface(android.os.IInterface, java.lang.String);
    public static void blockUntilThreadAvailable();
    public static long clearCallingIdentity();
    public static void copyAllowBlocking(android.os.IBinder, android.os.IBinder);
    public static android.os.IBinder defaultBlocking(android.os.IBinder);
    public static void disableTracing();
    public void dump(java.io.FileDescriptor, java.lang.String[]);
    protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
    public static void enableTracing();
    public static void flushPendingCommands();
    public static int getCallingPid();
    public static int getCallingUid();
    public static android.os.UserHandle getCallingUserHandle();
    public java.lang.String getInterfaceDescriptor();
    public static int getThreadStrictModePolicy();
    public static synchronized android.os.TransactionTracker getTransactionTracker();
    public boolean isBinderAlive();
    public static boolean isProxy(android.os.IInterface);
    public static boolean isTracingEnabled();
    public static void joinThreadPool();
    public void linkToDeath(android.os.IBinder$DeathRecipient, int);
    public void onShellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    protected boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);
    public boolean pingBinder();
    public android.os.IInterface queryLocalInterface(java.lang.String);
    public static void restoreCallingIdentity(long);
    public static void setDumpDisabled(java.lang.String);
    public static void setThreadStrictModePolicy(int);
    public static void setWarnOnBlocking(boolean);
    public void shellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    public boolean transact(int, android.os.Parcel, android.os.Parcel, int);
    public boolean unlinkToDeath(android.os.IBinder$DeathRecipient, int);
    public static void withCleanCallingIdentity(com.android.internal.util.FunctionalUtils$ThrowingRunnable);
    public static java.lang.Object withCleanCallingIdentity(com.android.internal.util.FunctionalUtils$ThrowingSupplier);


    public static boolean CHECK_PARCEL_SIZE;
    public static boolean LOG_RUNTIME_EXCEPTION;
}

-keep class android.os.Bundle {
    <init>();
    <init>(android.os.Parcel);
    <init>(android.os.Parcel, int);
    <init>(java.lang.ClassLoader);
    <init>(int);
    <init>(android.os.Bundle);
    <init>(android.os.PersistableBundle);

    public void clear();
    public java.lang.Object clone();
    public android.os.Bundle deepCopy();
    public int describeContents();
    public android.os.Bundle filterValues();
    public static android.os.Bundle forPair(java.lang.String, java.lang.String);
    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 android.os.IBinder getIBinder(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 int getSize();
    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 putIBinder(java.lang.String, android.os.IBinder);
    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 putParcelableList(java.lang.String, java.util.List);
    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 remove(java.lang.String);
    public boolean setAllowFds(boolean);
    public void setClassLoader(java.lang.ClassLoader);
    public void setDefusable(boolean);
    public static android.os.Bundle setDefusable(android.os.Bundle, boolean);
    public synchronized java.lang.String toShortString();
    public synchronized java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.Bundle EMPTY;
    public static android.os.Bundle STRIPPED;
}

-keep class android.os.CancellationSignal {
    <init>();

    public void cancel();
    public static android.os.ICancellationSignal createTransport();
    public static android.os.CancellationSignal fromTransport(android.os.ICancellationSignal);
    public boolean isCanceled();
    public void setOnCancelListener(android.os.CancellationSignal$OnCancelListener);
    public void setRemote(android.os.ICancellationSignal);
    public void throwIfCanceled();


}

-keep class android.os.CancellationSignal$OnCancelListener {

    public abstract void onCancel();


}

-keep class android.os.Debug {

    public static void attachJvmtiAgent(java.lang.String, java.lang.String, java.lang.ClassLoader);
    public static boolean cacheRegisterMap(java.lang.String);
    public static void changeDebugPort(int);
    public static long countInstancesOfClass(java.lang.Class);
    public static void dumpHprofData(java.lang.String);
    public static void dumpHprofData(java.lang.String, java.io.FileDescriptor);
    public static void dumpHprofDataDdms();
    public static boolean dumpJavaBacktraceToFileTimeout(int, java.lang.String, int);
    public static boolean dumpNativeBacktraceToFileTimeout(int, java.lang.String, int);
    public static void dumpNativeHeap(java.io.FileDescriptor);
    public static void dumpNativeMallocInfo(java.io.FileDescriptor);
    public static void dumpReferenceTables();
    public static boolean dumpService(java.lang.String, java.io.FileDescriptor, java.lang.String[]);
    public static void enableEmulatorTraceOutput();
    public static int getBinderDeathObjectCount();
    public static int getBinderLocalObjectCount();
    public static int getBinderProxyObjectCount();
    public static int getBinderReceivedTransactions();
    public static int getBinderSentTransactions();
    public static java.lang.String getCaller();
    public static java.lang.String getCallers(int);
    public static java.lang.String getCallers(int, int);
    public static java.lang.String getCallers(int, java.lang.String);
    public static int getGlobalAllocCount();
    public static int getGlobalAllocSize();
    public static int getGlobalClassInitCount();
    public static int getGlobalClassInitTime();
    public static int getGlobalExternalAllocCount();
    public static int getGlobalExternalAllocSize();
    public static int getGlobalExternalFreedCount();
    public static int getGlobalExternalFreedSize();
    public static int getGlobalFreedCount();
    public static int getGlobalFreedSize();
    public static int getGlobalGcInvocationCount();
    public static int getLoadedClassCount();
    public static void getMemInfo(long[]);
    public static void getMemoryInfo(android.os.Debug$MemoryInfo);
    public static void getMemoryInfo(int, android.os.Debug$MemoryInfo);
    public static int getMethodTracingMode();
    public static long getNativeHeapAllocatedSize();
    public static long getNativeHeapFreeSize();
    public static long getNativeHeapSize();
    public static long getPss();
    public static long getPss(int, long[], long[]);
    public static java.lang.String getRuntimeStat(java.lang.String);
    public static java.util.Map getRuntimeStats();
    public static int getThreadAllocCount();
    public static int getThreadAllocSize();
    public static int getThreadExternalAllocCount();
    public static int getThreadExternalAllocSize();
    public static int getThreadGcInvocationCount();
    public static java.lang.String getUnreachableMemory(int, boolean);
    public static java.lang.String[] getVmFeatureList();
    public static boolean isDebuggerConnected();
    public static void printLoadedClasses(int);
    public static void resetAllCounts();
    public static void resetGlobalAllocCount();
    public static void resetGlobalAllocSize();
    public static void resetGlobalClassInitCount();
    public static void resetGlobalClassInitTime();
    public static void resetGlobalExternalAllocCount();
    public static void resetGlobalExternalAllocSize();
    public static void resetGlobalExternalFreedCount();
    public static void resetGlobalExternalFreedSize();
    public static void resetGlobalFreedCount();
    public static void resetGlobalFreedSize();
    public static void resetGlobalGcInvocationCount();
    public static void resetThreadAllocCount();
    public static void resetThreadAllocSize();
    public static void resetThreadExternalAllocCount();
    public static void resetThreadExternalAllocSize();
    public static void resetThreadGcInvocationCount();
    public static int setAllocationLimit(int);
    public static void setFieldsOn(java.lang.Class);
    public static void setFieldsOn(java.lang.Class, boolean);
    public static int setGlobalAllocationLimit(int);
    public static void startAllocCounting();
    public static void startMethodTracing();
    public static void startMethodTracing(java.lang.String);
    public static void startMethodTracing(java.lang.String, int);
    public static void startMethodTracing(java.lang.String, int, int);
    public static void startMethodTracing(java.lang.String, java.io.FileDescriptor, int, int, boolean);
    public static void startMethodTracingDdms(int, int, boolean, int);
    public static void startMethodTracingSampling(java.lang.String, int, int);
    public static void startNativeTracing();
    public static void stopAllocCounting();
    public static void stopMethodTracing();
    public static void stopNativeTracing();
    public static long threadCpuTimeNanos();
    public static void waitForDebugger();
    public static boolean waitingForDebugger();


    public static int MEMINFO_BUFFERS;
    public static int MEMINFO_CACHED;
    public static int MEMINFO_COUNT;
    public static int MEMINFO_FREE;
    public static int MEMINFO_KERNEL_STACK;
    public static int MEMINFO_MAPPED;
    public static int MEMINFO_PAGE_TABLES;
    public static int MEMINFO_SHMEM;
    public static int MEMINFO_SLAB;
    public static int MEMINFO_SLAB_RECLAIMABLE;
    public static int MEMINFO_SLAB_UNRECLAIMABLE;
    public static int MEMINFO_SWAP_FREE;
    public static int MEMINFO_SWAP_TOTAL;
    public static int MEMINFO_TOTAL;
    public static int MEMINFO_VM_ALLOC_USED;
    public static int MEMINFO_ZRAM_TOTAL;
    public static int SHOW_CLASSLOADER;
    public static int SHOW_FULL_DETAIL;
    public static int SHOW_INITIALIZED;
    public static int TRACE_COUNT_ALLOCS;
}

-keep class android.os.Debug$MemoryInfo {
    <init>();

    public int describeContents();
    public java.lang.String getMemoryStat(java.lang.String);
    public java.util.Map getMemoryStats();
    public static java.lang.String getOtherLabel(int);
    public int getOtherPrivate(int);
    public int getOtherPrivateClean(int);
    public int getOtherPrivateDirty(int);
    public int getOtherPss(int);
    public int getOtherRss(int);
    public int getOtherSharedClean(int);
    public int getOtherSharedDirty(int);
    public int getOtherSwappablePss(int);
    public int getOtherSwappedOut(int);
    public int getOtherSwappedOutPss(int);
    public int getSummaryCode();
    public int getSummaryGraphics();
    public int getSummaryJavaHeap();
    public int getSummaryNativeHeap();
    public int getSummaryPrivateOther();
    public int getSummaryStack();
    public int getSummarySystem();
    public int getSummaryTotalPss();
    public int getSummaryTotalSwap();
    public int getSummaryTotalSwapPss();
    public int getTotalPrivateClean();
    public int getTotalPrivateDirty();
    public int getTotalPss();
    public int getTotalRss();
    public int getTotalSharedClean();
    public int getTotalSharedDirty();
    public int getTotalSwappablePss();
    public int getTotalSwappedOut();
    public int getTotalSwappedOutPss();
    public int getTotalUss();
    public boolean hasSwappedOutPss();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int HEAP_DALVIK;
    public static int HEAP_NATIVE;
    public static int HEAP_UNKNOWN;
    public static int NUM_CATEGORIES;
    public static int NUM_DVK_STATS;
    public static int NUM_OTHER_STATS;
    public static int OFFSET_PRIVATE_CLEAN;
    public static int OFFSET_PRIVATE_DIRTY;
    public static int OFFSET_PSS;
    public static int OFFSET_RSS;
    public static int OFFSET_SHARED_CLEAN;
    public static int OFFSET_SHARED_DIRTY;
    public static int OFFSET_SWAPPABLE_PSS;
    public static int OFFSET_SWAPPED_OUT;
    public static int OFFSET_SWAPPED_OUT_PSS;
    public static int OTHER_APK;
    public static int OTHER_ART;
    public static int OTHER_ART_APP;
    public static int OTHER_ART_BOOT;
    public static int OTHER_ASHMEM;
    public static int OTHER_CURSOR;
    public static int OTHER_DALVIK_LARGE;
    public static int OTHER_DALVIK_NON_MOVING;
    public static int OTHER_DALVIK_NORMAL;
    public static int OTHER_DALVIK_OTHER;
    public static int OTHER_DALVIK_OTHER_ACCOUNTING;
    public static int OTHER_DALVIK_OTHER_CODE_CACHE;
    public static int OTHER_DALVIK_OTHER_COMPILER_METADATA;
    public static int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE;
    public static int OTHER_DALVIK_OTHER_LINEARALLOC;
    public static int OTHER_DALVIK_ZYGOTE;
    public static int OTHER_DEX;
    public static int OTHER_DEX_APP_DEX;
    public static int OTHER_DEX_APP_VDEX;
    public static int OTHER_DEX_BOOT_VDEX;
    public static int OTHER_DVK_STAT_ART_END;
    public static int OTHER_DVK_STAT_ART_START;
    public static int OTHER_DVK_STAT_DALVIK_END;
    public static int OTHER_DVK_STAT_DALVIK_OTHER_END;
    public static int OTHER_DVK_STAT_DALVIK_OTHER_START;
    public static int OTHER_DVK_STAT_DALVIK_START;
    public static int OTHER_DVK_STAT_DEX_END;
    public static int OTHER_DVK_STAT_DEX_START;
    public static int OTHER_GL;
    public static int OTHER_GL_DEV;
    public static int OTHER_GRAPHICS;
    public static int OTHER_JAR;
    public static int OTHER_OAT;
    public static int OTHER_OTHER_MEMTRACK;
    public static int OTHER_SO;
    public static int OTHER_STACK;
    public static int OTHER_TTF;
    public static int OTHER_UNKNOWN_DEV;
    public static int OTHER_UNKNOWN_MAP;
    public int dalvikPrivateClean;
    public int dalvikPrivateDirty;
    public int dalvikPss;
    public int dalvikRss;
    public int dalvikSharedClean;
    public int dalvikSharedDirty;
    public int dalvikSwappablePss;
    public int dalvikSwappedOut;
    public int dalvikSwappedOutPss;
    public boolean hasSwappedOutPss;
    public int nativePrivateClean;
    public int nativePrivateDirty;
    public int nativePss;
    public int nativeRss;
    public int nativeSharedClean;
    public int nativeSharedDirty;
    public int nativeSwappablePss;
    public int nativeSwappedOut;
    public int nativeSwappedOutPss;
    public int otherPrivateClean;
    public int otherPrivateDirty;
    public int otherPss;
    public int otherRss;
    public int otherSharedClean;
    public int otherSharedDirty;
    public int otherSwappablePss;
    public int otherSwappedOut;
    public int otherSwappedOutPss;
}

-keep class android.os.Handler {
    <init>();
    <init>(android.os.Handler$Callback);
    <init>(android.os.Looper);
    <init>(android.os.Looper, android.os.Handler$Callback);
    <init>(boolean);
    <init>(android.os.Handler$Callback, boolean);
    <init>(android.os.Looper, android.os.Handler$Callback, boolean);

    public static android.os.Handler createAsync(android.os.Looper);
    public static android.os.Handler createAsync(android.os.Looper, android.os.Handler$Callback);
    public void dispatchMessage(android.os.Message);
    public void dump(android.util.Printer, java.lang.String);
    public void dumpMine(android.util.Printer, java.lang.String);
    public boolean executeOrSendMessage(android.os.Message);
    public android.os.Looper getLooper();
    public static android.os.Handler getMain();
    public java.lang.String getMessageName(android.os.Message);
    public java.lang.String getTraceName(android.os.Message);
    public void handleMessage(android.os.Message);
    public boolean hasCallbacks(java.lang.Runnable);
    public boolean hasMessages(int);
    public boolean hasMessages(int, java.lang.Object);
    public boolean hasMessagesOrCallbacks();
    public static android.os.Handler mainIfNull(android.os.Handler);
    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 boolean postDelayed(java.lang.Runnable, java.lang.Object, 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 runWithScissors(java.lang.Runnable, long);
    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 void shellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    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 MAX_IPC_SIZE;
    public static int PING_TRANSACTION;
    public static int SHELL_COMMAND_TRANSACTION;
    public static int SYSPROPS_TRANSACTION;
    public static int TWEET_TRANSACTION;
}

-keep class android.os.IBinder$DeathRecipient {

    public abstract void binderDied();


}

-keep class android.os.ICancellationSignal {

    public abstract void cancel();


}

-keep class android.os.IInterface {

    public abstract android.os.IBinder asBinder();


}

-keep class android.os.IProgressListener {

    public abstract void onFinished(int, android.os.Bundle);
    public abstract void onProgress(int, int, android.os.Bundle);
    public abstract void onStarted(int, android.os.Bundle);


}

-keep class android.os.IRemoteCallback {

    public abstract void sendResult(android.os.Bundle);


}

-keep class android.os.LocaleList {
    <init>(java.util.Locale[]);
    <init>(java.util.Locale, android.os.LocaleList);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.os.LocaleList forLanguageTags(java.lang.String);
    public java.util.Locale get(int);
    public static android.os.LocaleList getAdjustedDefault();
    public static android.os.LocaleList getDefault();
    public static android.os.LocaleList getEmptyLocaleList();
    public java.util.Locale getFirstMatch(java.lang.String[]);
    public int getFirstMatchIndex(java.lang.String[]);
    public int getFirstMatchIndexWithEnglishSupported(java.util.Collection);
    public int getFirstMatchIndexWithEnglishSupported(java.lang.String[]);
    public java.util.Locale getFirstMatchWithEnglishSupported(java.lang.String[]);
    public int hashCode();
    public int indexOf(java.util.Locale);
    public boolean isEmpty();
    public static boolean isPseudoLocale(java.util.Locale);
    public static boolean isPseudoLocalesOnly(java.lang.String[]);
    public static void setDefault(android.os.LocaleList);
    public static void setDefault(android.os.LocaleList, int);
    public int size();
    public java.lang.String toLanguageTags();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.Looper {

    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, android.os.Handler);
    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 void setSlowLogThresholdMs(long, long);
    public void setTraceTag(long);
    public java.lang.String toString();
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


}

-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 android.os.Message setCallback(java.lang.Runnable);
    public void setData(android.os.Bundle);
    public void setTarget(android.os.Handler);
    public android.os.Message setWhat(int);
    public java.lang.String toString();
    public static void updateCheckRecycle(int);
    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 static java.lang.Object sPoolSync;
    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 boolean isPolling();
    public int postSyncBarrier();
    public void removeIdleHandler(android.os.MessageQueue$IdleHandler);
    public void removeOnFileDescriptorEventListener(java.io.FileDescriptor);
    public void removeSyncBarrier(int);


}

-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 adoptClassCookies(android.os.Parcel);
    public void appendFrom(android.os.Parcel, int, int);
    public int compareData(android.os.Parcel);
    public java.util.Map copyClassCookies();
    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.io.FileDescriptor[] createRawFileDescriptorArray();
    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 long getBlobAshmemSize();
    public java.lang.Object getClassCookie(java.lang.Class);
    public static long getGlobalAllocCount();
    public static long getGlobalAllocSize();
    public boolean hasFileDescriptors();
    public boolean hasReadWriteHelper();
    public byte[] marshall();
    public static android.os.Parcel obtain();
    protected static android.os.Parcel obtain(int);
    protected static android.os.Parcel obtain(long);
    public boolean pushAllowFds(boolean);
    public void putClassCookies(java.util.Map);
    public java.lang.Object[] readArray(java.lang.ClassLoader);
    public java.util.ArrayList readArrayList(java.lang.ClassLoader);
    public void readArrayMap(android.util.ArrayMap, java.lang.ClassLoader);
    public android.util.ArraySet readArraySet(java.lang.ClassLoader);
    public void readBinderArray(android.os.IBinder[]);
    public void readBinderList(java.util.List);
    public byte[] readBlob();
    public boolean readBoolean();
    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 java.lang.CharSequence readCharSequence();
    public java.lang.CharSequence[] readCharSequenceArray();
    public java.util.ArrayList readCharSequenceList();
    public android.os.Parcelable readCreator(android.os.Parcelable$Creator, java.lang.ClassLoader);
    public double readDouble();
    public void readDoubleArray(double[]);
    public void readException();
    public void readException(int, java.lang.String);
    public int readExceptionCode();
    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.Parcelable[] readParcelableArray(java.lang.ClassLoader, java.lang.Class);
    public android.os.Parcelable$Creator readParcelableCreator(java.lang.ClassLoader);
    public java.util.List readParcelableList(java.util.List, java.lang.ClassLoader);
    public android.os.PersistableBundle readPersistableBundle();
    public android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
    public java.io.FileDescriptor readRawFileDescriptor();
    public void readRawFileDescriptorArray(java.io.FileDescriptor[]);
    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 android.util.SparseIntArray readSparseIntArray();
    public java.lang.String readString();
    public void readStringArray(java.lang.String[]);
    public java.lang.String[] readStringArray();
    public void readStringList(java.util.List);
    public java.lang.String readStringNoHelper();
    public android.os.IBinder readStrongBinder();
    public void readTypedArray(java.lang.Object[], android.os.Parcelable$Creator);
    public java.lang.Object[] readTypedArray(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 restoreAllowFds(boolean);
    public void setClassCookie(java.lang.Class, java.lang.Object);
    public void setDataCapacity(int);
    public void setDataPosition(int);
    public void setDataSize(int);
    public void setReadWriteHelper(android.os.Parcel$ReadWriteHelper);
    public static void setStackTraceParceling(boolean);
    public void unmarshall(byte[], int, int);
    public void writeArray(java.lang.Object[]);
    public void writeArrayMap(android.util.ArrayMap);
    public void writeArraySet(android.util.ArraySet);
    public void writeBinderArray(android.os.IBinder[]);
    public void writeBinderList(java.util.List);
    public void writeBlob(byte[]);
    public void writeBlob(byte[], int, int);
    public void writeBoolean(boolean);
    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 writeCharSequence(java.lang.CharSequence);
    public void writeCharSequenceArray(java.lang.CharSequence[]);
    public void writeCharSequenceList(java.util.ArrayList);
    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 writeParcelableCreator(android.os.Parcelable);
    public void writeParcelableList(java.util.List, int);
    public void writePersistableBundle(android.os.PersistableBundle);
    public void writeRawFileDescriptor(java.io.FileDescriptor);
    public void writeRawFileDescriptorArray(java.io.FileDescriptor[]);
    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 writeSparseIntArray(android.util.SparseIntArray);
    public void writeString(java.lang.String);
    public void writeStringArray(java.lang.String[]);
    public void writeStringList(java.util.List);
    public void writeStringNoHelper(java.lang.String);
    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 writeTypedList(java.util.List, int);
    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.Parcel$ReadWriteHelper {
    <init>();

    public java.lang.String readString(android.os.Parcel);
    public void writeString(android.os.Parcel, java.lang.String);


    public static android.os.Parcel$ReadWriteHelper DEFAULT;
}

-keep class android.os.ParcelFileDescriptor {
    <init>(android.os.ParcelFileDescriptor);
    <init>(java.io.FileDescriptor);
    <init>(java.io.FileDescriptor, java.io.FileDescriptor);

    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[] createReliableSocketPair(int);
    public static android.os.ParcelFileDescriptor[] createSocketPair();
    public static android.os.ParcelFileDescriptor[] createSocketPair(int);
    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 fromData(byte[], java.lang.String);
    public static android.os.ParcelFileDescriptor fromDatagramSocket(java.net.DatagramSocket);
    public static android.os.ParcelFileDescriptor fromFd(java.io.FileDescriptor, android.os.Handler, android.os.ParcelFileDescriptor$OnCloseListener);
    public static android.os.ParcelFileDescriptor fromFd(int);
    public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
    public int getFd();
    public static java.io.File getFile(java.io.FileDescriptor);
    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 void releaseResources();
    public long seekTo(long);
    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_ELIDE_DUPLICATES;
    public static int PARCELABLE_WRITE_RETURN_VALUE;
}

-keep class android.os.Parcelable$ClassLoaderCreator {

    public abstract java.lang.Object createFromParcel(android.os.Parcel, java.lang.ClassLoader);


}

-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 void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static int PATTERN_ADVANCED_GLOB;
    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);
    <init>(android.os.Bundle);

    public java.lang.Object clone();
    public android.os.PersistableBundle deepCopy();
    public int describeContents();
    public static android.os.PersistableBundle forPair(java.lang.String, java.lang.String);
    public android.os.PersistableBundle getPersistableBundle(java.lang.String);
    public static boolean isValidType(java.lang.Object);
    public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
    public static android.os.PersistableBundle restoreFromXml(org.xmlpull.v1.XmlPullParser);
    public void saveToXml(org.xmlpull.v1.XmlSerializer);
    public synchronized java.lang.String toShortString();
    public synchronized java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    public void writeUnknownObject(java.lang.Object, java.lang.String, org.xmlpull.v1.XmlSerializer);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.PersistableBundle EMPTY;
}

-keep class android.os.RemoteException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);

    public java.lang.RuntimeException rethrowAsRuntimeException();
    public java.lang.RuntimeException rethrowFromSystemServer();


}

-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.ShellCallback {
    <init>();

    public int describeContents();
    public android.os.ParcelFileDescriptor onOpenFile(java.lang.String, java.lang.String, java.lang.String);
    public android.os.ParcelFileDescriptor openFile(java.lang.String, java.lang.String, java.lang.String);
    public static void writeToParcel(android.os.ShellCallback, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.ShellCommand {
    <init>();

    public android.os.ResultReceiver adoptResultReceiver();
    public int exec(android.os.Binder, java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    public java.io.InputStream getBufferedInputStream();
    public java.io.FileDescriptor getErrFileDescriptor();
    public java.io.PrintWriter getErrPrintWriter();
    public java.io.FileDescriptor getInFileDescriptor();
    public java.lang.String getNextArg();
    public java.lang.String getNextArgRequired();
    public java.lang.String getNextOption();
    public java.io.FileDescriptor getOutFileDescriptor();
    public java.io.PrintWriter getOutPrintWriter();
    public java.io.OutputStream getRawErrorStream();
    public java.io.InputStream getRawInputStream();
    public java.io.OutputStream getRawOutputStream();
    public android.os.ShellCallback getShellCallback();
    public int handleDefaultCommands(java.lang.String);
    public void init(android.os.Binder, java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, int);
    public abstract int onCommand(java.lang.String);
    public abstract void onHelp();
    public android.os.ParcelFileDescriptor openFileForSystem(java.lang.String, java.lang.String);
    public java.lang.String peekNextArg();


}

-keep class android.os.StrictMode {

    public static android.os.StrictMode$ThreadPolicy allowThreadDiskReads();
    public static int allowThreadDiskReadsMask();
    public static android.os.StrictMode$ThreadPolicy allowThreadDiskWrites();
    public static int allowThreadDiskWritesMask();
    public static void conditionallyCheckInstanceCounts();
    public static void decrementExpectedActivityCount(java.lang.Class);
    public static void disableDeathOnFileUriExposure();
    public static void enableDeathOnFileUriExposure();
    public static void enableDefaults();
    public static android.os.StrictMode$Span enterCriticalSpan(java.lang.String);
    public static android.os.StrictMode$ThreadPolicy getThreadPolicy();
    public static int getThreadPolicyMask();
    public static android.os.StrictMode$VmPolicy getVmPolicy();
    public static void incrementExpectedActivityCount(java.lang.Class);
    public static void initThreadDefaults(android.content.pm.ApplicationInfo);
    public static void initVmDefaults(android.content.pm.ApplicationInfo);
    public static boolean isBundledSystemApp(android.content.pm.ApplicationInfo);
    public static void noteDiskRead();
    public static void noteDiskWrite();
    public static void noteResourceMismatch(java.lang.Object);
    public static void noteSlowCall(java.lang.String);
    public static void noteUnbufferedIO();
    public static void onCleartextNetworkDetected(byte[]);
    public static void onContentUriWithoutPermission(android.net.Uri, java.lang.String);
    public static void onFileUriExposed(android.net.Uri, java.lang.String);
    public static void onIntentReceiverLeaked(java.lang.Throwable);
    public static void onServiceConnectionLeaked(java.lang.Throwable);
    public static void onSqliteObjectLeaked(java.lang.String, java.lang.Throwable);
    public static void onUntaggedSocket();
    public static void onVmPolicyViolation(android.os.strictmode.Violation);
    public static void onVmPolicyViolation(android.os.strictmode.Violation, boolean);
    public static void onWebViewMethodCalledOnWrongThread(java.lang.Throwable);
    public static void setThreadPolicy(android.os.StrictMode$ThreadPolicy);
    public static void setThreadPolicyMask(int);
    public static void setViolationLogger(android.os.StrictMode$ViolationLogger);
    public static void setVmPolicy(android.os.StrictMode$VmPolicy);
    public static java.lang.Object trackActivity(java.lang.Object);
    public static boolean vmCleartextNetworkEnabled();
    public static boolean vmClosableObjectLeaksEnabled();
    public static boolean vmContentUriWithoutPermissionEnabled();
    public static boolean vmFileUriExposureEnabled();
    public static boolean vmRegistrationLeaksEnabled();
    public static boolean vmSqliteObjectLeaksEnabled();
    public static boolean vmUntaggedSocketEnabled();


    public static java.lang.String CLEARTEXT_DETECTED_MSG;
    public static int DETECT_CUSTOM;
    public static int DETECT_DISK_READ;
    public static int DETECT_DISK_WRITE;
    public static int DETECT_EXPLICIT_GC;
    public static int DETECT_NETWORK;
    public static int DETECT_RESOURCE_MISMATCH;
    public static int DETECT_UNBUFFERED_IO;
    public static int DETECT_VM_ACTIVITY_LEAKS;
    public static int DETECT_VM_CLEARTEXT_NETWORK;
    public static int DETECT_VM_CLOSABLE_LEAKS;
    public static int DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION;
    public static int DETECT_VM_CURSOR_LEAKS;
    public static int DETECT_VM_FILE_URI_EXPOSURE;
    public static int DETECT_VM_INSTANCE_LEAKS;
    public static int DETECT_VM_NON_SDK_API_USAGE;
    public static int DETECT_VM_REGISTRATION_LEAKS;
    public static int DETECT_VM_UNTAGGED_SOCKET;
    public static java.lang.String DISABLE_PROPERTY;
    public static int NETWORK_POLICY_ACCEPT;
    public static int NETWORK_POLICY_LOG;
    public static int NETWORK_POLICY_REJECT;
    public static int PENALTY_DEATH;
    public static int PENALTY_DEATH_ON_CLEARTEXT_NETWORK;
    public static int PENALTY_DEATH_ON_FILE_URI_EXPOSURE;
    public static int PENALTY_DEATH_ON_NETWORK;
    public static int PENALTY_DIALOG;
    public static int PENALTY_DROPBOX;
    public static int PENALTY_FLASH;
    public static int PENALTY_GATHER;
    public static int PENALTY_LOG;
    public static java.lang.String VISUAL_PROPERTY;
}

-keep class android.os.StrictMode$Span {
    <init>();

    public void finish();


}

-keep class android.os.StrictMode$ThreadPolicy {

    public java.lang.String toString();


    public static android.os.StrictMode$ThreadPolicy LAX;
}

-keep class android.os.StrictMode$ViolationInfo {
    <init>(android.os.Parcel);
    <init>(android.os.Parcel, boolean);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public int getPolicyMask();
    public java.lang.String getStackTrace();
    public int getViolationBit();
    public java.lang.String getViolationDetails();
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String broadcastIntentAction;
    public int durationMillis;
    public int numAnimationsRunning;
    public long numInstances;
    public java.lang.String[] tags;
    public int violationNumThisLoop;
    public long violationUptimeMillis;
}

-keep class android.os.StrictMode$ViolationLogger {

    public abstract void log(android.os.StrictMode$ViolationInfo);


}

-keep class android.os.StrictMode$VmPolicy {

    public java.lang.String toString();


    public static android.os.StrictMode$VmPolicy LAX;
}

-keep class android.os.TestLooperManager {
    <init>(android.os.Looper);

    public void execute(android.os.Message);
    public android.os.MessageQueue getMessageQueue();
    public android.os.MessageQueue getQueue();
    public boolean hasMessages(android.os.Handler, java.lang.Object, int);
    public boolean hasMessages(android.os.Handler, java.lang.Object, java.lang.Runnable);
    public android.os.Message next();
    public void recycle(android.os.Message);
    public void release();


}

-keep class android.os.TransactionTracker {

    public void addTrace(java.lang.Throwable);
    public void clearTraces();
    public void writeTracesToFile(android.os.ParcelFileDescriptor);


}

-keep class android.os.UserHandle {
    <init>(int);
    <init>(android.os.Parcel);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static void formatUid(java.lang.StringBuilder, int);
    public static java.lang.String formatUid(int);
    public static void formatUid(java.io.PrintWriter, int);
    public static int getAppId(int);
    public static int getAppIdFromSharedAppGid(int);
    public static int getCacheAppGid(int);
    public static int getCacheAppGid(int, int);
    public static int getCallingAppId();
    public static int getCallingUserId();
    public int getIdentifier();
    public static int getSharedAppGid(int);
    public static int getSharedAppGid(int, int);
    public static int getUid(int, int);
    public static int getUserGid(int);
    public static android.os.UserHandle getUserHandleForUid(int);
    public static int getUserId(int);
    public int hashCode();
    public static boolean isApp(int);
    public static boolean isCore(int);
    public static boolean isIsolated(int);
    public boolean isOwner();
    public static boolean isSameApp(int, int);
    public static boolean isSameUser(int, int);
    public boolean isSystem();
    public static int myUserId();
    public static android.os.UserHandle of(int);
    public static int parseUserArg(java.lang.String);
    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 int AID_APP_END;
    public static int AID_APP_START;
    public static int AID_CACHE_GID_START;
    public static int AID_ROOT;
    public static int AID_SHARED_GID_START;
    public static android.os.UserHandle ALL;
    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.UserHandle CURRENT;
    public static android.os.UserHandle CURRENT_OR_SELF;
    public static int ERR_GID;
    public static boolean MU_ENABLED;
    public static android.os.UserHandle OWNER;
    public static int PER_USER_RANGE;
    public static android.os.UserHandle SYSTEM;
    public static int USER_ALL;
    public static int USER_CURRENT;
    public static int USER_CURRENT_OR_SELF;
    public static int USER_NULL;
    public static int USER_OWNER;
    public static int USER_SERIAL_SYSTEM;
    public static int USER_SYSTEM;
}

-keep class android.os.VibrationEffect {
    <init>();

    public static android.os.VibrationEffect createOneShot(long, int);
    public static android.os.VibrationEffect createWaveform(long[], int);
    public static android.os.VibrationEffect createWaveform(long[], int[], int);
    public int describeContents();
    public static android.os.VibrationEffect get(int);
    public static android.os.VibrationEffect get(int, boolean);
    public static android.os.VibrationEffect get(android.net.Uri, android.content.Context);
    public abstract long getDuration();
    protected static int scale(int, float, int);
    public abstract void validate();


    public static android.os.Parcelable$Creator CREATOR;
    public static int DEFAULT_AMPLITUDE;
    public static int EFFECT_CLICK;
    public static int EFFECT_DOUBLE_CLICK;
    public static int EFFECT_HEAVY_CLICK;
    public static int EFFECT_POP;
    public static int EFFECT_THUD;
    public static int EFFECT_TICK;
    public static int MAX_AMPLITUDE;
    public static int[] RINGTONES;
}

-keep class android.os.Vibrator {
    <init>();
    <init>(android.content.Context);

    public abstract void cancel();
    public int getDefaultHapticFeedbackIntensity();
    public int getDefaultNotificationVibrationIntensity();
    public abstract boolean hasAmplitudeControl();
    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);
    public void vibrate(android.os.VibrationEffect);
    public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
    public abstract void vibrate(int, java.lang.String, android.os.VibrationEffect, android.media.AudioAttributes);


    public static int VIBRATION_INTENSITY_HIGH;
    public static int VIBRATION_INTENSITY_LOW;
    public static int VIBRATION_INTENSITY_MEDIUM;
    public static int VIBRATION_INTENSITY_OFF;
}

-keep class android.os.WorkSource {
    <init>();
    <init>(android.os.WorkSource);
    <init>(int);
    <init>(int, java.lang.String);

    public boolean add(android.os.WorkSource);
    public boolean add(int);
    public boolean add(int, java.lang.String);
    public android.os.WorkSource addReturningNewbs(android.os.WorkSource);
    public void clear();
    public void clearNames();
    public android.os.WorkSource$WorkChain createWorkChain();
    public int describeContents();
    public boolean diff(android.os.WorkSource);
    public static java.util.ArrayList[] diffChains(android.os.WorkSource, android.os.WorkSource);
    public boolean equals(java.lang.Object);
    public int get(int);
    public java.lang.String getName(int);
    public java.util.ArrayList getWorkChains();
    public int hashCode();
    public static boolean isChainedBatteryAttributionEnabled(android.content.Context);
    public boolean isEmpty();
    public boolean remove(android.os.WorkSource);
    public void set(android.os.WorkSource);
    public void set(int);
    public void set(int, java.lang.String);
    public android.os.WorkSource[] setReturningDiffs(android.os.WorkSource);
    public int size();
    public java.lang.String toString();
    public void transferWorkChains(android.os.WorkSource);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.WorkSource$WorkChain {
    <init>();
    <init>(android.os.WorkSource$WorkChain);

    public android.os.WorkSource$WorkChain addNode(int, java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getAttributionTag();
    public int getAttributionUid();
    public int getSize();
    public java.lang.String[] getTags();
    public int[] getUids();
    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.os.storage.DiskInfo {
    <init>(java.lang.String, int);
    <init>(android.os.Parcel);

    public android.os.storage.DiskInfo clone();
    public java.lang.Object clone();
    public int describeContents();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public boolean equals(java.lang.Object);
    public java.lang.String getDescription();
    public java.lang.String getId();
    public java.lang.String getShortDescription();
    public int hashCode();
    public boolean isAdoptable();
    public boolean isDefaultPrimary();
    public boolean isSd();
    public boolean isUsb();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static java.lang.String ACTION_DISK_SCANNED;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_DISK_ID;
    public static java.lang.String EXTRA_VOLUME_COUNT;
    public static int FLAG_ADOPTABLE;
    public static int FLAG_DEFAULT_PRIMARY;
    public static int FLAG_SD;
    public static int FLAG_USB;
    public int flags;
    public java.lang.String id;
    public java.lang.String label;
    public long size;
    public java.lang.String sysPath;
    public int volumeCount;
}

-keep class android.os.storage.StorageVolume {
    <init>(java.lang.String, java.io.File, java.io.File, java.lang.String, boolean, boolean, boolean, boolean, long, android.os.UserHandle, java.lang.String, java.lang.String);

    public boolean allowMassStorage();
    public android.content.Intent createAccessIntent(java.lang.String);
    public int describeContents();
    public java.lang.String dump();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public boolean equals(java.lang.Object);
    public java.lang.String getDescription(android.content.Context);
    public int getFatVolumeId();
    public java.lang.String getId();
    public java.lang.String getInternalPath();
    public long getMaxFileSize();
    public android.os.UserHandle getOwner();
    public java.lang.String getPath();
    public java.io.File getPathFile();
    public java.lang.String getState();
    public java.lang.String getUserLabel();
    public java.lang.String getUuid();
    public int hashCode();
    public boolean isEmulated();
    public boolean isPrimary();
    public boolean isRemovable();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_DIRECTORY_NAME;
    public static java.lang.String EXTRA_STORAGE_VOLUME;
    public static int STORAGE_ID_INVALID;
    public static int STORAGE_ID_PRIMARY;
}

-keep class android.os.storage.VolumeInfo {
    <init>(java.lang.String, int, android.os.storage.DiskInfo, java.lang.String);
    <init>(android.os.Parcel);

    public android.content.Intent buildBrowseIntent();
    public android.content.Intent buildBrowseIntentForUser(int);
    public static int buildStableMtpStorageId(java.lang.String);
    public android.os.storage.StorageVolume buildStorageVolume(android.content.Context, int, boolean);
    public android.os.storage.VolumeInfo clone();
    public java.lang.Object clone();
    public int describeContents();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public boolean equals(java.lang.Object);
    public static java.lang.String getBroadcastForEnvironment(java.lang.String);
    public static java.lang.String getBroadcastForState(int);
    public java.lang.String getDescription();
    public static java.util.Comparator getDescriptionComparator();
    public android.os.storage.DiskInfo getDisk();
    public java.lang.String getDiskId();
    public static java.lang.String getEnvironmentForState(int);
    public java.lang.String getFsUuid();
    public java.lang.String getId();
    public java.io.File getInternalPath();
    public java.io.File getInternalPathForUser(int);
    public int getMountUserId();
    public java.io.File getPath();
    public java.io.File getPathForUser(int);
    public int getState();
    public int getStateDescription();
    public int getType();
    public int hashCode();
    public boolean isMountedReadable();
    public boolean isMountedWritable();
    public boolean isPrimary();
    public boolean isPrimaryPhysical();
    public boolean isVisible();
    public boolean isVisibleForRead(int);
    public boolean isVisibleForUser(int);
    public boolean isVisibleForWrite(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static java.lang.String ACTION_VOLUME_STATE_CHANGED;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_VOLUME_ID;
    public static java.lang.String EXTRA_VOLUME_STATE;
    public static java.lang.String ID_EMULATED_INTERNAL;
    public static java.lang.String ID_PRIVATE_INTERNAL;
    public static int MOUNT_FLAG_PRIMARY;
    public static int MOUNT_FLAG_VISIBLE;
    public static int STATE_BAD_REMOVAL;
    public static int STATE_CHECKING;
    public static int STATE_EJECTING;
    public static int STATE_FORMATTING;
    public static int STATE_MOUNTED;
    public static int STATE_MOUNTED_READ_ONLY;
    public static int STATE_REMOVED;
    public static int STATE_UNMOUNTABLE;
    public static int STATE_UNMOUNTED;
    public static int TYPE_ASEC;
    public static int TYPE_EMULATED;
    public static int TYPE_OBB;
    public static int TYPE_PRIVATE;
    public static int TYPE_PUBLIC;
    public android.os.storage.DiskInfo disk;
    public java.lang.String fsLabel;
    public java.lang.String fsType;
    public java.lang.String fsUuid;
    public java.lang.String id;
    public java.lang.String internalPath;
    public int mountFlags;
    public int mountUserId;
    public java.lang.String partGuid;
    public java.lang.String path;
    public int state;
    public int type;
}

-keep class android.os.strictmode.Violation {



}

-keep class android.service.autofill.FieldClassification {
    <init>(java.util.ArrayList);

    public java.util.List getMatches();
    public java.lang.String toString();


}

-keep class android.service.autofill.FieldClassification$Match {
    <init>(java.lang.String, float);

    public java.lang.String getCategoryId();
    public float getScore();
    public java.lang.String toString();


}

-keep class android.service.autofill.FillEventHistory {
    <init>(int, android.os.Bundle);

    public void addEvent(android.service.autofill.FillEventHistory$Event);
    public int describeContents();
    public android.os.Bundle getClientState();
    public java.util.List getEvents();
    public int getSessionId();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.service.autofill.FillEventHistory$Event {
    <init>(int, java.lang.String, android.os.Bundle, java.util.List, android.util.ArraySet, java.util.ArrayList, java.util.ArrayList, java.util.ArrayList, java.util.ArrayList, android.view.autofill.AutofillId[], android.service.autofill.FieldClassification[]);

    public java.util.Map getChangedFields();
    public android.os.Bundle getClientState();
    public java.lang.String getDatasetId();
    public java.util.Map getFieldsClassification();
    public java.util.Set getIgnoredDatasetIds();
    public java.util.Map getManuallyEnteredField();
    public java.util.Set getSelectedDatasetIds();
    public int getType();
    public java.lang.String toString();


    public static int TYPE_AUTHENTICATION_SELECTED;
    public static int TYPE_CONTEXT_COMMITTED;
    public static int TYPE_DATASET_AUTHENTICATION_SELECTED;
    public static int TYPE_DATASET_SELECTED;
    public static int TYPE_SAVE_SHOWN;
}

-keep class android.service.autofill.UserData {

    public int describeContents();
    public void dump(java.lang.String, java.io.PrintWriter);
    public static void dumpConstraints(java.lang.String, java.io.PrintWriter);
    public android.os.Bundle getAlgorithmArgs();
    public java.lang.String[] getCategoryIds();
    public java.lang.String getFieldClassificationAlgorithm();
    public java.lang.String getId();
    public static int getMaxCategoryCount();
    public static int getMaxFieldClassificationIdsSize();
    public static int getMaxUserDataSize();
    public static int getMaxValueLength();
    public static int getMinValueLength();
    public java.lang.String[] getValues();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.service.voice.IVoiceInteractionSession {

    public abstract void closeSystemDialogs();
    public abstract void destroy();
    public abstract void handleAssist(android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent, int, int);
    public abstract void handleScreenshot(android.graphics.Bitmap);
    public abstract void hide();
    public abstract void onLockscreenShown();
    public abstract void show(android.os.Bundle, int, com.android.internal.app.IVoiceInteractionSessionShowCallback);
    public abstract void taskFinished(android.content.Intent, int);
    public abstract void taskStarted(android.content.Intent, int);


}

-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 java.lang.String INFO_SERVICE;
    public static java.lang.String NAVIGATION_STATUS_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 float getEvBatteryCapacity();
    public abstract int[] getEvConnectorTypes();
    public abstract float getFuelCapacity();
    public abstract int[] getFuelTypes();
    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 static int INDEX_WHEEL_DISTANCE_FRONT_LEFT;
    public static int INDEX_WHEEL_DISTANCE_FRONT_RIGHT;
    public static int INDEX_WHEEL_DISTANCE_REAR_LEFT;
    public static int INDEX_WHEEL_DISTANCE_REAR_RIGHT;
    public static int INDEX_WHEEL_DISTANCE_RESET_COUNT;
    public float[] floatValues;
    public int[] intValues;
    public long[] longValues;
    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_ABS_ACTIVE;
    public static int SENSOR_TYPE_COMPASS;
    public static int SENSOR_TYPE_DRIVING_STATUS;
    public static int SENSOR_TYPE_EV_BATTERY_CHARGE_RATE;
    public static int SENSOR_TYPE_EV_BATTERY_LEVEL;
    public static int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED;
    public static int SENSOR_TYPE_EV_CHARGE_PORT_OPEN;
    public static int SENSOR_TYPE_FUEL_DOOR_OPEN;
    public static int SENSOR_TYPE_NIGHT;
    public static int SENSOR_TYPE_PARKING_BRAKE;
    public static int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE;
    public static int SENSOR_TYPE_WHEEL_TICK_DISTANCE;
}

-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 android.support.car.media.CarAudioRecord createCarAudioRecord(int);
    public abstract android.media.AudioFormat getAudioRecordAudioFormat();
    public abstract int getAudioRecordMaxBufferSize();
    public abstract int getAudioRecordMinBufferSize();
    public abstract boolean isAudioRecordSupported();


}

-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 sendEvent(int, android.os.Bundle);


}

-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.transition.PathMotion {
    <init>();
    <init>(android.content.Context, android.util.AttributeSet);

    public abstract android.graphics.Path getPath(float, float, float, float);


}

-keep class android.transition.Scene {
    <init>(android.view.ViewGroup);
    <init>(android.view.ViewGroup, android.view.View);
    <init>(android.view.ViewGroup, android.view.ViewGroup);

    public void enter();
    public void exit();
    public static android.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
    public android.view.ViewGroup getSceneRoot();
    public void setEnterAction(java.lang.Runnable);
    public void setExitAction(java.lang.Runnable);


}

-keep class android.transition.Transition {
    <init>();
    <init>(android.content.Context, android.util.AttributeSet);

    public android.transition.Transition addListener(android.transition.Transition$TransitionListener);
    public android.transition.Transition addTarget(int);
    public android.transition.Transition addTarget(java.lang.String);
    public android.transition.Transition addTarget(java.lang.Class);
    public android.transition.Transition addTarget(android.view.View);
    protected void animate(android.animation.Animator);
    public boolean canRemoveViews();
    protected void cancel();
    public abstract void captureEndValues(android.transition.TransitionValues);
    public abstract void captureStartValues(android.transition.TransitionValues);
    public android.transition.Transition clone();
    public java.lang.Object clone();
    public android.animation.Animator createAnimator(android.view.ViewGroup, android.transition.TransitionValues, android.transition.TransitionValues);
    protected void createAnimators(android.view.ViewGroup, android.transition.TransitionValuesMaps, android.transition.TransitionValuesMaps, java.util.ArrayList, java.util.ArrayList);
    protected void end();
    public android.transition.Transition excludeChildren(int, boolean);
    public android.transition.Transition excludeChildren(android.view.View, boolean);
    public android.transition.Transition excludeChildren(java.lang.Class, boolean);
    public android.transition.Transition excludeTarget(int, boolean);
    public android.transition.Transition excludeTarget(java.lang.String, boolean);
    public android.transition.Transition excludeTarget(android.view.View, boolean);
    public android.transition.Transition excludeTarget(java.lang.Class, boolean);
    public long getDuration();
    public android.graphics.Rect getEpicenter();
    public android.transition.Transition$EpicenterCallback getEpicenterCallback();
    public android.animation.TimeInterpolator getInterpolator();
    public java.lang.String getName();
    public android.util.ArrayMap getNameOverrides();
    public android.transition.PathMotion getPathMotion();
    public android.transition.TransitionPropagation getPropagation();
    public long getStartDelay();
    public java.util.List getTargetIds();
    public java.util.List getTargetNames();
    public java.util.List getTargetTypes();
    public java.util.List getTargetViewNames();
    public java.util.List getTargets();
    public java.lang.String[] getTransitionProperties();
    public android.transition.TransitionValues getTransitionValues(android.view.View, boolean);
    public boolean isTransitionRequired(android.transition.TransitionValues, android.transition.TransitionValues);
    public boolean isValidTarget(android.view.View);
    public void pause(android.view.View);
    public android.transition.Transition removeListener(android.transition.Transition$TransitionListener);
    public android.transition.Transition removeTarget(int);
    public android.transition.Transition removeTarget(java.lang.String);
    public android.transition.Transition removeTarget(android.view.View);
    public android.transition.Transition removeTarget(java.lang.Class);
    public void resume(android.view.View);
    protected void runAnimators();
    public android.transition.Transition setDuration(long);
    public void setEpicenterCallback(android.transition.Transition$EpicenterCallback);
    public android.transition.Transition setInterpolator(android.animation.TimeInterpolator);
    public void setMatchOrder(int[]);
    public void setNameOverrides(android.util.ArrayMap);
    public void setPathMotion(android.transition.PathMotion);
    public void setPropagation(android.transition.TransitionPropagation);
    public android.transition.Transition setStartDelay(long);
    protected void start();
    public java.lang.String toString();


    public static int MATCH_ID;
    public static int MATCH_INSTANCE;
    public static int MATCH_ITEM_ID;
    public static int MATCH_NAME;
}

-keep class android.transition.Transition$EpicenterCallback {
    <init>();

    public abstract android.graphics.Rect onGetEpicenter(android.transition.Transition);


}

-keep class android.transition.Transition$TransitionListener {

    public abstract void onTransitionCancel(android.transition.Transition);
    public abstract void onTransitionEnd(android.transition.Transition);
    public abstract void onTransitionPause(android.transition.Transition);
    public abstract void onTransitionResume(android.transition.Transition);
    public abstract void onTransitionStart(android.transition.Transition);


}

-keep class android.transition.TransitionManager {
    <init>();

    public static void beginDelayedTransition(android.view.ViewGroup);
    public static void beginDelayedTransition(android.view.ViewGroup, android.transition.Transition);
    public static void endTransitions(android.view.ViewGroup);
    public static android.transition.Transition getDefaultTransition();
    public android.transition.Transition getTransition(android.transition.Scene);
    public static void go(android.transition.Scene);
    public static void go(android.transition.Scene, android.transition.Transition);
    public void setDefaultTransition(android.transition.Transition);
    public void setTransition(android.transition.Scene, android.transition.Transition);
    public void setTransition(android.transition.Scene, android.transition.Scene, android.transition.Transition);
    public void transitionTo(android.transition.Scene);


}

-keep class android.transition.TransitionPropagation {
    <init>();

    public abstract void captureValues(android.transition.TransitionValues);
    public abstract java.lang.String[] getPropagationProperties();
    public abstract long getStartDelay(android.view.ViewGroup, android.transition.Transition, android.transition.TransitionValues, android.transition.TransitionValues);


}

-keep class android.transition.TransitionValues {
    <init>();

    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();


    public java.util.Map values;
    public android.view.View view;
}

-keep class android.transition.TransitionValuesMaps {



}

-keep class android.util.AndroidException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Exception);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);



}

-keep class android.util.ArrayMap {
    <init>();
    <init>(int);
    <init>(int, boolean);
    <init>(android.util.ArrayMap);

    public void append(java.lang.Object, java.lang.Object);
    public void clear();
    public boolean containsAll(java.util.Collection);
    public boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public void ensureCapacity(int);
    public java.util.Set entrySet();
    public boolean equals(java.lang.Object);
    public void erase();
    public java.lang.Object get(java.lang.Object);
    public int hashCode();
    public int indexOfKey(java.lang.Object);
    public boolean isEmpty();
    public java.lang.Object keyAt(int);
    public java.util.Set keySet();
    public java.lang.Object put(java.lang.Object, java.lang.Object);
    public void putAll(android.util.ArrayMap);
    public void putAll(java.util.Map);
    public java.lang.Object remove(java.lang.Object);
    public boolean removeAll(java.util.Collection);
    public java.lang.Object removeAt(int);
    public boolean retainAll(java.util.Collection);
    public java.lang.Object setValueAt(int, java.lang.Object);
    public int size();
    public java.lang.String toString();
    public void validate();
    public java.lang.Object valueAt(int);
    public java.util.Collection values();


    public static android.util.ArrayMap EMPTY;
}

-keep class android.util.ArraySet {
    <init>();
    <init>(int);
    <init>(int, boolean);
    <init>(android.util.ArraySet);
    <init>(java.util.Collection);

    public boolean add(java.lang.Object);
    public void addAll(android.util.ArraySet);
    public boolean addAll(java.util.Collection);
    public void append(java.lang.Object);
    public void clear();
    public boolean contains(java.lang.Object);
    public boolean containsAll(java.util.Collection);
    public void ensureCapacity(int);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public int indexOf(java.lang.Object);
    public boolean isEmpty();
    public java.util.Iterator iterator();
    public boolean remove(java.lang.Object);
    public boolean removeAll(android.util.ArraySet);
    public boolean removeAll(java.util.Collection);
    public java.lang.Object removeAt(int);
    public boolean retainAll(java.util.Collection);
    public int size();
    public java.lang.Object[] toArray();
    public java.lang.Object[] toArray(java.lang.Object[]);
    public java.lang.String toString();
    public java.lang.Object valueAt(int);


}

-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 java.lang.String getAttributeNamespace(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 boolean equalsPhysical(android.util.DisplayMetrics);
    public int hashCode();
    public void setTo(android.util.DisplayMetrics);
    public void setToDefaults();
    public java.lang.String toString();


    public static int DENSITY_260;
    public static int DENSITY_280;
    public static int DENSITY_300;
    public static int DENSITY_340;
    public static int DENSITY_360;
    public static int DENSITY_400;
    public static int DENSITY_420;
    public static int DENSITY_440;
    public static int DENSITY_560;
    public static int DENSITY_DEFAULT;
    public static float DENSITY_DEFAULT_SCALE;
    public static int DENSITY_DEVICE;
    public static int DENSITY_DEVICE_STABLE;
    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 noncompatDensity;
    public int noncompatDensityDpi;
    public int noncompatHeightPixels;
    public float noncompatScaledDensity;
    public int noncompatWidthPixels;
    public float noncompatXdpi;
    public float noncompatYdpi;
    public float scaledDensity;
    public int widthPixels;
    public float xdpi;
    public float ydpi;
}

-keep class android.util.LongArray {
    <init>();
    <init>(int);

    public void add(long);
    public void add(int, long);
    public void addAll(android.util.LongArray);
    public void clear();
    public android.util.LongArray clone();
    public java.lang.Object clone();
    public static boolean elementsEqual(android.util.LongArray, android.util.LongArray);
    public static android.util.LongArray fromArray(long[], int);
    public long get(int);
    public int indexOf(long);
    public void remove(int);
    public void resize(int);
    public void set(int, long);
    public int size();
    public long[] toArray();
    public static android.util.LongArray wrap(long[]);


}

-keep class android.util.LongSparseArray {
    <init>();
    <init>(int);

    public void append(long, java.lang.Object);
    public void clear();
    public android.util.LongSparseArray clone();
    public java.lang.Object clone();
    public void delete(long);
    public java.lang.Object get(long);
    public java.lang.Object get(long, java.lang.Object);
    public int indexOfKey(long);
    public int indexOfValue(java.lang.Object);
    public int indexOfValueByValue(java.lang.Object);
    public long keyAt(int);
    public void put(long, java.lang.Object);
    public void remove(long);
    public void removeAt(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.MergedConfiguration {
    <init>();
    <init>(android.content.res.Configuration, android.content.res.Configuration);
    <init>(android.content.res.Configuration);
    <init>(android.util.MergedConfiguration);

    public int describeContents();
    public void dump(java.io.PrintWriter, java.lang.String);
    public boolean equals(java.lang.Object);
    public android.content.res.Configuration getGlobalConfiguration();
    public android.content.res.Configuration getMergedConfiguration();
    public android.content.res.Configuration getOverrideConfiguration();
    public int hashCode();
    public void readFromParcel(android.os.Parcel);
    public void setConfiguration(android.content.res.Configuration, android.content.res.Configuration);
    public void setGlobalConfiguration(android.content.res.Configuration);
    public void setOverrideConfiguration(android.content.res.Configuration);
    public void setTo(android.util.MergedConfiguration);
    public java.lang.String toString();
    public void unset();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-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.String toString();


    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.Property {
    <init>(java.lang.Class, java.lang.String);

    public abstract java.lang.Object get(java.lang.Object);
    public java.lang.String getName();
    public java.lang.Class getType();
    public boolean isReadOnly();
    public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String);
    public void set(java.lang.Object, java.lang.Object);


}

-keep class android.util.Rational {
    <init>(int, int);

    public int compareTo(android.util.Rational);
    public int compareTo(java.lang.Object);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public static int gcd(int, int);
    public int getDenominator();
    public int getNumerator();
    public int hashCode();
    public int intValue();
    public boolean isFinite();
    public boolean isInfinite();
    public boolean isNaN();
    public boolean isZero();
    public long longValue();
    public static android.util.Rational parseRational(java.lang.String);
    public short shortValue();
    public float toFloat();
    public java.lang.String toString();


    public static android.util.Rational NEGATIVE_INFINITY;
    public static android.util.Rational NaN;
    public static android.util.Rational POSITIVE_INFINITY;
    public static android.util.Rational ZERO;
}

-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 indexOfValueByValue(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 java.lang.Object removeReturnOld(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 equals(java.lang.Object);
    public boolean get(int);
    public boolean get(int, boolean);
    public int hashCode();
    public int indexOfKey(int);
    public int indexOfValue(boolean);
    public int keyAt(int);
    public void put(int, boolean);
    public void removeAt(int);
    public void setKeyAt(int, int);
    public void setValueAt(int, boolean);
    public int size();
    public java.lang.String toString();
    public boolean valueAt(int);


}

-keep class android.util.SparseIntArray {
    <init>();
    <init>(int);

    public void append(int, int);
    public void clear();
    public android.util.SparseIntArray clone();
    public java.lang.Object clone();
    public int[] copyKeys();
    public void delete(int);
    public int get(int);
    public int get(int, int);
    public int indexOfKey(int);
    public int indexOfValue(int);
    public int keyAt(int);
    public void put(int, int);
    public void removeAt(int);
    public void setValueAt(int, int);
    public int size();
    public java.lang.String toString();
    public int 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 float complexToDimensionNoisy(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.util.proto.ProtoOutputStream {
    <init>();
    <init>(int);
    <init>(java.io.OutputStream);
    <init>(java.io.FileDescriptor);

    public static int checkFieldId(long, long);
    public static int convertObjectIdToOrdinal(int);
    public void dump(java.lang.String);
    public void end(long);
    public void endObject(long);
    public void endRepeatedObject(long);
    public void flush();
    public byte[] getBytes();
    public static int getDepthFromToken(long);
    public static int getObjectIdFromToken(long);
    public static boolean getRepeatedFromToken(long);
    public static int getSizePosFromToken(long);
    public static int getTagSizeFromToken(long);
    public static long makeFieldId(int, long);
    public static long makeToken(int, boolean, int, int, int);
    public long start(long);
    public long startObject(long);
    public long startRepeatedObject(long);
    public static java.lang.String token2String(long);
    public void write(long, double);
    public void write(long, float);
    public void write(long, int);
    public void write(long, long);
    public void write(long, boolean);
    public void write(long, java.lang.String);
    public void write(long, byte[]);
    public void writeBool(long, boolean);
    public void writeBytes(long, byte[]);
    public void writeDouble(long, double);
    public void writeEnum(long, int);
    public void writeFixed32(long, int);
    public void writeFixed64(long, long);
    public void writeFloat(long, float);
    public void writeInt32(long, int);
    public void writeInt64(long, long);
    public void writeObject(long, byte[]);
    public void writePackedBool(long, boolean[]);
    public void writePackedDouble(long, double[]);
    public void writePackedEnum(long, int[]);
    public void writePackedFixed32(long, int[]);
    public void writePackedFixed64(long, long[]);
    public void writePackedFloat(long, float[]);
    public void writePackedInt32(long, int[]);
    public void writePackedInt64(long, long[]);
    public void writePackedSFixed32(long, int[]);
    public void writePackedSFixed64(long, long[]);
    public void writePackedSInt32(long, int[]);
    public void writePackedSInt64(long, long[]);
    public void writePackedUInt32(long, int[]);
    public void writePackedUInt64(long, long[]);
    public void writeRepeatedBool(long, boolean);
    public void writeRepeatedBytes(long, byte[]);
    public void writeRepeatedDouble(long, double);
    public void writeRepeatedEnum(long, int);
    public void writeRepeatedFixed32(long, int);
    public void writeRepeatedFixed64(long, long);
    public void writeRepeatedFloat(long, float);
    public void writeRepeatedInt32(long, int);
    public void writeRepeatedInt64(long, long);
    public void writeRepeatedObject(long, byte[]);
    public void writeRepeatedSFixed32(long, int);
    public void writeRepeatedSFixed64(long, long);
    public void writeRepeatedSInt32(long, int);
    public void writeRepeatedSInt64(long, long);
    public void writeRepeatedString(long, java.lang.String);
    public void writeRepeatedUInt32(long, int);
    public void writeRepeatedUInt64(long, long);
    public void writeSFixed32(long, int);
    public void writeSFixed64(long, long);
    public void writeSInt32(long, int);
    public void writeSInt64(long, long);
    public void writeString(long, java.lang.String);
    public void writeTag(int, int);
    public void writeUInt32(long, int);
    public void writeUInt64(long, long);


    public static long FIELD_COUNT_MASK;
    public static long FIELD_COUNT_PACKED;
    public static long FIELD_COUNT_REPEATED;
    public static int FIELD_COUNT_SHIFT;
    public static long FIELD_COUNT_SINGLE;
    public static long FIELD_COUNT_UNKNOWN;
    public static int FIELD_ID_MASK;
    public static int FIELD_ID_SHIFT;
    public static long FIELD_TYPE_BOOL;
    public static long FIELD_TYPE_BYTES;
    public static long FIELD_TYPE_DOUBLE;
    public static long FIELD_TYPE_ENUM;
    public static long FIELD_TYPE_FIXED32;
    public static long FIELD_TYPE_FIXED64;
    public static long FIELD_TYPE_FLOAT;
    public static long FIELD_TYPE_INT32;
    public static long FIELD_TYPE_INT64;
    public static long FIELD_TYPE_MASK;
    public static long FIELD_TYPE_MESSAGE;
    public static long FIELD_TYPE_SFIXED32;
    public static long FIELD_TYPE_SFIXED64;
    public static int FIELD_TYPE_SHIFT;
    public static long FIELD_TYPE_SINT32;
    public static long FIELD_TYPE_SINT64;
    public static long FIELD_TYPE_STRING;
    public static long FIELD_TYPE_UINT32;
    public static long FIELD_TYPE_UINT64;
    public static long FIELD_TYPE_UNKNOWN;
    public static java.lang.String TAG;
    public static int WIRE_TYPE_END_GROUP;
    public static int WIRE_TYPE_FIXED32;
    public static int WIRE_TYPE_FIXED64;
    public static int WIRE_TYPE_LENGTH_DELIMITED;
    public static int WIRE_TYPE_MASK;
    public static int WIRE_TYPE_START_GROUP;
    public static int WIRE_TYPE_VARINT;
}

-keep class android.view.AccessibilityInteractionController {
    <init>(android.view.ViewRootImpl);

    public void findAccessibilityNodeInfoByAccessibilityIdClientThread(long, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec, android.os.Bundle);
    public void findAccessibilityNodeInfosByTextClientThread(long, java.lang.String, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void findAccessibilityNodeInfosByViewIdClientThread(long, java.lang.String, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void findFocusClientThread(long, int, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void focusSearchClientThread(long, int, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void performAccessibilityActionClientThread(long, int, android.os.Bundle, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long);


}

-keep class android.view.AccessibilityIterators {
    <init>();



}

-keep class android.view.AccessibilityIterators$TextSegmentIterator {

    public abstract int[] following(int);
    public abstract int[] preceding(int);


}

-keep class android.view.ActionMode {
    <init>();

    public abstract void finish();
    public abstract android.view.View getCustomView();
    public abstract android.view.Menu getMenu();
    public abstract android.view.MenuInflater getMenuInflater();
    public abstract java.lang.CharSequence getSubtitle();
    public java.lang.Object getTag();
    public abstract java.lang.CharSequence getTitle();
    public boolean getTitleOptionalHint();
    public int getType();
    public void hide(long);
    public abstract void invalidate();
    public void invalidateContentRect();
    public boolean isTitleOptional();
    public boolean isUiFocusable();
    public void onWindowFocusChanged(boolean);
    public abstract void setCustomView(android.view.View);
    public abstract void setSubtitle(java.lang.CharSequence);
    public abstract void setSubtitle(int);
    public void setTag(java.lang.Object);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setTitle(int);
    public void setTitleOptionalHint(boolean);
    public void setType(int);


    public static int DEFAULT_HIDE_DURATION;
    public static int TYPE_FLOATING;
    public static int TYPE_PRIMARY;
}

-keep class android.view.ActionMode$Callback {

    public abstract boolean onActionItemClicked(android.view.ActionMode, android.view.MenuItem);
    public abstract boolean onCreateActionMode(android.view.ActionMode, android.view.Menu);
    public abstract void onDestroyActionMode(android.view.ActionMode);
    public abstract boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);


}

-keep class android.view.ActionProvider {
    <init>(android.content.Context);

    public boolean hasSubMenu();
    public boolean isVisible();
    public abstract android.view.View onCreateActionView();
    public android.view.View onCreateActionView(android.view.MenuItem);
    public boolean onPerformDefaultAction();
    public void onPrepareSubMenu(android.view.SubMenu);
    public boolean overridesItemVisibility();
    public void refreshVisibility();
    public void reset();
    public void setSubUiVisibilityListener(android.view.ActionProvider$SubUiVisibilityListener);
    public void setVisibilityListener(android.view.ActionProvider$VisibilityListener);
    public void subUiVisibilityChanged(boolean);


}

-keep class android.view.ActionProvider$SubUiVisibilityListener {

    public abstract void onSubUiVisibilityChanged(boolean);


}

-keep class android.view.ActionProvider$VisibilityListener {

    public abstract void onActionProviderVisibilityChanged(boolean);


}

-keep class android.view.AppTransitionAnimationSpec {
    <init>(int, android.graphics.GraphicBuffer, android.graphics.Rect);
    <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 android.graphics.GraphicBuffer buffer;
    public android.graphics.Rect rect;
    public int taskId;
}

-keep class android.view.Choreographer {

    public static long getFrameDelay();
    public long getFrameIntervalNanos();
    public long getFrameTime();
    public long getFrameTimeNanos();
    public static android.view.Choreographer getInstance();
    public long getLastFrameTimeNanos();
    public static android.view.Choreographer getMainThreadInstance();
    public static android.view.Choreographer getSfInstance();
    public void postCallback(int, java.lang.Runnable, java.lang.Object);
    public void postCallbackDelayed(int, java.lang.Runnable, java.lang.Object, long);
    public void postFrameCallback(android.view.Choreographer$FrameCallback);
    public void postFrameCallbackDelayed(android.view.Choreographer$FrameCallback, long);
    public static void releaseInstance();
    public void removeCallbacks(int, java.lang.Runnable, java.lang.Object);
    public void removeFrameCallback(android.view.Choreographer$FrameCallback);
    public static void setFrameDelay(long);
    public static long subtractFrameDelay(long);


    public static int CALLBACK_ANIMATION;
    public static int CALLBACK_COMMIT;
    public static int CALLBACK_INPUT;
    public static int CALLBACK_TRAVERSAL;
}

-keep class android.view.Choreographer$FrameCallback {

    public abstract void doFrame(long);


}

-keep class android.view.ContextMenu {

    public abstract void clearHeader();
    public abstract android.view.ContextMenu setHeaderIcon(int);
    public abstract android.view.ContextMenu setHeaderIcon(android.graphics.drawable.Drawable);
    public abstract android.view.ContextMenu setHeaderTitle(int);
    public abstract android.view.ContextMenu setHeaderTitle(java.lang.CharSequence);
    public abstract android.view.ContextMenu setHeaderView(android.view.View);


}

-keep class android.view.ContextMenu$ContextMenuInfo {



}

-keep class android.view.ContextThemeWrapper {
    <init>();
    <init>(android.content.Context, int);
    <init>(android.content.Context, android.content.res.Resources$Theme);

    public void applyOverrideConfiguration(android.content.res.Configuration);
    protected void attachBaseContext(android.content.Context);
    public android.content.res.AssetManager getAssets();
    public android.content.res.Configuration getOverrideConfiguration();
    public android.content.res.Resources getResources();
    public java.lang.Object getSystemService(java.lang.String);
    public android.content.res.Resources$Theme getTheme();
    public int getThemeResId();
    protected void onApplyThemeResource(android.content.res.Resources$Theme, int, boolean);
    public void setTheme(int);


}

-keep class android.view.Display {
    <init>(android.hardware.display.DisplayManagerGlobal, int, android.view.DisplayInfo, android.view.DisplayAdjustments);
    <init>(android.hardware.display.DisplayManagerGlobal, int, android.view.DisplayInfo, android.content.res.Resources);

    public java.lang.String getAddress();
    public long getAppVsyncOffsetNanos();
    public int getColorMode();
    public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
    public android.view.DisplayAdjustments getDisplayAdjustments();
    public int getDisplayId();
    public boolean getDisplayInfo(android.view.DisplayInfo);
    public int getFlags();
    public android.view.Display$HdrCapabilities getHdrCapabilities();
    public int getHeight();
    public int getLayerStack();
    public int getMaximumSizeDimension();
    public void getMetrics(android.util.DisplayMetrics);
    public android.view.Display$Mode getMode();
    public java.lang.String getName();
    public int getOrientation();
    public void getOverscanInsets(android.graphics.Rect);
    public java.lang.String getOwnerPackageName();
    public int getOwnerUid();
    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 getRemoveMode();
    public int getRotation();
    public void getSize(android.graphics.Point);
    public int getState();
    public int[] getSupportedColorModes();
    public android.view.Display$Mode[] getSupportedModes();
    public float[] getSupportedRefreshRates();
    public int getType();
    public int getWidth();
    public boolean hasAccess(int);
    public static boolean hasAccess(int, int, int);
    public static boolean isDozeState(int);
    public boolean isHdr();
    public boolean isPublicPresentation();
    public static boolean isSuspendedState(int);
    public boolean isValid();
    public boolean isWideColorGamut();
    public void requestColorMode(int);
    public static java.lang.String stateToString(int);
    public java.lang.String toString();
    public static java.lang.String typeToString(int);


    public static int COLOR_MODE_ADOBE_RGB;
    public static int COLOR_MODE_BT601_525;
    public static int COLOR_MODE_BT601_525_UNADJUSTED;
    public static int COLOR_MODE_BT601_625;
    public static int COLOR_MODE_BT601_625_UNADJUSTED;
    public static int COLOR_MODE_BT709;
    public static int COLOR_MODE_DCI_P3;
    public static int COLOR_MODE_DEFAULT;
    public static int COLOR_MODE_DISPLAY_P3;
    public static int COLOR_MODE_INVALID;
    public static int COLOR_MODE_SRGB;
    public static int DEFAULT_DISPLAY;
    public static int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
    public static int FLAG_PRESENTATION;
    public static int FLAG_PRIVATE;
    public static int FLAG_ROUND;
    public static int FLAG_SCALING_DISABLED;
    public static int FLAG_SECURE;
    public static int FLAG_SUPPORTS_PROTECTED_BUFFERS;
    public static int INVALID_DISPLAY;
    public static int REMOVE_MODE_DESTROY_CONTENT;
    public static int REMOVE_MODE_MOVE_CONTENT_TO_PRIMARY;
    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_ON_SUSPEND;
    public static int STATE_UNKNOWN;
    public static int STATE_VR;
    public static int TYPE_BUILT_IN;
    public static int TYPE_HDMI;
    public static int TYPE_OVERLAY;
    public static int TYPE_UNKNOWN;
    public static int TYPE_VIRTUAL;
    public static int TYPE_WIFI;
}

-keep class android.view.Display$HdrCapabilities {
    <init>();
    <init>(int[], float, float, float);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public float getDesiredMaxAverageLuminance();
    public float getDesiredMaxLuminance();
    public float getDesiredMinLuminance();
    public int[] getSupportedHdrTypes();
    public int hashCode();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int HDR_TYPE_DOLBY_VISION;
    public static int HDR_TYPE_HDR10;
    public static int HDR_TYPE_HLG;
    public static float INVALID_LUMINANCE;
}

-keep class android.view.Display$Mode {
    <init>(int, int, int, float);

    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 boolean matches(int, int, float);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.view.Display$Mode[] EMPTY_ARRAY;
}

-keep class android.view.DisplayAdjustments {
    <init>();
    <init>(android.content.res.Configuration);
    <init>(android.view.DisplayAdjustments);

    public boolean equals(java.lang.Object);
    public android.content.res.CompatibilityInfo getCompatibilityInfo();
    public android.content.res.Configuration getConfiguration();
    public int hashCode();
    public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
    public void setConfiguration(android.content.res.Configuration);


    public static android.view.DisplayAdjustments DEFAULT_DISPLAY_ADJUSTMENTS;
}

-keep class android.view.DisplayCutout {
    <init>(android.graphics.Rect, java.util.List);

    public boolean equals(java.lang.Object);
    public static android.view.DisplayCutout fromBoundingRect(int, int, int, int);
    public static android.view.DisplayCutout fromBounds(android.graphics.Region);
    public static android.view.DisplayCutout fromResourcesRectApproximation(android.content.res.Resources, int, int);
    public static android.view.DisplayCutout fromSpec(java.lang.String, int, int, float);
    public java.util.List getBoundingRects();
    public android.graphics.Region getBounds();
    public int getSafeInsetBottom();
    public int getSafeInsetLeft();
    public int getSafeInsetRight();
    public int getSafeInsetTop();
    public android.graphics.Rect getSafeInsets();
    public int hashCode();
    public android.view.DisplayCutout inset(int, int, int, int);
    public boolean isBoundsEmpty();
    public boolean isEmpty();
    public static android.graphics.Path pathFromResources(android.content.res.Resources, int, int);
    public android.view.DisplayCutout replaceSafeInsets(android.graphics.Rect);
    public java.lang.String toString();
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static java.lang.String EMULATION_OVERLAY_CATEGORY;
    public static android.view.DisplayCutout NO_CUTOUT;
}

-keep class android.view.DisplayCutout$ParcelableWrapper {
    <init>();
    <init>(android.view.DisplayCutout);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.view.DisplayCutout get();
    public int hashCode();
    public static android.view.DisplayCutout readCutoutFromParcel(android.os.Parcel);
    public void readFromParcel(android.os.Parcel);
    public void set(android.view.DisplayCutout$ParcelableWrapper);
    public void set(android.view.DisplayCutout);
    public java.lang.String toString();
    public static void writeCutoutToParcel(android.view.DisplayCutout, android.os.Parcel, int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.DisplayInfo {
    <init>();
    <init>(android.view.DisplayInfo);

    public void copyFrom(android.view.DisplayInfo);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public boolean equals(android.view.DisplayInfo);
    public int findDefaultModeByRefreshRate(float);
    public void getAppMetrics(android.util.DisplayMetrics);
    public void getAppMetrics(android.util.DisplayMetrics, android.view.DisplayAdjustments);
    public void getAppMetrics(android.util.DisplayMetrics, android.content.res.CompatibilityInfo, android.content.res.Configuration);
    public android.view.Display$Mode getDefaultMode();
    public float[] getDefaultRefreshRates();
    public void getLogicalMetrics(android.util.DisplayMetrics, android.content.res.CompatibilityInfo, android.content.res.Configuration);
    public android.view.Display$Mode getMode();
    public int getNaturalHeight();
    public int getNaturalWidth();
    public boolean hasAccess(int);
    public int hashCode();
    public boolean isHdr();
    public boolean isWideColorGamut();
    public void readFromParcel(android.os.Parcel);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String address;
    public int appHeight;
    public long appVsyncOffsetNanos;
    public int appWidth;
    public int colorMode;
    public int defaultModeId;
    public android.view.DisplayCutout displayCutout;
    public int flags;
    public android.view.Display$HdrCapabilities hdrCapabilities;
    public int largestNominalAppHeight;
    public int largestNominalAppWidth;
    public int layerStack;
    public int logicalDensityDpi;
    public int logicalHeight;
    public int logicalWidth;
    public int modeId;
    public java.lang.String name;
    public int overscanBottom;
    public int overscanLeft;
    public int overscanRight;
    public int overscanTop;
    public java.lang.String ownerPackageName;
    public int ownerUid;
    public float physicalXDpi;
    public float physicalYDpi;
    public long presentationDeadlineNanos;
    public int removeMode;
    public int rotation;
    public int smallestNominalAppHeight;
    public int smallestNominalAppWidth;
    public int state;
    public int[] supportedColorModes;
    public android.view.Display$Mode[] supportedModes;
    public int type;
    public java.lang.String uniqueId;
}

-keep class android.view.DisplayListCanvas {

    public void callDrawGLFunction2(long);
    public void drawCircle(android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty);
    public void drawGLFunctor2(long, java.lang.Runnable);
    public void drawRenderNode(android.view.RenderNode);
    public void drawRoundRect(android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty);
    public int getHeight();
    public int getMaximumBitmapHeight();
    public int getMaximumBitmapWidth();
    public int getWidth();
    public void insertInorderBarrier();
    public void insertReorderBarrier();
    public boolean isHardwareAccelerated();
    public boolean isOpaque();
    public boolean isRecordingFor(java.lang.Object);
    public void setBitmap(android.graphics.Bitmap);
    public void setDensity(int);
    protected void throwIfCannotDraw(android.graphics.Bitmap);


}

-keep class android.view.DragAndDropPermissions {

    public int describeContents();
    public static android.view.DragAndDropPermissions obtain(android.view.DragEvent);
    public void release();
    public boolean take(android.os.IBinder);
    public boolean takeTransient();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.DragEvent {

    public int describeContents();
    public int getAction();
    public android.content.ClipData getClipData();
    public android.content.ClipDescription getClipDescription();
    public com.android.internal.view.IDragAndDropPermissions getDragAndDropPermissions();
    public java.lang.Object getLocalState();
    public boolean getResult();
    public float getX();
    public float getY();
    public static android.view.DragEvent obtain(int, float, float, java.lang.Object, android.content.ClipDescription, android.content.ClipData, com.android.internal.view.IDragAndDropPermissions, boolean);
    public static android.view.DragEvent obtain(android.view.DragEvent);
    public void recycle();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTION_DRAG_ENDED;
    public static int ACTION_DRAG_ENTERED;
    public static int ACTION_DRAG_EXITED;
    public static int ACTION_DRAG_LOCATION;
    public static int ACTION_DRAG_STARTED;
    public static int ACTION_DROP;
    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.FrameMetrics {
    <init>(android.view.FrameMetrics);

    public long getMetric(int);


    public static int ANIMATION_DURATION;
    public static int COMMAND_ISSUE_DURATION;
    public static int DRAW_DURATION;
    public static int FIRST_DRAW_FRAME;
    public static int INPUT_HANDLING_DURATION;
    public static int INTENDED_VSYNC_TIMESTAMP;
    public static int LAYOUT_MEASURE_DURATION;
    public static int SWAP_BUFFERS_DURATION;
    public static int SYNC_DURATION;
    public static int TOTAL_DURATION;
    public static int UNKNOWN_DELAY_DURATION;
    public static int VSYNC_TIMESTAMP;
}

-keep class android.view.FrameStats {
    <init>();

    public long getEndTimeNano();
    public int getFrameCount();
    public long getFramePresentedTimeNano(int);
    public long getRefreshPeriodNano();
    public long getStartTimeNano();


    public static long UNDEFINED_TIME_NANO;
    protected long[] mFramesPresentedTimeNano;
    protected long mRefreshPeriodNano;
}

-keep class android.view.IAppTransitionAnimationSpecsFuture {

    public abstract android.view.AppTransitionAnimationSpec[] get();


}

-keep class android.view.IRecentsAnimationController {

    public abstract void finish(boolean);
    public abstract void hideCurrentInputMethod();
    public abstract android.app.ActivityManager$TaskSnapshot screenshotTask(int);
    public abstract void setAnimationTargetsBehindSystemBars(boolean);
    public abstract void setInputConsumerEnabled(boolean);
    public abstract void setSplitScreenMinimized(boolean);


}

-keep class android.view.IRecentsAnimationRunner {

    public abstract void onAnimationCanceled();
    public abstract void onAnimationStart(android.view.IRecentsAnimationController, android.view.RemoteAnimationTarget[], android.graphics.Rect, android.graphics.Rect);


}

-keep class android.view.IRemoteAnimationFinishedCallback {

    public abstract void onAnimationFinished();


}

-keep class android.view.IRemoteAnimationRunner {

    public abstract void onAnimationCancelled();
    public abstract void onAnimationStart(android.view.RemoteAnimationTarget[], android.view.IRemoteAnimationFinishedCallback);


}

-keep class android.view.IWindow {

    public abstract void closeSystemDialogs(java.lang.String);
    public abstract void dispatchAppVisibility(boolean);
    public abstract void dispatchDragEvent(android.view.DragEvent);
    public abstract void dispatchGetNewSurface();
    public abstract void dispatchPointerCaptureChanged(boolean);
    public abstract void dispatchSystemUiVisibilityChanged(int, int, int, int);
    public abstract void dispatchWallpaperCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
    public abstract void dispatchWallpaperOffsets(float, float, float, float, boolean);
    public abstract void dispatchWindowShown();
    public abstract void executeCommand(java.lang.String, java.lang.String, android.os.ParcelFileDescriptor);
    public abstract void moved(int, int);
    public abstract void requestAppKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
    public abstract void resized(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, boolean, android.util.MergedConfiguration, android.graphics.Rect, boolean, boolean, int, android.view.DisplayCutout$ParcelableWrapper);
    public abstract void updatePointerIcon(float, float);
    public abstract void windowFocusChanged(boolean, boolean);


}

-keep class android.view.IWindowFocusObserver {

    public abstract void focusGained(android.os.IBinder);
    public abstract void focusLost(android.os.IBinder);


}

-keep class android.view.IWindowId {

    public abstract boolean isFocused();
    public abstract void registerFocusObserver(android.view.IWindowFocusObserver);
    public abstract void unregisterFocusObserver(android.view.IWindowFocusObserver);


}

-keep class android.view.InflateException {
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.String);
    <init>(java.lang.Throwable);



}

-keep class android.view.InputChannel {
    <init>();

    public int describeContents();
    public void dispose();
    public android.view.InputChannel dup();
    protected void finalize();
    public java.lang.String getName();
    public static android.view.InputChannel[] openInputChannelPair(java.lang.String);
    public void readFromParcel(android.os.Parcel);
    public java.lang.String toString();
    public void transferTo(android.view.InputChannel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.InputDevice {

    public int describeContents();
    public void disable();
    public void enable();
    public int getControllerNumber();
    public java.lang.String getDescriptor();
    public static android.view.InputDevice getDevice(int);
    public static int[] getDeviceIds();
    public int getGeneration();
    public int getId();
    public android.hardware.input.InputDeviceIdentifier getIdentifier();
    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 hasButtonUnderPad();
    public boolean[] hasKeys(int[]);
    public boolean hasMicrophone();
    public boolean isEnabled();
    public boolean isExternal();
    public boolean isFullKeyboard();
    public boolean isVirtual();
    public void setCustomPointerIcon(android.view.PointerIcon);
    public void setPointerType(int);
    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_MOUSE_RELATIVE;
    public static int SOURCE_ROTARY_ENCODER;
    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 abstract void cancel();
    public abstract android.view.InputEvent copy();
    public int describeContents();
    public android.view.InputDevice getDevice();
    public abstract int getDeviceId();
    public abstract long getEventTime();
    public abstract long getEventTimeNano();
    public int getSequenceNumber();
    public abstract int getSource();
    public boolean isFromSource(int);
    public abstract boolean isTainted();
    protected void prepareForReuse();
    public void recycle();
    public void recycleIfNeededAfterDispatch();
    public abstract void setSource(int);
    public abstract void setTainted(boolean);


    public static android.os.Parcelable$Creator CREATOR;
    protected static int PARCEL_TOKEN_KEY_EVENT;
    protected static int PARCEL_TOKEN_MOTION_EVENT;
    protected boolean mRecycled;
    protected int mSeq;
}

-keep class android.view.InputEventConsistencyVerifier {
    <init>(java.lang.Object, int);
    <init>(java.lang.Object, int, java.lang.String);

    public static boolean isInstrumentationEnabled();
    public void onGenericMotionEvent(android.view.MotionEvent, int);
    public void onInputEvent(android.view.InputEvent, int);
    public void onKeyEvent(android.view.KeyEvent, int);
    public void onTouchEvent(android.view.MotionEvent, int);
    public void onTrackballEvent(android.view.MotionEvent, int);
    public void onUnhandledEvent(android.view.InputEvent, int);
    public void reset();


    public static int FLAG_RAW_DEVICE_INPUT;
}

-keep class android.view.InputEventReceiver {
    <init>(android.view.InputChannel, android.os.Looper);

    public boolean consumeBatchedInputEvents(long);
    public void dispose();
    protected void finalize();
    public void finishInputEvent(android.view.InputEvent, boolean);
    public void onBatchedInputEventPending();
    public void onInputEvent(android.view.InputEvent);


}

-keep class android.view.InputQueue {
    <init>();

    public void dispose();
    public void dispose(boolean);
    protected void finalize();
    public long getNativePtr();
    public void sendInputEvent(android.view.InputEvent, java.lang.Object, boolean, android.view.InputQueue$FinishedInputEventCallback);


}

-keep class android.view.InputQueue$Callback {

    public abstract void onInputQueueCreated(android.view.InputQueue);
    public abstract void onInputQueueDestroyed(android.view.InputQueue);


}

-keep class android.view.InputQueue$FinishedInputEventCallback {

    public abstract void onFinishedInputEvent(java.lang.Object, boolean);


}

-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 android.view.KeyCharacterMap$FallbackAction getFallbackAction(int, int);
    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$FallbackAction {

    public static android.view.KeyCharacterMap$FallbackAction obtain();
    public void recycle();


    public int keyCode;
    public int metaState;
}

-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 java.lang.String actionToString(int);
    public void cancel();
    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 android.view.KeyEvent copy();
    public android.view.InputEvent copy();
    public static android.view.KeyEvent createFromParcelBody(android.os.Parcel);
    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 long getEventTimeNano();
    public int getFlags();
    public android.view.KeyCharacterMap getKeyCharacterMap();
    public int getKeyCode();
    public boolean getKeyData(android.view.KeyCharacterMap$KeyData);
    public int getKeyboardDevice();
    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 static boolean isAltKey(int);
    public boolean isAltPressed();
    public boolean isCanceled();
    public boolean isCapsLockOn();
    public static boolean isConfirmKey(int);
    public boolean isCtrlPressed();
    public boolean isDown();
    public boolean isFunctionPressed();
    public static boolean isGamepadButton(int);
    public boolean isLongPress();
    public static boolean isMediaKey(int);
    public static boolean isMetaKey(int);
    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 static boolean isSystemKey(int);
    public boolean isTainted();
    public boolean isTracking();
    public boolean isWakeKey();
    public static boolean isWakeKey(int);
    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 java.lang.String metaStateToString(int);
    public static int normalizeMetaState(int);
    public static android.view.KeyEvent obtain(long, long, int, int, int, int, int, int, int, int, java.lang.String);
    public static android.view.KeyEvent obtain(android.view.KeyEvent);
    public void recycle();
    public void recycleIfNeededAfterDispatch();
    public void setSource(int);
    public void setTainted(boolean);
    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_PREDISPATCH;
    public static int FLAG_SOFT_KEYBOARD;
    public static int FLAG_START_TRACKING;
    public static int FLAG_TAINTED;
    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_ALL_APPS;
    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_COPY;
    public static int KEYCODE_CTRL_LEFT;
    public static int KEYCODE_CTRL_RIGHT;
    public static int KEYCODE_CUT;
    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_DOWN_LEFT;
    public static int KEYCODE_DPAD_DOWN_RIGHT;
    public static int KEYCODE_DPAD_LEFT;
    public static int KEYCODE_DPAD_RIGHT;
    public static int KEYCODE_DPAD_UP;
    public static int KEYCODE_DPAD_UP_LEFT;
    public static int KEYCODE_DPAD_UP_RIGHT;
    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_PASTE;
    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_REFRESH;
    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_SOFT_SLEEP;
    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_STEM_1;
    public static int KEYCODE_STEM_2;
    public static int KEYCODE_STEM_3;
    public static int KEYCODE_STEM_PRIMARY;
    public static int KEYCODE_SWITCH_CHARSET;
    public static int KEYCODE_SYM;
    public static int KEYCODE_SYSRQ;
    public static int KEYCODE_SYSTEM_NAVIGATION_DOWN;
    public static int KEYCODE_SYSTEM_NAVIGATION_LEFT;
    public static int KEYCODE_SYSTEM_NAVIGATION_RIGHT;
    public static int KEYCODE_SYSTEM_NAVIGATION_UP;
    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 LAST_KEYCODE;
    public static int MAX_KEYCODE;
    public static int META_ALT_LEFT_ON;
    public static int META_ALT_LOCKED;
    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_CAP_LOCKED;
    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_SELECTING;
    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_LOCKED;
    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 android.view.KeyboardShortcutGroup {
    <init>(java.lang.CharSequence, java.util.List);
    <init>(java.lang.CharSequence);
    <init>(java.lang.CharSequence, java.util.List, boolean);
    <init>(java.lang.CharSequence, boolean);

    public void addItem(android.view.KeyboardShortcutInfo);
    public int describeContents();
    public java.util.List getItems();
    public java.lang.CharSequence getLabel();
    public boolean isSystemGroup();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.KeyboardShortcutInfo {
    <init>(java.lang.CharSequence, android.graphics.drawable.Icon, int, int);
    <init>(java.lang.CharSequence, int, int);
    <init>(java.lang.CharSequence, char, int);

    public int describeContents();
    public char getBaseCharacter();
    public android.graphics.drawable.Icon getIcon();
    public int getKeycode();
    public java.lang.CharSequence getLabel();
    public int getModifiers();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.LayoutInflater {
    <init>(android.content.Context);
    <init>(android.view.LayoutInflater, android.content.Context);

    public abstract android.view.LayoutInflater cloneInContext(android.content.Context);
    public android.view.View createView(java.lang.String, java.lang.String, android.util.AttributeSet);
    public static android.view.LayoutInflater from(android.content.Context);
    public android.content.Context getContext();
    public android.view.LayoutInflater$Factory getFactory();
    public android.view.LayoutInflater$Factory2 getFactory2();
    public android.view.LayoutInflater$Filter getFilter();
    public android.view.View inflate(int, android.view.ViewGroup);
    public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup);
    public android.view.View inflate(int, android.view.ViewGroup, boolean);
    public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean);
    protected android.view.View onCreateView(java.lang.String, android.util.AttributeSet);
    protected android.view.View onCreateView(android.view.View, java.lang.String, android.util.AttributeSet);
    public void setFactory(android.view.LayoutInflater$Factory);
    public void setFactory2(android.view.LayoutInflater$Factory2);
    public void setFilter(android.view.LayoutInflater$Filter);
    public void setPrivateFactory(android.view.LayoutInflater$Factory2);


    protected android.content.Context mContext;
}

-keep class android.view.LayoutInflater$Factory {

    public abstract android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);


}

-keep class android.view.LayoutInflater$Factory2 {

    public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);


}

-keep class android.view.LayoutInflater$Filter {

    public abstract boolean onLoadClass(java.lang.Class);


}

-keep class android.view.MagnificationSpec {

    public void clear();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void initialize(float, float, float);
    public boolean isNop();
    public static android.view.MagnificationSpec obtain(android.view.MagnificationSpec);
    public static android.view.MagnificationSpec obtain();
    public void recycle();
    public void setTo(android.view.MagnificationSpec);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float offsetX;
    public float offsetY;
    public float scale;
}

-keep class android.view.Menu {

    public abstract android.view.MenuItem add(java.lang.CharSequence);
    public abstract android.view.MenuItem add(int);
    public abstract android.view.MenuItem add(int, int, int, java.lang.CharSequence);
    public abstract android.view.MenuItem add(int, int, int, int);
    public abstract int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
    public abstract android.view.SubMenu addSubMenu(java.lang.CharSequence);
    public abstract android.view.SubMenu addSubMenu(int);
    public abstract android.view.SubMenu addSubMenu(int, int, int, java.lang.CharSequence);
    public abstract android.view.SubMenu addSubMenu(int, int, int, int);
    public abstract void clear();
    public abstract void close();
    public abstract android.view.MenuItem findItem(int);
    public abstract android.view.MenuItem getItem(int);
    public abstract boolean hasVisibleItems();
    public abstract boolean isShortcutKey(int, android.view.KeyEvent);
    public abstract boolean performIdentifierAction(int, int);
    public abstract boolean performShortcut(int, android.view.KeyEvent, int);
    public abstract void removeGroup(int);
    public abstract void removeItem(int);
    public abstract void setGroupCheckable(int, boolean, boolean);
    public void setGroupDividerEnabled(boolean);
    public abstract void setGroupEnabled(int, boolean);
    public abstract void setGroupVisible(int, boolean);
    public abstract void setQwertyMode(boolean);
    public abstract int size();


    public static int CATEGORY_ALTERNATIVE;
    public static int CATEGORY_CONTAINER;
    public static int CATEGORY_MASK;
    public static int CATEGORY_SECONDARY;
    public static int CATEGORY_SHIFT;
    public static int CATEGORY_SYSTEM;
    public static int FIRST;
    public static int FLAG_ALWAYS_PERFORM_CLOSE;
    public static int FLAG_APPEND_TO_GROUP;
    public static int FLAG_PERFORM_NO_CLOSE;
    public static int NONE;
    public static int SUPPORTED_MODIFIERS_MASK;
    public static int USER_MASK;
    public static int USER_SHIFT;
}

-keep class android.view.MenuInflater {
    <init>(android.content.Context);
    <init>(android.content.Context, java.lang.Object);

    public void inflate(int, android.view.Menu);


}

-keep class android.view.MenuItem {

    public abstract boolean collapseActionView();
    public abstract boolean expandActionView();
    public abstract android.view.ActionProvider getActionProvider();
    public abstract android.view.View getActionView();
    public int getAlphabeticModifiers();
    public abstract char getAlphabeticShortcut();
    public java.lang.CharSequence getContentDescription();
    public abstract int getGroupId();
    public abstract android.graphics.drawable.Drawable getIcon();
    public android.content.res.ColorStateList getIconTintList();
    public android.graphics.PorterDuff$Mode getIconTintMode();
    public abstract android.content.Intent getIntent();
    public abstract int getItemId();
    public abstract android.view.ContextMenu$ContextMenuInfo getMenuInfo();
    public int getNumericModifiers();
    public abstract char getNumericShortcut();
    public abstract int getOrder();
    public abstract android.view.SubMenu getSubMenu();
    public abstract java.lang.CharSequence getTitle();
    public abstract java.lang.CharSequence getTitleCondensed();
    public java.lang.CharSequence getTooltipText();
    public abstract boolean hasSubMenu();
    public abstract boolean isActionViewExpanded();
    public abstract boolean isCheckable();
    public abstract boolean isChecked();
    public abstract boolean isEnabled();
    public abstract boolean isVisible();
    public boolean requiresActionButton();
    public boolean requiresOverflow();
    public abstract android.view.MenuItem setActionProvider(android.view.ActionProvider);
    public abstract android.view.MenuItem setActionView(android.view.View);
    public abstract android.view.MenuItem setActionView(int);
    public abstract android.view.MenuItem setAlphabeticShortcut(char);
    public android.view.MenuItem setAlphabeticShortcut(char, int);
    public abstract android.view.MenuItem setCheckable(boolean);
    public abstract android.view.MenuItem setChecked(boolean);
    public android.view.MenuItem setContentDescription(java.lang.CharSequence);
    public abstract android.view.MenuItem setEnabled(boolean);
    public abstract android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
    public abstract android.view.MenuItem setIcon(int);
    public android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    public android.view.MenuItem setIconTintMode(android.graphics.PorterDuff$Mode);
    public abstract android.view.MenuItem setIntent(android.content.Intent);
    public abstract android.view.MenuItem setNumericShortcut(char);
    public android.view.MenuItem setNumericShortcut(char, int);
    public abstract android.view.MenuItem setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener);
    public abstract android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem$OnMenuItemClickListener);
    public abstract android.view.MenuItem setShortcut(char, char);
    public android.view.MenuItem setShortcut(char, char, int, int);
    public abstract void setShowAsAction(int);
    public abstract android.view.MenuItem setShowAsActionFlags(int);
    public abstract android.view.MenuItem setTitle(java.lang.CharSequence);
    public abstract android.view.MenuItem setTitle(int);
    public abstract android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
    public android.view.MenuItem setTooltipText(java.lang.CharSequence);
    public abstract android.view.MenuItem setVisible(boolean);


    public static int SHOW_AS_ACTION_ALWAYS;
    public static int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW;
    public static int SHOW_AS_ACTION_IF_ROOM;
    public static int SHOW_AS_ACTION_NEVER;
    public static int SHOW_AS_ACTION_WITH_TEXT;
}

-keep class android.view.MenuItem$OnActionExpandListener {

    public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
    public abstract boolean onMenuItemActionExpand(android.view.MenuItem);


}

-keep class android.view.MenuItem$OnMenuItemClickListener {

    public abstract boolean onMenuItemClick(android.view.MenuItem);


}

-keep class android.view.MotionEvent {

    public static java.lang.String actionToString(int);
    public void addBatch(long, float, float, float, float, int);
    public void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
    public boolean addBatch(android.view.MotionEvent);
    public static int axisFromString(java.lang.String);
    public static java.lang.String axisToString(int);
    public static java.lang.String buttonStateToString(int);
    public void cancel();
    public android.view.MotionEvent clampNoHistory(float, float, float, float);
    public android.view.MotionEvent copy();
    public android.view.InputEvent copy();
    public static android.view.MotionEvent createFromParcelBody(android.os.Parcel);
    protected void finalize();
    public int findPointerIndex(int);
    public int getAction();
    public int getActionButton();
    public int getActionIndex();
    public int getActionMasked();
    public float getAxisValue(int);
    public float getAxisValue(int, int);
    public int getButtonState();
    public int getDeviceId();
    public int getDisplayId();
    public long getDownTime();
    public int getEdgeFlags();
    public long getEventTime();
    public long getEventTimeNano();
    public int getFlags();
    public float getHistoricalAxisValue(int, int);
    public float getHistoricalAxisValue(int, int, int);
    public long getHistoricalEventTime(int);
    public long getHistoricalEventTimeNano(int);
    public float getHistoricalOrientation(int);
    public float getHistoricalOrientation(int, int);
    public void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
    public float getHistoricalPressure(int);
    public float getHistoricalPressure(int, int);
    public float getHistoricalSize(int);
    public float getHistoricalSize(int, int);
    public float getHistoricalToolMajor(int);
    public float getHistoricalToolMajor(int, int);
    public float getHistoricalToolMinor(int);
    public float getHistoricalToolMinor(int, int);
    public float getHistoricalTouchMajor(int);
    public float getHistoricalTouchMajor(int, int);
    public float getHistoricalTouchMinor(int);
    public float getHistoricalTouchMinor(int, int);
    public float getHistoricalX(int);
    public float getHistoricalX(int, int);
    public float getHistoricalY(int);
    public float getHistoricalY(int, int);
    public int getHistorySize();
    public int getMetaState();
    public float getOrientation();
    public float getOrientation(int);
    public void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
    public int getPointerCount();
    public int getPointerId(int);
    public int getPointerIdBits();
    public void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
    public float getPressure();
    public float getPressure(int);
    public float getRawX();
    public float getRawY();
    public float getSize();
    public float getSize(int);
    public int getSource();
    public float getToolMajor();
    public float getToolMajor(int);
    public float getToolMinor();
    public float getToolMinor(int);
    public int getToolType(int);
    public float getTouchMajor();
    public float getTouchMajor(int);
    public float getTouchMinor();
    public float getTouchMinor(int);
    public float getX();
    public float getX(int);
    public float getXPrecision();
    public float getY();
    public float getY(int);
    public float getYPrecision();
    public boolean isButtonPressed(int);
    public boolean isHoverExitPending();
    public boolean isTainted();
    public boolean isTargetAccessibilityFocus();
    public boolean isTouchEvent();
    public boolean isWithinBoundsNoHistory(float, float, float, float);
    public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int, int);
    public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
    public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
    public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
    public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
    public static android.view.MotionEvent obtain(long, long, int, float, float, int);
    public static android.view.MotionEvent obtain(android.view.MotionEvent);
    public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
    public void offsetLocation(float, float);
    public void recycle();
    public void scale(float);
    public void setAction(int);
    public void setActionButton(int);
    public void setButtonState(int);
    public void setDisplayId(int);
    public void setDownTime(long);
    public void setEdgeFlags(int);
    public void setHoverExitPending(boolean);
    public void setLocation(float, float);
    public void setSource(int);
    public void setTainted(boolean);
    public void setTargetAccessibilityFocus(boolean);
    public android.view.MotionEvent split(int);
    public java.lang.String toString();
    public static java.lang.String toolTypeToString(int);
    public void transform(android.graphics.Matrix);
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTION_BUTTON_PRESS;
    public static int ACTION_BUTTON_RELEASE;
    public static int ACTION_CANCEL;
    public static int ACTION_DOWN;
    public static int ACTION_HOVER_ENTER;
    public static int ACTION_HOVER_EXIT;
    public static int ACTION_HOVER_MOVE;
    public static int ACTION_MASK;
    public static int ACTION_MOVE;
    public static int ACTION_OUTSIDE;
    public static int ACTION_POINTER_1_DOWN;
    public static int ACTION_POINTER_1_UP;
    public static int ACTION_POINTER_2_DOWN;
    public static int ACTION_POINTER_2_UP;
    public static int ACTION_POINTER_3_DOWN;
    public static int ACTION_POINTER_3_UP;
    public static int ACTION_POINTER_DOWN;
    public static int ACTION_POINTER_ID_MASK;
    public static int ACTION_POINTER_ID_SHIFT;
    public static int ACTION_POINTER_INDEX_MASK;
    public static int ACTION_POINTER_INDEX_SHIFT;
    public static int ACTION_POINTER_UP;
    public static int ACTION_SCROLL;
    public static int ACTION_UP;
    public static int AXIS_BRAKE;
    public static int AXIS_DISTANCE;
    public static int AXIS_GAS;
    public static int AXIS_GENERIC_1;
    public static int AXIS_GENERIC_10;
    public static int AXIS_GENERIC_11;
    public static int AXIS_GENERIC_12;
    public static int AXIS_GENERIC_13;
    public static int AXIS_GENERIC_14;
    public static int AXIS_GENERIC_15;
    public static int AXIS_GENERIC_16;
    public static int AXIS_GENERIC_2;
    public static int AXIS_GENERIC_3;
    public static int AXIS_GENERIC_4;
    public static int AXIS_GENERIC_5;
    public static int AXIS_GENERIC_6;
    public static int AXIS_GENERIC_7;
    public static int AXIS_GENERIC_8;
    public static int AXIS_GENERIC_9;
    public static int AXIS_HAT_X;
    public static int AXIS_HAT_Y;
    public static int AXIS_HSCROLL;
    public static int AXIS_LTRIGGER;
    public static int AXIS_ORIENTATION;
    public static int AXIS_PRESSURE;
    public static int AXIS_RELATIVE_X;
    public static int AXIS_RELATIVE_Y;
    public static int AXIS_RTRIGGER;
    public static int AXIS_RUDDER;
    public static int AXIS_RX;
    public static int AXIS_RY;
    public static int AXIS_RZ;
    public static int AXIS_SCROLL;
    public static int AXIS_SIZE;
    public static int AXIS_THROTTLE;
    public static int AXIS_TILT;
    public static int AXIS_TOOL_MAJOR;
    public static int AXIS_TOOL_MINOR;
    public static int AXIS_TOUCH_MAJOR;
    public static int AXIS_TOUCH_MINOR;
    public static int AXIS_VSCROLL;
    public static int AXIS_WHEEL;
    public static int AXIS_X;
    public static int AXIS_Y;
    public static int AXIS_Z;
    public static int BUTTON_BACK;
    public static int BUTTON_FORWARD;
    public static int BUTTON_PRIMARY;
    public static int BUTTON_SECONDARY;
    public static int BUTTON_STYLUS_PRIMARY;
    public static int BUTTON_STYLUS_SECONDARY;
    public static int BUTTON_TERTIARY;
    public static android.os.Parcelable$Creator CREATOR;
    public static int EDGE_BOTTOM;
    public static int EDGE_LEFT;
    public static int EDGE_RIGHT;
    public static int EDGE_TOP;
    public static int FLAG_HOVER_EXIT_PENDING;
    public static int FLAG_IS_GENERATED_GESTURE;
    public static int FLAG_TAINTED;
    public static int FLAG_TARGET_ACCESSIBILITY_FOCUS;
    public static int FLAG_WINDOW_IS_OBSCURED;
    public static int FLAG_WINDOW_IS_PARTIALLY_OBSCURED;
    public static int INVALID_POINTER_ID;
    public static int TOOL_TYPE_ERASER;
    public static int TOOL_TYPE_FINGER;
    public static int TOOL_TYPE_MOUSE;
    public static int TOOL_TYPE_STYLUS;
    public static int TOOL_TYPE_UNKNOWN;
}

-keep class android.view.MotionEvent$PointerCoords {
    <init>();
    <init>(android.view.MotionEvent$PointerCoords);

    public void clear();
    public void copyFrom(android.view.MotionEvent$PointerCoords);
    public static android.view.MotionEvent$PointerCoords[] createArray(int);
    public float getAxisValue(int);
    public void setAxisValue(int, float);


    public float orientation;
    public float pressure;
    public float size;
    public float toolMajor;
    public float toolMinor;
    public float touchMajor;
    public float touchMinor;
    public float x;
    public float y;
}

-keep class android.view.MotionEvent$PointerProperties {
    <init>();
    <init>(android.view.MotionEvent$PointerProperties);

    public void clear();
    public void copyFrom(android.view.MotionEvent$PointerProperties);
    public static android.view.MotionEvent$PointerProperties[] createArray(int);
    public boolean equals(java.lang.Object);
    public int hashCode();


    public int id;
    public int toolType;
}

-keep class android.view.PointerIcon {

    public static android.view.PointerIcon create(android.graphics.Bitmap, float, float);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.view.PointerIcon getDefaultIcon(android.content.Context);
    public static android.view.PointerIcon getNullIcon();
    public static android.view.PointerIcon getSystemIcon(android.content.Context, int);
    public int getType();
    public static android.view.PointerIcon load(android.content.res.Resources, int);
    public android.view.PointerIcon load(android.content.Context);
    public static void setUseLargeIcons(boolean);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int TYPE_ALIAS;
    public static int TYPE_ALL_SCROLL;
    public static int TYPE_ARROW;
    public static int TYPE_CELL;
    public static int TYPE_CONTEXT_MENU;
    public static int TYPE_COPY;
    public static int TYPE_CROSSHAIR;
    public static int TYPE_CUSTOM;
    public static int TYPE_DEFAULT;
    public static int TYPE_GRAB;
    public static int TYPE_GRABBING;
    public static int TYPE_HAND;
    public static int TYPE_HELP;
    public static int TYPE_HORIZONTAL_DOUBLE_ARROW;
    public static int TYPE_NOT_SPECIFIED;
    public static int TYPE_NO_DROP;
    public static int TYPE_NULL;
    public static int TYPE_SPOT_ANCHOR;
    public static int TYPE_SPOT_HOVER;
    public static int TYPE_SPOT_TOUCH;
    public static int TYPE_TEXT;
    public static int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
    public static int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
    public static int TYPE_VERTICAL_DOUBLE_ARROW;
    public static int TYPE_VERTICAL_TEXT;
    public static int TYPE_WAIT;
    public static int TYPE_ZOOM_IN;
    public static int TYPE_ZOOM_OUT;
}

-keep class android.view.RecordingCanvas {
    <init>(long);

    public void drawARGB(int, int, int, int);
    public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
    public void drawArc(android.graphics.RectF, 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.Matrix, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, 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 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(float, float, float, float, android.graphics.Paint);
    public void drawOval(android.graphics.RectF, android.graphics.Paint);
    public void drawPaint(android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, 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.Rect);
    public void drawPicture(android.graphics.Picture, android.graphics.RectF);
    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(float, float, float, float, android.graphics.Paint);
    public void drawRect(android.graphics.Rect, android.graphics.Paint);
    public void drawRect(android.graphics.RectF, android.graphics.Paint);
    public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
    public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
    public void drawText(char[], int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.CharSequence, 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 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);


}

-keep class android.view.RemoteAnimationAdapter {
    <init>(android.view.IRemoteAnimationRunner, long, long);
    <init>(android.os.Parcel);

    public int describeContents();
    public int getCallingPid();
    public long getDuration();
    public android.view.IRemoteAnimationRunner getRunner();
    public long getStatusBarTransitionDelay();
    public void setCallingPid(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.RemoteAnimationDefinition {
    <init>();
    <init>(android.os.Parcel);

    public void addRemoteAnimation(int, int, android.view.RemoteAnimationAdapter);
    public void addRemoteAnimation(int, android.view.RemoteAnimationAdapter);
    public int describeContents();
    public android.view.RemoteAnimationAdapter getAdapter(int, android.util.ArraySet);
    public boolean hasTransition(int, android.util.ArraySet);
    public void setCallingPid(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.RemoteAnimationTarget {
    <init>(int, int, android.view.SurfaceControl, boolean, android.graphics.Rect, android.graphics.Rect, int, android.graphics.Point, android.graphics.Rect, android.app.WindowConfiguration, boolean);
    <init>(android.os.Parcel);

    public int describeContents();
    public void dump(java.io.PrintWriter, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MODE_CLOSING;
    public static int MODE_OPENING;
    public android.graphics.Rect clipRect;
    public android.graphics.Rect contentInsets;
    public boolean isNotInRecents;
    public boolean isTranslucent;
    public android.view.SurfaceControl leash;
    public int mode;
    public android.graphics.Point position;
    public int prefixOrderIndex;
    public android.graphics.Rect sourceContainerBounds;
    public int taskId;
    public android.app.WindowConfiguration windowConfiguration;
}

-keep class android.view.RenderNode {

    public void addAnimator(android.view.RenderNodeAnimator);
    public static android.view.RenderNode adopt(long);
    public static android.view.RenderNode create(java.lang.String, android.view.View);
    public void destroy();
    public void discardDisplayList();
    public void end(android.view.DisplayListCanvas);
    public void endAllAnimators();
    public float getAlpha();
    public int getAmbientShadowColor();
    public float getCameraDistance();
    public boolean getClipToOutline();
    public int getDebugSize();
    public float getElevation();
    public void getInverseMatrix(android.graphics.Matrix);
    public void getMatrix(android.graphics.Matrix);
    public float getPivotX();
    public float getPivotY();
    public float getRotation();
    public float getRotationX();
    public float getRotationY();
    public float getScaleX();
    public float getScaleY();
    public int getSpotShadowColor();
    public float getTranslationX();
    public float getTranslationY();
    public float getTranslationZ();
    public boolean hasIdentityMatrix();
    public boolean hasOverlappingRendering();
    public boolean hasShadow();
    public boolean isAttached();
    public boolean isPivotExplicitlySet();
    public boolean isValid();
    public boolean offsetLeftAndRight(int);
    public boolean offsetTopAndBottom(int);
    public void output();
    public void registerVectorDrawableAnimator(android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT);
    public void requestPositionUpdates(android.view.SurfaceView);
    public boolean resetPivot();
    public boolean setAlpha(float);
    public boolean setAmbientShadowColor(int);
    public boolean setAnimationMatrix(android.graphics.Matrix);
    public boolean setBottom(int);
    public boolean setCameraDistance(float);
    public boolean setClipBounds(android.graphics.Rect);
    public boolean setClipToBounds(boolean);
    public boolean setClipToOutline(boolean);
    public boolean setElevation(float);
    public boolean setHasOverlappingRendering(boolean);
    public boolean setLayerPaint(android.graphics.Paint);
    public boolean setLayerType(int);
    public boolean setLeft(int);
    public boolean setLeftTopRightBottom(int, int, int, int);
    public boolean setOutline(android.graphics.Outline);
    public boolean setPivotX(float);
    public boolean setPivotY(float);
    public boolean setProjectBackwards(boolean);
    public boolean setProjectionReceiver(boolean);
    public boolean setRevealClip(boolean, float, float, float);
    public boolean setRight(int);
    public boolean setRotation(float);
    public boolean setRotationX(float);
    public boolean setRotationY(float);
    public boolean setScaleX(float);
    public boolean setScaleY(float);
    public boolean setSpotShadowColor(int);
    public boolean setStaticMatrix(android.graphics.Matrix);
    public boolean setTop(int);
    public boolean setTranslationX(float);
    public boolean setTranslationY(float);
    public boolean setTranslationZ(float);
    public android.view.DisplayListCanvas start(int, int);


}

-keep class android.view.RenderNodeAnimator {
    <init>(int, float);
    <init>(android.graphics.CanvasProperty, float);
    <init>(android.graphics.CanvasProperty, int, float);
    <init>(int, int, float, float);

    public void cancel();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public void end();
    public long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public long getStartDelay();
    public long getTotalDuration();
    public boolean isRunning();
    public boolean isStarted();
    public static int mapViewPropertyToRenderProperty(int);
    protected void onFinished();
    public void pause();
    public void resume();
    public void setAllowRunningAsynchronously(boolean);
    public android.view.RenderNodeAnimator setDuration(long);
    public android.animation.Animator setDuration(long);
    public void setInterpolator(android.animation.TimeInterpolator);
    public void setStartDelay(long);
    public void setStartValue(float);
    public void setTarget(android.view.View);
    public void setTarget(android.view.DisplayListCanvas);
    public void start();


    public static int ALPHA;
    public static int LAST_VALUE;
    public static int PAINT_ALPHA;
    public static int PAINT_STROKE_WIDTH;
    public static int ROTATION;
    public static int ROTATION_X;
    public static int ROTATION_Y;
    public static int SCALE_X;
    public static int SCALE_Y;
    public static int TRANSLATION_X;
    public static int TRANSLATION_Y;
    public static int TRANSLATION_Z;
    public static int X;
    public static int Y;
    public static int Z;
}

-keep class android.view.SearchEvent {
    <init>(android.view.InputDevice);

    public android.view.InputDevice getInputDevice();


}

-keep class android.view.SubMenu {

    public abstract void clearHeader();
    public abstract android.view.MenuItem getItem();
    public abstract android.view.SubMenu setHeaderIcon(int);
    public abstract android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
    public abstract android.view.SubMenu setHeaderTitle(int);
    public abstract android.view.SubMenu setHeaderTitle(java.lang.CharSequence);
    public abstract android.view.SubMenu setHeaderView(android.view.View);
    public abstract android.view.SubMenu setIcon(int);
    public abstract android.view.SubMenu setIcon(android.graphics.drawable.Drawable);


}

-keep class android.view.Surface {
    <init>();
    <init>(android.graphics.SurfaceTexture);

    public void allocateBuffers();
    public void attachAndQueueBuffer(android.graphics.GraphicBuffer);
    public void copyFrom(android.view.SurfaceControl);
    public void createFrom(android.view.SurfaceControl);
    public int describeContents();
    public void destroy();
    protected void finalize();
    public int getGenerationId();
    public long getNextFrameNumber();
    public void hwuiDestroy();
    public boolean isAutoRefreshEnabled();
    public boolean isConsumerRunningBehind();
    public boolean isSharedBufferModeEnabled();
    public boolean isSingleBuffered();
    public boolean isValid();
    public android.graphics.Canvas lockCanvas(android.graphics.Rect);
    public android.graphics.Canvas lockHardwareCanvas();
    public android.graphics.Canvas lockHardwareWideColorGamutCanvas();
    public void readFromParcel(android.os.Parcel);
    public void release();
    public static java.lang.String rotationToString(int);
    public void setAutoRefreshEnabled(boolean);
    public void setSharedBufferModeEnabled(boolean);
    public java.lang.String toString();
    public void transferFrom(android.view.Surface);
    public void unlockCanvas(android.graphics.Canvas);
    public void unlockCanvasAndPost(android.graphics.Canvas);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int ROTATION_0;
    public static int ROTATION_180;
    public static int ROTATION_270;
    public static int ROTATION_90;
    public static int SCALING_MODE_FREEZE;
    public static int SCALING_MODE_NO_SCALE_CROP;
    public static int SCALING_MODE_SCALE_CROP;
    public static int SCALING_MODE_SCALE_TO_WINDOW;
}

-keep class android.view.Surface$OutOfResourcesException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.view.SurfaceControl {
    <init>(android.view.SurfaceControl);

    public static android.graphics.GraphicBuffer captureLayers(android.os.IBinder, android.graphics.Rect, float);
    public static boolean clearAnimationFrameStats();
    public boolean clearContentFrameStats();
    public static void closeTransaction();
    public static void closeTransactionSync();
    public static android.os.IBinder createDisplay(java.lang.String, boolean);
    public void deferTransactionUntil(android.os.IBinder, long);
    public void deferTransactionUntil(android.view.Surface, long);
    public int describeContents();
    public void destroy();
    public static void destroyDisplay(android.os.IBinder);
    public void detachChildren();
    public void disconnect();
    protected void finalize();
    public static int getActiveColorMode(android.os.IBinder);
    public static int getActiveConfig(android.os.IBinder);
    public static boolean getAnimationFrameStats(android.view.WindowAnimationFrameStats);
    public static android.os.IBinder getBuiltInDisplay(int);
    public boolean getContentFrameStats(android.view.WindowContentFrameStats);
    public static int[] getDisplayColorModes(android.os.IBinder);
    public static android.view.SurfaceControl$PhysicalDisplayInfo[] getDisplayConfigs(android.os.IBinder);
    public android.os.IBinder getHandle();
    public static android.view.Display$HdrCapabilities getHdrCapabilities(android.os.IBinder);
    public int getHeight();
    public int getWidth();
    public void hide();
    public static void mergeToGlobalTransaction(android.view.SurfaceControl$Transaction);
    public static void openTransaction();
    public void release();
    public void reparent(android.os.IBinder);
    public void reparentChildren(android.os.IBinder);
    public static void screenshot(android.os.IBinder, android.view.Surface, int, int, int, int, boolean);
    public static void screenshot(android.os.IBinder, android.view.Surface, int, int);
    public static void screenshot(android.os.IBinder, android.view.Surface);
    public static android.graphics.Bitmap screenshot(android.graphics.Rect, int, int, int, int, boolean, int);
    public static android.graphics.Bitmap screenshot(android.graphics.Rect, int, int, int);
    public static android.graphics.GraphicBuffer screenshotToBuffer(android.graphics.Rect, int, int, int, int, boolean, int);
    public static boolean setActiveColorMode(android.os.IBinder, int);
    public static boolean setActiveConfig(android.os.IBinder, int);
    public void setAlpha(float);
    public static void setAnimationTransaction();
    public void setColor(float[]);
    public static void setDisplayLayerStack(android.os.IBinder, int);
    public static void setDisplayPowerMode(android.os.IBinder, int);
    public static void setDisplayProjection(android.os.IBinder, int, android.graphics.Rect, android.graphics.Rect);
    public static void setDisplaySize(android.os.IBinder, int, int);
    public static void setDisplaySurface(android.os.IBinder, android.view.Surface);
    public void setFinalCrop(android.graphics.Rect);
    public void setGeometryAppliesWithResize();
    public void setLayer(int);
    public void setLayerStack(int);
    public void setMatrix(float, float, float, float);
    public void setMatrix(android.graphics.Matrix, float[]);
    public void setOpaque(boolean);
    public void setOverrideScalingMode(int);
    public void setPosition(float, float);
    public void setRelativeLayer(android.view.SurfaceControl, int);
    public void setSecure(boolean);
    public void setSize(int, int);
    public void setTransparentRegionHint(android.graphics.Region);
    public void setWindowCrop(android.graphics.Rect);
    public void show();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int BUILT_IN_DISPLAY_ID_HDMI;
    public static int BUILT_IN_DISPLAY_ID_MAIN;
    public static android.os.Parcelable$Creator CREATOR;
    public static int CURSOR_WINDOW;
    public static int FX_SURFACE_DIM;
    public static int FX_SURFACE_MASK;
    public static int FX_SURFACE_NORMAL;
    public static int HIDDEN;
    public static int NON_PREMULTIPLIED;
    public static int OPAQUE;
    public static int POWER_MODE_DOZE;
    public static int POWER_MODE_DOZE_SUSPEND;
    public static int POWER_MODE_NORMAL;
    public static int POWER_MODE_OFF;
    public static int POWER_MODE_ON_SUSPEND;
    public static int PROTECTED_APP;
    public static int SECURE;
    public static int WINDOW_TYPE_DONT_SCREENSHOT;
}

-keep class android.view.SurfaceControl$PhysicalDisplayInfo {
    <init>();
    <init>(android.view.SurfaceControl$PhysicalDisplayInfo);

    public void copyFrom(android.view.SurfaceControl$PhysicalDisplayInfo);
    public boolean equals(java.lang.Object);
    public boolean equals(android.view.SurfaceControl$PhysicalDisplayInfo);
    public int hashCode();
    public java.lang.String toString();


    public long appVsyncOffsetNanos;
    public float density;
    public int height;
    public long presentationDeadlineNanos;
    public float refreshRate;
    public boolean secure;
    public int width;
    public float xDpi;
    public float yDpi;
}

-keep class android.view.SurfaceControl$Transaction {
    <init>();

    public void apply();
    public void apply(boolean);
    public void close();
    public android.view.SurfaceControl$Transaction deferTransactionUntil(android.view.SurfaceControl, android.os.IBinder, long);
    public android.view.SurfaceControl$Transaction deferTransactionUntilSurface(android.view.SurfaceControl, android.view.Surface, long);
    public android.view.SurfaceControl$Transaction destroy(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction detachChildren(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction hide(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction merge(android.view.SurfaceControl$Transaction);
    public android.view.SurfaceControl$Transaction reparent(android.view.SurfaceControl, android.os.IBinder);
    public android.view.SurfaceControl$Transaction reparentChildren(android.view.SurfaceControl, android.os.IBinder);
    public android.view.SurfaceControl$Transaction setAlpha(android.view.SurfaceControl, float);
    public android.view.SurfaceControl$Transaction setAnimationTransaction();
    public android.view.SurfaceControl$Transaction setColor(android.view.SurfaceControl, float[]);
    public android.view.SurfaceControl$Transaction setDisplayLayerStack(android.os.IBinder, int);
    public android.view.SurfaceControl$Transaction setDisplayProjection(android.os.IBinder, int, android.graphics.Rect, android.graphics.Rect);
    public android.view.SurfaceControl$Transaction setDisplaySize(android.os.IBinder, int, int);
    public android.view.SurfaceControl$Transaction setDisplaySurface(android.os.IBinder, android.view.Surface);
    public android.view.SurfaceControl$Transaction setEarlyWakeup();
    public android.view.SurfaceControl$Transaction setFinalCrop(android.view.SurfaceControl, android.graphics.Rect);
    public android.view.SurfaceControl$Transaction setGeometryAppliesWithResize(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction setLayer(android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setLayerStack(android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setMatrix(android.view.SurfaceControl, float, float, float, float);
    public android.view.SurfaceControl$Transaction setMatrix(android.view.SurfaceControl, android.graphics.Matrix, float[]);
    public android.view.SurfaceControl$Transaction setOpaque(android.view.SurfaceControl, boolean);
    public android.view.SurfaceControl$Transaction setOverrideScalingMode(android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setPosition(android.view.SurfaceControl, float, float);
    public android.view.SurfaceControl$Transaction setRelativeLayer(android.view.SurfaceControl, android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setSecure(android.view.SurfaceControl, boolean);
    public android.view.SurfaceControl$Transaction setSize(android.view.SurfaceControl, int, int);
    public android.view.SurfaceControl$Transaction setTransparentRegionHint(android.view.SurfaceControl, android.graphics.Region);
    public android.view.SurfaceControl$Transaction setWindowCrop(android.view.SurfaceControl, android.graphics.Rect);
    public android.view.SurfaceControl$Transaction show(android.view.SurfaceControl);


    public static libcore.util.NativeAllocationRegistry sRegistry;
}

-keep class android.view.SurfaceHolder {

    public abstract void addCallback(android.view.SurfaceHolder$Callback);
    public abstract android.view.Surface getSurface();
    public abstract android.graphics.Rect getSurfaceFrame();
    public abstract boolean isCreating();
    public abstract android.graphics.Canvas lockCanvas();
    public abstract android.graphics.Canvas lockCanvas(android.graphics.Rect);
    public android.graphics.Canvas lockHardwareCanvas();
    public abstract void removeCallback(android.view.SurfaceHolder$Callback);
    public abstract void setFixedSize(int, int);
    public abstract void setFormat(int);
    public abstract void setKeepScreenOn(boolean);
    public abstract void setSizeFromLayout();
    public abstract void setType(int);
    public abstract void unlockCanvasAndPost(android.graphics.Canvas);


    public static int SURFACE_TYPE_GPU;
    public static int SURFACE_TYPE_HARDWARE;
    public static int SURFACE_TYPE_NORMAL;
    public static int SURFACE_TYPE_PUSH_BUFFERS;
}

-keep class android.view.SurfaceHolder$Callback {

    public abstract void surfaceChanged(android.view.SurfaceHolder, int, int, int);
    public abstract void surfaceCreated(android.view.SurfaceHolder);
    public abstract void surfaceDestroyed(android.view.SurfaceHolder);


}

-keep class android.view.SurfaceHolder$Callback2 {

    public abstract void surfaceRedrawNeeded(android.view.SurfaceHolder);
    public void surfaceRedrawNeededAsync(android.view.SurfaceHolder, java.lang.Runnable);


}

-keep class android.view.SurfaceView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    protected void applyChildSurfaceTransaction_renderWorker(android.view.SurfaceControl$Transaction, android.view.Surface, long);
    protected void dispatchDraw(android.graphics.Canvas);
    public void draw(android.graphics.Canvas);
    public boolean gatherTransparentRegion(android.graphics.Region);
    public android.view.SurfaceHolder getHolder();
    public boolean isFixedSize();
    protected void onAttachedToWindow();
    protected void onDetachedFromWindow();
    protected void onMeasure(int, int);
    protected void onWindowVisibilityChanged(int);
    protected boolean setFrame(int, int, int, int);
    public void setResizeBackgroundColor(int);
    public void setSecure(boolean);
    public void setVisibility(int);
    public void setZOrderMediaOverlay(boolean);
    public void setZOrderOnTop(boolean);
    public void surfacePositionLost_uiRtSync(long);
    protected void updateSurface();
    public void updateSurfacePosition_renderWorker(long, int, int, int, int);
    public void windowStopped(boolean);


}

-keep class android.view.ThreadedRenderer {

    public void addRenderNode(android.view.RenderNode, boolean);
    public static int copySurfaceInto(android.view.Surface, android.graphics.Rect, android.graphics.Bitmap);
    public static android.view.ThreadedRenderer create(android.content.Context, boolean, java.lang.String);
    public static android.graphics.Bitmap createHardwareBitmap(android.view.RenderNode, int, int);
    public static void disable(boolean);
    public static void disableVsync();
    public void drawRenderNode(android.view.RenderNode);
    public static void enableForegroundTrimming();
    protected void finalize();
    public static boolean isAvailable();
    public void notifyFramePending();
    public static void overrideProperty(java.lang.String, java.lang.String);
    public void removeRenderNode(android.view.RenderNode);
    public void setContentDrawBounds(int, int, int, int);
    public static void setContextPriority(int);
    public static void setDebuggingEnabled(boolean);
    public static void setFPSDivisor(int);
    public static void setHighContrastText(boolean);
    public static void setIsolatedProcess(boolean);
    public static void setupDiskCache(java.io.File);
    public static void trimMemory(int);


    public static java.lang.String DEBUG_DIRTY_REGIONS_PROPERTY;
    public static java.lang.String DEBUG_FPS_DIVISOR;
    public static java.lang.String DEBUG_OVERDRAW_PROPERTY;
    public static java.lang.String DEBUG_SHOW_LAYERS_UPDATES_PROPERTY;
    public static java.lang.String DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY;
    public static int EGL_CONTEXT_PRIORITY_HIGH_IMG;
    public static int EGL_CONTEXT_PRIORITY_LOW_IMG;
    public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG;
    public static java.lang.String OVERDRAW_PROPERTY_SHOW;
    public static java.lang.String PROFILE_PROPERTY;
    public static java.lang.String PROFILE_PROPERTY_VISUALIZE_BARS;
    public static boolean sRendererDisabled;
    public static boolean sSystemRendererDisabled;
    public static boolean sTrimForeground;
}

-keep class android.view.ThreadedRenderer$FrameDrawingCallback {

    public abstract void onFrameDraw(long);


}

-keep class android.view.TouchDelegate {
    <init>(android.graphics.Rect, android.view.View);

    public boolean onTouchEvent(android.view.MotionEvent);


    public static int ABOVE;
    public static int BELOW;
    public static int TO_LEFT;
    public static int TO_RIGHT;
}

-keep class android.view.View {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addChildrenForAccessibility(java.util.ArrayList);
    public void addExtraDataToAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
    public void addFocusables(java.util.ArrayList, int);
    public void addFocusables(java.util.ArrayList, int, int);
    public void addFrameMetricsListener(android.view.Window, android.view.Window$OnFrameMetricsAvailableListener, android.os.Handler);
    public void addKeyboardNavigationClusters(java.util.Collection, int);
    public void addOnAttachStateChangeListener(android.view.View$OnAttachStateChangeListener);
    public void addOnLayoutChangeListener(android.view.View$OnLayoutChangeListener);
    public void addOnUnhandledKeyEventListener(android.view.View$OnUnhandledKeyEventListener);
    public void addTouchables(java.util.ArrayList);
    public android.view.ViewPropertyAnimator animate();
    public void announceForAccessibility(java.lang.CharSequence);
    public void applyDrawableToTransparentRegion(android.graphics.drawable.Drawable, android.graphics.Region);
    public void autofill(android.view.autofill.AutofillValue);
    public void autofill(android.util.SparseArray);
    protected boolean awakenScrollBars();
    protected boolean awakenScrollBars(int);
    protected boolean awakenScrollBars(int, boolean);
    public void bringToFront();
    public void buildDrawingCache();
    public void buildDrawingCache(boolean);
    public void buildLayer();
    public boolean callOnClick();
    public boolean canHaveDisplayList();
    public boolean canNotifyAutofillEnterExitEvent();
    public boolean canResolveLayoutDirection();
    public boolean canResolveTextAlignment();
    public boolean canResolveTextDirection();
    public boolean canScrollHorizontally(int);
    public boolean canScrollVertically(int);
    public void cancelDragAndDrop();
    public void cancelLongPress();
    public void cancelPendingInputEvents();
    public void captureTransitioningViews(java.util.List);
    public boolean checkInputConnectionProxy(android.view.View);
    public void clearAccessibilityFocus();
    public void clearAnimation();
    public void clearFocus();
    public static int combineMeasuredStates(int, int);
    protected boolean computeFitSystemWindows(android.graphics.Rect, android.graphics.Rect);
    protected int computeHorizontalScrollExtent();
    protected int computeHorizontalScrollOffset();
    protected int computeHorizontalScrollRange();
    protected void computeOpaqueFlags();
    public void computeScroll();
    public android.view.WindowInsets computeSystemWindowInsets(android.view.WindowInsets, android.graphics.Rect);
    protected int computeVerticalScrollExtent();
    protected int computeVerticalScrollOffset();
    protected int computeVerticalScrollRange();
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo();
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfoInternal();
    public void createContextMenu(android.view.ContextMenu);
    public android.graphics.Bitmap createSnapshot(android.view.ViewDebug$CanvasProvider, boolean);
    protected void damageInParent();
    public void debug();
    protected void debug(int);
    protected static java.lang.String debugIndent(int);
    public void destroyDrawingCache();
    protected void destroyHardwareResources();
    public boolean dispatchActivityResult(java.lang.String, int, int, android.content.Intent);
    public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets);
    public boolean dispatchCapturedPointerEvent(android.view.MotionEvent);
    public void dispatchConfigurationChanged(android.content.res.Configuration);
    public void dispatchDisplayHint(int);
    public boolean dispatchDragEvent(android.view.DragEvent);
    protected void dispatchDraw(android.graphics.Canvas);
    public void dispatchDrawableHotspotChanged(float, float);
    public void dispatchFinishTemporaryDetach();
    protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
    public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
    protected void dispatchGetDisplayList();
    protected boolean dispatchHoverEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public boolean dispatchNestedFling(float, float, boolean);
    public boolean dispatchNestedPreFling(float, float);
    public boolean dispatchNestedPrePerformAccessibilityAction(int, android.os.Bundle);
    public boolean dispatchNestedPreScroll(int, int, int[], int[]);
    public boolean dispatchNestedScroll(int, int, int, int, int[]);
    public void dispatchPointerCaptureChanged(boolean);
    public boolean dispatchPointerEvent(android.view.MotionEvent);
    public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
    public void dispatchProvideStructure(android.view.ViewStructure);
    protected void dispatchRestoreInstanceState(android.util.SparseArray);
    protected void dispatchSaveInstanceState(android.util.SparseArray);
    protected void dispatchSetActivated(boolean);
    protected void dispatchSetPressed(boolean);
    protected void dispatchSetSelected(boolean);
    public void dispatchStartTemporaryDetach();
    public void dispatchSystemUiVisibilityChanged(int);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public boolean dispatchUnhandledMove(android.view.View, int);
    protected void dispatchVisibilityChanged(android.view.View, int);
    public void dispatchWindowFocusChanged(boolean);
    public void dispatchWindowSystemUiVisiblityChanged(int);
    public void dispatchWindowVisibilityChanged(int);
    public void draw(android.graphics.Canvas);
    public void drawableHotspotChanged(float, float);
    protected void drawableStateChanged();
    public void encode(android.view.ViewHierarchyEncoder);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public android.view.View findFocus();
    public void findNamedViews(java.util.Map);
    public android.view.View findViewByAccessibilityIdTraversal(int);
    public android.view.View findViewByAutofillIdTraversal(int);
    public android.view.View findViewById(int);
    public android.view.View findViewByPredicate(java.util.function.Predicate);
    public android.view.View findViewByPredicateInsideOut(android.view.View, java.util.function.Predicate);
    protected android.view.View findViewByPredicateTraversal(java.util.function.Predicate, android.view.View);
    protected android.view.View findViewTraversal(int);
    public android.view.View findViewWithTag(java.lang.Object);
    protected android.view.View findViewWithTagTraversal(java.lang.Object);
    public void findViewsWithText(java.util.ArrayList, java.lang.CharSequence, int);
    protected boolean fitSystemWindows(android.graphics.Rect);
    public boolean fitsSystemWindows();
    public android.view.View focusSearch(int);
    public void forceHasOverlappingRendering(boolean);
    public void forceLayout();
    public boolean gatherTransparentRegion(android.graphics.Region);
    public static int generateViewId();
    public java.lang.CharSequence getAccessibilityClassName();
    public android.view.View$AccessibilityDelegate getAccessibilityDelegate();
    public int getAccessibilityLiveRegion();
    public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
    public java.lang.CharSequence getAccessibilityPaneTitle();
    public int getAccessibilitySelectionEnd();
    public int getAccessibilitySelectionStart();
    public int getAccessibilityTraversalAfter();
    public int getAccessibilityTraversalBefore();
    public int getAccessibilityViewId();
    public int getAccessibilityWindowId();
    public float getAlpha();
    public android.view.animation.Animation getAnimation();
    public android.os.IBinder getApplicationWindowToken();
    public java.lang.String[] getAutofillHints();
    public android.view.autofill.AutofillId getAutofillId();
    public int getAutofillType();
    public android.view.autofill.AutofillValue getAutofillValue();
    public int getAutofillViewId();
    public android.graphics.drawable.Drawable getBackground();
    public android.content.res.ColorStateList getBackgroundTintList();
    public android.graphics.PorterDuff$Mode getBackgroundTintMode();
    public int getBaseline();
    public int getBottom();
    protected float getBottomFadingEdgeStrength();
    protected int getBottomPaddingOffset();
    public void getBoundsOnScreen(android.graphics.Rect);
    public void getBoundsOnScreen(android.graphics.Rect, boolean);
    public float getCameraDistance();
    public android.graphics.Rect getClipBounds();
    public boolean getClipBounds(android.graphics.Rect);
    public boolean getClipToOutline();
    public java.lang.CharSequence getContentDescription();
    public android.content.Context getContext();
    protected android.view.ContextMenu$ContextMenuInfo getContextMenuInfo();
    public boolean getDefaultFocusHighlightEnabled();
    public static int getDefaultSize(int, int);
    public android.view.Display getDisplay();
    public int[] getDrawableState();
    public android.graphics.Bitmap getDrawingCache();
    public android.graphics.Bitmap getDrawingCache(boolean);
    public int getDrawingCacheBackgroundColor();
    public int getDrawingCacheQuality();
    public void getDrawingRect(android.graphics.Rect);
    public long getDrawingTime();
    public float getElevation();
    protected int getFadeHeight(boolean);
    protected int getFadeTop(boolean);
    public boolean getFilterTouchesWhenObscured();
    public boolean getFitsSystemWindows();
    public int getFocusable();
    public java.util.ArrayList getFocusables(int);
    public void getFocusedRect(android.graphics.Rect);
    public android.graphics.drawable.Drawable getForeground();
    public int getForegroundGravity();
    public android.content.res.ColorStateList getForegroundTintList();
    public android.graphics.PorterDuff$Mode getForegroundTintMode();
    public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
    public boolean getGlobalVisibleRect(android.graphics.Rect);
    public android.os.Handler getHandler();
    public boolean getHasOverlappingRendering();
    public int getHeight();
    public void getHitRect(android.graphics.Rect);
    public int getHorizontalFadingEdgeLength();
    protected float getHorizontalScrollFactor();
    protected int getHorizontalScrollbarHeight();
    public void getHotspotBounds(android.graphics.Rect);
    public int getId();
    public int getImportantForAccessibility();
    public int getImportantForAutofill();
    public android.graphics.Matrix getInverseMatrix();
    public java.lang.CharSequence getIterableTextForAccessibility();
    public android.view.AccessibilityIterators$TextSegmentIterator getIteratorForGranularity(int);
    public boolean getKeepScreenOn();
    public android.view.KeyEvent$DispatcherState getKeyDispatcherState();
    public int getLabelFor();
    public int getLayerType();
    public int getLayoutDirection();
    public android.view.ViewGroup$LayoutParams getLayoutParams();
    public int getLeft();
    protected float getLeftFadingEdgeStrength();
    protected int getLeftPaddingOffset();
    public boolean getLocalVisibleRect(android.graphics.Rect);
    public void getLocationInSurface(int[]);
    public void getLocationInWindow(int[]);
    public int[] getLocationOnScreen();
    public void getLocationOnScreen(int[]);
    public android.graphics.Matrix getMatrix();
    public int getMeasuredHeight();
    public int getMeasuredHeightAndState();
    public int getMeasuredState();
    public int getMeasuredWidth();
    public int getMeasuredWidthAndState();
    public int getMinimumHeight();
    public int getMinimumWidth();
    public int getNextClusterForwardId();
    public int getNextFocusDownId();
    public int getNextFocusForwardId();
    public int getNextFocusLeftId();
    public int getNextFocusRightId();
    public int getNextFocusUpId();
    public android.view.View$OnFocusChangeListener getOnFocusChangeListener();
    public android.graphics.Insets getOpticalInsets();
    public int getOutlineAmbientShadowColor();
    public android.view.ViewOutlineProvider getOutlineProvider();
    public int getOutlineSpotShadowColor();
    public void getOutsets(android.graphics.Rect);
    public int getOverScrollMode();
    public android.view.ViewOverlay getOverlay();
    public int getPaddingBottom();
    public int getPaddingEnd();
    public int getPaddingLeft();
    public int getPaddingRight();
    public int getPaddingStart();
    public int getPaddingTop();
    public android.view.ViewParent getParent();
    public android.view.ViewParent getParentForAccessibility();
    public float getPivotX();
    public float getPivotY();
    public android.view.PointerIcon getPointerIcon();
    public int getRawLayoutDirection();
    public int getRawTextAlignment();
    public int getRawTextDirection();
    public android.content.res.Resources getResources();
    public boolean getRevealOnFocusHint();
    public int getRight();
    protected float getRightFadingEdgeStrength();
    protected int getRightPaddingOffset();
    public android.view.View getRootView();
    public android.view.WindowInsets getRootWindowInsets();
    public float getRotation();
    public float getRotationX();
    public float getRotationY();
    public float getScaleX();
    public float getScaleY();
    public int getScrollBarDefaultDelayBeforeFade();
    public int getScrollBarFadeDuration();
    public int getScrollBarSize();
    public int getScrollBarStyle();
    public int getScrollIndicators();
    public int getScrollX();
    public int getScrollY();
    public int getSolidColor();
    public android.animation.StateListAnimator getStateListAnimator();
    protected int getSuggestedMinimumHeight();
    protected int getSuggestedMinimumWidth();
    public int getSystemUiVisibility();
    public java.lang.Object getTag();
    public java.lang.Object getTag(int);
    public int getTextAlignment();
    public int getTextDirection();
    public android.view.ThreadedRenderer getThreadedRenderer();
    public java.lang.CharSequence getTooltip();
    public java.lang.CharSequence getTooltipText();
    public android.view.View getTooltipView();
    public int getTop();
    protected float getTopFadingEdgeStrength();
    protected int getTopPaddingOffset();
    public android.view.TouchDelegate getTouchDelegate();
    public java.util.ArrayList getTouchables();
    public float getTransitionAlpha();
    public java.lang.String getTransitionName();
    public float getTranslationX();
    public float getTranslationY();
    public float getTranslationZ();
    public int getVerticalFadingEdgeLength();
    protected float getVerticalScrollFactor();
    public int getVerticalScrollbarPosition();
    public int getVerticalScrollbarWidth();
    public android.view.ViewRootImpl getViewRootImpl();
    public android.view.ViewTreeObserver getViewTreeObserver();
    public int getVisibility();
    public int getWidth();
    protected android.view.IWindow getWindow();
    protected int getWindowAttachCount();
    public void getWindowDisplayFrame(android.graphics.Rect);
    public android.view.WindowId getWindowId();
    public int getWindowSystemUiVisibility();
    public android.os.IBinder getWindowToken();
    public int getWindowVisibility();
    public void getWindowVisibleDisplayFrame(android.graphics.Rect);
    public float getX();
    public float getY();
    public float getZ();
    protected boolean handleScrollBarDragging(android.view.MotionEvent);
    public boolean hasExplicitFocusable();
    public boolean hasFocus();
    public boolean hasFocusable();
    protected boolean hasHoveredChild();
    public boolean hasNestedScrollingParent();
    public boolean hasOnClickListeners();
    protected boolean hasOpaqueScrollbars();
    public boolean hasOverlappingRendering();
    public boolean hasPointerCapture();
    public boolean hasShadow();
    public boolean hasTransientState();
    public boolean hasWindowFocus();
    public boolean includeForAccessibility();
    public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup);
    protected void initializeFadingEdge(android.content.res.TypedArray);
    protected void initializeFadingEdgeInternal(android.content.res.TypedArray);
    protected void initializeScrollbars(android.content.res.TypedArray);
    protected void initializeScrollbarsInternal(android.content.res.TypedArray);
    protected void internalSetPadding(int, int, int, int);
    public void invalidate(android.graphics.Rect);
    public void invalidate(int, int, int, int);
    public void invalidate();
    public void invalidate(boolean);
    public void invalidateDrawable(android.graphics.drawable.Drawable);
    public void invalidateOutline();
    protected void invalidateParentCaches();
    protected void invalidateParentIfNeeded();
    protected void invalidateParentIfNeededAndWasQuickRejected();
    public boolean isAccessibilityFocused();
    public boolean isAccessibilityHeading();
    public boolean isAccessibilitySelectionExtendable();
    public boolean isActionableForAccessibility();
    public boolean isActivated();
    public boolean isAssistBlocked();
    public boolean isAttachedToWindow();
    public boolean isAutofilled();
    public boolean isClickable();
    public boolean isContextClickable();
    public static boolean isDefaultFocusHighlightEnabled();
    public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
    public boolean isDirty();
    public boolean isDrawingCacheEnabled();
    public boolean isDuplicateParentStateEnabled();
    public boolean isEnabled();
    public boolean isFocusable();
    public boolean isFocusableInTouchMode();
    public boolean isFocused();
    public boolean isFocusedByDefault();
    public boolean isForegroundInsidePadding();
    public boolean isHapticFeedbackEnabled();
    public boolean isHardwareAccelerated();
    public boolean isHorizontalFadingEdgeEnabled();
    public boolean isHorizontalScrollBarEnabled();
    public boolean isHovered();
    public boolean isImportantForAccessibility();
    public boolean isImportantForAutofill();
    public boolean isInEditMode();
    public boolean isInLayout();
    public boolean isInScrollingContainer();
    public boolean isInTouchMode();
    public boolean isKeyboardNavigationCluster();
    public boolean isLaidOut();
    public boolean isLayoutDirectionInherited();
    public boolean isLayoutDirectionResolved();
    public static boolean isLayoutModeOptical(java.lang.Object);
    public boolean isLayoutRequested();
    public boolean isLayoutRtl();
    public boolean isLongClickable();
    public boolean isNestedScrollingEnabled();
    public boolean isOpaque();
    protected boolean isPaddingOffsetRequired();
    public boolean isPaddingRelative();
    public boolean isPivotSet();
    public boolean isPressed();
    public boolean isRootNamespace();
    public boolean isSaveEnabled();
    public boolean isSaveFromParentEnabled();
    public boolean isScreenReaderFocusable();
    public boolean isScrollContainer();
    public boolean isScrollbarFadingEnabled();
    public boolean isSelected();
    public boolean isShown();
    public boolean isSoundEffectsEnabled();
    public boolean isTemporarilyDetached();
    public boolean isTextAlignmentInherited();
    public boolean isTextAlignmentResolved();
    public boolean isTextDirectionInherited();
    public boolean isTextDirectionResolved();
    public boolean isVerticalFadingEdgeEnabled();
    public boolean isVerticalScrollBarEnabled();
    protected boolean isVerticalScrollBarHidden();
    public boolean isVisibleToUser();
    protected boolean isVisibleToUser(android.graphics.Rect);
    public boolean isVisibleToUserForAutofill(int);
    public void jumpDrawablesToCurrentState();
    public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
    public void layout(int, int, int, int);
    public void makeOptionalFitsSystemWindows();
    public void mapRectFromViewToScreenCoords(android.graphics.RectF, boolean);
    public void measure(int, int);
    protected static int[] mergeDrawableStates(int[], int[]);
    public void notifyEnterOrExitForAutoFillIfNeeded(boolean);
    public void notifySubtreeAccessibilityStateChangedIfNeeded();
    public void notifyViewAccessibilityStateChangedIfNeeded(int);
    public void offsetLeftAndRight(int);
    public void offsetTopAndBottom(int);
    public void onActivityResult(int, int, android.content.Intent);
    protected void onAnimationEnd();
    protected void onAnimationStart();
    public android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets);
    protected void onAttachedToWindow();
    public void onCancelPendingInputEvents();
    public boolean onCapturedPointerEvent(android.view.MotionEvent);
    public boolean onCheckIsTextEditor();
    public void onCloseSystemDialogs(java.lang.String);
    protected void onConfigurationChanged(android.content.res.Configuration);
    protected void onCreateContextMenu(android.view.ContextMenu);
    protected int[] onCreateDrawableState(int);
    public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
    protected void onDetachedFromWindow();
    protected void onDetachedFromWindowInternal();
    protected void onDisplayHint(int);
    public boolean onDragEvent(android.view.DragEvent);
    protected void onDraw(android.graphics.Canvas);
    public void onDrawForeground(android.graphics.Canvas);
    protected void onDrawHorizontalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
    protected void onDrawScrollBars(android.graphics.Canvas);
    protected void onDrawVerticalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
    public boolean onFilterTouchEventForSecurity(android.view.MotionEvent);
    protected void onFinishInflate();
    public void onFinishTemporaryDetach();
    protected void onFocusChanged(boolean, int, android.graphics.Rect);
    protected void onFocusLost();
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public void onHoverChanged(boolean);
    public boolean onHoverEvent(android.view.MotionEvent);
    public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    public boolean onKeyDown(int, android.view.KeyEvent);
    public boolean onKeyLongPress(int, android.view.KeyEvent);
    public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public boolean onKeyPreIme(int, android.view.KeyEvent);
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onKeyUp(int, android.view.KeyEvent);
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public void onMovedToDisplay(int, android.content.res.Configuration);
    protected void onOverScrolled(int, int, boolean, boolean);
    public void onPointerCaptureChange(boolean);
    public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public void onPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onProvideAutofillStructure(android.view.ViewStructure, int);
    public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
    public void onProvideStructure(android.view.ViewStructure);
    public void onProvideVirtualStructure(android.view.ViewStructure);
    public void onResolveDrawables(int);
    public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
    protected void onRestoreInstanceState(android.os.Parcelable);
    public void onRtlPropertiesChanged(int);
    protected android.os.Parcelable onSaveInstanceState();
    public void onScreenStateChanged(int);
    protected void onScrollChanged(int, int, int, int);
    protected boolean onSetAlpha(int);
    protected void onSizeChanged(int, int, int, int);
    public void onStartTemporaryDetach();
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean onTrackballEvent(android.view.MotionEvent);
    public void onVisibilityAggregated(boolean);
    protected void onVisibilityChanged(android.view.View, int);
    public void onWindowFocusChanged(boolean);
    public void onWindowSystemUiVisibilityChanged(int);
    protected void onWindowVisibilityChanged(int);
    public void outputDirtyFlags(java.lang.String, boolean, int);
    protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean);
    public boolean performAccessibilityAction(int, android.os.Bundle);
    public boolean performAccessibilityActionInternal(int, android.os.Bundle);
    protected boolean performButtonActionOnTouchDown(android.view.MotionEvent);
    public boolean performClick();
    public boolean performContextClick(float, float);
    public boolean performContextClick();
    public boolean performHapticFeedback(int);
    public boolean performHapticFeedback(int, int);
    public boolean performLongClick();
    public boolean performLongClick(float, float);
    public void playSoundEffect(int);
    public boolean pointInView(float, float, float);
    public boolean post(java.lang.Runnable);
    public boolean postDelayed(java.lang.Runnable, long);
    public void postInvalidate();
    public void postInvalidate(int, int, int, int);
    public void postInvalidateDelayed(long);
    public void postInvalidateDelayed(long, int, int, int, int);
    public void postInvalidateOnAnimation();
    public void postInvalidateOnAnimation(int, int, int, int);
    public void postOnAnimation(java.lang.Runnable);
    public void postOnAnimationDelayed(java.lang.Runnable, long);
    protected void recomputePadding();
    public void refreshDrawableState();
    public void releasePointerCapture();
    public boolean removeCallbacks(java.lang.Runnable);
    public void removeFrameMetricsListener(android.view.Window$OnFrameMetricsAvailableListener);
    public void removeOnAttachStateChangeListener(android.view.View$OnAttachStateChangeListener);
    public void removeOnLayoutChangeListener(android.view.View$OnLayoutChangeListener);
    public void removeOnUnhandledKeyEventListener(android.view.View$OnUnhandledKeyEventListener);
    public boolean requestAccessibilityFocus();
    public void requestApplyInsets();
    public void requestFitSystemWindows();
    public boolean requestFocus();
    public boolean requestFocus(int);
    public boolean requestFocus(int, android.graphics.Rect);
    public boolean requestFocusFromTouch();
    public void requestKeyboardShortcuts(java.util.List, int);
    public void requestLayout();
    public void requestPointerCapture();
    public boolean requestRectangleOnScreen(android.graphics.Rect);
    public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
    public void requestUnbufferedDispatch(android.view.MotionEvent);
    public android.view.View requireViewById(int);
    public void resetPaddingToInitialValues();
    public void resetPivot();
    protected void resetResolvedDrawables();
    public void resetResolvedLayoutDirection();
    public void resetResolvedPadding();
    public void resetResolvedTextAlignment();
    public void resetResolvedTextDirection();
    public void resetRtlProperties();
    protected void resolveDrawables();
    public boolean resolveLayoutDirection();
    public void resolveLayoutParams();
    public void resolvePadding();
    public boolean resolveRtlPropertiesIfNeeded();
    public static int resolveSize(int, int);
    public static int resolveSizeAndState(int, int, int);
    public boolean resolveTextAlignment();
    public boolean resolveTextDirection();
    public boolean restoreDefaultFocus();
    public boolean restoreFocusInCluster(int);
    public boolean restoreFocusNotInCluster();
    public void restoreHierarchyState(android.util.SparseArray);
    public void saveHierarchyState(android.util.SparseArray);
    public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
    public void scrollBy(int, int);
    public void scrollTo(int, int);
    public void sendAccessibilityEvent(int);
    public void sendAccessibilityEventInternal(int);
    public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
    public void sendAccessibilityEventUncheckedInternal(android.view.accessibility.AccessibilityEvent);
    public void setAccessibilityDelegate(android.view.View$AccessibilityDelegate);
    public void setAccessibilityHeading(boolean);
    public void setAccessibilityLiveRegion(int);
    public void setAccessibilityPaneTitle(java.lang.CharSequence);
    public void setAccessibilitySelection(int, int);
    public void setAccessibilityTraversalAfter(int);
    public void setAccessibilityTraversalBefore(int);
    public void setActivated(boolean);
    public void setAlpha(float);
    public void setAnimation(android.view.animation.Animation);
    public void setAnimationMatrix(android.graphics.Matrix);
    public void setAssistBlocked(boolean);
    public void setAutofillHints(java.lang.String[]);
    public void setAutofillId(android.view.autofill.AutofillId);
    public void setAutofilled(boolean);
    public void setBackground(android.graphics.drawable.Drawable);
    public void setBackgroundColor(int);
    public void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public void setBackgroundResource(int);
    public void setBackgroundTintList(android.content.res.ColorStateList);
    public void setBackgroundTintMode(android.graphics.PorterDuff$Mode);
    public void setBottom(int);
    public void setCameraDistance(float);
    public void setClickable(boolean);
    public void setClipBounds(android.graphics.Rect);
    public void setClipToOutline(boolean);
    public void setContentDescription(java.lang.CharSequence);
    public void setContextClickable(boolean);
    public void setDefaultFocusHighlightEnabled(boolean);
    public void setDisabledSystemUiVisibility(int);
    public void setDrawingCacheBackgroundColor(int);
    public void setDrawingCacheEnabled(boolean);
    public void setDrawingCacheQuality(int);
    public void setDuplicateParentStateEnabled(boolean);
    public void setElevation(float);
    public void setEnabled(boolean);
    public void setFadingEdgeLength(int);
    public void setFilterTouchesWhenObscured(boolean);
    public void setFitsSystemWindows(boolean);
    public void setFocusable(boolean);
    public void setFocusable(int);
    public void setFocusableInTouchMode(boolean);
    public void setFocusedByDefault(boolean);
    public void setFocusedInCluster();
    public void setForeground(android.graphics.drawable.Drawable);
    public void setForegroundGravity(int);
    public void setForegroundTintList(android.content.res.ColorStateList);
    public void setForegroundTintMode(android.graphics.PorterDuff$Mode);
    protected boolean setFrame(int, int, int, int);
    public void setHapticFeedbackEnabled(boolean);
    public void setHasTransientState(boolean);
    public void setHorizontalFadingEdgeEnabled(boolean);
    public void setHorizontalScrollBarEnabled(boolean);
    public void setHovered(boolean);
    public void setId(int);
    public void setImportantForAccessibility(int);
    public void setImportantForAutofill(int);
    public void setIsRootNamespace(boolean);
    public void setKeepScreenOn(boolean);
    public void setKeyboardNavigationCluster(boolean);
    public void setLabelFor(int);
    public void setLayerPaint(android.graphics.Paint);
    public void setLayerType(int, android.graphics.Paint);
    public void setLayoutDirection(int);
    public void setLayoutParams(android.view.ViewGroup$LayoutParams);
    public void setLeft(int);
    public void setLeftTopRightBottom(int, int, int, int);
    public void setLongClickable(boolean);
    protected void setMeasuredDimension(int, int);
    public void setMinimumHeight(int);
    public void setMinimumWidth(int);
    public void setNestedScrollingEnabled(boolean);
    public void setNextClusterForwardId(int);
    public void setNextFocusDownId(int);
    public void setNextFocusForwardId(int);
    public void setNextFocusLeftId(int);
    public void setNextFocusRightId(int);
    public void setNextFocusUpId(int);
    public void setNotifyAutofillManagerOnClick(boolean);
    public void setOnApplyWindowInsetsListener(android.view.View$OnApplyWindowInsetsListener);
    public void setOnCapturedPointerListener(android.view.View$OnCapturedPointerListener);
    public void setOnClickListener(android.view.View$OnClickListener);
    public void setOnContextClickListener(android.view.View$OnContextClickListener);
    public void setOnCreateContextMenuListener(android.view.View$OnCreateContextMenuListener);
    public void setOnDragListener(android.view.View$OnDragListener);
    public void setOnFocusChangeListener(android.view.View$OnFocusChangeListener);
    public void setOnGenericMotionListener(android.view.View$OnGenericMotionListener);
    public void setOnHoverListener(android.view.View$OnHoverListener);
    public void setOnKeyListener(android.view.View$OnKeyListener);
    public void setOnLongClickListener(android.view.View$OnLongClickListener);
    public void setOnScrollChangeListener(android.view.View$OnScrollChangeListener);
    public void setOnSystemUiVisibilityChangeListener(android.view.View$OnSystemUiVisibilityChangeListener);
    public void setOnTouchListener(android.view.View$OnTouchListener);
    public void setOpticalInsets(android.graphics.Insets);
    public void setOutlineAmbientShadowColor(int);
    public void setOutlineProvider(android.view.ViewOutlineProvider);
    public void setOutlineSpotShadowColor(int);
    public void setOverScrollMode(int);
    public void setPadding(int, int, int, int);
    public void setPaddingRelative(int, int, int, int);
    public void setPivotX(float);
    public void setPivotY(float);
    public void setPointerIcon(android.view.PointerIcon);
    public void setPressed(boolean);
    public void setRevealClip(boolean, float, float, float);
    public void setRevealOnFocusHint(boolean);
    public void setRight(int);
    public void setRotation(float);
    public void setRotationX(float);
    public void setRotationY(float);
    public void setSaveEnabled(boolean);
    public void setSaveFromParentEnabled(boolean);
    public void setScaleX(float);
    public void setScaleY(float);
    public void setScreenReaderFocusable(boolean);
    public void setScrollBarDefaultDelayBeforeFade(int);
    public void setScrollBarFadeDuration(int);
    public void setScrollBarSize(int);
    public void setScrollBarStyle(int);
    public void setScrollContainer(boolean);
    public void setScrollIndicators(int);
    public void setScrollIndicators(int, int);
    public void setScrollX(int);
    public void setScrollY(int);
    public void setScrollbarFadingEnabled(boolean);
    public void setSelected(boolean);
    public void setSoundEffectsEnabled(boolean);
    public void setStateListAnimator(android.animation.StateListAnimator);
    public void setSystemUiVisibility(int);
    public void setTag(java.lang.Object);
    public void setTag(int, java.lang.Object);
    public void setTagInternal(int, java.lang.Object);
    public void setTextAlignment(int);
    public void setTextDirection(int);
    public void setTooltip(java.lang.CharSequence);
    public void setTooltipText(java.lang.CharSequence);
    public void setTop(int);
    public void setTouchDelegate(android.view.TouchDelegate);
    public void setTransitionAlpha(float);
    public void setTransitionName(java.lang.String);
    public void setTransitionVisibility(int);
    public void setTranslationX(float);
    public void setTranslationY(float);
    public void setTranslationZ(float);
    public void setVerticalFadingEdgeEnabled(boolean);
    public void setVerticalScrollBarEnabled(boolean);
    public void setVerticalScrollbarPosition(int);
    public void setVisibility(int);
    public void setWillNotCacheDrawing(boolean);
    public void setWillNotDraw(boolean);
    public void setX(float);
    public void setY(float);
    public void setZ(float);
    public boolean showContextMenu();
    public boolean showContextMenu(float, float);
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback, int);
    public void startActivityForResult(android.content.Intent, int);
    public void startAnimation(android.view.animation.Animation);
    public boolean startDrag(android.content.ClipData, android.view.View$DragShadowBuilder, java.lang.Object, int);
    public boolean startDragAndDrop(android.content.ClipData, android.view.View$DragShadowBuilder, java.lang.Object, int);
    public boolean startMovingTask(float, float);
    public boolean startNestedScroll(int);
    public void stopNestedScroll();
    public boolean toGlobalMotionEvent(android.view.MotionEvent);
    public boolean toLocalMotionEvent(android.view.MotionEvent);
    public java.lang.String toString();
    public void transformFromViewToWindowSpace(int[]);
    public void transformMatrixToGlobal(android.graphics.Matrix);
    public void transformMatrixToLocal(android.graphics.Matrix);
    public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
    public void unscheduleDrawable(android.graphics.drawable.Drawable);
    public android.view.RenderNode updateDisplayListIfDirty();
    public void updateDragShadow(android.view.View$DragShadowBuilder);
    protected boolean verifyDrawable(android.graphics.drawable.Drawable);
    public boolean willNotCacheDrawing();
    public boolean willNotDraw();


    public static int ACCESSIBILITY_CURSOR_POSITION_UNDEFINED;
    public static int ACCESSIBILITY_LIVE_REGION_ASSERTIVE;
    public static int ACCESSIBILITY_LIVE_REGION_NONE;
    public static int ACCESSIBILITY_LIVE_REGION_POLITE;
    public static android.util.Property ALPHA;
    public static int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_NUMBER;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE;
    public static java.lang.String AUTOFILL_HINT_EMAIL_ADDRESS;
    public static java.lang.String AUTOFILL_HINT_NAME;
    public static java.lang.String AUTOFILL_HINT_PASSWORD;
    public static java.lang.String AUTOFILL_HINT_PHONE;
    public static java.lang.String AUTOFILL_HINT_POSTAL_ADDRESS;
    public static java.lang.String AUTOFILL_HINT_POSTAL_CODE;
    public static java.lang.String AUTOFILL_HINT_USERNAME;
    public static int AUTOFILL_TYPE_DATE;
    public static int AUTOFILL_TYPE_LIST;
    public static int AUTOFILL_TYPE_NONE;
    public static int AUTOFILL_TYPE_TEXT;
    public static int AUTOFILL_TYPE_TOGGLE;
    public static boolean DEBUG_DRAW;
    public static java.lang.String DEBUG_LAYOUT_PROPERTY;
    public static int DRAG_FLAG_GLOBAL;
    public static int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION;
    public static int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION;
    public static int DRAG_FLAG_GLOBAL_URI_READ;
    public static int DRAG_FLAG_GLOBAL_URI_WRITE;
    public static int DRAG_FLAG_OPAQUE;
    public static int DRAWING_CACHE_QUALITY_AUTO;
    public static int DRAWING_CACHE_QUALITY_HIGH;
    public static int DRAWING_CACHE_QUALITY_LOW;
    protected static int[] EMPTY_STATE_SET;
    protected static int[] ENABLED_FOCUSED_SELECTED_STATE_SET;
    protected static int[] ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] ENABLED_FOCUSED_STATE_SET;
    protected static int[] ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] ENABLED_SELECTED_STATE_SET;
    protected static int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] ENABLED_STATE_SET;
    protected static int[] ENABLED_WINDOW_FOCUSED_STATE_SET;
    public static int FIND_VIEWS_WITH_ACCESSIBILITY_NODE_PROVIDERS;
    public static int FIND_VIEWS_WITH_CONTENT_DESCRIPTION;
    public static int FIND_VIEWS_WITH_TEXT;
    public static int FOCUSABLE;
    public static int FOCUSABLES_ALL;
    public static int FOCUSABLES_TOUCH_MODE;
    public static int FOCUSABLE_AUTO;
    protected static int[] FOCUSED_SELECTED_STATE_SET;
    protected static int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] FOCUSED_STATE_SET;
    protected static int[] FOCUSED_WINDOW_FOCUSED_STATE_SET;
    public static int FOCUS_BACKWARD;
    public static int FOCUS_DOWN;
    public static int FOCUS_FORWARD;
    public static int FOCUS_LEFT;
    public static int FOCUS_RIGHT;
    public static int FOCUS_UP;
    public static int GONE;
    public static int HAPTIC_FEEDBACK_ENABLED;
    public static int IMPORTANT_FOR_ACCESSIBILITY_AUTO;
    public static int IMPORTANT_FOR_ACCESSIBILITY_NO;
    public static int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
    public static int IMPORTANT_FOR_ACCESSIBILITY_YES;
    public static int IMPORTANT_FOR_AUTOFILL_AUTO;
    public static int IMPORTANT_FOR_AUTOFILL_NO;
    public static int IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS;
    public static int IMPORTANT_FOR_AUTOFILL_YES;
    public static int IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS;
    public static int INVISIBLE;
    public static int KEEP_SCREEN_ON;
    public static int LAST_APP_AUTOFILL_ID;
    public static int LAYER_TYPE_HARDWARE;
    public static int LAYER_TYPE_NONE;
    public static int LAYER_TYPE_SOFTWARE;
    public static int LAYOUT_DIRECTION_INHERIT;
    public static int LAYOUT_DIRECTION_LOCALE;
    public static int LAYOUT_DIRECTION_LTR;
    public static int LAYOUT_DIRECTION_RTL;
    public static int LAYOUT_DIRECTION_UNDEFINED;
    public static int MEASURED_HEIGHT_STATE_SHIFT;
    public static int MEASURED_SIZE_MASK;
    public static int MEASURED_STATE_MASK;
    public static int MEASURED_STATE_TOO_SMALL;
    public static int NAVIGATION_BAR_TRANSIENT;
    public static int NAVIGATION_BAR_TRANSLUCENT;
    public static int NAVIGATION_BAR_TRANSPARENT;
    public static int NAVIGATION_BAR_UNHIDE;
    public static int NOT_FOCUSABLE;
    public static int NO_ID;
    public static int OVER_SCROLL_ALWAYS;
    public static int OVER_SCROLL_IF_CONTENT_SCROLLS;
    public static int OVER_SCROLL_NEVER;
    protected static int[] PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET;
    protected static int[] PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_SELECTED_STATE_SET;
    protected static int[] PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_STATE_SET;
    protected static int[] PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_SELECTED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_SELECTED_STATE_SET;
    protected static int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_STATE_SET;
    protected static int[] PRESSED_WINDOW_FOCUSED_STATE_SET;
    public static int PUBLIC_STATUS_BAR_VISIBILITY_MASK;
    public static android.util.Property ROTATION;
    public static android.util.Property ROTATION_X;
    public static android.util.Property ROTATION_Y;
    public static android.util.Property SCALE_X;
    public static android.util.Property SCALE_Y;
    public static int SCREEN_STATE_OFF;
    public static int SCREEN_STATE_ON;
    public static int SCROLLBARS_INSIDE_INSET;
    public static int SCROLLBARS_INSIDE_OVERLAY;
    public static int SCROLLBARS_OUTSIDE_INSET;
    public static int SCROLLBARS_OUTSIDE_OVERLAY;
    public static int SCROLLBAR_POSITION_DEFAULT;
    public static int SCROLLBAR_POSITION_LEFT;
    public static int SCROLLBAR_POSITION_RIGHT;
    public static int SCROLL_AXIS_HORIZONTAL;
    public static int SCROLL_AXIS_NONE;
    public static int SCROLL_AXIS_VERTICAL;
    public static int SCROLL_INDICATOR_BOTTOM;
    public static int SCROLL_INDICATOR_END;
    public static int SCROLL_INDICATOR_LEFT;
    public static int SCROLL_INDICATOR_RIGHT;
    public static int SCROLL_INDICATOR_START;
    public static int SCROLL_INDICATOR_TOP;
    protected static int[] SELECTED_STATE_SET;
    protected static int[] SELECTED_WINDOW_FOCUSED_STATE_SET;
    public static int SOUND_EFFECTS_ENABLED;
    public static int STATUS_BAR_DISABLE_BACK;
    public static int STATUS_BAR_DISABLE_CLOCK;
    public static int STATUS_BAR_DISABLE_EXPAND;
    public static int STATUS_BAR_DISABLE_HOME;
    public static int STATUS_BAR_DISABLE_NOTIFICATION_ALERTS;
    public static int STATUS_BAR_DISABLE_NOTIFICATION_ICONS;
    public static int STATUS_BAR_DISABLE_NOTIFICATION_TICKER;
    public static int STATUS_BAR_DISABLE_RECENT;
    public static int STATUS_BAR_DISABLE_SEARCH;
    public static int STATUS_BAR_DISABLE_SYSTEM_INFO;
    public static int STATUS_BAR_HIDDEN;
    public static int STATUS_BAR_TRANSIENT;
    public static int STATUS_BAR_TRANSLUCENT;
    public static int STATUS_BAR_TRANSPARENT;
    public static int STATUS_BAR_UNHIDE;
    public static int STATUS_BAR_VISIBLE;
    public static int SYSTEM_UI_CLEARABLE_FLAGS;
    public static int SYSTEM_UI_FLAG_FULLSCREEN;
    public static int SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    public static int SYSTEM_UI_FLAG_IMMERSIVE;
    public static int SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    public static int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
    public static int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
    public static int SYSTEM_UI_FLAG_LAYOUT_STABLE;
    public static int SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
    public static int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
    public static int SYSTEM_UI_FLAG_LOW_PROFILE;
    public static int SYSTEM_UI_FLAG_VISIBLE;
    public static int SYSTEM_UI_LAYOUT_FLAGS;
    public static int SYSTEM_UI_TRANSPARENT;
    public static int TEXT_ALIGNMENT_CENTER;
    public static int TEXT_ALIGNMENT_GRAVITY;
    public static int TEXT_ALIGNMENT_INHERIT;
    public static int TEXT_ALIGNMENT_TEXT_END;
    public static int TEXT_ALIGNMENT_TEXT_START;
    public static int TEXT_ALIGNMENT_VIEW_END;
    public static int TEXT_ALIGNMENT_VIEW_START;
    public static int TEXT_DIRECTION_ANY_RTL;
    public static int TEXT_DIRECTION_FIRST_STRONG;
    public static int TEXT_DIRECTION_FIRST_STRONG_LTR;
    public static int TEXT_DIRECTION_FIRST_STRONG_RTL;
    public static int TEXT_DIRECTION_INHERIT;
    public static int TEXT_DIRECTION_LOCALE;
    public static int TEXT_DIRECTION_LTR;
    public static int TEXT_DIRECTION_RTL;
    public static android.util.Property TRANSLATION_X;
    public static android.util.Property TRANSLATION_Y;
    public static android.util.Property TRANSLATION_Z;
    protected static java.lang.String VIEW_LOG_TAG;
    public static int VISIBLE;
    protected static int[] WINDOW_FOCUSED_STATE_SET;
    public static android.util.Property X;
    public static android.util.Property Y;
    public static android.util.Property Z;
    public java.lang.String[] mAttributes;
    protected int mBottom;
    public boolean mCachingFailed;
    protected android.content.Context mContext;
    protected android.view.animation.Animation mCurrentAnimation;
    public static boolean mDebugViewAttributes;
    protected android.view.InputEventConsistencyVerifier mInputEventConsistencyVerifier;
    protected android.view.ViewGroup$LayoutParams mLayoutParams;
    protected int mLeft;
    protected int mPaddingBottom;
    protected int mPaddingLeft;
    protected int mPaddingRight;
    protected int mPaddingTop;
    protected android.view.ViewParent mParent;
    public int mPrivateFlags;
    protected int mRight;
    protected int mScrollX;
    protected int mScrollY;
    protected java.lang.Object mTag;
    protected int mTop;
    public android.view.View$TransformationInfo mTransformationInfo;
    protected int mUserPaddingBottom;
    protected int mUserPaddingLeft;
    protected int mUserPaddingRight;
    protected static boolean sPreserveMarginParamsInLayoutParamConversion;
}

-keep class android.view.View$AccessibilityDelegate {
    <init>();

    public void addExtraDataToAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(android.view.View);
    public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider(android.view.View);
    public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
    public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
    public void sendAccessibilityEvent(android.view.View, int);
    public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);


}

-keep class android.view.View$AttachInfo {



    public android.view.Surface mDragSurface;
}

-keep class android.view.View$AttachInfo$InvalidateInfo {

    public static android.view.View$AttachInfo$InvalidateInfo obtain();
    public void recycle();


}

-keep class android.view.View$DragShadowBuilder {
    <init>(android.view.View);
    <init>();

    public android.view.View getView();
    public void onDrawShadow(android.graphics.Canvas);
    public void onProvideShadowMetrics(android.graphics.Point, android.graphics.Point);


}

-keep class android.view.View$OnApplyWindowInsetsListener {

    public abstract android.view.WindowInsets onApplyWindowInsets(android.view.View, android.view.WindowInsets);


}

-keep class android.view.View$OnAttachStateChangeListener {

    public abstract void onViewAttachedToWindow(android.view.View);
    public abstract void onViewDetachedFromWindow(android.view.View);


}

-keep class android.view.View$OnCapturedPointerListener {

    public abstract boolean onCapturedPointer(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnClickListener {

    public abstract void onClick(android.view.View);


}

-keep class android.view.View$OnContextClickListener {

    public abstract boolean onContextClick(android.view.View);


}

-keep class android.view.View$OnCreateContextMenuListener {

    public abstract void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);


}

-keep class android.view.View$OnDragListener {

    public abstract boolean onDrag(android.view.View, android.view.DragEvent);


}

-keep class android.view.View$OnFocusChangeListener {

    public abstract void onFocusChange(android.view.View, boolean);


}

-keep class android.view.View$OnGenericMotionListener {

    public abstract boolean onGenericMotion(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnHoverListener {

    public abstract boolean onHover(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnKeyListener {

    public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);


}

-keep class android.view.View$OnLayoutChangeListener {

    public abstract void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);


}

-keep class android.view.View$OnLongClickListener {

    public abstract boolean onLongClick(android.view.View);


}

-keep class android.view.View$OnScrollChangeListener {

    public abstract void onScrollChange(android.view.View, int, int, int, int);


}

-keep class android.view.View$OnSystemUiVisibilityChangeListener {

    public abstract void onSystemUiVisibilityChange(int);


}

-keep class android.view.View$OnTouchListener {

    public abstract boolean onTouch(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnUnhandledKeyEventListener {

    public abstract boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);


}

-keep class android.view.View$TransformationInfo {



}

-keep class android.view.ViewDebug {
    <init>();

    public static void capture(android.view.View, java.io.OutputStream, android.view.View);
    public static void captureLayers(android.view.View, java.io.DataOutputStream);
    public static void dump(android.view.View, boolean, boolean, java.io.OutputStream);
    public static void dumpCapturedView(java.lang.String, java.lang.Object);
    public static void dumpTheme(android.view.View, java.io.OutputStream);
    public static void dumpv2(android.view.View, java.io.ByteArrayOutputStream);
    public static android.view.View findView(android.view.View, java.lang.String);
    public static java.lang.String flagsToString(java.lang.Class, java.lang.String, int);
    public static long getViewInstanceCount();
    public static long getViewRootImplCount();
    public static java.lang.String intToString(java.lang.Class, java.lang.String, int);
    public static java.lang.Object invokeViewMethod(android.view.View, java.lang.reflect.Method, java.lang.Object[]);
    public static void outputDisplayList(android.view.View, android.view.View);
    public static void profileViewAndChildren(android.view.View, java.io.BufferedWriter);
    public static void setLayoutParameter(android.view.View, java.lang.String, int);
    public static void startHierarchyTracing(java.lang.String, android.view.View);
    public static void startRecyclerTracing(java.lang.String, android.view.View);
    public static void stopHierarchyTracing();
    public static void stopRecyclerTracing();
    public static void trace(android.view.View, android.view.ViewDebug$RecyclerTraceType, int[]);
    public static void trace(android.view.View, android.view.ViewDebug$HierarchyTraceType);


    public static boolean DEBUG_DRAG;
    public static boolean DEBUG_POSITIONING;
    public static boolean TRACE_HIERARCHY;
    public static boolean TRACE_RECYCLER;
}

-keep class android.view.ViewDebug$CanvasProvider {

    public abstract android.graphics.Bitmap createBitmap();
    public abstract android.graphics.Canvas getCanvas(android.view.View, int, int);


}

-keep class android.view.ViewDebug$HierarchyTraceType {

    public static android.view.ViewDebug$HierarchyTraceType valueOf(java.lang.String);
    public static android.view.ViewDebug$HierarchyTraceType[] values();

    public static android.view.ViewDebug$HierarchyTraceType BUILD_CACHE;
    public static android.view.ViewDebug$HierarchyTraceType DRAW;
    public static android.view.ViewDebug$HierarchyTraceType INVALIDATE;
    public static android.view.ViewDebug$HierarchyTraceType INVALIDATE_CHILD;
    public static android.view.ViewDebug$HierarchyTraceType INVALIDATE_CHILD_IN_PARENT;
    public static android.view.ViewDebug$HierarchyTraceType ON_LAYOUT;
    public static android.view.ViewDebug$HierarchyTraceType ON_MEASURE;
    public static android.view.ViewDebug$HierarchyTraceType REQUEST_LAYOUT;

}

-keep class android.view.ViewDebug$RecyclerTraceType {

    public static android.view.ViewDebug$RecyclerTraceType valueOf(java.lang.String);
    public static android.view.ViewDebug$RecyclerTraceType[] values();

    public static android.view.ViewDebug$RecyclerTraceType BIND_VIEW;
    public static android.view.ViewDebug$RecyclerTraceType MOVE_FROM_ACTIVE_TO_SCRAP_HEAP;
    public static android.view.ViewDebug$RecyclerTraceType MOVE_TO_SCRAP_HEAP;
    public static android.view.ViewDebug$RecyclerTraceType NEW_VIEW;
    public static android.view.ViewDebug$RecyclerTraceType RECYCLE_FROM_ACTIVE_HEAP;
    public static android.view.ViewDebug$RecyclerTraceType RECYCLE_FROM_SCRAP_HEAP;

}

-keep class android.view.ViewGroup {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addChildrenForAccessibility(java.util.ArrayList);
    public void addFocusables(java.util.ArrayList, int, int);
    public void addKeyboardNavigationClusters(java.util.Collection, int);
    public boolean addStatesFromChildren();
    public void addTouchables(java.util.ArrayList);
    public void addTransientView(android.view.View, int);
    public void addView(android.view.View);
    public void addView(android.view.View, int);
    public void addView(android.view.View, int, int);
    public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
    protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup$LayoutParams);
    protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup$LayoutParams, boolean);
    protected void attachLayoutAnimationParameters(android.view.View, android.view.ViewGroup$LayoutParams, int, int);
    protected void attachViewToParent(android.view.View, int, android.view.ViewGroup$LayoutParams);
    public void bringChildToFront(android.view.View);
    public java.util.ArrayList buildTouchDispatchChildList();
    protected boolean canAnimate();
    public void captureTransitioningViews(java.util.List);
    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    public void childDrawableStateChanged(android.view.View);
    public void childHasTransientStateChanged(android.view.View, boolean);
    protected void cleanupLayoutState(android.view.View);
    public void clearChildFocus(android.view.View);
    public void clearDisappearingChildren();
    public void clearFocus();
    public android.graphics.Bitmap createSnapshot(android.view.ViewDebug$CanvasProvider, boolean);
    protected void debug(int);
    protected void destroyHardwareResources();
    protected void detachAllViewsFromParent();
    protected void detachViewFromParent(android.view.View);
    protected void detachViewFromParent(int);
    protected void detachViewsFromParent(int, int);
    public boolean dispatchActivityResult(java.lang.String, int, int, android.content.Intent);
    public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets);
    public boolean dispatchCapturedPointerEvent(android.view.MotionEvent);
    public void dispatchConfigurationChanged(android.content.res.Configuration);
    public void dispatchDisplayHint(int);
    public boolean dispatchDragEvent(android.view.DragEvent);
    protected void dispatchDraw(android.graphics.Canvas);
    public void dispatchDrawableHotspotChanged(float, float);
    public void dispatchFinishTemporaryDetach();
    protected void dispatchFreezeSelfOnly(android.util.SparseArray);
    protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
    protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
    protected void dispatchGetDisplayList();
    protected boolean dispatchHoverEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public void dispatchPointerCaptureChanged(boolean);
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
    public void dispatchProvideStructure(android.view.ViewStructure);
    protected void dispatchRestoreInstanceState(android.util.SparseArray);
    protected void dispatchSaveInstanceState(android.util.SparseArray);
    public void dispatchSetActivated(boolean);
    protected void dispatchSetPressed(boolean);
    public void dispatchSetSelected(boolean);
    public void dispatchStartTemporaryDetach();
    public void dispatchSystemUiVisibilityChanged(int);
    protected void dispatchThawSelfOnly(android.util.SparseArray);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public boolean dispatchUnhandledMove(android.view.View, int);
    protected void dispatchVisibilityChanged(android.view.View, int);
    public void dispatchWindowFocusChanged(boolean);
    public void dispatchWindowSystemUiVisiblityChanged(int);
    public void dispatchWindowVisibilityChanged(int);
    protected boolean drawChild(android.graphics.Canvas, android.view.View, long);
    protected void drawableStateChanged();
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public void endViewTransition(android.view.View);
    public android.view.View findFocus();
    public void findNamedViews(java.util.Map);
    public android.view.View findViewByAccessibilityIdTraversal(int);
    public android.view.View findViewByAutofillIdTraversal(int);
    protected android.view.View findViewByPredicateTraversal(java.util.function.Predicate, android.view.View);
    protected android.view.View findViewTraversal(int);
    protected android.view.View findViewWithTagTraversal(java.lang.Object);
    public void findViewsWithText(java.util.ArrayList, java.lang.CharSequence, int);
    public android.view.View focusSearch(android.view.View, int);
    public void focusableViewAvailable(android.view.View);
    public boolean gatherTransparentRegion(android.graphics.Region);
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public java.lang.CharSequence getAccessibilityClassName();
    public android.view.View getChildAt(int);
    public int getChildCount();
    protected int getChildDrawingOrder(int, int);
    public static int getChildMeasureSpec(int, int, int);
    protected boolean getChildStaticTransformation(android.view.View, android.view.animation.Transformation);
    public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point, boolean);
    public boolean getClipChildren();
    public boolean getClipToPadding();
    public int getDescendantFocusability();
    public android.view.View getFocusedChild();
    public android.view.animation.LayoutAnimationController getLayoutAnimation();
    public android.view.animation.Animation$AnimationListener getLayoutAnimationListener();
    public int getLayoutMode();
    public android.animation.LayoutTransition getLayoutTransition();
    public int getNestedScrollAxes();
    public android.view.ViewGroupOverlay getOverlay();
    public android.view.ViewOverlay getOverlay();
    public int getPersistentDrawingCache();
    public boolean getTouchscreenBlocksFocus();
    public android.view.View getTransientView(int);
    public int getTransientViewCount();
    public int getTransientViewIndex(int);
    public boolean hasFocus();
    protected boolean hasHoveredChild();
    public boolean hasTransientState();
    public int indexOfChild(android.view.View);
    protected void internalSetPadding(int, int, int, int);
    public void invalidateChild(android.view.View, android.graphics.Rect);
    public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    public boolean isAlwaysDrawnWithCacheEnabled();
    public boolean isAnimationCacheEnabled();
    protected boolean isChildrenDrawingOrderEnabled();
    protected boolean isChildrenDrawnWithCacheEnabled();
    public boolean isLayoutSuppressed();
    public boolean isMotionEventSplittingEnabled();
    public boolean isShowingContextMenuWithCoords();
    protected boolean isTransformedTouchPointInView(float, float, android.view.View, android.graphics.PointF);
    public boolean isTransitionGroup();
    public void jumpDrawablesToCurrentState();
    public void layout(int, int, int, int);
    public void makeOptionalFitsSystemWindows();
    protected void measureChild(android.view.View, int, int);
    protected void measureChildWithMargins(android.view.View, int, int, int, int);
    protected void measureChildren(int, int);
    public void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
    public void notifySubtreeAccessibilityStateChangedIfNeeded();
    public void offsetChildrenTopAndBottom(int);
    public void offsetDescendantRectToMyCoords(android.view.View, android.graphics.Rect);
    public void offsetRectIntoDescendantCoords(android.view.View, android.graphics.Rect);
    protected void onAttachedToWindow();
    protected void onChildVisibilityChanged(android.view.View, int, int);
    protected int[] onCreateDrawableState(int);
    protected void onDebugDraw(android.graphics.Canvas);
    protected void onDebugDrawMargins(android.graphics.Canvas, android.graphics.Paint);
    public void onDescendantInvalidated(android.view.View, android.view.View);
    protected void onDetachedFromWindow();
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    public boolean onInterceptHoverEvent(android.view.MotionEvent);
    public boolean onInterceptTouchEvent(android.view.MotionEvent);
    protected abstract void onLayout(boolean, int, int, int, int);
    public boolean onNestedFling(android.view.View, float, float, boolean);
    public boolean onNestedPreFling(android.view.View, float, float);
    public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
    public void onNestedPreScroll(android.view.View, int, int, int[]);
    public void onNestedScroll(android.view.View, int, int, int, int);
    public void onNestedScrollAccepted(android.view.View, android.view.View, int);
    protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
    public boolean onRequestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean onRequestSendAccessibilityEventInternal(android.view.View, android.view.accessibility.AccessibilityEvent);
    public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
    protected void onSetLayoutParams(android.view.View, android.view.ViewGroup$LayoutParams);
    public boolean onStartNestedScroll(android.view.View, android.view.View, int);
    public void onStopNestedScroll(android.view.View);
    public void onViewAdded(android.view.View);
    public void onViewRemoved(android.view.View);
    public void recomputeViewAttributes(android.view.View);
    public void removeAllViews();
    public void removeAllViewsInLayout();
    protected void removeDetachedView(android.view.View, boolean);
    public void removeTransientView(android.view.View);
    public void removeView(android.view.View);
    public void removeViewAt(int);
    public void removeViewInLayout(android.view.View);
    public void removeViews(int, int);
    public void removeViewsInLayout(int, int);
    public void requestChildFocus(android.view.View, android.view.View);
    public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public void requestDisallowInterceptTouchEvent(boolean);
    public boolean requestFocus(int, android.graphics.Rect);
    public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public void requestTransitionStart(android.animation.LayoutTransition);
    public void requestTransparentRegion(android.view.View);
    protected void resetResolvedDrawables();
    public void resetResolvedLayoutDirection();
    public void resetResolvedPadding();
    public void resetResolvedTextAlignment();
    public void resetResolvedTextDirection();
    protected void resolveDrawables();
    public boolean resolveLayoutDirection();
    public void resolveLayoutParams();
    public void resolvePadding();
    public boolean resolveRtlPropertiesIfNeeded();
    public boolean resolveTextAlignment();
    public boolean resolveTextDirection();
    public boolean restoreDefaultFocus();
    public boolean restoreFocusInCluster(int);
    public boolean restoreFocusNotInCluster();
    public void scheduleLayoutAnimation();
    public void setAddStatesFromChildren(boolean);
    public void setAlwaysDrawnWithCacheEnabled(boolean);
    public void setAnimationCacheEnabled(boolean);
    protected void setChildrenDrawingCacheEnabled(boolean);
    protected void setChildrenDrawingOrderEnabled(boolean);
    protected void setChildrenDrawnWithCacheEnabled(boolean);
    public void setClipChildren(boolean);
    public void setClipToPadding(boolean);
    public void setDescendantFocusability(int);
    public void setLayoutAnimation(android.view.animation.LayoutAnimationController);
    public void setLayoutAnimationListener(android.view.animation.Animation$AnimationListener);
    public void setLayoutMode(int);
    public void setLayoutTransition(android.animation.LayoutTransition);
    public void setMotionEventSplittingEnabled(boolean);
    public void setOnHierarchyChangeListener(android.view.ViewGroup$OnHierarchyChangeListener);
    public void setPersistentDrawingCache(int);
    protected void setStaticTransformationsEnabled(boolean);
    public void setTouchscreenBlocksFocus(boolean);
    public void setTransitionGroup(boolean);
    public boolean shouldDelayChildPressedState();
    public boolean showContextMenuForChild(android.view.View);
    public boolean showContextMenuForChild(android.view.View, float, float);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);
    public void startLayoutAnimation();
    public void startViewTransition(android.view.View);
    public void suppressLayout(boolean);
    public void transformPointToViewLocal(float[], android.view.View);
    public void updateViewLayout(android.view.View, android.view.ViewGroup$LayoutParams);


    protected static int CLIP_TO_PADDING_MASK;
    protected static int FLAG_DISALLOW_INTERCEPT;
    protected static int FLAG_SUPPORT_STATIC_TRANSFORMATIONS;
    protected static int FLAG_USE_CHILD_DRAWING_ORDER;
    public static int FOCUS_AFTER_DESCENDANTS;
    public static int FOCUS_BEFORE_DESCENDANTS;
    public static int FOCUS_BLOCK_DESCENDANTS;
    public static int LAYOUT_MODE_CLIP_BOUNDS;
    public static int LAYOUT_MODE_DEFAULT;
    public static int LAYOUT_MODE_OPTICAL_BOUNDS;
    public static int PERSISTENT_ALL_CACHES;
    public static int PERSISTENT_ANIMATION_CACHE;
    public static int PERSISTENT_NO_CACHE;
    public static int PERSISTENT_SCROLLING_CACHE;
    protected java.util.ArrayList mDisappearingChildren;
    protected int mGroupFlags;
    protected android.view.ViewGroup$OnHierarchyChangeListener mOnHierarchyChangeListener;
    protected int mPersistentDrawingCache;
}

-keep class android.view.ViewGroup$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(android.view.ViewGroup$LayoutParams);

    public java.lang.String debug(java.lang.String);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public void onDebugDraw(android.view.View, android.graphics.Canvas, android.graphics.Paint);
    public void resolveLayoutDirection(int);
    protected void setBaseAttributes(android.content.res.TypedArray, int, int);
    protected static java.lang.String sizeToString(int);


    public static int FILL_PARENT;
    public static int MATCH_PARENT;
    public static int WRAP_CONTENT;
    public int height;
    public android.view.animation.LayoutAnimationController$AnimationParameters layoutAnimationParameters;
    public int width;
}

-keep class android.view.ViewGroup$MarginLayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.view.ViewGroup$LayoutParams);

    public void copyMarginsFrom(android.view.ViewGroup$MarginLayoutParams);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public int getLayoutDirection();
    public int getMarginEnd();
    public int getMarginStart();
    public boolean isLayoutRtl();
    public boolean isMarginRelative();
    public void onDebugDraw(android.view.View, android.graphics.Canvas, android.graphics.Paint);
    public void resolveLayoutDirection(int);
    public void setLayoutDirection(int);
    public void setMarginEnd(int);
    public void setMarginStart(int);
    public void setMargins(int, int, int, int);
    public void setMarginsRelative(int, int, int, int);


    public static int DEFAULT_MARGIN_RELATIVE;
    public int bottomMargin;
    public int leftMargin;
    public int rightMargin;
    public int topMargin;
}

-keep class android.view.ViewGroup$OnHierarchyChangeListener {

    public abstract void onChildViewAdded(android.view.View, android.view.View);
    public abstract void onChildViewRemoved(android.view.View, android.view.View);


}

-keep class android.view.ViewGroupOverlay {

    public void add(android.view.View);
    public void remove(android.view.View);


}

-keep class android.view.ViewHierarchyEncoder {
    <init>(java.io.ByteArrayOutputStream);

    public void addProperty(java.lang.String, boolean);
    public void addProperty(java.lang.String, short);
    public void addProperty(java.lang.String, int);
    public void addProperty(java.lang.String, float);
    public void addProperty(java.lang.String, java.lang.String);
    public void addPropertyKey(java.lang.String);
    public void beginObject(java.lang.Object);
    public void endObject();
    public void endStream();


}

-keep class android.view.ViewOutlineProvider {
    <init>();

    public abstract void getOutline(android.view.View, android.graphics.Outline);


    public static android.view.ViewOutlineProvider BACKGROUND;
    public static android.view.ViewOutlineProvider BOUNDS;
    public static android.view.ViewOutlineProvider PADDED_BOUNDS;
}

-keep class android.view.ViewOverlay {

    public void add(android.graphics.drawable.Drawable);
    public void clear();
    public void remove(android.graphics.drawable.Drawable);


}

-keep class android.view.ViewParent {

    public abstract void bringChildToFront(android.view.View);
    public abstract boolean canResolveLayoutDirection();
    public abstract boolean canResolveTextAlignment();
    public abstract boolean canResolveTextDirection();
    public abstract void childDrawableStateChanged(android.view.View);
    public abstract void childHasTransientStateChanged(android.view.View, boolean);
    public abstract void clearChildFocus(android.view.View);
    public abstract void createContextMenu(android.view.ContextMenu);
    public abstract android.view.View focusSearch(android.view.View, int);
    public abstract void focusableViewAvailable(android.view.View);
    public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    public abstract int getLayoutDirection();
    public abstract android.view.ViewParent getParent();
    public abstract android.view.ViewParent getParentForAccessibility();
    public abstract int getTextAlignment();
    public abstract int getTextDirection();
    public abstract void invalidateChild(android.view.View, android.graphics.Rect);
    public abstract android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    public abstract boolean isLayoutDirectionResolved();
    public abstract boolean isLayoutRequested();
    public abstract boolean isTextAlignmentResolved();
    public abstract boolean isTextDirectionResolved();
    public abstract android.view.View keyboardNavigationClusterSearch(android.view.View, int);
    public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
    public void onDescendantInvalidated(android.view.View, android.view.View);
    public abstract boolean onNestedFling(android.view.View, float, float, boolean);
    public abstract boolean onNestedPreFling(android.view.View, float, float);
    public abstract boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
    public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
    public abstract void onNestedScroll(android.view.View, int, int, int, int);
    public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
    public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
    public abstract void onStopNestedScroll(android.view.View);
    public abstract void recomputeViewAttributes(android.view.View);
    public abstract void requestChildFocus(android.view.View, android.view.View);
    public abstract boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public abstract void requestDisallowInterceptTouchEvent(boolean);
    public abstract void requestFitSystemWindows();
    public abstract void requestLayout();
    public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public abstract void requestTransparentRegion(android.view.View);
    public abstract boolean showContextMenuForChild(android.view.View);
    public abstract boolean showContextMenuForChild(android.view.View, float, float);
    public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
    public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);


}

-keep class android.view.ViewPropertyAnimator {

    public android.view.ViewPropertyAnimator alpha(float);
    public android.view.ViewPropertyAnimator alphaBy(float);
    public void cancel();
    public long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public long getStartDelay();
    public android.view.ViewPropertyAnimator rotation(float);
    public android.view.ViewPropertyAnimator rotationBy(float);
    public android.view.ViewPropertyAnimator rotationX(float);
    public android.view.ViewPropertyAnimator rotationXBy(float);
    public android.view.ViewPropertyAnimator rotationY(float);
    public android.view.ViewPropertyAnimator rotationYBy(float);
    public android.view.ViewPropertyAnimator scaleX(float);
    public android.view.ViewPropertyAnimator scaleXBy(float);
    public android.view.ViewPropertyAnimator scaleY(float);
    public android.view.ViewPropertyAnimator scaleYBy(float);
    public android.view.ViewPropertyAnimator setDuration(long);
    public android.view.ViewPropertyAnimator setInterpolator(android.animation.TimeInterpolator);
    public android.view.ViewPropertyAnimator setListener(android.animation.Animator$AnimatorListener);
    public android.view.ViewPropertyAnimator setStartDelay(long);
    public android.view.ViewPropertyAnimator setUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
    public void start();
    public android.view.ViewPropertyAnimator translationX(float);
    public android.view.ViewPropertyAnimator translationXBy(float);
    public android.view.ViewPropertyAnimator translationY(float);
    public android.view.ViewPropertyAnimator translationYBy(float);
    public android.view.ViewPropertyAnimator translationZ(float);
    public android.view.ViewPropertyAnimator translationZBy(float);
    public android.view.ViewPropertyAnimator withEndAction(java.lang.Runnable);
    public android.view.ViewPropertyAnimator withLayer();
    public android.view.ViewPropertyAnimator withStartAction(java.lang.Runnable);
    public android.view.ViewPropertyAnimator x(float);
    public android.view.ViewPropertyAnimator xBy(float);
    public android.view.ViewPropertyAnimator y(float);
    public android.view.ViewPropertyAnimator yBy(float);
    public android.view.ViewPropertyAnimator z(float);
    public android.view.ViewPropertyAnimator zBy(float);


}

-keep class android.view.ViewRootImpl {
    <init>(android.content.Context, android.view.Display);

    public static void addConfigCallback(android.view.ViewRootImpl$ConfigChangedCallback);
    public static void addFirstDrawHandler(java.lang.Runnable);
    public void addWindowCallbacks(android.view.WindowCallbacks);
    public void bringChildToFront(android.view.View);
    public boolean canResolveLayoutDirection();
    public boolean canResolveTextAlignment();
    public boolean canResolveTextDirection();
    public void cancelInvalidate(android.view.View);
    public void childDrawableStateChanged(android.view.View);
    public void childHasTransientStateChanged(android.view.View, boolean);
    public void clearChildFocus(android.view.View);
    public void createContextMenu(android.view.ContextMenu);
    public void debug();
    public void detachFunctor(long);
    public void dispatchAppVisibility(boolean);
    public void dispatchCheckFocus();
    public void dispatchCloseSystemDialogs(java.lang.String);
    public void dispatchDragEvent(android.view.DragEvent);
    public void dispatchGetNewSurface();
    public void dispatchInputEvent(android.view.InputEvent);
    public void dispatchInputEvent(android.view.InputEvent, android.view.InputEventReceiver);
    public void dispatchInvalidateDelayed(android.view.View, long);
    public void dispatchInvalidateOnAnimation(android.view.View);
    public void dispatchInvalidateRectDelayed(android.view.View$AttachInfo$InvalidateInfo, long);
    public void dispatchInvalidateRectOnAnimation(android.view.View$AttachInfo$InvalidateInfo);
    public void dispatchKeyFromAutofill(android.view.KeyEvent);
    public void dispatchKeyFromIme(android.view.KeyEvent);
    public void dispatchMoved(int, int);
    public void dispatchPointerCaptureChanged(boolean);
    public void dispatchRequestKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
    public void dispatchSystemUiVisibilityChanged(int, int, int, int);
    public void dispatchUnhandledInputEvent(android.view.InputEvent);
    public boolean dispatchUnhandledKeyEvent(android.view.KeyEvent);
    public void dispatchWindowShown();
    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void dumpGfxInfo(int[]);
    public android.view.View focusSearch(android.view.View, int);
    public void focusableViewAvailable(android.view.View);
    public android.view.View getAccessibilityFocusedHost();
    public android.view.accessibility.AccessibilityNodeInfo getAccessibilityFocusedVirtualView();
    public android.view.AccessibilityInteractionController getAccessibilityInteractionController();
    public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    public int getDisplayId();
    public int getHeight();
    public void getLastTouchPoint(android.graphics.Point);
    public int getLastTouchSource();
    public int getLayoutDirection();
    public android.view.ViewParent getParent();
    public android.view.ViewParent getParentForAccessibility();
    public int getTextAlignment();
    public int getTextDirection();
    public java.lang.CharSequence getTitle();
    public android.view.View getView();
    public int getWidth();
    public int getWindowFlags();
    public void handleDispatchSystemUiVisibilityChanged(android.view.ViewRootImpl$SystemUiVisibilityInfo);
    public void handleDispatchWindowShown();
    public void handleRequestKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
    public void invalidateChild(android.view.View, android.graphics.Rect);
    public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    public static void invokeFunctor(long, boolean);
    public boolean isLayoutDirectionResolved();
    public boolean isLayoutRequested();
    public boolean isTextAlignmentResolved();
    public boolean isTextDirectionResolved();
    public static boolean isViewDescendantOf(android.view.View, android.view.View);
    public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
    public void loadSystemProperties();
    public void notifyChildRebuilt();
    public void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
    public void onDescendantInvalidated(android.view.View, android.view.View);
    public void onMovedToDisplay(int, android.content.res.Configuration);
    public boolean onNestedFling(android.view.View, float, float, boolean);
    public boolean onNestedPreFling(android.view.View, float, float);
    public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
    public void onNestedPreScroll(android.view.View, int, int, int[]);
    public void onNestedScroll(android.view.View, int, int, int, int);
    public void onNestedScrollAccepted(android.view.View, android.view.View, int);
    public void onPostDraw(android.view.DisplayListCanvas);
    public void onPreDraw(android.view.DisplayListCanvas);
    public boolean onStartNestedScroll(android.view.View, android.view.View, int);
    public void onStopNestedScroll(android.view.View);
    public void onWindowTitleChanged();
    public boolean performHapticFeedback(int, boolean);
    public void playSoundEffect(int);
    public void profile();
    public void recomputeViewAttributes(android.view.View);
    public void registerAnimatingRenderNode(android.view.RenderNode);
    public void registerRtFrameCallback(android.view.ThreadedRenderer$FrameDrawingCallback);
    public void registerVectorDrawableAnimator(android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT);
    public void removeWindowCallbacks(android.view.WindowCallbacks);
    public void reportActivityRelaunched();
    public void reportDrawFinish();
    public void requestChildFocus(android.view.View, android.view.View);
    public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public void requestDisallowInterceptTouchEvent(boolean);
    public void requestFitSystemWindows();
    public void requestInvalidateRootRenderNode();
    public void requestLayout();
    public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public void requestTransitionStart(android.animation.LayoutTransition);
    public void requestTransparentRegion(android.view.View);
    public void requestUpdateConfiguration(android.content.res.Configuration);
    public void setActivityConfigCallback(android.view.ViewRootImpl$ActivityConfigCallback);
    public void setDragFocus(android.view.View, android.view.DragEvent);
    public void setIsAmbientMode(boolean);
    public void setPausedForTransition(boolean);
    public void setReportNextDraw();
    public void setView(android.view.View, android.view.WindowManager$LayoutParams, android.view.View);
    public boolean showContextMenuForChild(android.view.View);
    public boolean showContextMenuForChild(android.view.View, float, float);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);
    public void synthesizeInputEvent(android.view.InputEvent);
    public void updateConfiguration(int);
    public void updatePointerIcon(float, float);
    public void windowFocusChanged(boolean, boolean);


    public static java.lang.String PROPERTY_EMULATOR_WIN_OUTSET_BOTTOM_PX;
    protected android.view.InputEventConsistencyVerifier mInputEventConsistencyVerifier;
    public boolean mIsAnimating;
    public android.view.Surface mSurface;
    public boolean mTraversalScheduled;
    public android.view.WindowManager$LayoutParams mWindowAttributes;
}

-keep class android.view.ViewRootImpl$ActivityConfigCallback {

    public abstract void onConfigurationChanged(android.content.res.Configuration, int);


}

-keep class android.view.ViewRootImpl$ConfigChangedCallback {

    public abstract void onConfigurationChanged(android.content.res.Configuration);


}

-keep class android.view.ViewRootImpl$SystemUiVisibilityInfo {



}

-keep class android.view.ViewStructure {
    <init>();

    public abstract int addChildCount(int);
    public abstract void asyncCommit();
    public abstract android.view.ViewStructure asyncNewChild(int);
    public abstract android.view.autofill.AutofillId getAutofillId();
    public abstract int getChildCount();
    public abstract android.os.Bundle getExtras();
    public abstract java.lang.CharSequence getHint();
    public abstract android.graphics.Rect getTempRect();
    public abstract java.lang.CharSequence getText();
    public abstract int getTextSelectionEnd();
    public abstract int getTextSelectionStart();
    public abstract boolean hasExtras();
    public abstract android.view.ViewStructure newChild(int);
    public abstract android.view.ViewStructure$HtmlInfo$Builder newHtmlInfoBuilder(java.lang.String);
    public abstract void setAccessibilityFocused(boolean);
    public abstract void setActivated(boolean);
    public abstract void setAlpha(float);
    public abstract void setAssistBlocked(boolean);
    public abstract void setAutofillHints(java.lang.String[]);
    public abstract void setAutofillId(android.view.autofill.AutofillId);
    public abstract void setAutofillId(android.view.autofill.AutofillId, int);
    public abstract void setAutofillOptions(java.lang.CharSequence[]);
    public abstract void setAutofillType(int);
    public abstract void setAutofillValue(android.view.autofill.AutofillValue);
    public abstract void setCheckable(boolean);
    public abstract void setChecked(boolean);
    public abstract void setChildCount(int);
    public abstract void setClassName(java.lang.String);
    public abstract void setClickable(boolean);
    public abstract void setContentDescription(java.lang.CharSequence);
    public abstract void setContextClickable(boolean);
    public abstract void setDataIsSensitive(boolean);
    public abstract void setDimens(int, int, int, int, int, int);
    public abstract void setElevation(float);
    public abstract void setEnabled(boolean);
    public abstract void setFocusable(boolean);
    public abstract void setFocused(boolean);
    public abstract void setHint(java.lang.CharSequence);
    public abstract void setHtmlInfo(android.view.ViewStructure$HtmlInfo);
    public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
    public void setImportantForAutofill(int);
    public abstract void setInputType(int);
    public abstract void setLocaleList(android.os.LocaleList);
    public abstract void setLongClickable(boolean);
    public void setMaxTextEms(int);
    public void setMaxTextLength(int);
    public void setMinTextEms(int);
    public abstract void setOpaque(boolean);
    public abstract void setSelected(boolean);
    public abstract void setText(java.lang.CharSequence);
    public abstract void setText(java.lang.CharSequence, int, int);
    public void setTextIdEntry(java.lang.String);
    public abstract void setTextLines(int[], int[]);
    public abstract void setTextStyle(float, int, int, int);
    public abstract void setTransformation(android.graphics.Matrix);
    public abstract void setVisibility(int);
    public abstract void setWebDomain(java.lang.String);


}

-keep class android.view.ViewStructure$HtmlInfo {
    <init>();

    public abstract java.util.List getAttributes();
    public abstract java.lang.String getTag();


}

-keep class android.view.ViewStructure$HtmlInfo$Builder {
    <init>();

    public abstract android.view.ViewStructure$HtmlInfo$Builder addAttribute(java.lang.String, java.lang.String);
    public abstract android.view.ViewStructure$HtmlInfo build();


}

-keep class android.view.ViewTreeObserver {

    public void addOnComputeInternalInsetsListener(android.view.ViewTreeObserver$OnComputeInternalInsetsListener);
    public void addOnDrawListener(android.view.ViewTreeObserver$OnDrawListener);
    public void addOnEnterAnimationCompleteListener(android.view.ViewTreeObserver$OnEnterAnimationCompleteListener);
    public void addOnGlobalFocusChangeListener(android.view.ViewTreeObserver$OnGlobalFocusChangeListener);
    public void addOnGlobalLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
    public void addOnPreDrawListener(android.view.ViewTreeObserver$OnPreDrawListener);
    public void addOnScrollChangedListener(android.view.ViewTreeObserver$OnScrollChangedListener);
    public void addOnTouchModeChangeListener(android.view.ViewTreeObserver$OnTouchModeChangeListener);
    public void addOnWindowAttachListener(android.view.ViewTreeObserver$OnWindowAttachListener);
    public void addOnWindowFocusChangeListener(android.view.ViewTreeObserver$OnWindowFocusChangeListener);
    public void addOnWindowShownListener(android.view.ViewTreeObserver$OnWindowShownListener);
    public void dispatchOnDraw();
    public void dispatchOnEnterAnimationComplete();
    public void dispatchOnGlobalLayout();
    public boolean dispatchOnPreDraw();
    public void dispatchOnWindowShown();
    public boolean isAlive();
    public void removeGlobalOnLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
    public void removeOnComputeInternalInsetsListener(android.view.ViewTreeObserver$OnComputeInternalInsetsListener);
    public void removeOnDrawListener(android.view.ViewTreeObserver$OnDrawListener);
    public void removeOnEnterAnimationCompleteListener(android.view.ViewTreeObserver$OnEnterAnimationCompleteListener);
    public void removeOnGlobalFocusChangeListener(android.view.ViewTreeObserver$OnGlobalFocusChangeListener);
    public void removeOnGlobalLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
    public void removeOnPreDrawListener(android.view.ViewTreeObserver$OnPreDrawListener);
    public void removeOnScrollChangedListener(android.view.ViewTreeObserver$OnScrollChangedListener);
    public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver$OnTouchModeChangeListener);
    public void removeOnWindowAttachListener(android.view.ViewTreeObserver$OnWindowAttachListener);
    public void removeOnWindowFocusChangeListener(android.view.ViewTreeObserver$OnWindowFocusChangeListener);
    public void removeOnWindowShownListener(android.view.ViewTreeObserver$OnWindowShownListener);


}

-keep class android.view.ViewTreeObserver$InternalInsetsInfo {
    <init>();

    public boolean equals(java.lang.Object);
    public int hashCode();
    public void setTouchableInsets(int);


    public static int TOUCHABLE_INSETS_CONTENT;
    public static int TOUCHABLE_INSETS_FRAME;
    public static int TOUCHABLE_INSETS_REGION;
    public static int TOUCHABLE_INSETS_VISIBLE;
    public android.graphics.Rect contentInsets;
    public android.graphics.Region touchableRegion;
    public android.graphics.Rect visibleInsets;
}

-keep class android.view.ViewTreeObserver$OnComputeInternalInsetsListener {

    public abstract void onComputeInternalInsets(android.view.ViewTreeObserver$InternalInsetsInfo);


}

-keep class android.view.ViewTreeObserver$OnDrawListener {

    public abstract void onDraw();


}

-keep class android.view.ViewTreeObserver$OnEnterAnimationCompleteListener {

    public abstract void onEnterAnimationComplete();


}

-keep class android.view.ViewTreeObserver$OnGlobalFocusChangeListener {

    public abstract void onGlobalFocusChanged(android.view.View, android.view.View);


}

-keep class android.view.ViewTreeObserver$OnGlobalLayoutListener {

    public abstract void onGlobalLayout();


}

-keep class android.view.ViewTreeObserver$OnPreDrawListener {

    public abstract boolean onPreDraw();


}

-keep class android.view.ViewTreeObserver$OnScrollChangedListener {

    public abstract void onScrollChanged();


}

-keep class android.view.ViewTreeObserver$OnTouchModeChangeListener {

    public abstract void onTouchModeChanged(boolean);


}

-keep class android.view.ViewTreeObserver$OnWindowAttachListener {

    public abstract void onWindowAttached();
    public abstract void onWindowDetached();


}

-keep class android.view.ViewTreeObserver$OnWindowFocusChangeListener {

    public abstract void onWindowFocusChanged(boolean);


}

-keep class android.view.ViewTreeObserver$OnWindowShownListener {

    public abstract void onWindowShown();


}

-keep class android.view.Window {
    <init>(android.content.Context);

    public abstract void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addFlags(int);
    public void addOnFrameMetricsAvailableListener(android.view.Window$OnFrameMetricsAvailableListener, android.os.Handler);
    public void addPrivateFlags(int);
    public abstract void alwaysReadCloseOnTouchAttr();
    public abstract void clearContentView();
    public void clearFlags(int);
    public abstract void closeAllPanels();
    public abstract void closePanel(int);
    public void destroy();
    public void dispatchOnWindowDismissed(boolean, boolean);
    public void dispatchOnWindowSwipeDismissed();
    protected void dispatchWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public android.view.View findViewById(int);
    public boolean getAllowEnterTransitionOverlap();
    public boolean getAllowReturnTransitionOverlap();
    public android.view.WindowManager$LayoutParams getAttributes();
    public android.view.Window$Callback getCallback();
    public int getColorMode();
    public android.view.Window getContainer();
    public android.transition.Scene getContentScene();
    public android.content.Context getContext();
    public abstract android.view.View getCurrentFocus();
    public abstract android.view.View getDecorView();
    public static int getDefaultFeatures(android.content.Context);
    public float getElevation();
    public android.transition.Transition getEnterTransition();
    public android.transition.Transition getExitTransition();
    protected int getFeatures();
    protected int getForcedWindowFlags();
    public abstract android.view.LayoutInflater getLayoutInflater();
    protected int getLocalFeatures();
    public android.media.session.MediaController getMediaController();
    public abstract int getNavigationBarColor();
    public int getNavigationBarDividerColor();
    public android.transition.Transition getReenterTransition();
    public android.transition.Transition getReturnTransition();
    public android.transition.Transition getSharedElementEnterTransition();
    public android.transition.Transition getSharedElementExitTransition();
    public android.transition.Transition getSharedElementReenterTransition();
    public android.transition.Transition getSharedElementReturnTransition();
    public boolean getSharedElementsUseOverlay();
    public abstract int getStatusBarColor();
    public long getTransitionBackgroundFadeDuration();
    public android.transition.TransitionManager getTransitionManager();
    public abstract int getVolumeControlStream();
    public android.view.Window$WindowControllerCallback getWindowControllerCallback();
    public android.view.WindowManager getWindowManager();
    public android.content.res.TypedArray getWindowStyle();
    public boolean hasChildren();
    public boolean hasFeature(int);
    protected boolean hasSoftInputMode();
    protected boolean haveDimAmount();
    public void injectInputEvent(android.view.InputEvent);
    public abstract void invalidatePanelMenu(int);
    public boolean isActive();
    public boolean isCloseOnSwipeEnabled();
    public boolean isDestroyed();
    public abstract boolean isFloating();
    public boolean isOverlayWithDecorCaptionEnabled();
    public abstract boolean isShortcutKey(int, android.view.KeyEvent);
    public boolean isWideColorGamut();
    public void makeActive();
    public void notifyRestrictedCaptionAreaCallback(int, int, int, int);
    protected abstract void onActive();
    public abstract void onConfigurationChanged(android.content.res.Configuration);
    public abstract void onMultiWindowModeChanged();
    public abstract void onPictureInPictureModeChanged(boolean);
    public abstract void openPanel(int, android.view.KeyEvent);
    public abstract android.view.View peekDecorView();
    public abstract boolean performContextMenuIdentifierAction(int, int);
    public abstract boolean performPanelIdentifierAction(int, int, int);
    public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int);
    protected void removeFeature(int);
    public void removeOnFrameMetricsAvailableListener(android.view.Window$OnFrameMetricsAvailableListener);
    public abstract void reportActivityRelaunched();
    public boolean requestFeature(int);
    public android.view.View requireViewById(int);
    public abstract void restoreHierarchyState(android.os.Bundle);
    public abstract android.os.Bundle saveHierarchyState();
    public void setAllowEnterTransitionOverlap(boolean);
    public void setAllowReturnTransitionOverlap(boolean);
    public void setAttributes(android.view.WindowManager$LayoutParams);
    public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public void setBackgroundDrawableResource(int);
    public void setCallback(android.view.Window$Callback);
    public abstract void setChildDrawable(int, android.graphics.drawable.Drawable);
    public abstract void setChildInt(int, int);
    public void setClipToOutline(boolean);
    public void setCloseOnSwipeEnabled(boolean);
    public void setCloseOnTouchOutside(boolean);
    public void setCloseOnTouchOutsideIfNotSet(boolean);
    public void setColorMode(int);
    public void setContainer(android.view.Window);
    public abstract void setContentView(int);
    public abstract void setContentView(android.view.View);
    public abstract void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public abstract void setDecorCaptionShade(int);
    public void setDefaultIcon(int);
    public void setDefaultLogo(int);
    protected void setDefaultWindowFormat(int);
    public void setDimAmount(float);
    public void setElevation(float);
    public void setEnterTransition(android.transition.Transition);
    public void setExitTransition(android.transition.Transition);
    public abstract void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    public abstract void setFeatureDrawableAlpha(int, int);
    public abstract void setFeatureDrawableResource(int, int);
    public abstract void setFeatureDrawableUri(int, android.net.Uri);
    public abstract void setFeatureInt(int, int);
    public void setFlags(int, int);
    public void setFormat(int);
    public void setGravity(int);
    public void setIcon(int);
    public void setLayout(int, int);
    public void setLocalFocus(boolean, boolean);
    public void setLogo(int);
    public void setMediaController(android.media.session.MediaController);
    public abstract void setNavigationBarColor(int);
    public void setNavigationBarDividerColor(int);
    protected void setNeedsMenuKey(int);
    public void setOnWindowDismissedCallback(android.view.Window$OnWindowDismissedCallback);
    public void setOnWindowSwipeDismissedCallback(android.view.Window$OnWindowSwipeDismissedCallback);
    public void setOverlayWithDecorCaptionEnabled(boolean);
    public void setReenterTransition(android.transition.Transition);
    public abstract void setResizingCaptionDrawable(android.graphics.drawable.Drawable);
    public void setRestrictedCaptionAreaListener(android.view.Window$OnRestrictedCaptionAreaChangedListener);
    public void setReturnTransition(android.transition.Transition);
    public void setSharedElementEnterTransition(android.transition.Transition);
    public void setSharedElementExitTransition(android.transition.Transition);
    public void setSharedElementReenterTransition(android.transition.Transition);
    public void setSharedElementReturnTransition(android.transition.Transition);
    public void setSharedElementsUseOverlay(boolean);
    public void setSoftInputMode(int);
    public abstract void setStatusBarColor(int);
    public void setSustainedPerformanceMode(boolean);
    public void setTheme(int);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setTitleColor(int);
    public void setTransitionBackgroundFadeDuration(long);
    public void setTransitionManager(android.transition.TransitionManager);
    public void setType(int);
    public void setUiOptions(int);
    public void setUiOptions(int, int);
    public abstract void setVolumeControlStream(int);
    public void setWindowAnimations(int);
    public void setWindowControllerCallback(android.view.Window$WindowControllerCallback);
    public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String);
    public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String, boolean);
    public boolean shouldCloseOnTouch(android.content.Context, android.view.MotionEvent);
    public abstract boolean superDispatchGenericMotionEvent(android.view.MotionEvent);
    public abstract boolean superDispatchKeyEvent(android.view.KeyEvent);
    public abstract boolean superDispatchKeyShortcutEvent(android.view.KeyEvent);
    public abstract boolean superDispatchTouchEvent(android.view.MotionEvent);
    public abstract boolean superDispatchTrackballEvent(android.view.MotionEvent);
    public abstract void takeInputQueue(android.view.InputQueue$Callback);
    public abstract void takeKeyEvents(boolean);
    public abstract void takeSurface(android.view.SurfaceHolder$Callback2);
    public abstract void togglePanel(int, android.view.KeyEvent);


    public static int DECOR_CAPTION_SHADE_AUTO;
    public static int DECOR_CAPTION_SHADE_DARK;
    public static int DECOR_CAPTION_SHADE_LIGHT;
    protected static int DEFAULT_FEATURES;
    public static int FEATURE_ACTION_BAR;
    public static int FEATURE_ACTION_BAR_OVERLAY;
    public static int FEATURE_ACTION_MODE_OVERLAY;
    public static int FEATURE_ACTIVITY_TRANSITIONS;
    public static int FEATURE_CONTENT_TRANSITIONS;
    public static int FEATURE_CONTEXT_MENU;
    public static int FEATURE_CUSTOM_TITLE;
    public static int FEATURE_INDETERMINATE_PROGRESS;
    public static int FEATURE_LEFT_ICON;
    public static int FEATURE_MAX;
    public static int FEATURE_NO_TITLE;
    public static int FEATURE_OPTIONS_PANEL;
    public static int FEATURE_PROGRESS;
    public static int FEATURE_RIGHT_ICON;
    public static int FEATURE_SWIPE_TO_DISMISS;
    public static int ID_ANDROID_CONTENT;
    public static java.lang.String NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME;
    public static int PROGRESS_END;
    public static int PROGRESS_INDETERMINATE_OFF;
    public static int PROGRESS_INDETERMINATE_ON;
    public static int PROGRESS_SECONDARY_END;
    public static int PROGRESS_SECONDARY_START;
    public static int PROGRESS_START;
    public static int PROGRESS_VISIBILITY_OFF;
    public static int PROGRESS_VISIBILITY_ON;
    public static java.lang.String STATUS_BAR_BACKGROUND_TRANSITION_NAME;
}

-keep class android.view.Window$Callback {

    public abstract boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    public abstract boolean dispatchKeyEvent(android.view.KeyEvent);
    public abstract boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public abstract boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public abstract boolean dispatchTouchEvent(android.view.MotionEvent);
    public abstract boolean dispatchTrackballEvent(android.view.MotionEvent);
    public abstract void onActionModeFinished(android.view.ActionMode);
    public abstract void onActionModeStarted(android.view.ActionMode);
    public abstract void onAttachedToWindow();
    public abstract void onContentChanged();
    public abstract boolean onCreatePanelMenu(int, android.view.Menu);
    public abstract android.view.View onCreatePanelView(int);
    public abstract void onDetachedFromWindow();
    public abstract boolean onMenuItemSelected(int, android.view.MenuItem);
    public abstract boolean onMenuOpened(int, android.view.Menu);
    public abstract void onPanelClosed(int, android.view.Menu);
    public void onPointerCaptureChanged(boolean);
    public abstract boolean onPreparePanel(int, android.view.View, android.view.Menu);
    public void onProvideKeyboardShortcuts(java.util.List, android.view.Menu, int);
    public abstract boolean onSearchRequested();
    public abstract boolean onSearchRequested(android.view.SearchEvent);
    public abstract void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public abstract void onWindowFocusChanged(boolean);
    public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
    public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);


}

-keep class android.view.Window$OnFrameMetricsAvailableListener {

    public abstract void onFrameMetricsAvailable(android.view.Window, android.view.FrameMetrics, int);


}

-keep class android.view.Window$OnRestrictedCaptionAreaChangedListener {

    public abstract void onRestrictedCaptionAreaChanged(android.graphics.Rect);


}

-keep class android.view.Window$OnWindowDismissedCallback {

    public abstract void onWindowDismissed(boolean, boolean);


}

-keep class android.view.Window$OnWindowSwipeDismissedCallback {

    public abstract void onWindowSwipeDismissed();


}

-keep class android.view.Window$WindowControllerCallback {

    public abstract void enterPictureInPictureModeIfPossible();
    public abstract void exitFreeformMode();
    public abstract boolean isTaskRoot();


}

-keep class android.view.WindowAnimationFrameStats {
    <init>();

    public int describeContents();
    public void init(long, long[]);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.WindowCallbacks {

    public abstract boolean onContentDrawn(int, int, int, int);
    public abstract void onPostDraw(android.view.DisplayListCanvas);
    public abstract void onRequestDraw(boolean);
    public abstract void onWindowDragResizeEnd();
    public abstract void onWindowDragResizeStart(android.graphics.Rect, boolean, android.graphics.Rect, android.graphics.Rect, int);
    public abstract void onWindowSizeIsChanging(android.graphics.Rect, boolean, android.graphics.Rect, android.graphics.Rect);


    public static int RESIZE_MODE_DOCKED_DIVIDER;
    public static int RESIZE_MODE_FREEFORM;
    public static int RESIZE_MODE_INVALID;
}

-keep class android.view.WindowContentFrameStats {
    <init>();

    public int describeContents();
    public long getFramePostedTimeNano(int);
    public long getFrameReadyTimeNano(int);
    public void init(long, long[], long[], long[]);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.WindowId {
    <init>(android.view.IWindowId);
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.view.IWindowId getTarget();
    public int hashCode();
    public boolean isFocused();
    public void registerFocusObserver(android.view.WindowId$FocusObserver);
    public java.lang.String toString();
    public void unregisterFocusObserver(android.view.WindowId$FocusObserver);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.WindowId$FocusObserver {
    <init>();

    public abstract void onFocusGained(android.view.WindowId);
    public abstract void onFocusLost(android.view.WindowId);


}

-keep class android.view.WindowInsets {
    <init>(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, boolean, boolean, android.view.DisplayCutout);
    <init>(android.view.WindowInsets);
    <init>(android.graphics.Rect);

    public android.view.WindowInsets consumeDisplayCutout();
    public android.view.WindowInsets consumeStableInsets();
    public android.view.WindowInsets consumeSystemWindowInsets();
    public android.view.WindowInsets consumeSystemWindowInsets(boolean, boolean, boolean, boolean);
    public android.view.WindowInsets consumeWindowDecorInsets();
    public android.view.WindowInsets consumeWindowDecorInsets(boolean, boolean, boolean, boolean);
    public boolean equals(java.lang.Object);
    public android.view.DisplayCutout getDisplayCutout();
    public int getStableInsetBottom();
    public int getStableInsetLeft();
    public int getStableInsetRight();
    public int getStableInsetTop();
    public int getSystemWindowInsetBottom();
    public int getSystemWindowInsetLeft();
    public int getSystemWindowInsetRight();
    public int getSystemWindowInsetTop();
    public android.graphics.Rect getSystemWindowInsets();
    public int getWindowDecorInsetBottom();
    public int getWindowDecorInsetLeft();
    public int getWindowDecorInsetRight();
    public int getWindowDecorInsetTop();
    public boolean hasInsets();
    public boolean hasStableInsets();
    public boolean hasSystemWindowInsets();
    public boolean hasWindowDecorInsets();
    public int hashCode();
    public android.view.WindowInsets inset(android.graphics.Rect);
    public android.view.WindowInsets inset(int, int, int, int);
    public boolean isConsumed();
    public boolean isRound();
    public android.view.WindowInsets replaceSystemWindowInsets(int, int, int, int);
    public android.view.WindowInsets replaceSystemWindowInsets(android.graphics.Rect);
    public android.view.WindowInsets replaceWindowDecorInsets(int, int, int, int);
    public boolean shouldAlwaysConsumeNavBar();
    public java.lang.String toString();


    public static android.view.WindowInsets CONSUMED;
}

-keep class android.view.WindowManager {

    public abstract android.graphics.Region getCurrentImeTouchRegion();
    public abstract android.view.Display getDefaultDisplay();
    public abstract void removeViewImmediate(android.view.View);
    public abstract void requestAppKeyboardShortcuts(android.view.WindowManager$KeyboardShortcutsReceiver, int);


    public static int DOCKED_BOTTOM;
    public static int DOCKED_INVALID;
    public static int DOCKED_LEFT;
    public static int DOCKED_RIGHT;
    public static int DOCKED_TOP;
    public static java.lang.String INPUT_CONSUMER_NAVIGATION;
    public static java.lang.String INPUT_CONSUMER_PIP;
    public static java.lang.String INPUT_CONSUMER_RECENTS_ANIMATION;
    public static java.lang.String INPUT_CONSUMER_WALLPAPER;
    public static java.lang.String PARCEL_KEY_SHORTCUTS_ARRAY;
    public static int TAKE_SCREENSHOT_FULLSCREEN;
    public static int TAKE_SCREENSHOT_SELECTED_REGION;
    public static int TRANSIT_ACTIVITY_CLOSE;
    public static int TRANSIT_ACTIVITY_OPEN;
    public static int TRANSIT_ACTIVITY_RELAUNCH;
    public static int TRANSIT_CRASHING_ACTIVITY_CLOSE;
    public static int TRANSIT_DOCK_TASK_FROM_RECENTS;
    public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
    public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
    public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
    public static int TRANSIT_KEYGUARD_GOING_AWAY;
    public static int TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
    public static int TRANSIT_KEYGUARD_OCCLUDE;
    public static int TRANSIT_KEYGUARD_UNOCCLUDE;
    public static int TRANSIT_NONE;
    public static int TRANSIT_TASK_CLOSE;
    public static int TRANSIT_TASK_IN_PLACE;
    public static int TRANSIT_TASK_OPEN;
    public static int TRANSIT_TASK_OPEN_BEHIND;
    public static int TRANSIT_TASK_TO_BACK;
    public static int TRANSIT_TASK_TO_FRONT;
    public static int TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
    public static int TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
    public static int TRANSIT_UNSET;
    public static int TRANSIT_WALLPAPER_CLOSE;
    public static int TRANSIT_WALLPAPER_INTRA_CLOSE;
    public static int TRANSIT_WALLPAPER_INTRA_OPEN;
    public static int TRANSIT_WALLPAPER_OPEN;
}

-keep class android.view.WindowManager$KeyboardShortcutsReceiver {

    public abstract void onKeyboardShortcutsReceived(java.util.List);


}

-keep class android.view.WindowManager$LayoutParams {
    <init>();
    <init>(int);
    <init>(int, int);
    <init>(int, int, int);
    <init>(int, int, int, int, int);
    <init>(int, int, int, int, int, int, int);
    <init>(android.os.Parcel);

    public int copyFrom(android.view.WindowManager$LayoutParams);
    public java.lang.String debug(java.lang.String);
    public int describeContents();
    public void dumpDimensions(java.lang.StringBuilder);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public int getColorMode();
    public java.lang.CharSequence getTitle();
    public long getUserActivityTimeout();
    public boolean isFullscreen();
    public static boolean isSystemAlertWindowType(int);
    public static boolean mayUseInputMethod(int);
    public void scale(float);
    public void setColorMode(int);
    public void setSurfaceInsets(android.view.View, boolean, boolean);
    public void setTitle(java.lang.CharSequence);
    public void setUserActivityTimeout(long);
    public java.lang.String toString();
    public java.lang.String toString(java.lang.String);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int ACCESSIBILITY_ANCHOR_CHANGED;
    public static int ACCESSIBILITY_TITLE_CHANGED;
    public static int ALPHA_CHANGED;
    public static int ANIMATION_CHANGED;
    public static float BRIGHTNESS_OVERRIDE_FULL;
    public static float BRIGHTNESS_OVERRIDE_NONE;
    public static float BRIGHTNESS_OVERRIDE_OFF;
    public static int BUTTON_BRIGHTNESS_CHANGED;
    public static int COLOR_MODE_CHANGED;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DIM_AMOUNT_CHANGED;
    public static int EVERYTHING_CHANGED;
    public static int FIRST_APPLICATION_WINDOW;
    public static int FIRST_SUB_WINDOW;
    public static int FIRST_SYSTEM_WINDOW;
    public static int FLAGS_CHANGED;
    public static int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
    public static int FLAG_ALT_FOCUSABLE_IM;
    public static int FLAG_BLUR_BEHIND;
    public static int FLAG_DIM_BEHIND;
    public static int FLAG_DISMISS_KEYGUARD;
    public static int FLAG_DITHER;
    public static int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
    public static int FLAG_FORCE_NOT_FULLSCREEN;
    public static int FLAG_FULLSCREEN;
    public static int FLAG_HARDWARE_ACCELERATED;
    public static int FLAG_IGNORE_CHEEK_PRESSES;
    public static int FLAG_KEEP_SCREEN_ON;
    public static int FLAG_LAYOUT_ATTACHED_IN_DECOR;
    public static int FLAG_LAYOUT_INSET_DECOR;
    public static int FLAG_LAYOUT_IN_OVERSCAN;
    public static int FLAG_LAYOUT_IN_SCREEN;
    public static int FLAG_LAYOUT_NO_LIMITS;
    public static int FLAG_LOCAL_FOCUS_MODE;
    public static int FLAG_NOT_FOCUSABLE;
    public static int FLAG_NOT_TOUCHABLE;
    public static int FLAG_NOT_TOUCH_MODAL;
    public static int FLAG_SCALED;
    public static int FLAG_SECURE;
    public static int FLAG_SHOW_WALLPAPER;
    public static int FLAG_SHOW_WHEN_LOCKED;
    public static int FLAG_SLIPPERY;
    public static int FLAG_SPLIT_TOUCH;
    public static int FLAG_TOUCHABLE_WHEN_WAKING;
    public static int FLAG_TRANSLUCENT_NAVIGATION;
    public static int FLAG_TRANSLUCENT_STATUS;
    public static int FLAG_TURN_SCREEN_ON;
    public static int FLAG_WATCH_OUTSIDE_TOUCH;
    public static int FORMAT_CHANGED;
    public static int INPUT_FEATURES_CHANGED;
    public static int INPUT_FEATURE_DISABLE_POINTER_GESTURES;
    public static int INPUT_FEATURE_DISABLE_USER_ACTIVITY;
    public static int INPUT_FEATURE_NO_INPUT_CHANNEL;
    public static int INVALID_WINDOW_TYPE;
    public static int LAST_APPLICATION_WINDOW;
    public static int LAST_SUB_WINDOW;
    public static int LAST_SYSTEM_WINDOW;
    public static int LAYOUT_CHANGED;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
    public static int MEMORY_TYPE_CHANGED;
    public static int MEMORY_TYPE_GPU;
    public static int MEMORY_TYPE_HARDWARE;
    public static int MEMORY_TYPE_NORMAL;
    public static int MEMORY_TYPE_PUSH_BUFFERS;
    public static int NEEDS_MENU_KEY_CHANGED;
    public static int NEEDS_MENU_SET_FALSE;
    public static int NEEDS_MENU_SET_TRUE;
    public static int NEEDS_MENU_UNSET;
    public static int PREFERRED_DISPLAY_MODE_ID;
    public static int PREFERRED_REFRESH_RATE_CHANGED;
    public static int PRIVATE_FLAGS_CHANGED;
    public static int PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN;
    public static int PRIVATE_FLAG_COMPATIBLE_WINDOW;
    public static int PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS;
    public static int PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED;
    public static int PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
    public static int PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
    public static int PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED;
    public static int PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
    public static int PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
    public static int PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR;
    public static int PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
    public static int PRIVATE_FLAG_IS_SCREEN_DECOR;
    public static int PRIVATE_FLAG_KEYGUARD;
    public static int PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
    public static int PRIVATE_FLAG_NO_MOVE_ANIMATION;
    public static int PRIVATE_FLAG_PRESERVE_GEOMETRY;
    public static int PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
    public static int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
    public static int PRIVATE_FLAG_SYSTEM_ERROR;
    public static int PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS;
    public static int PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH;
    public static int ROTATION_ANIMATION_CHANGED;
    public static int ROTATION_ANIMATION_CROSSFADE;
    public static int ROTATION_ANIMATION_JUMPCUT;
    public static int ROTATION_ANIMATION_ROTATE;
    public static int ROTATION_ANIMATION_SEAMLESS;
    public static int ROTATION_ANIMATION_UNSPECIFIED;
    public static int SCREEN_BRIGHTNESS_CHANGED;
    public static int SCREEN_ORIENTATION_CHANGED;
    public static int SOFT_INPUT_ADJUST_NOTHING;
    public static int SOFT_INPUT_ADJUST_PAN;
    public static int SOFT_INPUT_ADJUST_RESIZE;
    public static int SOFT_INPUT_ADJUST_UNSPECIFIED;
    public static int SOFT_INPUT_IS_FORWARD_NAVIGATION;
    public static int SOFT_INPUT_MASK_ADJUST;
    public static int SOFT_INPUT_MASK_STATE;
    public static int SOFT_INPUT_MODE_CHANGED;
    public static int SOFT_INPUT_STATE_ALWAYS_HIDDEN;
    public static int SOFT_INPUT_STATE_ALWAYS_VISIBLE;
    public static int SOFT_INPUT_STATE_HIDDEN;
    public static int SOFT_INPUT_STATE_UNCHANGED;
    public static int SOFT_INPUT_STATE_UNSPECIFIED;
    public static int SOFT_INPUT_STATE_VISIBLE;
    public static int SURFACE_INSETS_CHANGED;
    public static int SYSTEM_UI_LISTENER_CHANGED;
    public static int SYSTEM_UI_VISIBILITY_CHANGED;
    public static int TITLE_CHANGED;
    public static int TRANSLUCENT_FLAGS_CHANGED;
    public static int TYPE_ACCESSIBILITY_OVERLAY;
    public static int TYPE_APPLICATION;
    public static int TYPE_APPLICATION_ABOVE_SUB_PANEL;
    public static int TYPE_APPLICATION_ATTACHED_DIALOG;
    public static int TYPE_APPLICATION_MEDIA;
    public static int TYPE_APPLICATION_MEDIA_OVERLAY;
    public static int TYPE_APPLICATION_OVERLAY;
    public static int TYPE_APPLICATION_PANEL;
    public static int TYPE_APPLICATION_STARTING;
    public static int TYPE_APPLICATION_SUB_PANEL;
    public static int TYPE_BASE_APPLICATION;
    public static int TYPE_BOOT_PROGRESS;
    public static int TYPE_CHANGED;
    public static int TYPE_DISPLAY_OVERLAY;
    public static int TYPE_DOCK_DIVIDER;
    public static int TYPE_DRAG;
    public static int TYPE_DRAWN_APPLICATION;
    public static int TYPE_DREAM;
    public static int TYPE_INPUT_CONSUMER;
    public static int TYPE_INPUT_METHOD;
    public static int TYPE_INPUT_METHOD_DIALOG;
    public static int TYPE_KEYGUARD;
    public static int TYPE_KEYGUARD_DIALOG;
    public static int TYPE_MAGNIFICATION_OVERLAY;
    public static int TYPE_NAVIGATION_BAR;
    public static int TYPE_NAVIGATION_BAR_PANEL;
    public static int TYPE_PHONE;
    public static int TYPE_POINTER;
    public static int TYPE_PRESENTATION;
    public static int TYPE_PRIORITY_PHONE;
    public static int TYPE_PRIVATE_PRESENTATION;
    public static int TYPE_QS_DIALOG;
    public static int TYPE_SCREENSHOT;
    public static int TYPE_SEARCH_BAR;
    public static int TYPE_SECURE_SYSTEM_OVERLAY;
    public static int TYPE_STATUS_BAR;
    public static int TYPE_STATUS_BAR_PANEL;
    public static int TYPE_STATUS_BAR_SUB_PANEL;
    public static int TYPE_SYSTEM_ALERT;
    public static int TYPE_SYSTEM_DIALOG;
    public static int TYPE_SYSTEM_ERROR;
    public static int TYPE_SYSTEM_OVERLAY;
    public static int TYPE_TOAST;
    public static int TYPE_VOICE_INTERACTION;
    public static int TYPE_VOICE_INTERACTION_STARTING;
    public static int TYPE_VOLUME_OVERLAY;
    public static int TYPE_WALLPAPER;
    public static int USER_ACTIVITY_TIMEOUT_CHANGED;
    public long accessibilityIdOfAnchor;
    public java.lang.CharSequence accessibilityTitle;
    public float alpha;
    public float buttonBrightness;
    public float dimAmount;
    public int flags;
    public int format;
    public int gravity;
    public boolean hasManualSurfaceInsets;
    public boolean hasSystemUiListeners;
    public long hideTimeoutMilliseconds;
    public float horizontalMargin;
    public float horizontalWeight;
    public int inputFeatures;
    public int layoutInDisplayCutoutMode;
    public int memoryType;
    public int needsMenuKey;
    public java.lang.String packageName;
    public int preferredDisplayModeId;
    public float preferredRefreshRate;
    public boolean preservePreviousSurfaceInsets;
    public int privateFlags;
    public int rotationAnimation;
    public float screenBrightness;
    public int screenOrientation;
    public int softInputMode;
    public int subtreeSystemUiVisibility;
    public android.graphics.Rect surfaceInsets;
    public int systemUiVisibility;
    public android.os.IBinder token;
    public int type;
    public long userActivityTimeout;
    public float verticalMargin;
    public float verticalWeight;
    public int windowAnimations;
    public int x;
    public int y;
}

-keep class android.view.accessibility.AccessibilityEvent {

    public void appendRecord(android.view.accessibility.AccessibilityRecord);
    protected void clear();
    public int describeContents();
    public static java.lang.String eventTypeToString(int);
    public int getAction();
    public int getContentChangeTypes();
    public long getEventTime();
    public int getEventType();
    public int getMovementGranularity();
    public java.lang.CharSequence getPackageName();
    public android.view.accessibility.AccessibilityRecord getRecord(int);
    public int getRecordCount();
    public int getWindowChanges();
    public void initFromParcel(android.os.Parcel);
    public static android.view.accessibility.AccessibilityEvent obtain(int);
    public static android.view.accessibility.AccessibilityEvent obtain(android.view.accessibility.AccessibilityEvent);
    public static android.view.accessibility.AccessibilityEvent obtain();
    public static android.view.accessibility.AccessibilityEvent obtainWindowsChangedEvent(int, int);
    public void recycle();
    public void setAction(int);
    public void setContentChangeTypes(int);
    public void setEventTime(long);
    public void setEventType(int);
    public void setMovementGranularity(int);
    public void setPackageName(java.lang.CharSequence);
    public void setSealed(boolean);
    public void setWindowChanges(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION;
    public static int CONTENT_CHANGE_TYPE_PANE_APPEARED;
    public static int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED;
    public static int CONTENT_CHANGE_TYPE_PANE_TITLE;
    public static int CONTENT_CHANGE_TYPE_SUBTREE;
    public static int CONTENT_CHANGE_TYPE_TEXT;
    public static int CONTENT_CHANGE_TYPE_UNDEFINED;
    public static android.os.Parcelable$Creator CREATOR;
    public static boolean DEBUG_ORIGIN;
    public static int INVALID_POSITION;
    public static int MAX_TEXT_LENGTH;
    public static int TYPES_ALL_MASK;
    public static int TYPE_ANNOUNCEMENT;
    public static int TYPE_ASSIST_READING_CONTEXT;
    public static int TYPE_GESTURE_DETECTION_END;
    public static int TYPE_GESTURE_DETECTION_START;
    public static int TYPE_NOTIFICATION_STATE_CHANGED;
    public static int TYPE_TOUCH_EXPLORATION_GESTURE_END;
    public static int TYPE_TOUCH_EXPLORATION_GESTURE_START;
    public static int TYPE_TOUCH_INTERACTION_END;
    public static int TYPE_TOUCH_INTERACTION_START;
    public static int TYPE_VIEW_ACCESSIBILITY_FOCUSED;
    public static int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED;
    public static int TYPE_VIEW_CLICKED;
    public static int TYPE_VIEW_CONTEXT_CLICKED;
    public static int TYPE_VIEW_FOCUSED;
    public static int TYPE_VIEW_HOVER_ENTER;
    public static int TYPE_VIEW_HOVER_EXIT;
    public static int TYPE_VIEW_LONG_CLICKED;
    public static int TYPE_VIEW_SCROLLED;
    public static int TYPE_VIEW_SELECTED;
    public static int TYPE_VIEW_TEXT_CHANGED;
    public static int TYPE_VIEW_TEXT_SELECTION_CHANGED;
    public static int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY;
    public static int TYPE_WINDOWS_CHANGED;
    public static int TYPE_WINDOW_CONTENT_CHANGED;
    public static int TYPE_WINDOW_STATE_CHANGED;
    public static int WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED;
    public static int WINDOWS_CHANGE_ACTIVE;
    public static int WINDOWS_CHANGE_ADDED;
    public static int WINDOWS_CHANGE_BOUNDS;
    public static int WINDOWS_CHANGE_CHILDREN;
    public static int WINDOWS_CHANGE_FOCUSED;
    public static int WINDOWS_CHANGE_LAYER;
    public static int WINDOWS_CHANGE_PARENT;
    public static int WINDOWS_CHANGE_PIP;
    public static int WINDOWS_CHANGE_REMOVED;
    public static int WINDOWS_CHANGE_TITLE;
    public java.lang.StackTraceElement[] originStackTrace;
}

-keep class android.view.accessibility.AccessibilityNodeInfo {

    public void addAction(android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction);
    public void addAction(int);
    public void addChild(android.view.View);
    public void addChild(android.view.View, int);
    public void addChildUnchecked(android.view.View);
    public boolean canOpenPopup();
    public int describeContents();
    protected void enforceNotSealed();
    protected void enforceSealed();
    public boolean equals(java.lang.Object);
    public java.util.List findAccessibilityNodeInfosByText(java.lang.String);
    public java.util.List findAccessibilityNodeInfosByViewId(java.lang.String);
    public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    public android.view.accessibility.AccessibilityNodeInfo focusSearch(int);
    public static int getAccessibilityViewId(long);
    public java.util.List getActionList();
    public int getActions();
    public java.util.List getAvailableExtraData();
    public void getBoundsInParent(android.graphics.Rect);
    public void getBoundsInScreen(android.graphics.Rect);
    public android.graphics.Rect getBoundsInScreen();
    public android.view.accessibility.AccessibilityNodeInfo getChild(int);
    public int getChildCount();
    public long getChildId(int);
    public android.util.LongArray getChildNodeIds();
    public java.lang.CharSequence getClassName();
    public android.view.accessibility.AccessibilityNodeInfo$CollectionInfo getCollectionInfo();
    public android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo getCollectionItemInfo();
    public int getConnectionId();
    public java.lang.CharSequence getContentDescription();
    public int getDrawingOrder();
    public java.lang.CharSequence getError();
    public android.os.Bundle getExtras();
    public java.lang.CharSequence getHintText();
    public int getInputType();
    public android.view.accessibility.AccessibilityNodeInfo getLabelFor();
    public android.view.accessibility.AccessibilityNodeInfo getLabeledBy();
    public int getLiveRegion();
    public int getMaxTextLength();
    public int getMovementGranularities();
    public java.lang.CharSequence getOriginalText();
    public java.lang.CharSequence getPackageName();
    public java.lang.CharSequence getPaneTitle();
    public android.view.accessibility.AccessibilityNodeInfo getParent();
    public long getParentNodeId();
    public android.view.accessibility.AccessibilityNodeInfo$RangeInfo getRangeInfo();
    public long getSourceNodeId();
    public java.lang.CharSequence getText();
    public int getTextSelectionEnd();
    public int getTextSelectionStart();
    public java.lang.CharSequence getTooltipText();
    public android.view.accessibility.AccessibilityNodeInfo getTraversalAfter();
    public android.view.accessibility.AccessibilityNodeInfo getTraversalBefore();
    public java.lang.String getViewIdResourceName();
    public static int getVirtualDescendantId(long);
    public android.view.accessibility.AccessibilityWindowInfo getWindow();
    public int getWindowId();
    public boolean hasExtras();
    public int hashCode();
    public static java.lang.String idToString(long);
    public boolean isAccessibilityFocused();
    public boolean isCheckable();
    public boolean isChecked();
    public boolean isClickable();
    public boolean isContentInvalid();
    public boolean isContextClickable();
    public boolean isDismissable();
    public boolean isEditable();
    public boolean isEnabled();
    public boolean isFocusable();
    public boolean isFocused();
    public boolean isHeading();
    public boolean isImportantForAccessibility();
    public boolean isLongClickable();
    public boolean isMultiLine();
    public boolean isPassword();
    public boolean isScreenReaderFocusable();
    public boolean isScrollable();
    public boolean isSealed();
    public boolean isSelected();
    public boolean isShowingHintText();
    public boolean isVisibleToUser();
    public static long makeNodeId(int, int);
    public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View);
    public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View, int);
    public static android.view.accessibility.AccessibilityNodeInfo obtain();
    public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.accessibility.AccessibilityNodeInfo);
    public boolean performAction(int);
    public boolean performAction(int, android.os.Bundle);
    public void recycle();
    public boolean refresh(android.os.Bundle, boolean);
    public boolean refresh();
    public boolean refreshWithExtraData(java.lang.String, android.os.Bundle);
    public void removeAction(int);
    public boolean removeAction(android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction);
    public void removeAllActions();
    public boolean removeChild(android.view.View);
    public boolean removeChild(android.view.View, int);
    public void setAccessibilityFocused(boolean);
    public void setAvailableExtraData(java.util.List);
    public void setBoundsInParent(android.graphics.Rect);
    public void setBoundsInScreen(android.graphics.Rect);
    public void setCanOpenPopup(boolean);
    public void setCheckable(boolean);
    public void setChecked(boolean);
    public void setClassName(java.lang.CharSequence);
    public void setClickable(boolean);
    public void setCollectionInfo(android.view.accessibility.AccessibilityNodeInfo$CollectionInfo);
    public void setCollectionItemInfo(android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo);
    public void setConnectionId(int);
    public void setContentDescription(java.lang.CharSequence);
    public void setContentInvalid(boolean);
    public void setContextClickable(boolean);
    public void setDismissable(boolean);
    public void setDrawingOrder(int);
    public void setEditable(boolean);
    public void setEnabled(boolean);
    public void setError(java.lang.CharSequence);
    public void setFocusable(boolean);
    public void setFocused(boolean);
    public void setHeading(boolean);
    public void setHintText(java.lang.CharSequence);
    public void setImportantForAccessibility(boolean);
    public void setInputType(int);
    public void setLabelFor(android.view.View);
    public void setLabelFor(android.view.View, int);
    public void setLabeledBy(android.view.View);
    public void setLabeledBy(android.view.View, int);
    public void setLiveRegion(int);
    public void setLongClickable(boolean);
    public void setMaxTextLength(int);
    public void setMovementGranularities(int);
    public void setMultiLine(boolean);
    public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
    public void setPackageName(java.lang.CharSequence);
    public void setPaneTitle(java.lang.CharSequence);
    public void setParent(android.view.View);
    public void setParent(android.view.View, int);
    public void setPassword(boolean);
    public void setRangeInfo(android.view.accessibility.AccessibilityNodeInfo$RangeInfo);
    public void setScreenReaderFocusable(boolean);
    public void setScrollable(boolean);
    public void setSealed(boolean);
    public void setSelected(boolean);
    public void setShowingHintText(boolean);
    public void setSource(android.view.View);
    public void setSource(android.view.View, int);
    public void setSourceNodeId(long, int);
    public void setText(java.lang.CharSequence);
    public void setTextSelection(int, int);
    public void setTooltipText(java.lang.CharSequence);
    public void setTraversalAfter(android.view.View);
    public void setTraversalAfter(android.view.View, int);
    public void setTraversalBefore(android.view.View);
    public void setTraversalBefore(android.view.View, int);
    public void setViewIdResourceName(java.lang.String);
    public void setVisibleToUser(boolean);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToParcelNoRecycle(android.os.Parcel, int);


    public static int ACTION_ACCESSIBILITY_FOCUS;
    public static java.lang.String ACTION_ARGUMENT_ACCESSIBLE_CLICKABLE_SPAN;
    public static java.lang.String ACTION_ARGUMENT_COLUMN_INT;
    public static java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN;
    public static java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING;
    public static java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT;
    public static java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X;
    public static java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y;
    public static java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE;
    public static java.lang.String ACTION_ARGUMENT_ROW_INT;
    public static java.lang.String ACTION_ARGUMENT_SELECTION_END_INT;
    public static java.lang.String ACTION_ARGUMENT_SELECTION_START_INT;
    public static java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE;
    public static int ACTION_CLEAR_ACCESSIBILITY_FOCUS;
    public static int ACTION_CLEAR_FOCUS;
    public static int ACTION_CLEAR_SELECTION;
    public static int ACTION_CLICK;
    public static int ACTION_COLLAPSE;
    public static int ACTION_COPY;
    public static int ACTION_CUT;
    public static int ACTION_DISMISS;
    public static int ACTION_EXPAND;
    public static int ACTION_FOCUS;
    public static int ACTION_LONG_CLICK;
    public static int ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
    public static int ACTION_NEXT_HTML_ELEMENT;
    public static int ACTION_PASTE;
    public static int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
    public static int ACTION_PREVIOUS_HTML_ELEMENT;
    public static int ACTION_SCROLL_BACKWARD;
    public static int ACTION_SCROLL_FORWARD;
    public static int ACTION_SELECT;
    public static int ACTION_SET_SELECTION;
    public static int ACTION_SET_TEXT;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_DATA_REQUESTED_KEY;
    public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH;
    public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX;
    public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY;
    public static int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    public static int FLAG_PREFETCH_DESCENDANTS;
    public static int FLAG_PREFETCH_PREDECESSORS;
    public static int FLAG_PREFETCH_SIBLINGS;
    public static int FLAG_REPORT_VIEW_IDS;
    public static int FOCUS_ACCESSIBILITY;
    public static int FOCUS_INPUT;
    public static int LAST_LEGACY_STANDARD_ACTION;
    public static int MOVEMENT_GRANULARITY_CHARACTER;
    public static int MOVEMENT_GRANULARITY_LINE;
    public static int MOVEMENT_GRANULARITY_PAGE;
    public static int MOVEMENT_GRANULARITY_PARAGRAPH;
    public static int MOVEMENT_GRANULARITY_WORD;
    public static int ROOT_ITEM_ID;
    public static long ROOT_NODE_ID;
    public static int UNDEFINED_CONNECTION_ID;
    public static int UNDEFINED_ITEM_ID;
    public static long UNDEFINED_NODE_ID;
    public static int UNDEFINED_SELECTION_INDEX;
}

-keep class android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction {
    <init>(int, java.lang.CharSequence);

    public boolean equals(java.lang.Object);
    public int getId();
    public java.lang.CharSequence getLabel();
    public int hashCode();
    public java.lang.String toString();


    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_ACCESSIBILITY_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_ACCESSIBILITY_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_SELECTION;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLICK;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_COLLAPSE;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CONTEXT_CLICK;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_COPY;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CUT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_DISMISS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_EXPAND;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_HIDE_TOOLTIP;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_LONG_CLICK;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_MOVE_WINDOW;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_NEXT_HTML_ELEMENT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PASTE;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PREVIOUS_HTML_ELEMENT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_BACKWARD;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_DOWN;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_FORWARD;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_LEFT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_RIGHT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_TO_POSITION;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_UP;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SELECT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_PROGRESS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_SELECTION;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_TEXT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SHOW_ON_SCREEN;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SHOW_TOOLTIP;
    public long mSerializationFlag;
    public static android.util.ArraySet sStandardActions;
}

-keep class android.view.accessibility.AccessibilityNodeInfo$CollectionInfo {

    public int getColumnCount();
    public int getRowCount();
    public int getSelectionMode();
    public boolean isHierarchical();
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(android.view.accessibility.AccessibilityNodeInfo$CollectionInfo);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(int, int, boolean);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(int, int, boolean, int);


    public static int SELECTION_MODE_MULTIPLE;
    public static int SELECTION_MODE_NONE;
    public static int SELECTION_MODE_SINGLE;
}

-keep class android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo {

    public int getColumnIndex();
    public int getColumnSpan();
    public int getRowIndex();
    public int getRowSpan();
    public boolean isHeading();
    public boolean isSelected();
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(int, int, int, int, boolean);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(int, int, int, int, boolean, boolean);


}

-keep class android.view.accessibility.AccessibilityNodeInfo$RangeInfo {

    public float getCurrent();
    public float getMax();
    public float getMin();
    public int getType();
    public static android.view.accessibility.AccessibilityNodeInfo$RangeInfo obtain(android.view.accessibility.AccessibilityNodeInfo$RangeInfo);
    public static android.view.accessibility.AccessibilityNodeInfo$RangeInfo obtain(int, float, float, float);


    public static int RANGE_TYPE_FLOAT;
    public static int RANGE_TYPE_INT;
    public static int RANGE_TYPE_PERCENT;
}

-keep class android.view.accessibility.AccessibilityNodeProvider {
    <init>();

    public void addExtraDataToAccessibilityNodeInfo(int, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
    public java.util.List findAccessibilityNodeInfosByText(java.lang.String, int);
    public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    public boolean performAction(int, int, android.os.Bundle);


    public static int HOST_VIEW_ID;
}

-keep class android.view.accessibility.AccessibilityRecord {

    public int getAddedCount();
    public java.lang.CharSequence getBeforeText();
    public java.lang.CharSequence getClassName();
    public java.lang.CharSequence getContentDescription();
    public int getCurrentItemIndex();
    public int getFromIndex();
    public int getItemCount();
    public int getMaxScrollX();
    public int getMaxScrollY();
    public android.os.Parcelable getParcelableData();
    public int getRemovedCount();
    public int getScrollDeltaX();
    public int getScrollDeltaY();
    public int getScrollX();
    public int getScrollY();
    public android.view.accessibility.AccessibilityNodeInfo getSource();
    public long getSourceNodeId();
    public java.util.List getText();
    public int getToIndex();
    public int getWindowId();
    public boolean isChecked();
    public boolean isEnabled();
    public boolean isFullScreen();
    public boolean isImportantForAccessibility();
    public boolean isPassword();
    public boolean isScrollable();
    public static android.view.accessibility.AccessibilityRecord obtain(android.view.accessibility.AccessibilityRecord);
    public static android.view.accessibility.AccessibilityRecord obtain();
    public void recycle();
    public void setAddedCount(int);
    public void setBeforeText(java.lang.CharSequence);
    public void setChecked(boolean);
    public void setClassName(java.lang.CharSequence);
    public void setConnectionId(int);
    public void setContentDescription(java.lang.CharSequence);
    public void setCurrentItemIndex(int);
    public void setEnabled(boolean);
    public void setFromIndex(int);
    public void setFullScreen(boolean);
    public void setImportantForAccessibility(boolean);
    public void setItemCount(int);
    public void setMaxScrollX(int);
    public void setMaxScrollY(int);
    public void setParcelableData(android.os.Parcelable);
    public void setPassword(boolean);
    public void setRemovedCount(int);
    public void setScrollDeltaX(int);
    public void setScrollDeltaY(int);
    public void setScrollX(int);
    public void setScrollY(int);
    public void setScrollable(boolean);
    public void setSealed(boolean);
    public void setSource(android.view.View);
    public void setSource(android.view.View, int);
    public void setSourceNodeId(long);
    public void setToIndex(int);
    public void setWindowId(int);
    public java.lang.String toString();


    protected static boolean DEBUG_CONCISE_TOSTRING;
}

-keep class android.view.accessibility.AccessibilityWindowInfo {

    public void addChild(int);
    public boolean changed(android.view.accessibility.AccessibilityWindowInfo);
    public int describeContents();
    public int differenceFrom(android.view.accessibility.AccessibilityWindowInfo);
    public boolean equals(java.lang.Object);
    public android.view.accessibility.AccessibilityNodeInfo getAnchor();
    public void getBoundsInScreen(android.graphics.Rect);
    public android.view.accessibility.AccessibilityWindowInfo getChild(int);
    public int getChildCount();
    public int getId();
    public int getLayer();
    public android.view.accessibility.AccessibilityWindowInfo getParent();
    public android.view.accessibility.AccessibilityNodeInfo getRoot();
    public java.lang.CharSequence getTitle();
    public int getType();
    public int hashCode();
    public boolean isAccessibilityFocused();
    public boolean isActive();
    public boolean isFocused();
    public boolean isInPictureInPictureMode();
    public static android.view.accessibility.AccessibilityWindowInfo obtain();
    public static android.view.accessibility.AccessibilityWindowInfo obtain(android.view.accessibility.AccessibilityWindowInfo);
    public void recycle();
    public void setAccessibilityFocused(boolean);
    public void setActive(boolean);
    public void setAnchorId(long);
    public void setBoundsInScreen(android.graphics.Rect);
    public void setConnectionId(int);
    public void setFocused(boolean);
    public void setId(int);
    public void setLayer(int);
    public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
    public void setParentId(int);
    public void setPictureInPicture(boolean);
    public void setTitle(java.lang.CharSequence);
    public void setType(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTIVE_WINDOW_ID;
    public static int ANY_WINDOW_ID;
    public static android.os.Parcelable$Creator CREATOR;
    public static int PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID;
    public static int TYPE_ACCESSIBILITY_OVERLAY;
    public static int TYPE_APPLICATION;
    public static int TYPE_INPUT_METHOD;
    public static int TYPE_SPLIT_SCREEN_DIVIDER;
    public static int TYPE_SYSTEM;
    public static int UNDEFINED_WINDOW_ID;
}

-keep class android.view.accessibility.IAccessibilityInteractionConnectionCallback {

    public abstract void setFindAccessibilityNodeInfoResult(android.view.accessibility.AccessibilityNodeInfo, int);
    public abstract void setFindAccessibilityNodeInfosResult(java.util.List, int);
    public abstract void setPerformAccessibilityActionResult(boolean, int);


}

-keep class android.view.animation.Animation {
    <init>();
    <init>(android.content.Context, android.util.AttributeSet);

    protected void applyTransformation(float, android.view.animation.Transformation);
    public void cancel();
    protected android.view.animation.Animation clone();
    protected java.lang.Object clone();
    public long computeDurationHint();
    public void detach();
    protected void ensureInterpolator();
    protected void finalize();
    public int getBackgroundColor();
    public boolean getDetachWallpaper();
    public long getDuration();
    public boolean getFillAfter();
    public boolean getFillBefore();
    public android.view.animation.Interpolator getInterpolator();
    public void getInvalidateRegion(int, int, int, int, android.graphics.RectF, android.view.animation.Transformation);
    public int getRepeatCount();
    public int getRepeatMode();
    protected float getScaleFactor();
    public boolean getShowWallpaper();
    public long getStartOffset();
    public long getStartTime();
    public boolean getTransformation(long, android.view.animation.Transformation);
    public boolean getTransformation(long, android.view.animation.Transformation, float);
    public int getZAdjustment();
    public boolean hasAlpha();
    public boolean hasEnded();
    public boolean hasStarted();
    public void initialize(int, int, int, int);
    public void initializeInvalidateRegion(int, int, int, int);
    public boolean isFillEnabled();
    public boolean isInitialized();
    public void reset();
    protected float resolveSize(int, float, int, int);
    public void restrictDuration(long);
    public void scaleCurrentDuration(float);
    public void setAnimationListener(android.view.animation.Animation$AnimationListener);
    public void setBackgroundColor(int);
    public void setDetachWallpaper(boolean);
    public void setDuration(long);
    public void setFillAfter(boolean);
    public void setFillBefore(boolean);
    public void setFillEnabled(boolean);
    public void setInterpolator(android.content.Context, int);
    public void setInterpolator(android.view.animation.Interpolator);
    public void setListenerHandler(android.os.Handler);
    public void setRepeatCount(int);
    public void setRepeatMode(int);
    public void setShowWallpaper(boolean);
    public void setStartOffset(long);
    public void setStartTime(long);
    public void setZAdjustment(int);
    public void start();
    public void startNow();
    public boolean willChangeBounds();
    public boolean willChangeTransformationMatrix();


    public static int ABSOLUTE;
    public static int INFINITE;
    public static int RELATIVE_TO_PARENT;
    public static int RELATIVE_TO_SELF;
    public static int RESTART;
    public static int REVERSE;
    public static int START_ON_FIRST_FRAME;
    public static int ZORDER_BOTTOM;
    public static int ZORDER_NORMAL;
    public static int ZORDER_TOP;
}

-keep class android.view.animation.Animation$AnimationListener {

    public abstract void onAnimationEnd(android.view.animation.Animation);
    public abstract void onAnimationRepeat(android.view.animation.Animation);
    public abstract void onAnimationStart(android.view.animation.Animation);


}

-keep class android.view.animation.Interpolator {



}

-keep class android.view.animation.LayoutAnimationController {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.view.animation.Animation);
    <init>(android.view.animation.Animation, float);

    public android.view.animation.Animation getAnimation();
    public android.view.animation.Animation getAnimationForView(android.view.View);
    public float getDelay();
    protected long getDelayForView(android.view.View);
    public android.view.animation.Interpolator getInterpolator();
    public int getOrder();
    protected int getTransformedIndex(android.view.animation.LayoutAnimationController$AnimationParameters);
    public boolean isDone();
    public void setAnimation(android.content.Context, int);
    public void setAnimation(android.view.animation.Animation);
    public void setDelay(float);
    public void setInterpolator(android.content.Context, int);
    public void setInterpolator(android.view.animation.Interpolator);
    public void setOrder(int);
    public void start();
    public boolean willOverlap();


    public static int ORDER_NORMAL;
    public static int ORDER_RANDOM;
    public static int ORDER_REVERSE;
    protected android.view.animation.Animation mAnimation;
    protected android.view.animation.Interpolator mInterpolator;
    protected java.util.Random mRandomizer;
}

-keep class android.view.animation.LayoutAnimationController$AnimationParameters {
    <init>();



    public int count;
    public int index;
}

-keep class android.view.animation.Transformation {
    <init>();

    public void clear();
    public void compose(android.view.animation.Transformation);
    public float getAlpha();
    public android.graphics.Rect getClipRect();
    public android.graphics.Matrix getMatrix();
    public int getTransformationType();
    public boolean hasClipRect();
    public void postCompose(android.view.animation.Transformation);
    public void printShortString(java.io.PrintWriter);
    public void set(android.view.animation.Transformation);
    public void setAlpha(float);
    public void setClipRect(android.graphics.Rect);
    public void setClipRect(int, int, int, int);
    public void setTransformationType(int);
    public java.lang.String toShortString();
    public void toShortString(java.lang.StringBuilder);
    public java.lang.String toString();


    public static int TYPE_ALPHA;
    public static int TYPE_BOTH;
    public static int TYPE_IDENTITY;
    public static int TYPE_MATRIX;
    protected float mAlpha;
    protected android.graphics.Matrix mMatrix;
    protected int mTransformationType;
}

-keep class android.view.autofill.AutofillId {
    <init>(int);
    <init>(android.view.autofill.AutofillId, int);
    <init>(int, int);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int getViewId();
    public int getVirtualChildId();
    public int hashCode();
    public boolean isVirtual();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.autofill.AutofillManager {
    <init>(android.content.Context, android.view.autofill.IAutoFillManager);

    public void cancel();
    public void commit();
    public void disableAutofillServices();
    public void disableOwnedAutofillServices();
    public void dump(java.lang.String, java.io.PrintWriter);
    public void enableCompatibilityMode();
    public android.content.ComponentName getAutofillServiceComponentName();
    public java.util.List getAvailableFieldClassificationAlgorithms();
    public static int getDatasetIdFromAuthenticationId(int);
    public java.lang.String getDefaultFieldClassificationAlgorithm();
    public android.service.autofill.FillEventHistory getFillEventHistory();
    public android.view.autofill.AutofillId getNextAutofillId();
    public static int getRequestIdFromAuthenticationId(int);
    public android.service.autofill.UserData getUserData();
    public java.lang.String getUserDataId();
    public boolean hasAutofillFeature();
    public boolean hasEnabledAutofillServices();
    public boolean isAutofillSupported();
    public boolean isAutofillUiShowing();
    public boolean isCompatibilityModeEnabledLocked();
    public boolean isEnabled();
    public boolean isFieldClassificationEnabled();
    public static int makeAuthenticationId(int, int);
    public void notifyValueChanged(android.view.View);
    public void notifyValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
    public void notifyViewClicked(android.view.View);
    public void notifyViewClicked(android.view.View, int);
    public void notifyViewEntered(android.view.View);
    public void notifyViewEntered(android.view.View, int, android.graphics.Rect);
    public void notifyViewExited(android.view.View);
    public void notifyViewExited(android.view.View, int);
    public void notifyViewVisibilityChanged(android.view.View, boolean);
    public void notifyViewVisibilityChanged(android.view.View, int, boolean);
    public void onActivityFinishing();
    public void onAuthenticationResult(int, android.content.Intent, android.view.View);
    public void onCreate(android.os.Bundle);
    public void onInvisibleForAutofill();
    public void onPendingSaveUi(int, android.os.IBinder);
    public void onSaveInstanceState(android.os.Bundle);
    public void onVisibleForAutofill();
    public void registerCallback(android.view.autofill.AutofillManager$AutofillCallback);
    public void requestAutofill(android.view.View);
    public void requestAutofill(android.view.View, int, android.graphics.Rect);
    public void requestHideFillUi();
    public void setUserData(android.service.autofill.UserData);
    public void unregisterCallback(android.view.autofill.AutofillManager$AutofillCallback);


    public static int ACTION_START_SESSION;
    public static int ACTION_VALUE_CHANGED;
    public static int ACTION_VIEW_ENTERED;
    public static int ACTION_VIEW_EXITED;
    public static int AUTHENTICATION_ID_DATASET_ID_UNDEFINED;
    public static java.lang.String EXTRA_ASSIST_STRUCTURE;
    public static java.lang.String EXTRA_AUTHENTICATION_RESULT;
    public static java.lang.String EXTRA_CLIENT_STATE;
    public static java.lang.String EXTRA_RESTORE_SESSION_TOKEN;
    public static int FC_SERVICE_TIMEOUT;
    public static int FLAG_ADD_CLIENT_DEBUG;
    public static int FLAG_ADD_CLIENT_ENABLED;
    public static int FLAG_ADD_CLIENT_VERBOSE;
    public static int NO_SESSION;
    public static int PENDING_UI_OPERATION_CANCEL;
    public static int PENDING_UI_OPERATION_RESTORE;
    public static int SET_STATE_FLAG_DEBUG;
    public static int SET_STATE_FLAG_ENABLED;
    public static int SET_STATE_FLAG_RESET_CLIENT;
    public static int SET_STATE_FLAG_RESET_SESSION;
    public static int SET_STATE_FLAG_VERBOSE;
    public static int STATE_ACTIVE;
    public static int STATE_DISABLED_BY_SERVICE;
    public static int STATE_FINISHED;
    public static int STATE_SHOWING_SAVE_UI;
    public static int STATE_UNKNOWN;
    public static int STATE_UNKNOWN_COMPAT_MODE;
}

-keep class android.view.autofill.AutofillManager$AutofillCallback {
    <init>();

    public void onAutofillEvent(android.view.View, int);
    public void onAutofillEvent(android.view.View, int, int);


    public static int EVENT_INPUT_HIDDEN;
    public static int EVENT_INPUT_SHOWN;
    public static int EVENT_INPUT_UNAVAILABLE;
}

-keep class android.view.autofill.AutofillManager$AutofillClient {

    public abstract void autofillClientAuthenticate(int, android.content.IntentSender, android.content.Intent);
    public abstract void autofillClientDispatchUnhandledKey(android.view.View, android.view.KeyEvent);
    public abstract android.view.View autofillClientFindViewByAccessibilityIdTraversal(int, int);
    public abstract android.view.View autofillClientFindViewByAutofillIdTraversal(android.view.autofill.AutofillId);
    public abstract android.view.View[] autofillClientFindViewsByAutofillIdTraversal(android.view.autofill.AutofillId[]);
    public abstract android.os.IBinder autofillClientGetActivityToken();
    public abstract android.content.ComponentName autofillClientGetComponentName();
    public abstract android.view.autofill.AutofillId autofillClientGetNextAutofillId();
    public abstract boolean[] autofillClientGetViewVisibility(android.view.autofill.AutofillId[]);
    public abstract boolean autofillClientIsCompatibilityModeEnabled();
    public abstract boolean autofillClientIsFillUiShowing();
    public abstract boolean autofillClientIsVisibleForAutofill();
    public abstract boolean autofillClientRequestHideFillUi();
    public abstract boolean autofillClientRequestShowFillUi(android.view.View, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
    public abstract void autofillClientResetableStateAvailable();
    public abstract void autofillClientRunOnUiThread(java.lang.Runnable);
    public abstract boolean isDisablingEnterExitEventForAutofill();


}

-keep class android.view.autofill.AutofillValue {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.view.autofill.AutofillValue forDate(long);
    public static android.view.autofill.AutofillValue forList(int);
    public static android.view.autofill.AutofillValue forText(java.lang.CharSequence);
    public static android.view.autofill.AutofillValue forToggle(boolean);
    public long getDateValue();
    public int getListValue();
    public java.lang.CharSequence getTextValue();
    public boolean getToggleValue();
    public int hashCode();
    public boolean isDate();
    public boolean isEmpty();
    public boolean isList();
    public boolean isText();
    public boolean isToggle();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.autofill.IAutoFillManager {

    public abstract int addClient(android.view.autofill.IAutoFillManagerClient, int);
    public abstract void cancelSession(int, int);
    public abstract void disableOwnedAutofillServices(int);
    public abstract void finishSession(int, int);
    public abstract android.content.ComponentName getAutofillServiceComponentName();
    public abstract java.lang.String[] getAvailableFieldClassificationAlgorithms();
    public abstract java.lang.String getDefaultFieldClassificationAlgorithm();
    public abstract android.service.autofill.FillEventHistory getFillEventHistory();
    public abstract android.service.autofill.UserData getUserData();
    public abstract java.lang.String getUserDataId();
    public abstract boolean isFieldClassificationEnabled();
    public abstract boolean isServiceEnabled(int, java.lang.String);
    public abstract boolean isServiceSupported(int);
    public abstract void onPendingSaveUi(int, android.os.IBinder);
    public abstract void removeClient(android.view.autofill.IAutoFillManagerClient, int);
    public abstract boolean restoreSession(int, android.os.IBinder, android.os.IBinder);
    public abstract void setAuthenticationResult(android.os.Bundle, int, int, int);
    public abstract void setAutofillFailure(int, java.util.List, int);
    public abstract void setHasCallback(int, int, boolean);
    public abstract void setUserData(android.service.autofill.UserData);
    public abstract int startSession(android.os.IBinder, android.os.IBinder, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, boolean, int, android.content.ComponentName, boolean);
    public abstract int updateOrRestartSession(android.os.IBinder, android.os.IBinder, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, boolean, int, android.content.ComponentName, int, int, boolean);
    public abstract void updateSession(int, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, int, int);


}

-keep class android.view.autofill.IAutoFillManagerClient {

    public abstract void authenticate(int, int, android.content.IntentSender, android.content.Intent);
    public abstract void autofill(int, java.util.List, java.util.List);
    public abstract void dispatchUnhandledKey(int, android.view.autofill.AutofillId, android.view.KeyEvent);
    public abstract void notifyNoFillUi(int, android.view.autofill.AutofillId, int);
    public abstract void requestHideFillUi(int, android.view.autofill.AutofillId);
    public abstract void requestShowFillUi(int, android.view.autofill.AutofillId, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
    public abstract void setSaveUiState(int, boolean);
    public abstract void setSessionFinished(int);
    public abstract void setState(int);
    public abstract void setTrackedViews(int, android.view.autofill.AutofillId[], boolean, boolean, android.view.autofill.AutofillId[], android.view.autofill.AutofillId);
    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent);


}

-keep class android.view.autofill.IAutofillWindowPresenter {

    public abstract void hide(android.graphics.Rect);
    public abstract void show(android.view.WindowManager$LayoutParams, android.graphics.Rect, boolean, int);


}

-keep class android.view.inputmethod.CompletionInfo {
    <init>(long, int, java.lang.CharSequence);
    <init>(long, int, java.lang.CharSequence, java.lang.CharSequence);

    public int describeContents();
    public long getId();
    public java.lang.CharSequence getLabel();
    public int getPosition();
    public java.lang.CharSequence getText();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.inputmethod.CorrectionInfo {
    <init>(int, java.lang.CharSequence, java.lang.CharSequence);

    public int describeContents();
    public java.lang.CharSequence getNewText();
    public int getOffset();
    public java.lang.CharSequence getOldText();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.inputmethod.EditorInfo {
    <init>();

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public void makeCompatible(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int IME_ACTION_DONE;
    public static int IME_ACTION_GO;
    public static int IME_ACTION_NEXT;
    public static int IME_ACTION_NONE;
    public static int IME_ACTION_PREVIOUS;
    public static int IME_ACTION_SEARCH;
    public static int IME_ACTION_SEND;
    public static int IME_ACTION_UNSPECIFIED;
    public static int IME_FLAG_FORCE_ASCII;
    public static int IME_FLAG_NAVIGATE_NEXT;
    public static int IME_FLAG_NAVIGATE_PREVIOUS;
    public static int IME_FLAG_NO_ACCESSORY_ACTION;
    public static int IME_FLAG_NO_ENTER_ACTION;
    public static int IME_FLAG_NO_EXTRACT_UI;
    public static int IME_FLAG_NO_FULLSCREEN;
    public static int IME_FLAG_NO_PERSONALIZED_LEARNING;
    public static int IME_MASK_ACTION;
    public static int IME_NULL;
    public int actionId;
    public java.lang.CharSequence actionLabel;
    public java.lang.String[] contentMimeTypes;
    public android.os.Bundle extras;
    public int fieldId;
    public java.lang.String fieldName;
    public android.os.LocaleList hintLocales;
    public java.lang.CharSequence hintText;
    public int imeOptions;
    public int initialCapsMode;
    public int initialSelEnd;
    public int initialSelStart;
    public int inputType;
    public java.lang.CharSequence label;
    public java.lang.String packageName;
    public java.lang.String privateImeOptions;
}

-keep class android.view.inputmethod.ExtractedText {
    <init>();

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_SELECTING;
    public static int FLAG_SINGLE_LINE;
    public int flags;
    public java.lang.CharSequence hint;
    public int partialEndOffset;
    public int partialStartOffset;
    public int selectionEnd;
    public int selectionStart;
    public int startOffset;
    public java.lang.CharSequence text;
}

-keep class android.view.inputmethod.ExtractedTextRequest {
    <init>();

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int flags;
    public int hintMaxChars;
    public int hintMaxLines;
    public int token;
}

-keep class android.view.inputmethod.InputConnection {

    public abstract boolean beginBatchEdit();
    public abstract boolean clearMetaKeyStates(int);
    public abstract void closeConnection();
    public abstract boolean commitCompletion(android.view.inputmethod.CompletionInfo);
    public abstract boolean commitContent(android.view.inputmethod.InputContentInfo, int, android.os.Bundle);
    public abstract boolean commitCorrection(android.view.inputmethod.CorrectionInfo);
    public abstract boolean commitText(java.lang.CharSequence, int);
    public abstract boolean deleteSurroundingText(int, int);
    public abstract boolean deleteSurroundingTextInCodePoints(int, int);
    public abstract boolean endBatchEdit();
    public abstract boolean finishComposingText();
    public abstract int getCursorCapsMode(int);
    public abstract android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
    public abstract android.os.Handler getHandler();
    public abstract java.lang.CharSequence getSelectedText(int);
    public abstract java.lang.CharSequence getTextAfterCursor(int, int);
    public abstract java.lang.CharSequence getTextBeforeCursor(int, int);
    public abstract boolean performContextMenuAction(int);
    public abstract boolean performEditorAction(int);
    public abstract boolean performPrivateCommand(java.lang.String, android.os.Bundle);
    public abstract boolean reportFullscreenMode(boolean);
    public abstract boolean requestCursorUpdates(int);
    public abstract boolean sendKeyEvent(android.view.KeyEvent);
    public abstract boolean setComposingRegion(int, int);
    public abstract boolean setComposingText(java.lang.CharSequence, int);
    public abstract boolean setSelection(int, int);


    public static int CURSOR_UPDATE_IMMEDIATE;
    public static int CURSOR_UPDATE_MONITOR;
    public static int GET_EXTRACTED_TEXT_MONITOR;
    public static int GET_TEXT_WITH_STYLES;
    public static int INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
}

-keep class android.view.inputmethod.InputContentInfo {
    <init>(android.net.Uri, android.content.ClipDescription);
    <init>(android.net.Uri, android.content.ClipDescription, android.net.Uri);

    public int describeContents();
    public android.net.Uri getContentUri();
    public android.content.ClipDescription getDescription();
    public android.net.Uri getLinkUri();
    public void releasePermission();
    public void requestPermission();
    public boolean validate();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.widget.ActionMenuPresenter {
    <init>(android.content.Context);

    public void bindItemView(com.android.internal.view.menu.MenuItemImpl, com.android.internal.view.menu.MenuView$ItemView);
    public boolean dismissPopupMenus();
    public boolean filterLeftoverView(android.view.ViewGroup, int);
    public boolean flagActionItems();
    public android.view.View getItemView(com.android.internal.view.menu.MenuItemImpl, android.view.View, android.view.ViewGroup);
    public com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
    public android.graphics.drawable.Drawable getOverflowIcon();
    public boolean hideOverflowMenu();
    public boolean hideSubMenus();
    public void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
    public boolean isOverflowMenuShowPending();
    public boolean isOverflowMenuShowing();
    public boolean isOverflowReserved();
    public void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onRestoreInstanceState(android.os.Parcelable);
    public android.os.Parcelable onSaveInstanceState();
    public boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
    public void onSubUiVisibilityChanged(boolean);
    public void setExpandedActionViewsExclusive(boolean);
    public void setItemLimit(int);
    public void setMenuView(android.widget.ActionMenuView);
    public void setOverflowIcon(android.graphics.drawable.Drawable);
    public void setReserveOverflow(boolean);
    public void setWidthLimit(int, boolean);
    public boolean shouldIncludeItem(int, com.android.internal.view.menu.MenuItemImpl);
    public boolean showOverflowMenu();
    public void updateMenuView(boolean);


}

-keep class android.widget.ActionMenuView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);

    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    public void dismissPopupMenus();
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    protected android.widget.ActionMenuView$LayoutParams generateDefaultLayoutParams();
    protected android.widget.LinearLayout$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.ActionMenuView$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.widget.ActionMenuView$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    protected android.widget.LinearLayout$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.widget.LinearLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public android.widget.ActionMenuView$LayoutParams generateOverflowButtonLayoutParams();
    public android.view.Menu getMenu();
    public android.graphics.drawable.Drawable getOverflowIcon();
    public int getPopupTheme();
    public int getWindowAnimations();
    protected boolean hasDividerBeforeChildAt(int);
    public boolean hideOverflowMenu();
    public void initialize(com.android.internal.view.menu.MenuBuilder);
    public boolean invokeItem(com.android.internal.view.menu.MenuItemImpl);
    public boolean isOverflowMenuShowPending();
    public boolean isOverflowMenuShowing();
    public boolean isOverflowReserved();
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onDetachedFromWindow();
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public com.android.internal.view.menu.MenuBuilder peekMenu();
    public void setExpandedActionViewsExclusive(boolean);
    public void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
    public void setOnMenuItemClickListener(android.widget.ActionMenuView$OnMenuItemClickListener);
    public void setOverflowIcon(android.graphics.drawable.Drawable);
    public void setOverflowReserved(boolean);
    public void setPopupTheme(int);
    public void setPresenter(android.widget.ActionMenuPresenter);
    public boolean showOverflowMenu();


}

-keep class android.widget.ActionMenuView$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.view.ViewGroup$LayoutParams);
    <init>(android.widget.ActionMenuView$LayoutParams);
    <init>(int, int);
    <init>(int, int, boolean);

    protected void encodeProperties(android.view.ViewHierarchyEncoder);


    public int cellsUsed;
    public boolean expandable;
    public boolean expanded;
    public int extraPixels;
    public boolean isOverflowButton;
    public boolean preventEdgeOffset;
}

-keep class android.widget.ActionMenuView$OnMenuItemClickListener {

    public abstract boolean onMenuItemClick(android.view.MenuItem);


}

-keep class android.widget.Adapter {

    public java.lang.CharSequence[] getAutofillOptions();
    public abstract int getCount();
    public abstract java.lang.Object getItem(int);
    public abstract long getItemId(int);
    public abstract int getItemViewType(int);
    public abstract android.view.View getView(int, android.view.View, android.view.ViewGroup);
    public abstract int getViewTypeCount();
    public abstract boolean hasStableIds();
    public abstract boolean isEmpty();
    public abstract void registerDataSetObserver(android.database.DataSetObserver);
    public abstract void unregisterDataSetObserver(android.database.DataSetObserver);


    public static int IGNORE_ITEM_VIEW_TYPE;
    public static int NO_SELECTION;
}

-keep class android.widget.AdapterView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addView(android.view.View);
    public void addView(android.view.View, int);
    public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
    protected boolean canAnimate();
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    protected void dispatchRestoreInstanceState(android.util.SparseArray);
    protected void dispatchSaveInstanceState(android.util.SparseArray);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public java.lang.CharSequence getAccessibilityClassName();
    public abstract android.widget.Adapter getAdapter();
    public int getCount();
    public android.view.View getEmptyView();
    public int getFirstVisiblePosition();
    public java.lang.Object getItemAtPosition(int);
    public long getItemIdAtPosition(int);
    public int getLastVisiblePosition();
    public android.widget.AdapterView$OnItemClickListener getOnItemClickListener();
    public android.widget.AdapterView$OnItemLongClickListener getOnItemLongClickListener();
    public android.widget.AdapterView$OnItemSelectedListener getOnItemSelectedListener();
    public int getPositionForView(android.view.View);
    public java.lang.Object getSelectedItem();
    public long getSelectedItemId();
    public int getSelectedItemPosition();
    public abstract android.view.View getSelectedView();
    protected void onDetachedFromWindow();
    public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    protected void onLayout(boolean, int, int, int, int);
    public void onProvideAutofillStructure(android.view.ViewStructure, int);
    public boolean onRequestSendAccessibilityEventInternal(android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean performItemClick(android.view.View, int, long);
    public void removeAllViews();
    public void removeView(android.view.View);
    public void removeViewAt(int);
    public abstract void setAdapter(android.widget.Adapter);
    public void setEmptyView(android.view.View);
    public void setFocusable(int);
    public void setFocusableInTouchMode(boolean);
    public void setOnClickListener(android.view.View$OnClickListener);
    public void setOnItemClickListener(android.widget.AdapterView$OnItemClickListener);
    public void setOnItemLongClickListener(android.widget.AdapterView$OnItemLongClickListener);
    public void setOnItemSelectedListener(android.widget.AdapterView$OnItemSelectedListener);
    public abstract void setSelection(int);


    public static int INVALID_POSITION;
    public static long INVALID_ROW_ID;
    public static int ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
    public static int ITEM_VIEW_TYPE_IGNORE;
}

-keep class android.widget.AdapterView$OnItemClickListener {

    public abstract void onItemClick(android.widget.AdapterView, android.view.View, int, long);


}

-keep class android.widget.AdapterView$OnItemLongClickListener {

    public abstract boolean onItemLongClick(android.widget.AdapterView, android.view.View, int, long);


}

-keep class android.widget.AdapterView$OnItemSelectedListener {

    public abstract void onItemSelected(android.widget.AdapterView, android.view.View, int, long);
    public abstract void onNothingSelected(android.widget.AdapterView);


}

-keep class android.widget.FrameLayout {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    protected android.widget.FrameLayout$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.FrameLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public java.lang.CharSequence getAccessibilityClassName();
    public boolean getConsiderGoneChildrenWhenMeasuring();
    public boolean getMeasureAllChildren();
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public void setForegroundGravity(int);
    public void setMeasureAllChildren(boolean);
    public boolean shouldDelayChildPressedState();


}

-keep class android.widget.FrameLayout$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, int);
    <init>(android.view.ViewGroup$LayoutParams);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.widget.FrameLayout$LayoutParams);



    public static int UNSPECIFIED_GRAVITY;
    public int gravity;
}

-keep class android.widget.HorizontalScrollView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addView(android.view.View);
    public void addView(android.view.View, int);
    public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
    public boolean arrowScroll(int);
    protected int computeHorizontalScrollOffset();
    protected int computeHorizontalScrollRange();
    public void computeScroll();
    protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public void draw(android.graphics.Canvas);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public boolean executeKeyEvent(android.view.KeyEvent);
    public void fling(int);
    public boolean fullScroll(int);
    public java.lang.CharSequence getAccessibilityClassName();
    protected float getLeftFadingEdgeStrength();
    public int getMaxScrollAmount();
    protected float getRightFadingEdgeStrength();
    public boolean isFillViewport();
    public boolean isSmoothScrollingEnabled();
    protected void measureChild(android.view.View, int, int);
    protected void measureChildWithMargins(android.view.View, int, int, int, int);
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    public boolean onInterceptTouchEvent(android.view.MotionEvent);
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    protected void onOverScrolled(int, int, boolean, boolean);
    protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
    protected void onRestoreInstanceState(android.os.Parcelable);
    protected android.os.Parcelable onSaveInstanceState();
    protected void onSizeChanged(int, int, int, int);
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean pageScroll(int);
    public boolean performAccessibilityActionInternal(int, android.os.Bundle);
    public void requestChildFocus(android.view.View, android.view.View);
    public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public void requestDisallowInterceptTouchEvent(boolean);
    public void requestLayout();
    public void scrollTo(int, int);
    public void setFillViewport(boolean);
    public void setOverScrollMode(int);
    public void setSmoothScrollingEnabled(boolean);
    public boolean shouldDelayChildPressedState();
    public void smoothScrollBy(int, int);
    public void smoothScrollTo(int, int);


}

-keep class android.widget.LinearLayout {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    protected android.widget.LinearLayout$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.LinearLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.widget.LinearLayout$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public java.lang.CharSequence getAccessibilityClassName();
    public int getBaseline();
    public int getBaselineAlignedChildIndex();
    public android.graphics.drawable.Drawable getDividerDrawable();
    public int getDividerPadding();
    public int getDividerWidth();
    public int getGravity();
    public int getOrientation();
    public int getShowDividers();
    public float getWeightSum();
    protected boolean hasDividerBeforeChildAt(int);
    public boolean isBaselineAligned();
    public boolean isMeasureWithLargestChildEnabled();
    protected void onDraw(android.graphics.Canvas);
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public void onRtlPropertiesChanged(int);
    public void setBaselineAligned(boolean);
    public void setBaselineAlignedChildIndex(int);
    public void setDividerDrawable(android.graphics.drawable.Drawable);
    public void setDividerPadding(int);
    public void setGravity(int);
    public void setHorizontalGravity(int);
    public void setMeasureWithLargestChildEnabled(boolean);
    public void setOrientation(int);
    public void setShowDividers(int);
    public void setVerticalGravity(int);
    public void setWeightSum(float);
    public boolean shouldDelayChildPressedState();


    public static int HORIZONTAL;
    public static int SHOW_DIVIDER_BEGINNING;
    public static int SHOW_DIVIDER_END;
    public static int SHOW_DIVIDER_MIDDLE;
    public static int SHOW_DIVIDER_NONE;
    public static int VERTICAL;
}

-keep class android.widget.LinearLayout$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, float);
    <init>(android.view.ViewGroup$LayoutParams);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.widget.LinearLayout$LayoutParams);

    public java.lang.String debug(java.lang.String);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);


    public int gravity;
    public float weight;
}

-keep class android.widget.RemoteViews {
    <init>(java.lang.String, int);
    <init>(java.lang.String, int, int);
    <init>(android.content.pm.ApplicationInfo, int);
    <init>(android.widget.RemoteViews, android.widget.RemoteViews);
    <init>(android.widget.RemoteViews);
    <init>(android.os.Parcel);

    public void addView(int, android.widget.RemoteViews);
    public void addView(int, android.widget.RemoteViews, int);
    public android.view.View apply(android.content.Context, android.view.ViewGroup);
    public android.view.View apply(android.content.Context, android.view.ViewGroup, android.widget.RemoteViews$OnClickHandler);
    public android.os.CancellationSignal applyAsync(android.content.Context, android.view.ViewGroup, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener);
    public android.os.CancellationSignal applyAsync(android.content.Context, android.view.ViewGroup, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener, android.widget.RemoteViews$OnClickHandler);
    public android.widget.RemoteViews clone();
    public java.lang.Object clone();
    public int describeContents();
    public int estimateMemoryUsage();
    public int getLayoutId();
    public java.lang.String getPackage();
    public int getSequenceNumber();
    public boolean hasSameAppInfo(android.content.pm.ApplicationInfo);
    public boolean isReapplyDisallowed();
    public void mergeRemoteViews(android.widget.RemoteViews);
    public boolean onLoadClass(java.lang.Class);
    public void overrideTextColors(int);
    public boolean prefersAsyncApply();
    public void reapply(android.content.Context, android.view.View);
    public void reapply(android.content.Context, android.view.View, android.widget.RemoteViews$OnClickHandler);
    public android.os.CancellationSignal reapplyAsync(android.content.Context, android.view.View, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener);
    public android.os.CancellationSignal reapplyAsync(android.content.Context, android.view.View, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener, android.widget.RemoteViews$OnClickHandler);
    public void reduceImageSizes(int, int);
    public void removeAllViews(int);
    public void removeAllViewsExceptId(int, int);
    public void setAccessibilityTraversalAfter(int, int);
    public void setAccessibilityTraversalBefore(int, int);
    public void setApplyTheme(int);
    public void setBitmap(int, java.lang.String, android.graphics.Bitmap);
    public void setBoolean(int, java.lang.String, boolean);
    public void setBundle(int, java.lang.String, android.os.Bundle);
    public void setByte(int, java.lang.String, byte);
    public void setChar(int, java.lang.String, char);
    public void setCharSequence(int, java.lang.String, java.lang.CharSequence);
    public void setChronometer(int, long, java.lang.String, boolean);
    public void setChronometerCountDown(int, boolean);
    public void setColorStateList(int, java.lang.String, android.content.res.ColorStateList);
    public void setContentDescription(int, java.lang.CharSequence);
    public void setDisplayedChild(int, int);
    public void setDouble(int, java.lang.String, double);
    public void setDrawableTint(int, boolean, int, android.graphics.PorterDuff$Mode);
    public void setEmptyView(int, int);
    public void setFloat(int, java.lang.String, float);
    public void setIcon(int, java.lang.String, android.graphics.drawable.Icon);
    public void setImageViewBitmap(int, android.graphics.Bitmap);
    public void setImageViewIcon(int, android.graphics.drawable.Icon);
    public void setImageViewResource(int, int);
    public void setImageViewUri(int, android.net.Uri);
    public void setInt(int, java.lang.String, int);
    public void setIntent(int, java.lang.String, android.content.Intent);
    public void setLabelFor(int, int);
    public void setLong(int, java.lang.String, long);
    public void setOnClickFillInIntent(int, android.content.Intent);
    public void setOnClickPendingIntent(int, android.app.PendingIntent);
    public void setPendingIntentTemplate(int, android.app.PendingIntent);
    public void setProgressBackgroundTintList(int, android.content.res.ColorStateList);
    public void setProgressBar(int, int, int, boolean);
    public void setProgressIndeterminateTintList(int, android.content.res.ColorStateList);
    public void setProgressTintList(int, android.content.res.ColorStateList);
    public void setReapplyDisallowed();
    public void setRelativeScrollPosition(int, int);
    public void setRemoteAdapter(int, int, android.content.Intent);
    public void setRemoteAdapter(int, android.content.Intent);
    public void setRemoteAdapter(int, java.util.ArrayList, int);
    public void setRemoteInputs(int, android.app.RemoteInput[]);
    public void setScrollPosition(int, int);
    public void setShort(int, java.lang.String, short);
    public void setString(int, java.lang.String, java.lang.String);
    public void setTextColor(int, int);
    public void setTextColor(int, android.content.res.ColorStateList);
    public void setTextViewCompoundDrawables(int, int, int, int, int);
    public void setTextViewCompoundDrawables(int, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon);
    public void setTextViewCompoundDrawablesRelative(int, int, int, int, int);
    public void setTextViewCompoundDrawablesRelative(int, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon);
    public void setTextViewText(int, java.lang.CharSequence);
    public void setTextViewTextSize(int, int, float);
    public void setUri(int, java.lang.String, android.net.Uri);
    public void setViewLayoutMarginBottomDimen(int, int);
    public void setViewLayoutMarginEnd(int, int);
    public void setViewLayoutMarginEndDimen(int, int);
    public void setViewLayoutWidth(int, int);
    public void setViewPadding(int, int, int, int, int);
    public void setViewVisibility(int, int);
    public void showNext(int);
    public void showPrevious(int);
    public void visitUris(java.util.function.Consumer);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ApplicationInfo mApplication;
}

-keep class android.widget.RemoteViews$OnClickHandler {
    <init>();

    public boolean onClickHandler(android.view.View, android.app.PendingIntent, android.content.Intent);
    public boolean onClickHandler(android.view.View, android.app.PendingIntent, android.content.Intent, int);
    public void setEnterAnimationId(int);


}

-keep class android.widget.RemoteViews$OnViewAppliedListener {

    public abstract void onError(java.lang.Exception);
    public abstract void onViewApplied(android.view.View);


}

-keep class android.widget.SpinnerAdapter {

    public abstract android.view.View getDropDownView(int, android.view.View, android.view.ViewGroup);


}

-keep class android.widget.Toolbar {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public boolean canShowOverflowMenu();
    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    public void collapseActionView();
    public void dismissPopupMenus();
    protected android.widget.Toolbar$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.Toolbar$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.widget.Toolbar$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public java.lang.CharSequence getCollapseContentDescription();
    public android.graphics.drawable.Drawable getCollapseIcon();
    public int getContentInsetEnd();
    public int getContentInsetEndWithActions();
    public int getContentInsetLeft();
    public int getContentInsetRight();
    public int getContentInsetStart();
    public int getContentInsetStartWithNavigation();
    public int getCurrentContentInsetEnd();
    public int getCurrentContentInsetLeft();
    public int getCurrentContentInsetRight();
    public int getCurrentContentInsetStart();
    public android.graphics.drawable.Drawable getLogo();
    public java.lang.CharSequence getLogoDescription();
    public android.view.Menu getMenu();
    public java.lang.CharSequence getNavigationContentDescription();
    public android.graphics.drawable.Drawable getNavigationIcon();
    public android.view.View getNavigationView();
    public android.graphics.drawable.Drawable getOverflowIcon();
    public int getPopupTheme();
    public java.lang.CharSequence getSubtitle();
    public java.lang.CharSequence getTitle();
    public int getTitleMarginBottom();
    public int getTitleMarginEnd();
    public int getTitleMarginStart();
    public int getTitleMarginTop();
    public com.android.internal.widget.DecorToolbar getWrapper();
    public boolean hasExpandedActionView();
    public boolean hideOverflowMenu();
    public void inflateMenu(int);
    public boolean isOverflowMenuShowPending();
    public boolean isOverflowMenuShowing();
    public boolean isTitleTruncated();
    protected void onAttachedToWindow();
    protected void onDetachedFromWindow();
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    protected void onRestoreInstanceState(android.os.Parcelable);
    public void onRtlPropertiesChanged(int);
    protected android.os.Parcelable onSaveInstanceState();
    protected void onSetLayoutParams(android.view.View, android.view.ViewGroup$LayoutParams);
    public boolean onTouchEvent(android.view.MotionEvent);
    public void setCollapseContentDescription(int);
    public void setCollapseContentDescription(java.lang.CharSequence);
    public void setCollapseIcon(int);
    public void setCollapseIcon(android.graphics.drawable.Drawable);
    public void setCollapsible(boolean);
    public void setContentInsetEndWithActions(int);
    public void setContentInsetStartWithNavigation(int);
    public void setContentInsetsAbsolute(int, int);
    public void setContentInsetsRelative(int, int);
    public void setLogo(int);
    public void setLogo(android.graphics.drawable.Drawable);
    public void setLogoDescription(int);
    public void setLogoDescription(java.lang.CharSequence);
    public void setMenu(com.android.internal.view.menu.MenuBuilder, android.widget.ActionMenuPresenter);
    public void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
    public void setNavigationContentDescription(int);
    public void setNavigationContentDescription(java.lang.CharSequence);
    public void setNavigationIcon(int);
    public void setNavigationIcon(android.graphics.drawable.Drawable);
    public void setNavigationOnClickListener(android.view.View$OnClickListener);
    public void setOnMenuItemClickListener(android.widget.Toolbar$OnMenuItemClickListener);
    public void setOverflowIcon(android.graphics.drawable.Drawable);
    public void setPopupTheme(int);
    public void setSubtitle(int);
    public void setSubtitle(java.lang.CharSequence);
    public void setSubtitleTextAppearance(android.content.Context, int);
    public void setSubtitleTextColor(int);
    public void setTitle(int);
    public void setTitle(java.lang.CharSequence);
    public void setTitleMargin(int, int, int, int);
    public void setTitleMarginBottom(int);
    public void setTitleMarginEnd(int);
    public void setTitleMarginStart(int);
    public void setTitleMarginTop(int);
    public void setTitleTextAppearance(android.content.Context, int);
    public void setTitleTextColor(int);
    public boolean showOverflowMenu();


}

-keep class android.widget.Toolbar$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, int);
    <init>(int);
    <init>(android.widget.Toolbar$LayoutParams);
    <init>(android.app.ActionBar$LayoutParams);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.view.ViewGroup$LayoutParams);



}

-keep class android.widget.Toolbar$OnMenuItemClickListener {

    public abstract boolean onMenuItemClick(android.view.MenuItem);


}

-keep class com.android.internal.app.IAppOpsActiveCallback {

    public abstract void opActiveChanged(int, int, java.lang.String, boolean);


}

-keep class com.android.internal.app.IAppOpsCallback {

    public abstract void opChanged(int, int, java.lang.String);


}

-keep class com.android.internal.app.IAppOpsService {

    public abstract int checkAudioOperation(int, int, int, java.lang.String);
    public abstract int checkOperation(int, int, java.lang.String);
    public abstract int checkPackage(int, java.lang.String);
    public abstract void finishOperation(android.os.IBinder, int, int, java.lang.String);
    public abstract java.util.List getOpsForPackage(int, java.lang.String, int[]);
    public abstract java.util.List getPackagesForOps(int[]);
    public abstract android.os.IBinder getToken(android.os.IBinder);
    public abstract java.util.List getUidOps(int, int[]);
    public abstract boolean isOperationActive(int, int, java.lang.String);
    public abstract int noteOperation(int, int, java.lang.String);
    public abstract int noteProxyOperation(int, java.lang.String, int, java.lang.String);
    public abstract int permissionToOpCode(java.lang.String);
    public abstract void removeUser(int);
    public abstract void resetAllModes(int, java.lang.String);
    public abstract void setAudioRestriction(int, int, int, int, java.lang.String[]);
    public abstract void setMode(int, int, java.lang.String, int);
    public abstract void setUidMode(int, int, int);
    public abstract void setUserRestriction(int, boolean, android.os.IBinder, int, java.lang.String[]);
    public abstract void setUserRestrictions(android.os.Bundle, android.os.IBinder, int);
    public abstract int startOperation(android.os.IBinder, int, int, java.lang.String, boolean);
    public abstract void startWatchingActive(int[], com.android.internal.app.IAppOpsActiveCallback);
    public abstract void startWatchingMode(int, java.lang.String, com.android.internal.app.IAppOpsCallback);
    public abstract void startWatchingModeWithFlags(int, java.lang.String, int, com.android.internal.app.IAppOpsCallback);
    public abstract void stopWatchingActive(com.android.internal.app.IAppOpsActiveCallback);
    public abstract void stopWatchingMode(com.android.internal.app.IAppOpsCallback);


}

-keep class com.android.internal.app.IVoiceInteractionSessionShowCallback {

    public abstract void onFailed();
    public abstract void onShown();


}

-keep class com.android.internal.app.IVoiceInteractor {

    public abstract com.android.internal.app.IVoiceInteractorRequest startAbortVoice(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startCommand(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, java.lang.String, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startCompleteVoice(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startConfirmation(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startPickOption(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
    public abstract boolean[] supportsCommands(java.lang.String, java.lang.String[]);


}

-keep class com.android.internal.app.IVoiceInteractorCallback {

    public abstract void deliverAbortVoiceResult(com.android.internal.app.IVoiceInteractorRequest, android.os.Bundle);
    public abstract void deliverCancel(com.android.internal.app.IVoiceInteractorRequest);
    public abstract void deliverCommandResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.os.Bundle);
    public abstract void deliverCompleteVoiceResult(com.android.internal.app.IVoiceInteractorRequest, android.os.Bundle);
    public abstract void deliverConfirmationResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.os.Bundle);
    public abstract void deliverPickOptionResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);


}

-keep class com.android.internal.app.IVoiceInteractorRequest {

    public abstract void cancel();


}

-keep class com.android.internal.content.ReferrerIntent {
    <init>(android.content.Intent, java.lang.String);

    public boolean equals(java.lang.Object);
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String mReferrer;
}

-keep class com.android.internal.os.IResultReceiver {

    public abstract void send(int, android.os.Bundle);


}

-keep class com.android.internal.policy.IKeyguardDismissCallback {

    public abstract void onDismissCancelled();
    public abstract void onDismissError();
    public abstract void onDismissSucceeded();


}

-keep class com.android.internal.util.FunctionalUtils {

    public static java.lang.Runnable handleExceptions(com.android.internal.util.FunctionalUtils$ThrowingRunnable, java.util.function.Consumer);
    public static java.util.function.Consumer ignoreRemoteException(com.android.internal.util.FunctionalUtils$RemoteExceptionIgnoringConsumer);
    public static java.util.function.Consumer uncheckExceptions(com.android.internal.util.FunctionalUtils$ThrowingConsumer);


}

-keep class com.android.internal.util.FunctionalUtils$RemoteExceptionIgnoringConsumer {

    public void accept(java.lang.Object);
    public abstract void acceptOrThrow(java.lang.Object);


}

-keep class com.android.internal.util.FunctionalUtils$ThrowingConsumer {

    public void accept(java.lang.Object);
    public abstract void acceptOrThrow(java.lang.Object);


}

-keep class com.android.internal.util.FunctionalUtils$ThrowingRunnable {

    public void run();
    public abstract void runOrThrow();


}

-keep class com.android.internal.util.FunctionalUtils$ThrowingSupplier {

    public abstract java.lang.Object getOrThrow();


}

-keep class com.android.internal.util.IndentingPrintWriter {
    <init>(java.io.Writer, java.lang.String);
    <init>(java.io.Writer, java.lang.String, int);

    public com.android.internal.util.IndentingPrintWriter decreaseIndent();
    public com.android.internal.util.IndentingPrintWriter increaseIndent();
    public com.android.internal.util.IndentingPrintWriter printHexPair(java.lang.String, int);
    public com.android.internal.util.IndentingPrintWriter printPair(java.lang.String, java.lang.Object);
    public com.android.internal.util.IndentingPrintWriter printPair(java.lang.String, java.lang.Object[]);
    public void println();
    public com.android.internal.util.IndentingPrintWriter setIndent(java.lang.String);
    public com.android.internal.util.IndentingPrintWriter setIndent(int);
    public void write(int);
    public void write(java.lang.String, int, int);
    public void write(char[], int, int);


}

-keep class com.android.internal.view.IDragAndDropPermissions {

    public abstract void release();
    public abstract void take(android.os.IBinder);
    public abstract void takeTransient(android.os.IBinder);


}

-keep class com.android.internal.view.menu.BaseMenuPresenter {
    <init>(android.content.Context, int, int);

    protected void addItemView(android.view.View, int);
    public abstract void bindItemView(com.android.internal.view.menu.MenuItemImpl, com.android.internal.view.menu.MenuView$ItemView);
    public boolean collapseItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    public com.android.internal.view.menu.MenuView$ItemView createItemView(android.view.ViewGroup);
    public boolean expandItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    protected boolean filterLeftoverView(android.view.ViewGroup, int);
    public boolean flagActionItems();
    public com.android.internal.view.menu.MenuPresenter$Callback getCallback();
    public int getId();
    public android.view.View getItemView(com.android.internal.view.menu.MenuItemImpl, android.view.View, android.view.ViewGroup);
    public com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
    public void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
    public void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
    public void setCallback(com.android.internal.view.menu.MenuPresenter$Callback);
    public void setId(int);
    public boolean shouldIncludeItem(int, com.android.internal.view.menu.MenuItemImpl);
    public void updateMenuView(boolean);


    protected android.content.Context mContext;
    protected android.view.LayoutInflater mInflater;
    protected com.android.internal.view.menu.MenuBuilder mMenu;
    protected com.android.internal.view.menu.MenuView mMenuView;
    protected android.content.Context mSystemContext;
    protected android.view.LayoutInflater mSystemInflater;
}

-keep class com.android.internal.view.menu.MenuBuilder {
    <init>(android.content.Context);

    public android.view.MenuItem add(java.lang.CharSequence);
    public android.view.MenuItem add(int);
    public android.view.MenuItem add(int, int, int, java.lang.CharSequence);
    public android.view.MenuItem add(int, int, int, int);
    public int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
    public void addMenuPresenter(com.android.internal.view.menu.MenuPresenter);
    public void addMenuPresenter(com.android.internal.view.menu.MenuPresenter, android.content.Context);
    public android.view.SubMenu addSubMenu(java.lang.CharSequence);
    public android.view.SubMenu addSubMenu(int);
    public android.view.SubMenu addSubMenu(int, int, int, java.lang.CharSequence);
    public android.view.SubMenu addSubMenu(int, int, int, int);
    public void changeMenuMode();
    public void clear();
    public void clearAll();
    public void clearHeader();
    public void close(boolean);
    public void close();
    public boolean collapseItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public boolean expandItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public int findGroupIndex(int);
    public int findGroupIndex(int, int);
    public android.view.MenuItem findItem(int);
    public int findItemIndex(int);
    public void flagActionItems();
    public java.util.ArrayList getActionItems();
    protected java.lang.String getActionViewStatesKey();
    public android.content.Context getContext();
    public com.android.internal.view.menu.MenuItemImpl getExpandedItem();
    public android.graphics.drawable.Drawable getHeaderIcon();
    public java.lang.CharSequence getHeaderTitle();
    public android.view.View getHeaderView();
    public android.view.MenuItem getItem(int);
    public java.util.ArrayList getNonActionItems();
    public com.android.internal.view.menu.MenuBuilder getRootMenu();
    public java.util.ArrayList getVisibleItems();
    public boolean hasVisibleItems();
    public boolean isGroupDividerEnabled();
    public boolean isShortcutKey(int, android.view.KeyEvent);
    public boolean isShortcutsVisible();
    public void onItemsChanged(boolean);
    public boolean performIdentifierAction(int, int);
    public boolean performItemAction(android.view.MenuItem, int);
    public boolean performItemAction(android.view.MenuItem, com.android.internal.view.menu.MenuPresenter, int);
    public boolean performShortcut(int, android.view.KeyEvent, int);
    public void removeGroup(int);
    public void removeItem(int);
    public void removeItemAt(int);
    public void removeMenuPresenter(com.android.internal.view.menu.MenuPresenter);
    public void restoreActionViewStates(android.os.Bundle);
    public void restorePresenterStates(android.os.Bundle);
    public void saveActionViewStates(android.os.Bundle);
    public void savePresenterStates(android.os.Bundle);
    public void setCallback(com.android.internal.view.menu.MenuBuilder$Callback);
    public void setCurrentMenuInfo(android.view.ContextMenu$ContextMenuInfo);
    public com.android.internal.view.menu.MenuBuilder setDefaultShowAsAction(int);
    public void setGroupCheckable(int, boolean, boolean);
    public void setGroupDividerEnabled(boolean);
    public void setGroupEnabled(int, boolean);
    public void setGroupVisible(int, boolean);
    protected com.android.internal.view.menu.MenuBuilder setHeaderIconInt(android.graphics.drawable.Drawable);
    protected com.android.internal.view.menu.MenuBuilder setHeaderIconInt(int);
    protected com.android.internal.view.menu.MenuBuilder setHeaderTitleInt(java.lang.CharSequence);
    protected com.android.internal.view.menu.MenuBuilder setHeaderTitleInt(int);
    protected com.android.internal.view.menu.MenuBuilder setHeaderViewInt(android.view.View);
    public void setQwertyMode(boolean);
    public void setShortcutsVisible(boolean);
    public int size();
    public void startDispatchingItemsChanged();
    public void stopDispatchingItemsChanged();


}

-keep class com.android.internal.view.menu.MenuBuilder$Callback {

    public abstract boolean onMenuItemSelected(com.android.internal.view.menu.MenuBuilder, android.view.MenuItem);
    public abstract void onMenuModeChange(com.android.internal.view.menu.MenuBuilder);


}

-keep class com.android.internal.view.menu.MenuItemImpl {

    public void actionFormatChanged();
    public boolean collapseActionView();
    public boolean expandActionView();
    public android.view.ActionProvider getActionProvider();
    public android.view.View getActionView();
    public int getAlphabeticModifiers();
    public char getAlphabeticShortcut();
    public java.lang.CharSequence getContentDescription();
    public int getGroupId();
    public android.graphics.drawable.Drawable getIcon();
    public android.content.res.ColorStateList getIconTintList();
    public android.graphics.PorterDuff$Mode getIconTintMode();
    public android.content.Intent getIntent();
    public int getItemId();
    public android.view.ContextMenu$ContextMenuInfo getMenuInfo();
    public int getNumericModifiers();
    public char getNumericShortcut();
    public int getOrder();
    public int getOrdering();
    public android.view.SubMenu getSubMenu();
    public java.lang.CharSequence getTitle();
    public java.lang.CharSequence getTitleCondensed();
    public java.lang.CharSequence getTooltipText();
    public boolean hasCollapsibleActionView();
    public boolean hasSubMenu();
    public boolean invoke();
    public boolean isActionButton();
    public boolean isActionViewExpanded();
    public boolean isCheckable();
    public boolean isChecked();
    public boolean isEnabled();
    public boolean isExclusiveCheckable();
    public boolean isVisible();
    public boolean requestsActionButton();
    public boolean requiresActionButton();
    public boolean requiresOverflow();
    public android.view.MenuItem setActionProvider(android.view.ActionProvider);
    public android.view.MenuItem setActionView(android.view.View);
    public android.view.MenuItem setActionView(int);
    public void setActionViewExpanded(boolean);
    public android.view.MenuItem setAlphabeticShortcut(char);
    public android.view.MenuItem setAlphabeticShortcut(char, int);
    public android.view.MenuItem setCallback(java.lang.Runnable);
    public android.view.MenuItem setCheckable(boolean);
    public android.view.MenuItem setChecked(boolean);
    public android.view.MenuItem setContentDescription(java.lang.CharSequence);
    public android.view.MenuItem setEnabled(boolean);
    public void setExclusiveCheckable(boolean);
    public android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
    public android.view.MenuItem setIcon(int);
    public android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    public android.view.MenuItem setIconTintMode(android.graphics.PorterDuff$Mode);
    public android.view.MenuItem setIntent(android.content.Intent);
    public void setIsActionButton(boolean);
    public android.view.MenuItem setNumericShortcut(char);
    public android.view.MenuItem setNumericShortcut(char, int);
    public android.view.MenuItem setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener);
    public android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem$OnMenuItemClickListener);
    public android.view.MenuItem setShortcut(char, char);
    public android.view.MenuItem setShortcut(char, char, int, int);
    public void setShowAsAction(int);
    public android.view.MenuItem setShowAsActionFlags(int);
    public android.view.MenuItem setTitle(java.lang.CharSequence);
    public android.view.MenuItem setTitle(int);
    public android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
    public android.view.MenuItem setTooltipText(java.lang.CharSequence);
    public android.view.MenuItem setVisible(boolean);
    public boolean shouldShowIcon();
    public boolean showsTextAsAction();
    public java.lang.String toString();


}

-keep class com.android.internal.view.menu.MenuPresenter {

    public abstract boolean collapseItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    public abstract boolean expandItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    public abstract boolean flagActionItems();
    public abstract int getId();
    public abstract com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
    public abstract void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
    public abstract void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public abstract void onRestoreInstanceState(android.os.Parcelable);
    public abstract android.os.Parcelable onSaveInstanceState();
    public abstract boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
    public abstract void setCallback(com.android.internal.view.menu.MenuPresenter$Callback);
    public abstract void updateMenuView(boolean);


}

-keep class com.android.internal.view.menu.MenuPresenter$Callback {

    public abstract void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public abstract boolean onOpenSubMenu(com.android.internal.view.menu.MenuBuilder);


}

-keep class com.android.internal.view.menu.MenuView {

    public abstract int getWindowAnimations();
    public abstract void initialize(com.android.internal.view.menu.MenuBuilder);


}

-keep class com.android.internal.view.menu.MenuView$ItemView {

    public abstract com.android.internal.view.menu.MenuItemImpl getItemData();
    public abstract void initialize(com.android.internal.view.menu.MenuItemImpl, int);
    public abstract boolean prefersCondensedTitle();
    public abstract void setCheckable(boolean);
    public abstract void setChecked(boolean);
    public abstract void setEnabled(boolean);
    public abstract void setIcon(android.graphics.drawable.Drawable);
    public abstract void setShortcut(boolean, char);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract boolean showsIcon();


}

-keep class com.android.internal.view.menu.SubMenuBuilder {
    <init>(android.content.Context, com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);

    public boolean collapseItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public boolean expandItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public java.lang.String getActionViewStatesKey();
    public android.view.MenuItem getItem();
    public android.view.Menu getParentMenu();
    public com.android.internal.view.menu.MenuBuilder getRootMenu();
    public boolean isGroupDividerEnabled();
    public boolean isQwertyMode();
    public boolean isShortcutsVisible();
    public void setCallback(com.android.internal.view.menu.MenuBuilder$Callback);
    public void setGroupDividerEnabled(boolean);
    public android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
    public android.view.SubMenu setHeaderIcon(int);
    public android.view.SubMenu setHeaderTitle(java.lang.CharSequence);
    public android.view.SubMenu setHeaderTitle(int);
    public android.view.SubMenu setHeaderView(android.view.View);
    public android.view.SubMenu setIcon(android.graphics.drawable.Drawable);
    public android.view.SubMenu setIcon(int);
    public void setQwertyMode(boolean);
    public void setShortcutsVisible(boolean);


}

-keep class com.android.internal.widget.DecorToolbar {

    public abstract void animateToVisibility(int);
    public abstract boolean canShowOverflowMenu();
    public abstract boolean canSplit();
    public abstract void collapseActionView();
    public abstract void dismissPopupMenus();
    public abstract android.content.Context getContext();
    public abstract android.view.View getCustomView();
    public abstract int getDisplayOptions();
    public abstract int getDropdownItemCount();
    public abstract int getDropdownSelectedPosition();
    public abstract int getHeight();
    public abstract android.view.Menu getMenu();
    public abstract int getNavigationMode();
    public abstract java.lang.CharSequence getSubtitle();
    public abstract java.lang.CharSequence getTitle();
    public abstract android.view.ViewGroup getViewGroup();
    public abstract int getVisibility();
    public abstract boolean hasEmbeddedTabs();
    public abstract boolean hasExpandedActionView();
    public abstract boolean hasIcon();
    public abstract boolean hasLogo();
    public abstract boolean hideOverflowMenu();
    public abstract void initIndeterminateProgress();
    public abstract void initProgress();
    public abstract boolean isOverflowMenuShowPending();
    public abstract boolean isOverflowMenuShowing();
    public abstract boolean isSplit();
    public abstract boolean isTitleTruncated();
    public abstract void restoreHierarchyState(android.util.SparseArray);
    public abstract void saveHierarchyState(android.util.SparseArray);
    public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public abstract void setCollapsible(boolean);
    public abstract void setCustomView(android.view.View);
    public abstract void setDefaultNavigationContentDescription(int);
    public abstract void setDefaultNavigationIcon(android.graphics.drawable.Drawable);
    public abstract void setDisplayOptions(int);
    public abstract void setDropdownParams(android.widget.SpinnerAdapter, android.widget.AdapterView$OnItemSelectedListener);
    public abstract void setDropdownSelectedPosition(int);
    public abstract void setEmbeddedTabView(com.android.internal.widget.ScrollingTabContainerView);
    public abstract void setHomeButtonEnabled(boolean);
    public abstract void setIcon(int);
    public abstract void setIcon(android.graphics.drawable.Drawable);
    public abstract void setLogo(int);
    public abstract void setLogo(android.graphics.drawable.Drawable);
    public abstract void setMenu(android.view.Menu, com.android.internal.view.menu.MenuPresenter$Callback);
    public abstract void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
    public abstract void setMenuPrepared();
    public abstract void setNavigationContentDescription(java.lang.CharSequence);
    public abstract void setNavigationContentDescription(int);
    public abstract void setNavigationIcon(android.graphics.drawable.Drawable);
    public abstract void setNavigationIcon(int);
    public abstract void setNavigationMode(int);
    public abstract void setSplitToolbar(boolean);
    public abstract void setSplitView(android.view.ViewGroup);
    public abstract void setSplitWhenNarrow(boolean);
    public abstract void setSubtitle(java.lang.CharSequence);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setVisibility(int);
    public abstract void setWindowCallback(android.view.Window$Callback);
    public abstract void setWindowTitle(java.lang.CharSequence);
    public abstract android.animation.Animator setupAnimatorToVisibility(int, long);
    public abstract boolean showOverflowMenu();


}

-keep class com.android.internal.widget.ScrollingTabContainerView {
    <init>(android.content.Context);

    public void addTab(android.app.ActionBar$Tab, boolean);
    public void addTab(android.app.ActionBar$Tab, int, boolean);
    public void animateToTab(int);
    public void animateToVisibility(int);
    public void onAttachedToWindow();
    protected void onConfigurationChanged(android.content.res.Configuration);
    public void onDetachedFromWindow();
    public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
    public void onMeasure(int, int);
    public void removeAllTabs();
    public void removeTabAt(int);
    public void setAllowCollapse(boolean);
    public void setContentHeight(int);
    public void setTabSelected(int);
    public void updateTab(int);


    protected com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener mVisAnimListener;
    protected android.animation.Animator mVisibilityAnim;
}

-keep class com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener {
    <init>();

    public void onAnimationCancel(android.animation.Animator);
    public void onAnimationEnd(android.animation.Animator);
    public void onAnimationRepeat(android.animation.Animator);
    public void onAnimationStart(android.animation.Animator);
    public com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener withFinalVisibility(int);


}

-keep class java.io.BufferedWriter {
    <init>(java.io.Writer);
    <init>(java.io.Writer, int);

    public void close();
    public void flush();
    public void newLine();
    public void write(int);
    public void write(char[], int, int);
    public void write(java.lang.String, int, int);


}

-keep class java.io.ByteArrayOutputStream {
    <init>();
    <init>(int);

    public void close();
    public synchronized void reset();
    public synchronized int size();
    public synchronized byte[] toByteArray();
    public synchronized java.lang.String toString();
    public synchronized java.lang.String toString(java.lang.String);
    public synchronized java.lang.String toString(int);
    public synchronized void write(int);
    public synchronized void write(byte[], int, int);
    public synchronized void writeTo(java.io.OutputStream);


    protected byte[] buf;
    protected int count;
}

-keep class java.io.DataOutputStream {
    <init>(java.io.OutputStream);

    public void flush();
    public int size();
    public synchronized void write(int);
    public synchronized void write(byte[], int, int);
    public void writeBoolean(boolean);
    public void writeByte(int);
    public void writeBytes(java.lang.String);
    public void writeChar(int);
    public void writeChars(java.lang.String);
    public void writeDouble(double);
    public void writeFloat(float);
    public void writeInt(int);
    public void writeLong(long);
    public void writeShort(int);
    public void writeUTF(java.lang.String);


    protected int written;
}

-keep class java.io.File {
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.io.File, 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, java.io.File);
    public static java.io.File createTempFile(java.lang.String, java.lang.String);
    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.nio.file.Path toPath();
    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 int getInt$();
    public boolean isSocket$();
    public void setInt$(int);
    public void sync();
    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.lang.String);
    <init>(java.io.File);
    <init>(java.io.FileDescriptor);
    <init>(java.io.FileDescriptor, boolean);

    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[]);
    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.lang.String);
    <init>(java.lang.String, boolean);
    <init>(java.io.File);
    <init>(java.io.File, boolean);
    <init>(java.io.FileDescriptor);
    <init>(java.io.FileDescriptor, boolean);

    public void close();
    protected void finalize();
    public java.nio.channels.FileChannel getChannel();
    public java.io.FileDescriptor getFD();
    public void write(int);
    public void write(byte[]);
    public void write(byte[], int, 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(int);
    public void write(byte[]);
    public void write(byte[], int, 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 synchronized 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.InvalidObjectException {
    <init>(java.lang.String);



}

-keep class java.io.ObjectStreamException {
    <init>(java.lang.String);
    <init>();



}

-keep class java.io.OutputStream {
    <init>();

    public void close();
    public void flush();
    public abstract void write(int);
    public void write(byte[]);
    public void write(byte[], int, 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.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.io.File);
    <init>(java.io.File, java.lang.String);

    public java.io.PrintStream append(java.lang.CharSequence);
    public java.io.PrintStream append(java.lang.CharSequence, int, int);
    public java.io.PrintStream append(char);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public boolean checkError();
    protected void clearError();
    public void close();
    public 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(boolean);
    public void print(char);
    public void print(int);
    public void print(long);
    public void print(float);
    public void print(double);
    public void print(char[]);
    public void print(java.lang.String);
    public void print(java.lang.Object);
    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(boolean);
    public void println(char);
    public void println(int);
    public void println(long);
    public void println(float);
    public void println(double);
    public void println(char[]);
    public void println(java.lang.String);
    public void println(java.lang.Object);
    protected void setError();
    public void write(int);
    public void write(byte[], int, int);


}

-keep class java.io.PrintWriter {
    <init>(java.io.Writer);
    <init>(java.io.Writer, boolean);
    <init>(java.io.OutputStream);
    <init>(java.io.OutputStream, boolean);
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.io.File);
    <init>(java.io.File, java.lang.String);

    public java.io.PrintWriter append(java.lang.CharSequence);
    public java.io.PrintWriter append(java.lang.CharSequence, int, int);
    public java.io.PrintWriter append(char);
    public java.io.Writer append(char);
    public java.io.Writer append(java.lang.CharSequence, int, int);
    public java.io.Writer append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    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(boolean);
    public void print(char);
    public void print(int);
    public void print(long);
    public void print(float);
    public void print(double);
    public void print(char[]);
    public void print(java.lang.String);
    public void print(java.lang.Object);
    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(boolean);
    public void println(char);
    public void println(int);
    public void println(long);
    public void println(float);
    public void println(double);
    public void println(char[]);
    public void println(java.lang.String);
    public void println(java.lang.Object);
    protected void setError();
    public void write(int);
    public void write(char[], int, int);
    public void write(char[]);
    public void write(java.lang.String, int, int);
    public void write(java.lang.String);


    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(java.nio.CharBuffer);
    public int read();
    public int read(char[]);
    public abstract int read(char[], int, int);
    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(java.lang.CharSequence);
    public java.io.Writer append(java.lang.CharSequence, int, int);
    public java.io.Writer append(char);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public abstract void close();
    public abstract void flush();
    public void write(int);
    public void write(char[]);
    public abstract void write(char[], int, 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 java.lang.AbstractStringBuilder append(java.lang.Object);
    public java.lang.AbstractStringBuilder append(java.lang.String);
    public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder append(char[]);
    public java.lang.AbstractStringBuilder append(char[], int, int);
    public java.lang.AbstractStringBuilder append(boolean);
    public java.lang.AbstractStringBuilder append(char);
    public java.lang.AbstractStringBuilder append(int);
    public java.lang.AbstractStringBuilder append(long);
    public java.lang.AbstractStringBuilder append(float);
    public java.lang.AbstractStringBuilder append(double);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder 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.AbstractStringBuilder delete(int, int);
    public java.lang.AbstractStringBuilder deleteCharAt(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 java.lang.AbstractStringBuilder insert(int, char[], int, int);
    public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
    public java.lang.AbstractStringBuilder insert(int, java.lang.String);
    public java.lang.AbstractStringBuilder insert(int, char[]);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder insert(int, boolean);
    public java.lang.AbstractStringBuilder insert(int, char);
    public java.lang.AbstractStringBuilder insert(int, int);
    public java.lang.AbstractStringBuilder insert(int, long);
    public java.lang.AbstractStringBuilder insert(int, float);
    public java.lang.AbstractStringBuilder insert(int, double);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String, int);
    public int length();
    public int offsetByCodePoints(int, int);
    public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
    public java.lang.AbstractStringBuilder reverse();
    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 abstract java.lang.String toString();
    public void trimToSize();


}

-keep class java.lang.Appendable {

    public abstract java.lang.Appendable append(java.lang.CharSequence);
    public abstract java.lang.Appendable append(java.lang.CharSequence, int, int);
    public abstract java.lang.Appendable append(char);


}

-keep class java.lang.Boolean {
    <init>(boolean);
    <init>(java.lang.String);

    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 int hashCode(boolean);
    public static boolean logicalAnd(boolean, boolean);
    public static boolean logicalOr(boolean, boolean);
    public static boolean logicalXor(boolean, boolean);
    public static boolean parseBoolean(java.lang.String);
    public static java.lang.String toString(boolean);
    public java.lang.String toString();
    public static java.lang.Boolean valueOf(boolean);
    public static java.lang.Boolean valueOf(java.lang.String);


    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 static int hashCode(byte);
    public int intValue();
    public long longValue();
    public static byte parseByte(java.lang.String, int);
    public static byte parseByte(java.lang.String);
    public short shortValue();
    public static java.lang.String toHexString(byte, boolean);
    public static java.lang.String toString(byte);
    public java.lang.String toString();
    public static int toUnsignedInt(byte);
    public static long toUnsignedLong(byte);
    public static java.lang.Byte valueOf(byte);
    public static java.lang.Byte valueOf(java.lang.String, int);
    public static java.lang.Byte valueOf(java.lang.String);


    public static int BYTES;
    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 java.util.stream.IntStream chars();
    public java.util.stream.IntStream codePoints();
    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 int hashCode(char);
    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 int BYTES;
    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 int getAccessFlags();
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    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 getDeclaredAnnotation(java.lang.Class);
    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.Field[] getDeclaredFieldsUnchecked(boolean);
    public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class[]);
    public java.lang.reflect.Method[] getDeclaredMethods();
    public java.lang.reflect.Method[] getDeclaredMethodsUnchecked(boolean);
    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.Object[] getEnumConstantsShared();
    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.reflect.Method getInstanceMethod(java.lang.String, java.lang.Class[]);
    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.lang.String getPackageName$();
    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 java.lang.String getTypeName();
    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 isFinalizable();
    public boolean isInstance(java.lang.Object);
    public boolean isInterface();
    public boolean isLocalClass();
    public boolean isMemberClass();
    public boolean isPrimitive();
    public boolean isProxy();
    public boolean isSynthetic();
    public java.lang.Object newInstance();
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.ClassFormatError {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.ClassLoader {
    <init>(java.lang.ClassLoader);
    <init>();

    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 static boolean registerAsParallelCapable();
    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[]);


    public java.util.Map proxyCache;
}

-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.Comparable {

    public abstract int compareTo(java.lang.Object);


}

-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 static int hashCode(double);
    public int intValue();
    public static boolean isFinite(double);
    public static boolean isInfinite(double);
    public boolean isInfinite();
    public static boolean isNaN(double);
    public boolean isNaN();
    public static double longBitsToDouble(long);
    public long longValue();
    public static double max(double, double);
    public static double min(double, double);
    public static double parseDouble(java.lang.String);
    public short shortValue();
    public static double sum(double, double);
    public static java.lang.String toHexString(double);
    public static java.lang.String toString(double);
    public java.lang.String toString();
    public static java.lang.Double valueOf(java.lang.String);
    public static java.lang.Double valueOf(double);


    public static int BYTES;
    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 static java.lang.Enum[] getSharedConstants(java.lang.Class);
    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);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);



}

-keep class java.lang.Exception {
    <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);



}

-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 int hashCode(float);
    public static float intBitsToFloat(int);
    public int intValue();
    public static boolean isFinite(float);
    public static boolean isInfinite(float);
    public boolean isInfinite();
    public static boolean isNaN(float);
    public boolean isNaN();
    public long longValue();
    public static float max(float, float);
    public static float min(float, float);
    public static float parseFloat(java.lang.String);
    public short shortValue();
    public static float sum(float, float);
    public static java.lang.String toHexString(float);
    public static java.lang.String toString(float);
    public java.lang.String toString();
    public static java.lang.Float valueOf(java.lang.String);
    public static java.lang.Float valueOf(float);


    public static int BYTES;
    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 int compareUnsigned(int, int);
    public static java.lang.Integer decode(java.lang.String);
    public static int divideUnsigned(int, int);
    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 hashCode(int);
    public static int highestOneBit(int);
    public int intValue();
    public long longValue();
    public static int lowestOneBit(int);
    public static int max(int, int);
    public static int min(int, int);
    public static int numberOfLeadingZeros(int);
    public static int numberOfTrailingZeros(int);
    public static int parseInt(java.lang.String, int);
    public static int parseInt(java.lang.String);
    public static int parseUnsignedInt(java.lang.String, int);
    public static int parseUnsignedInt(java.lang.String);
    public static int remainderUnsigned(int, 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 int sum(int, int);
    public static java.lang.String toBinaryString(int);
    public static java.lang.String toHexString(int);
    public static java.lang.String toOctalString(int);
    public static java.lang.String toString(int, int);
    public static java.lang.String toString(int);
    public java.lang.String toString();
    public static long toUnsignedLong(int);
    public static java.lang.String toUnsignedString(int, int);
    public static java.lang.String toUnsignedString(int);
    public static java.lang.Integer valueOf(java.lang.String, int);
    public static java.lang.Integer valueOf(java.lang.String);
    public static java.lang.Integer valueOf(int);


    public static int BYTES;
    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.Iterable {

    public void forEach(java.util.function.Consumer);
    public abstract java.util.Iterator iterator();
    public java.util.Spliterator spliterator();


}

-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 int compareUnsigned(long, long);
    public static java.lang.Long decode(java.lang.String);
    public static long divideUnsigned(long, long);
    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 int hashCode(long);
    public static long highestOneBit(long);
    public int intValue();
    public long longValue();
    public static long lowestOneBit(long);
    public static long max(long, long);
    public static long min(long, long);
    public static int numberOfLeadingZeros(long);
    public static int numberOfTrailingZeros(long);
    public static long parseLong(java.lang.String, int);
    public static long parseLong(java.lang.String);
    public static long parseUnsignedLong(java.lang.String, int);
    public static long parseUnsignedLong(java.lang.String);
    public static long remainderUnsigned(long, long);
    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 long sum(long, long);
    public static java.lang.String toBinaryString(long);
    public static java.lang.String toHexString(long);
    public static java.lang.String toOctalString(long);
    public static java.lang.String toString(long, int);
    public static java.lang.String toString(long);
    public java.lang.String toString();
    public static java.lang.String toUnsignedString(long, int);
    public static java.lang.String toUnsignedString(long);
    public static java.lang.Long valueOf(java.lang.String, int);
    public static java.lang.Long valueOf(java.lang.String);
    public static java.lang.Long valueOf(long);


    public static int BYTES;
    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(long);
    public void wait(long, int);
    public void wait();


}

-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[] getAnnotationsByType(java.lang.Class);
    public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
    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.String, java.lang.Throwable);
    <init>(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);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);



}

-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>(short);
    <init>(java.lang.String);

    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 static int hashCode(short);
    public int intValue();
    public long longValue();
    public static short parseShort(java.lang.String, int);
    public static short parseShort(java.lang.String);
    public static short reverseBytes(short);
    public short shortValue();
    public static java.lang.String toString(short);
    public java.lang.String toString();
    public static int toUnsignedInt(short);
    public static long toUnsignedLong(short);
    public static java.lang.Short valueOf(java.lang.String, int);
    public static java.lang.Short valueOf(java.lang.String);
    public static java.lang.Short valueOf(short);


    public static int BYTES;
    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>(java.lang.String);
    <init>(char[]);
    <init>(char[], int, int);
    <init>(int[], int, int);
    <init>(byte[], int, int, int);
    <init>(byte[], int);
    <init>(byte[], int, int, java.lang.String);
    <init>(byte[], int, int, java.nio.charset.Charset);
    <init>(byte[], java.lang.String);
    <init>(byte[], java.nio.charset.Charset);
    <init>(byte[], int, int);
    <init>(byte[]);
    <init>(java.lang.StringBuffer);
    <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[], int, int);
    public static java.lang.String copyValueOf(char[]);
    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(java.lang.String);
    public byte[] getBytes(java.nio.charset.Charset);
    public byte[] getBytes();
    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 static java.lang.String join(java.lang.CharSequence, java.lang.CharSequence[]);
    public static java.lang.String join(java.lang.CharSequence, java.lang.Iterable);
    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, int);
    public java.lang.String[] split(java.lang.String);
    public boolean startsWith(java.lang.String, int);
    public boolean startsWith(java.lang.String);
    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(java.util.Locale);
    public java.lang.String toLowerCase();
    public java.lang.String toString();
    public java.lang.String toUpperCase(java.util.Locale);
    public java.lang.String toUpperCase();
    public java.lang.String trim();
    public static java.lang.String valueOf(java.lang.Object);
    public static java.lang.String valueOf(char[]);
    public static java.lang.String valueOf(char[], int, int);
    public static java.lang.String valueOf(boolean);
    public static java.lang.String valueOf(char);
    public static java.lang.String valueOf(int);
    public static java.lang.String valueOf(long);
    public static java.lang.String valueOf(float);
    public static java.lang.String valueOf(double);


    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 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(java.lang.CharSequence);
    public synchronized java.lang.StringBuffer append(java.lang.CharSequence, int, int);
    public synchronized java.lang.StringBuffer append(char[]);
    public synchronized java.lang.StringBuffer append(char[], int, int);
    public synchronized java.lang.StringBuffer append(boolean);
    public synchronized java.lang.StringBuffer append(char);
    public synchronized java.lang.StringBuffer append(int);
    public synchronized java.lang.StringBuffer append(long);
    public synchronized java.lang.StringBuffer append(float);
    public synchronized java.lang.StringBuffer append(double);
    public java.lang.AbstractStringBuilder append(double);
    public java.lang.AbstractStringBuilder append(float);
    public java.lang.AbstractStringBuilder append(long);
    public java.lang.AbstractStringBuilder append(int);
    public java.lang.AbstractStringBuilder append(char);
    public java.lang.AbstractStringBuilder append(boolean);
    public java.lang.AbstractStringBuilder append(char[], int, int);
    public java.lang.AbstractStringBuilder append(char[]);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
    public java.lang.AbstractStringBuilder append(java.lang.String);
    public java.lang.AbstractStringBuilder append(java.lang.Object);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public synchronized java.lang.StringBuffer appendCodePoint(int);
    public java.lang.AbstractStringBuilder appendCodePoint(int);
    public synchronized 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 java.lang.AbstractStringBuilder delete(int, int);
    public synchronized java.lang.StringBuffer deleteCharAt(int);
    public java.lang.AbstractStringBuilder deleteCharAt(int);
    public synchronized void ensureCapacity(int);
    public synchronized void getChars(int, int, char[], int);
    public int indexOf(java.lang.String);
    public synchronized int indexOf(java.lang.String, int);
    public synchronized java.lang.StringBuffer insert(int, char[], int, int);
    public synchronized 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 java.lang.StringBuffer insert(int, java.lang.CharSequence);
    public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence, int, int);
    public java.lang.StringBuffer insert(int, boolean);
    public synchronized java.lang.StringBuffer insert(int, char);
    public java.lang.StringBuffer insert(int, int);
    public java.lang.StringBuffer insert(int, long);
    public java.lang.StringBuffer insert(int, float);
    public java.lang.StringBuffer insert(int, double);
    public java.lang.AbstractStringBuilder insert(int, double);
    public java.lang.AbstractStringBuilder insert(int, float);
    public java.lang.AbstractStringBuilder insert(int, long);
    public java.lang.AbstractStringBuilder insert(int, int);
    public java.lang.AbstractStringBuilder insert(int, char);
    public java.lang.AbstractStringBuilder insert(int, boolean);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
    public java.lang.AbstractStringBuilder insert(int, char[]);
    public java.lang.AbstractStringBuilder insert(int, java.lang.String);
    public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
    public java.lang.AbstractStringBuilder insert(int, char[], int, int);
    public int lastIndexOf(java.lang.String);
    public synchronized int lastIndexOf(java.lang.String, int);
    public synchronized int length();
    public synchronized int offsetByCodePoints(int, int);
    public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
    public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
    public synchronized java.lang.StringBuffer reverse();
    public java.lang.AbstractStringBuilder 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.String);
    <init>(java.lang.CharSequence);

    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(java.lang.CharSequence);
    public java.lang.StringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.StringBuilder append(char[]);
    public java.lang.StringBuilder append(char[], int, int);
    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.AbstractStringBuilder append(double);
    public java.lang.AbstractStringBuilder append(float);
    public java.lang.AbstractStringBuilder append(long);
    public java.lang.AbstractStringBuilder append(int);
    public java.lang.AbstractStringBuilder append(char);
    public java.lang.AbstractStringBuilder append(boolean);
    public java.lang.AbstractStringBuilder append(char[], int, int);
    public java.lang.AbstractStringBuilder append(char[]);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
    public java.lang.AbstractStringBuilder append(java.lang.String);
    public java.lang.AbstractStringBuilder append(java.lang.Object);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.StringBuilder appendCodePoint(int);
    public java.lang.AbstractStringBuilder 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.AbstractStringBuilder delete(int, int);
    public java.lang.StringBuilder deleteCharAt(int);
    public java.lang.AbstractStringBuilder deleteCharAt(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 java.lang.StringBuilder insert(int, char[], int, int);
    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, java.lang.CharSequence);
    public java.lang.StringBuilder insert(int, java.lang.CharSequence, int, int);
    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.AbstractStringBuilder insert(int, double);
    public java.lang.AbstractStringBuilder insert(int, float);
    public java.lang.AbstractStringBuilder insert(int, long);
    public java.lang.AbstractStringBuilder insert(int, int);
    public java.lang.AbstractStringBuilder insert(int, char);
    public java.lang.AbstractStringBuilder insert(int, boolean);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
    public java.lang.AbstractStringBuilder insert(int, char[]);
    public java.lang.AbstractStringBuilder insert(int, java.lang.String);
    public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
    public java.lang.AbstractStringBuilder insert(int, char[], int, int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String, int);
    public int length();
    public int offsetByCodePoints(int, int);
    public java.lang.StringBuilder replace(int, int, java.lang.String);
    public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
    public java.lang.StringBuilder reverse();
    public java.lang.AbstractStringBuilder 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.ThreadGroup, java.lang.Runnable);
    <init>(java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.String);
    <init>(java.lang.Runnable, java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long);

    public static int activeCount();
    public void blockedOn(sun.nio.ch.Interruptible);
    public void checkAccess();
    protected java.lang.Object clone();
    public int countStackFrames();
    public static java.lang.Thread currentThread();
    public void destroy();
    public void dispatchUncaughtException(java.lang.Throwable);
    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 java.lang.Thread$UncaughtExceptionHandler getUncaughtExceptionPreHandler();
    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(long);
    public void join(long, int);
    public void join();
    public void parkFor$(long);
    public void parkUntil$(long);
    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 setUncaughtExceptionPreHandler(java.lang.Thread$UncaughtExceptionHandler);
    public static void sleep(long);
    public static void sleep(long, int);
    public synchronized void start();
    public void stop();
    public void stop(java.lang.Throwable);
    public void suspend();
    public java.lang.String toString();
    public void unpark$();
    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.ThreadLocal {
    <init>();

    public java.lang.Object get();
    protected java.lang.Object initialValue();
    public void remove();
    public void set(java.lang.Object);
    public static java.lang.ThreadLocal withInitial(java.util.function.Supplier);


}

-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 synchronized void addSuppressed(java.lang.Throwable);
    public synchronized java.lang.Throwable fillInStackTrace();
    public synchronized java.lang.Throwable getCause();
    public java.lang.String getLocalizedMessage();
    public java.lang.String getMessage();
    public java.lang.StackTraceElement[] getStackTrace();
    public synchronized java.lang.Throwable[] getSuppressed();
    public synchronized 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.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[] getAnnotationsByType(java.lang.Class);
    public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
    public boolean isAccessible();
    public boolean isAnnotationPresent(java.lang.Class);
    public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean);
    public void setAccessible(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[] 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 int getParameterCount();
    public java.lang.Class[] getParameterTypes();
    public java.lang.reflect.TypeVariable[] getTypeParameters();
    public int hashCode();
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.Object newInstance(java.lang.Object[]);
    public java.lang.reflect.Constructor serializationCopy(java.lang.Class, java.lang.Class);
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.reflect.Executable {

    public int getAccessFlags();
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public long getArtMethod();
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public abstract java.lang.Class getDeclaringClass();
    public abstract java.lang.Class[] getExceptionTypes();
    public java.lang.reflect.Type[] getGenericExceptionTypes();
    public java.lang.reflect.Type[] getGenericParameterTypes();
    public abstract int getModifiers();
    public abstract java.lang.String getName();
    public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
    public int getParameterCount();
    public abstract java.lang.Class[] getParameterTypes();
    public java.lang.reflect.Parameter[] getParameters();
    public abstract java.lang.reflect.TypeVariable[] getTypeParameters();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isSynthetic();
    public boolean isVarArgs();
    public abstract java.lang.String toGenericString();


}

-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 java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public long getArtField();
    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 int getDexFieldIndex();
    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 int getOffset();
    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[] 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 int getParameterCount();
    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 isBridge();
    public boolean isDefault();
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.String toGenericString();
    public java.lang.String toString();


    public static java.util.Comparator ORDER_BY_SIGNATURE;
}

-keep class java.lang.reflect.Parameter {

    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[] getAnnotationsByType(java.lang.Class);
    public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
    public java.lang.reflect.Executable getDeclaringExecutable();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.reflect.Type getParameterizedType();
    public java.lang.Class getType();
    public int hashCode();
    public boolean isImplicit();
    public boolean isNamePresent();
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.String toString();


}

-keep class java.lang.reflect.Type {

    public java.lang.String getTypeName();


}

-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, int);
    <init>(byte[], int);
    <init>(byte[], int, int, java.net.InetAddress, int);
    <init>(byte[], int, int, java.net.SocketAddress);
    <init>(byte[], int, java.net.InetAddress, int);
    <init>(byte[], 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 void setReceivedLength(int);
    public synchronized void setSocketAddress(java.net.SocketAddress);


}

-keep class java.net.DatagramSocket {
    <init>();
    <init>(java.net.DatagramSocketImpl);
    <init>(java.net.SocketAddress);
    <init>(int);
    <init>(int, java.net.InetAddress);

    public synchronized void bind(java.net.SocketAddress);
    public void close();
    public void connect(java.net.InetAddress, int);
    public void connect(java.net.SocketAddress);
    public void disconnect();
    public synchronized boolean getBroadcast();
    public java.nio.channels.DatagramChannel getChannel();
    public java.io.FileDescriptor getFileDescriptor$();
    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 synchronized boolean getReuseAddress();
    public synchronized int getSendBufferSize();
    public synchronized int getSoTimeout();
    public synchronized 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 synchronized void setBroadcast(boolean);
    public static synchronized void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory);
    public synchronized void setReceiveBufferSize(int);
    public synchronized void setReuseAddress(boolean);
    public synchronized void setSendBufferSize(int);
    public synchronized void setSoTimeout(int);
    public synchronized 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 static void clearDnsCache();
    public boolean equals(java.lang.Object);
    public byte[] getAddress();
    public static java.net.InetAddress[] getAllByName(java.lang.String);
    public static java.net.InetAddress[] getAllByNameOnNet(java.lang.String, int);
    public static java.net.InetAddress getByAddress(java.lang.String, byte[]);
    public static java.net.InetAddress getByAddress(byte[]);
    public static java.net.InetAddress getByName(java.lang.String);
    public static java.net.InetAddress getByNameOnNet(java.lang.String, int);
    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 static boolean isNumeric(java.lang.String);
    public boolean isReachable(int);
    public boolean isReachable(java.net.NetworkInterface, int, int);
    public boolean isReachableByICMP(int);
    public boolean isSiteLocalAddress();
    public static java.net.InetAddress parseNumericAddress(java.lang.String);
    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.ProtocolFamily {

    public abstract java.lang.String name();


}

-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.io.FileDescriptor getFileDescriptor$();
    public java.net.SocketImpl getImpl();
    public java.net.InetAddress getInetAddress();
    public int getLocalPort();
    public java.net.SocketAddress getLocalSocketAddress();
    public synchronized 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 synchronized 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.net.SocketImpl);
    <init>(java.lang.String, int);
    <init>(java.net.InetAddress, int);
    <init>(java.lang.String, int, java.net.InetAddress, int);
    <init>(java.net.InetAddress, int, java.net.InetAddress, int);
    <init>(java.lang.String, int, boolean);
    <init>(java.net.InetAddress, int, boolean);

    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.io.FileDescriptor getFileDescriptor$();
    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>(java.lang.String);
    <init>();
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable);



}

-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);
    public java.io.FileDescriptor getFD$();
    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.SocketOption {

    public abstract java.lang.String name();
    public abstract java.lang.Class type();


}

-keep class java.net.URI {
    <init>(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, 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);

    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, java.lang.String, int, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler);
    <init>(java.lang.String);
    <init>(java.net.URL, java.lang.String);
    <init>(java.net.URL, 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 synchronized 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);
    public static 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 long getContentLengthLong();
    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 synchronized java.net.FileNameMap getFileNameMap();
    public java.lang.String getHeaderField(java.lang.String);
    public java.lang.String getHeaderField(int);
    public long getHeaderFieldDate(java.lang.String, long);
    public int getHeaderFieldInt(java.lang.String, int);
    public java.lang.String getHeaderFieldKey(int);
    public long getHeaderFieldLong(java.lang.String, long);
    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 synchronized 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, java.lang.String, 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);
    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>(java.lang.String);
    <init>();



}

-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 int getElementSizeShift();
    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();


}

-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 abstract byte get(int);
    public java.nio.ByteBuffer get(byte[], int, int);
    public java.nio.ByteBuffer get(byte[]);
    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 boolean isAccessible();
    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 abstract java.nio.ByteBuffer put(int, byte);
    public java.nio.ByteBuffer put(java.nio.ByteBuffer);
    public java.nio.ByteBuffer put(byte[], int, int);
    public java.nio.ByteBuffer put(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 void setAccessible(boolean);
    public abstract java.nio.ByteBuffer slice();
    public java.lang.String toString();
    public static java.nio.ByteBuffer wrap(byte[], int, int);
    public static java.nio.ByteBuffer wrap(byte[]);


}

-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(java.lang.CharSequence);
    public java.nio.CharBuffer append(java.lang.CharSequence, int, int);
    public java.nio.CharBuffer append(char);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public char[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.CharBuffer asReadOnlyBuffer();
    public char charAt(int);
    public java.util.stream.IntStream chars();
    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 abstract char get(int);
    public java.nio.CharBuffer get(char[], int, int);
    public java.nio.CharBuffer get(char[]);
    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 abstract java.nio.CharBuffer put(int, char);
    public java.nio.CharBuffer put(java.nio.CharBuffer);
    public java.nio.CharBuffer put(char[], int, int);
    public java.nio.CharBuffer put(char[]);
    public java.nio.CharBuffer put(java.lang.String, int, int);
    public java.nio.CharBuffer put(java.lang.String);
    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[], int, int);
    public static java.nio.CharBuffer wrap(char[]);
    public static java.nio.CharBuffer wrap(java.lang.CharSequence, int, int);
    public static java.nio.CharBuffer wrap(java.lang.CharSequence);


}

-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 abstract double get(int);
    public java.nio.DoubleBuffer get(double[], int, int);
    public java.nio.DoubleBuffer get(double[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.DoubleBuffer put(double);
    public abstract java.nio.DoubleBuffer put(int, double);
    public java.nio.DoubleBuffer put(java.nio.DoubleBuffer);
    public java.nio.DoubleBuffer put(double[], int, int);
    public java.nio.DoubleBuffer put(double[]);
    public abstract java.nio.DoubleBuffer slice();
    public java.lang.String toString();
    public static java.nio.DoubleBuffer wrap(double[], int, int);
    public static java.nio.DoubleBuffer wrap(double[]);


}

-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 abstract float get(int);
    public java.nio.FloatBuffer get(float[], int, int);
    public java.nio.FloatBuffer get(float[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.FloatBuffer put(float);
    public abstract java.nio.FloatBuffer put(int, float);
    public java.nio.FloatBuffer put(java.nio.FloatBuffer);
    public java.nio.FloatBuffer put(float[], int, int);
    public java.nio.FloatBuffer put(float[]);
    public abstract java.nio.FloatBuffer slice();
    public java.lang.String toString();
    public static java.nio.FloatBuffer wrap(float[], int, int);
    public static java.nio.FloatBuffer wrap(float[]);


}

-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 abstract int get(int);
    public java.nio.IntBuffer get(int[], int, int);
    public java.nio.IntBuffer 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 abstract java.nio.IntBuffer put(int, int);
    public java.nio.IntBuffer put(java.nio.IntBuffer);
    public java.nio.IntBuffer put(int[], int, int);
    public java.nio.IntBuffer put(int[]);
    public abstract java.nio.IntBuffer slice();
    public java.lang.String toString();
    public static java.nio.IntBuffer wrap(int[], int, int);
    public static java.nio.IntBuffer wrap(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 abstract long get(int);
    public java.nio.LongBuffer get(long[], int, int);
    public java.nio.LongBuffer get(long[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.LongBuffer put(long);
    public abstract java.nio.LongBuffer put(int, long);
    public java.nio.LongBuffer put(java.nio.LongBuffer);
    public java.nio.LongBuffer put(long[], int, int);
    public java.nio.LongBuffer put(long[]);
    public abstract java.nio.LongBuffer slice();
    public java.lang.String toString();
    public static java.nio.LongBuffer wrap(long[], int, int);
    public static java.nio.LongBuffer wrap(long[]);


}

-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 abstract short get(int);
    public java.nio.ShortBuffer get(short[], int, int);
    public java.nio.ShortBuffer get(short[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.ShortBuffer put(short);
    public abstract java.nio.ShortBuffer put(int, short);
    public java.nio.ShortBuffer put(java.nio.ShortBuffer);
    public java.nio.ShortBuffer put(short[], int, int);
    public java.nio.ShortBuffer put(short[]);
    public abstract java.nio.ShortBuffer slice();
    public java.lang.String toString();
    public static java.nio.ShortBuffer wrap(short[], int, int);
    public static java.nio.ShortBuffer wrap(short[]);


}

-keep class java.nio.channels.AsynchronousCloseException {
    <init>();



}

-keep class java.nio.channels.AsynchronousFileChannel {
    <init>();

    public abstract void force(boolean);
    public abstract void lock(long, long, boolean, java.lang.Object, java.nio.channels.CompletionHandler);
    public void lock(java.lang.Object, java.nio.channels.CompletionHandler);
    public abstract java.util.concurrent.Future lock(long, long, boolean);
    public java.util.concurrent.Future lock();
    public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute[]);
    public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption[]);
    public abstract void read(java.nio.ByteBuffer, long, java.lang.Object, java.nio.channels.CompletionHandler);
    public abstract java.util.concurrent.Future read(java.nio.ByteBuffer, long);
    public abstract long size();
    public abstract java.nio.channels.AsynchronousFileChannel truncate(long);
    public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
    public java.nio.channels.FileLock tryLock();
    public abstract void write(java.nio.ByteBuffer, long, java.lang.Object, java.nio.channels.CompletionHandler);
    public abstract java.util.concurrent.Future write(java.nio.ByteBuffer, long);


}

-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.CompletionHandler {

    public abstract void completed(java.lang.Object, java.lang.Object);
    public abstract void failed(java.lang.Throwable, java.lang.Object);


}

-keep class java.nio.channels.DatagramChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract java.nio.channels.DatagramChannel bind(java.net.SocketAddress);
    public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress);
    public abstract java.nio.channels.DatagramChannel disconnect();
    public abstract java.net.SocketAddress getLocalAddress();
    public abstract java.net.SocketAddress getRemoteAddress();
    public abstract boolean isConnected();
    public static java.nio.channels.DatagramChannel open();
    public static java.nio.channels.DatagramChannel open(java.net.ProtocolFamily);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public 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.nio.channels.DatagramChannel setOption(java.net.SocketOption, java.lang.Object);
    public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    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 long write(java.nio.ByteBuffer[]);


}

-keep class java.nio.channels.FileChannel {
    <init>();

    public abstract void force(boolean);
    public abstract java.nio.channels.FileLock lock(long, long, boolean);
    public java.nio.channels.FileLock lock();
    public abstract java.nio.MappedByteBuffer map(java.nio.channels.FileChannel$MapMode, long, long);
    public static java.nio.channels.FileChannel open(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
    public static java.nio.channels.FileChannel open(java.nio.file.Path, java.nio.file.OpenOption[]);
    public abstract long position();
    public abstract java.nio.channels.FileChannel position(long);
    public java.nio.channels.SeekableByteChannel position(long);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public long read(java.nio.ByteBuffer[]);
    public abstract int read(java.nio.ByteBuffer, long);
    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.SeekableByteChannel truncate(long);
    public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
    public java.nio.channels.FileLock tryLock();
    public abstract int write(java.nio.ByteBuffer);
    public abstract long write(java.nio.ByteBuffer[], int, int);
    public long write(java.nio.ByteBuffer[]);
    public abstract int write(java.nio.ByteBuffer, long);


}

-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);
    <init>(java.nio.channels.AsynchronousFileChannel, long, long, boolean);

    public java.nio.channels.Channel acquiredBy();
    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.NetworkChannel {

    public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract java.net.SocketAddress getLocalAddress();
    public abstract java.lang.Object getOption(java.net.SocketOption);
    public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    public abstract java.util.Set supportedOptions();


}

-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.SeekableByteChannel {

    public abstract long position();
    public abstract java.nio.channels.SeekableByteChannel position(long);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long size();
    public abstract java.nio.channels.SeekableByteChannel truncate(long);
    public abstract int write(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 abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);
    public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int);
    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(long);
    public abstract int select();
    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 java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress);
    public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int);
    public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract java.net.SocketAddress getLocalAddress();
    public static java.nio.channels.ServerSocketChannel open();
    public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, java.lang.Object);
    public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    public abstract java.net.ServerSocket socket();
    public int validOps();


}

-keep class java.nio.channels.SocketChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract java.nio.channels.SocketChannel bind(java.net.SocketAddress);
    public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract boolean connect(java.net.SocketAddress);
    public abstract boolean finishConnect();
    public abstract java.net.SocketAddress getLocalAddress();
    public abstract java.net.SocketAddress getRemoteAddress();
    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 long read(java.nio.ByteBuffer[]);
    public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, java.lang.Object);
    public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    public abstract java.nio.channels.SocketChannel shutdownInput();
    public abstract java.nio.channels.SocketChannel shutdownOutput();
    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 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 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 void implCloseChannel();
    protected abstract void implCloseSelectableChannel();
    protected abstract void implConfigureBlocking(boolean);
    public boolean isBlocking();
    public boolean isRegistered();
    public 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.DatagramChannel openDatagramChannel(java.net.ProtocolFamily);
    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 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 static java.nio.charset.Charset forNameUEE(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.charset.CoderResult decode(java.nio.ByteBuffer, java.nio.CharBuffer, boolean);
    public java.nio.CharBuffer decode(java.nio.ByteBuffer);
    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, byte[]);
    <init>(java.nio.charset.Charset, float, float);

    public float averageBytesPerChar();
    public boolean canEncode(char);
    public boolean canEncode(java.lang.CharSequence);
    public java.nio.charset.Charset charset();
    public java.nio.charset.CoderResult encode(java.nio.CharBuffer, java.nio.ByteBuffer, boolean);
    public java.nio.ByteBuffer encode(java.nio.CharBuffer);
    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 java.nio.charset.CoderResult malformedForLength(int);
    public void throwException();
    public java.lang.String toString();
    public static 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.file.AccessMode {

    public static java.nio.file.AccessMode valueOf(java.lang.String);
    public static java.nio.file.AccessMode[] values();

    public static java.nio.file.AccessMode EXECUTE;
    public static java.nio.file.AccessMode READ;
    public static java.nio.file.AccessMode WRITE;

}

-keep class java.nio.file.CopyOption {



}

-keep class java.nio.file.DirectoryStream {

    public abstract java.util.Iterator iterator();


}

-keep class java.nio.file.DirectoryStream$Filter {

    public abstract boolean accept(java.lang.Object);


}

-keep class java.nio.file.FileStore {
    <init>();

    public abstract java.lang.Object getAttribute(java.lang.String);
    public abstract java.nio.file.attribute.FileStoreAttributeView getFileStoreAttributeView(java.lang.Class);
    public abstract long getTotalSpace();
    public abstract long getUnallocatedSpace();
    public abstract long getUsableSpace();
    public abstract boolean isReadOnly();
    public abstract java.lang.String name();
    public abstract boolean supportsFileAttributeView(java.lang.Class);
    public abstract boolean supportsFileAttributeView(java.lang.String);
    public abstract java.lang.String type();


}

-keep class java.nio.file.FileSystem {
    <init>();

    public abstract void close();
    public abstract java.lang.Iterable getFileStores();
    public abstract java.nio.file.Path getPath(java.lang.String, java.lang.String[]);
    public abstract java.nio.file.PathMatcher getPathMatcher(java.lang.String);
    public abstract java.lang.Iterable getRootDirectories();
    public abstract java.lang.String getSeparator();
    public abstract java.nio.file.attribute.UserPrincipalLookupService getUserPrincipalLookupService();
    public abstract boolean isOpen();
    public abstract boolean isReadOnly();
    public abstract java.nio.file.WatchService newWatchService();
    public abstract java.nio.file.spi.FileSystemProvider provider();
    public abstract java.util.Set supportedFileAttributeViews();


}

-keep class java.nio.file.LinkOption {

    public static java.nio.file.LinkOption valueOf(java.lang.String);
    public static java.nio.file.LinkOption[] values();

    public static java.nio.file.LinkOption NOFOLLOW_LINKS;

}

-keep class java.nio.file.OpenOption {



}

-keep class java.nio.file.Path {

    public abstract int compareTo(java.nio.file.Path);
    public int compareTo(java.lang.Object);
    public abstract boolean endsWith(java.nio.file.Path);
    public abstract boolean endsWith(java.lang.String);
    public abstract boolean equals(java.lang.Object);
    public abstract java.nio.file.Path getFileName();
    public abstract java.nio.file.FileSystem getFileSystem();
    public abstract java.nio.file.Path getName(int);
    public abstract int getNameCount();
    public abstract java.nio.file.Path getParent();
    public abstract java.nio.file.Path getRoot();
    public abstract int hashCode();
    public abstract boolean isAbsolute();
    public abstract java.util.Iterator iterator();
    public abstract java.nio.file.Path normalize();
    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[], java.nio.file.WatchEvent$Modifier[]);
    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[]);
    public abstract java.nio.file.Path relativize(java.nio.file.Path);
    public abstract java.nio.file.Path resolve(java.nio.file.Path);
    public abstract java.nio.file.Path resolve(java.lang.String);
    public abstract java.nio.file.Path resolveSibling(java.nio.file.Path);
    public abstract java.nio.file.Path resolveSibling(java.lang.String);
    public abstract boolean startsWith(java.nio.file.Path);
    public abstract boolean startsWith(java.lang.String);
    public abstract java.nio.file.Path subpath(int, int);
    public abstract java.nio.file.Path toAbsolutePath();
    public abstract java.io.File toFile();
    public abstract java.nio.file.Path toRealPath(java.nio.file.LinkOption[]);
    public abstract java.lang.String toString();
    public abstract java.net.URI toUri();


}

-keep class java.nio.file.PathMatcher {

    public abstract boolean matches(java.nio.file.Path);


}

-keep class java.nio.file.WatchEvent {

    public abstract java.lang.Object context();
    public abstract int count();
    public abstract java.nio.file.WatchEvent$Kind kind();


}

-keep class java.nio.file.WatchEvent$Kind {

    public abstract java.lang.String name();
    public abstract java.lang.Class type();


}

-keep class java.nio.file.WatchEvent$Modifier {

    public abstract java.lang.String name();


}

-keep class java.nio.file.WatchKey {

    public abstract void cancel();
    public abstract boolean isValid();
    public abstract java.util.List pollEvents();
    public abstract boolean reset();
    public abstract java.nio.file.Watchable watchable();


}

-keep class java.nio.file.WatchService {

    public abstract void close();
    public abstract java.nio.file.WatchKey poll();
    public abstract java.nio.file.WatchKey poll(long, java.util.concurrent.TimeUnit);
    public abstract java.nio.file.WatchKey take();


}

-keep class java.nio.file.Watchable {

    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[], java.nio.file.WatchEvent$Modifier[]);
    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[]);


}

-keep class java.nio.file.attribute.BasicFileAttributes {

    public abstract java.nio.file.attribute.FileTime creationTime();
    public abstract java.lang.Object fileKey();
    public abstract boolean isDirectory();
    public abstract boolean isOther();
    public abstract boolean isRegularFile();
    public abstract boolean isSymbolicLink();
    public abstract java.nio.file.attribute.FileTime lastAccessTime();
    public abstract java.nio.file.attribute.FileTime lastModifiedTime();
    public abstract long size();


}

-keep class java.nio.file.attribute.FileAttribute {

    public abstract java.lang.String name();
    public abstract java.lang.Object value();


}

-keep class java.nio.file.attribute.FileAttributeView {



}

-keep class java.nio.file.attribute.FileStoreAttributeView {



}

-keep class java.nio.file.attribute.FileTime {

    public int compareTo(java.nio.file.attribute.FileTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.nio.file.attribute.FileTime from(long, java.util.concurrent.TimeUnit);
    public static java.nio.file.attribute.FileTime from(java.time.Instant);
    public static java.nio.file.attribute.FileTime fromMillis(long);
    public int hashCode();
    public long to(java.util.concurrent.TimeUnit);
    public java.time.Instant toInstant();
    public long toMillis();
    public java.lang.String toString();


}

-keep class java.nio.file.attribute.GroupPrincipal {



}

-keep class java.nio.file.attribute.UserPrincipal {



}

-keep class java.nio.file.attribute.UserPrincipalLookupService {
    <init>();

    public abstract java.nio.file.attribute.GroupPrincipal lookupPrincipalByGroupName(java.lang.String);
    public abstract java.nio.file.attribute.UserPrincipal lookupPrincipalByName(java.lang.String);


}

-keep class java.nio.file.spi.FileSystemProvider {
    <init>();

    public abstract void checkAccess(java.nio.file.Path, java.nio.file.AccessMode[]);
    public abstract void copy(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption[]);
    public abstract void createDirectory(java.nio.file.Path, java.nio.file.attribute.FileAttribute[]);
    public void createLink(java.nio.file.Path, java.nio.file.Path);
    public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute[]);
    public abstract void delete(java.nio.file.Path);
    public boolean deleteIfExists(java.nio.file.Path);
    public abstract java.nio.file.attribute.FileAttributeView getFileAttributeView(java.nio.file.Path, java.lang.Class, java.nio.file.LinkOption[]);
    public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path);
    public abstract java.nio.file.FileSystem getFileSystem(java.net.URI);
    public abstract java.nio.file.Path getPath(java.net.URI);
    public abstract java.lang.String getScheme();
    public static java.util.List installedProviders();
    public abstract boolean isHidden(java.nio.file.Path);
    public abstract boolean isSameFile(java.nio.file.Path, java.nio.file.Path);
    public abstract void move(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption[]);
    public java.nio.channels.AsynchronousFileChannel newAsynchronousFileChannel(java.nio.file.Path, java.util.Set, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute[]);
    public abstract java.nio.channels.SeekableByteChannel newByteChannel(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
    public abstract java.nio.file.DirectoryStream newDirectoryStream(java.nio.file.Path, java.nio.file.DirectoryStream$Filter);
    public java.nio.channels.FileChannel newFileChannel(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
    public abstract java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map);
    public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map);
    public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption[]);
    public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption[]);
    public abstract java.nio.file.attribute.BasicFileAttributes readAttributes(java.nio.file.Path, java.lang.Class, java.nio.file.LinkOption[]);
    public abstract java.util.Map readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption[]);
    public java.nio.file.Path readSymbolicLink(java.nio.file.Path);
    public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption[]);


}

-keep class java.security.AccessControlContext {
    <init>(java.security.ProtectionDomain[]);
    <init>(java.security.AccessControlContext, java.security.DomainCombiner);

    public void checkPermission(java.security.Permission);
    public java.security.DomainCombiner getDomainCombiner();


}

-keep class java.security.AccessControlException {
    <init>(java.lang.String);
    <init>(java.lang.String, java.security.Permission);

    public java.security.Permission getPermission();


}

-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.DomainCombiner {

    public abstract java.security.ProtectionDomain[] combine(java.security.ProtectionDomain[], java.security.ProtectionDomain[]);


}

-keep class java.security.GeneralSecurityException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.InvalidKeyException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.KeyException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.NoSuchAlgorithmException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.NoSuchProviderException {
    <init>();
    <init>(java.lang.String);



}

-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 boolean implies(javax.security.auth.Subject);
    public abstract java.lang.String toString();


}

-keep class java.security.PrivilegedAction {

    public abstract java.lang.Object run();


}

-keep class java.security.PrivilegedActionException {
    <init>(java.lang.Exception);

    public java.lang.Throwable getCause();
    public java.lang.Exception getException();
    public java.lang.String toString();


}

-keep class java.security.PrivilegedExceptionAction {

    public abstract java.lang.Object run();


}

-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.Provider {
    <init>(java.lang.String, double, java.lang.String);

    public synchronized void clear();
    public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    public java.util.Enumeration elements();
    public synchronized java.util.Set entrySet();
    public synchronized void forEach(java.util.function.BiConsumer);
    public java.lang.Object get(java.lang.Object);
    public java.lang.String getInfo();
    public java.lang.String getName();
    public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public java.lang.String getProperty(java.lang.String);
    public synchronized java.security.Provider$Service getService(java.lang.String, java.lang.String);
    public synchronized java.util.Set getServices();
    public double getVersion();
    public boolean isRegistered();
    public java.util.Set keySet();
    public java.util.Enumeration keys();
    public synchronized void load(java.io.InputStream);
    public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
    public synchronized void putAll(java.util.Map);
    public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    protected synchronized void putService(java.security.Provider$Service);
    public synchronized java.lang.Object remove(java.lang.Object);
    public synchronized boolean remove(java.lang.Object, java.lang.Object);
    protected synchronized void removeService(java.security.Provider$Service);
    public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
    public synchronized void replaceAll(java.util.function.BiFunction);
    public void setRegistered();
    public void setUnregistered();
    public java.lang.String toString();
    public java.util.Collection values();
    public synchronized void warmUpServiceProvision();


}

-keep class java.security.Provider$Service {
    <init>(java.security.Provider, java.lang.String, java.lang.String, java.lang.String, java.util.List, java.util.Map);

    public java.lang.String getAlgorithm();
    public java.lang.String getAttribute(java.lang.String);
    public java.lang.String getClassName();
    public java.security.Provider getProvider();
    public java.lang.String getType();
    public java.lang.Object newInstance(java.lang.Object);
    public boolean supportsParameter(java.lang.Object);
    public java.lang.String toString();


}

-keep class java.security.PublicKey {



    public static long serialVersionUID;
}

-keep class java.security.SignatureException {
    <init>();
    <init>(java.lang.String);
    <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.CRL {
    <init>(java.lang.String);

    public java.lang.String getType();
    public abstract boolean isRevoked(java.security.cert.Certificate);
    public abstract java.lang.String toString();


}

-keep class java.security.cert.CRLException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-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);
    public void verify(java.security.PublicKey, java.security.Provider);
    protected java.lang.Object writeReplace();


}

-keep class java.security.cert.CertificateEncodingException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.cert.CertificateException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.cert.CertificateFactory {
    <init>(java.security.cert.CertificateFactorySpi, java.security.Provider, java.lang.String);

    public java.security.cert.CRL generateCRL(java.io.InputStream);
    public java.util.Collection generateCRLs(java.io.InputStream);
    public java.security.cert.CertPath generateCertPath(java.io.InputStream);
    public java.security.cert.CertPath generateCertPath(java.io.InputStream, java.lang.String);
    public java.security.cert.CertPath generateCertPath(java.util.List);
    public java.security.cert.Certificate generateCertificate(java.io.InputStream);
    public java.util.Collection generateCertificates(java.io.InputStream);
    public java.util.Iterator getCertPathEncodings();
    public static java.security.cert.CertificateFactory getInstance(java.lang.String);
    public static java.security.cert.CertificateFactory getInstance(java.lang.String, java.lang.String);
    public static java.security.cert.CertificateFactory getInstance(java.lang.String, java.security.Provider);
    public java.security.Provider getProvider();
    public java.lang.String getType();


}

-keep class java.security.cert.CertificateFactorySpi {
    <init>();

    public abstract java.security.cert.CRL engineGenerateCRL(java.io.InputStream);
    public abstract java.util.Collection engineGenerateCRLs(java.io.InputStream);
    public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream);
    public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream, java.lang.String);
    public java.security.cert.CertPath engineGenerateCertPath(java.util.List);
    public abstract java.security.cert.Certificate engineGenerateCertificate(java.io.InputStream);
    public abstract java.util.Collection engineGenerateCertificates(java.io.InputStream);
    public java.util.Iterator engineGetCertPathEncodings();


}

-keep class java.text.AttributedCharacterIterator {

    public abstract java.util.Set getAllAttributeKeys();
    public abstract java.lang.Object getAttribute(java.text.AttributedCharacterIterator$Attribute);
    public abstract java.util.Map getAttributes();
    public abstract int getRunLimit();
    public abstract int getRunLimit(java.text.AttributedCharacterIterator$Attribute);
    public abstract int getRunLimit(java.util.Set);
    public abstract int getRunStart();
    public abstract int getRunStart(java.text.AttributedCharacterIterator$Attribute);
    public abstract int getRunStart(java.util.Set);


}

-keep class java.text.AttributedCharacterIterator$Attribute {
    <init>(java.lang.String);

    public boolean equals(java.lang.Object);
    protected java.lang.String getName();
    public int hashCode();
    protected java.lang.Object readResolve();
    public java.lang.String toString();


    public static java.text.AttributedCharacterIterator$Attribute INPUT_METHOD_SEGMENT;
    public static java.text.AttributedCharacterIterator$Attribute LANGUAGE;
    public static java.text.AttributedCharacterIterator$Attribute READING;
}

-keep class java.text.FieldPosition {
    <init>(int);
    <init>(java.text.Format$Field);
    <init>(java.text.Format$Field, int);

    public boolean equals(java.lang.Object);
    public int getBeginIndex();
    public int getEndIndex();
    public int getField();
    public java.text.Format$Field getFieldAttribute();
    public int hashCode();
    public void setBeginIndex(int);
    public void setEndIndex(int);
    public java.lang.String toString();


}

-keep class java.text.Format {
    <init>();

    public java.lang.Object clone();
    public java.lang.String format(java.lang.Object);
    public abstract java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
    public java.text.AttributedCharacterIterator formatToCharacterIterator(java.lang.Object);
    public abstract java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
    public java.lang.Object parseObject(java.lang.String);


}

-keep class java.text.Format$Field {
    <init>(java.lang.String);



}

-keep class java.text.ParseException {
    <init>(java.lang.String, int);

    public int getErrorOffset();


}

-keep class java.text.ParsePosition {
    <init>(int);

    public boolean equals(java.lang.Object);
    public int getErrorIndex();
    public int getIndex();
    public int hashCode();
    public void setErrorIndex(int);
    public void setIndex(int);
    public java.lang.String toString();


}

-keep class java.time.Clock {
    <init>();

    public boolean equals(java.lang.Object);
    public static java.time.Clock fixed(java.time.Instant, java.time.ZoneId);
    public abstract java.time.ZoneId getZone();
    public int hashCode();
    public abstract java.time.Instant instant();
    public long millis();
    public static java.time.Clock offset(java.time.Clock, java.time.Duration);
    public static java.time.Clock system(java.time.ZoneId);
    public static java.time.Clock systemDefaultZone();
    public static java.time.Clock systemUTC();
    public static java.time.Clock tick(java.time.Clock, java.time.Duration);
    public static java.time.Clock tickMinutes(java.time.ZoneId);
    public static java.time.Clock tickSeconds(java.time.ZoneId);
    public abstract java.time.Clock withZone(java.time.ZoneId);


}

-keep class java.time.DayOfWeek {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public static java.time.DayOfWeek from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public long getLong(java.time.temporal.TemporalField);
    public int getValue();
    public boolean isSupported(java.time.temporal.TemporalField);
    public java.time.DayOfWeek minus(long);
    public static java.time.DayOfWeek of(int);
    public java.time.DayOfWeek plus(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.time.DayOfWeek valueOf(java.lang.String);
    public static java.time.DayOfWeek[] values();

    public static java.time.DayOfWeek FRIDAY;
    public static java.time.DayOfWeek MONDAY;
    public static java.time.DayOfWeek SATURDAY;
    public static java.time.DayOfWeek SUNDAY;
    public static java.time.DayOfWeek THURSDAY;
    public static java.time.DayOfWeek TUESDAY;
    public static java.time.DayOfWeek WEDNESDAY;

}

-keep class java.time.Duration {

    public java.time.Duration abs();
    public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public static java.time.Duration between(java.time.temporal.Temporal, java.time.temporal.Temporal);
    public int compareTo(java.time.Duration);
    public int compareTo(java.lang.Object);
    public java.time.Duration dividedBy(long);
    public boolean equals(java.lang.Object);
    public static java.time.Duration from(java.time.temporal.TemporalAmount);
    public long get(java.time.temporal.TemporalUnit);
    public int getNano();
    public long getSeconds();
    public java.util.List getUnits();
    public int hashCode();
    public boolean isNegative();
    public boolean isZero();
    public java.time.Duration minus(java.time.Duration);
    public java.time.Duration minus(long, java.time.temporal.TemporalUnit);
    public java.time.Duration minusDays(long);
    public java.time.Duration minusHours(long);
    public java.time.Duration minusMillis(long);
    public java.time.Duration minusMinutes(long);
    public java.time.Duration minusNanos(long);
    public java.time.Duration minusSeconds(long);
    public java.time.Duration multipliedBy(long);
    public java.time.Duration negated();
    public static java.time.Duration of(long, java.time.temporal.TemporalUnit);
    public static java.time.Duration ofDays(long);
    public static java.time.Duration ofHours(long);
    public static java.time.Duration ofMillis(long);
    public static java.time.Duration ofMinutes(long);
    public static java.time.Duration ofNanos(long);
    public static java.time.Duration ofSeconds(long);
    public static java.time.Duration ofSeconds(long, long);
    public static java.time.Duration parse(java.lang.CharSequence);
    public java.time.Duration plus(java.time.Duration);
    public java.time.Duration plus(long, java.time.temporal.TemporalUnit);
    public java.time.Duration plusDays(long);
    public java.time.Duration plusHours(long);
    public java.time.Duration plusMillis(long);
    public java.time.Duration plusMinutes(long);
    public java.time.Duration plusNanos(long);
    public java.time.Duration plusSeconds(long);
    public java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
    public long toDays();
    public long toHours();
    public long toMillis();
    public long toMinutes();
    public long toNanos();
    public java.lang.String toString();
    public java.time.Duration withNanos(int);
    public java.time.Duration withSeconds(long);


    public static java.time.Duration ZERO;
}

-keep class java.time.Instant {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
    public java.time.ZonedDateTime atZone(java.time.ZoneId);
    public int compareTo(java.time.Instant);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.time.Instant from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public long getEpochSecond();
    public long getLong(java.time.temporal.TemporalField);
    public int getNano();
    public int hashCode();
    public boolean isAfter(java.time.Instant);
    public boolean isBefore(java.time.Instant);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.Instant minus(java.time.temporal.TemporalAmount);
    public java.time.Instant minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.Instant minusMillis(long);
    public java.time.Instant minusNanos(long);
    public java.time.Instant minusSeconds(long);
    public static java.time.Instant now();
    public static java.time.Instant now(java.time.Clock);
    public static java.time.Instant ofEpochMilli(long);
    public static java.time.Instant ofEpochSecond(long);
    public static java.time.Instant ofEpochSecond(long, long);
    public static java.time.Instant parse(java.lang.CharSequence);
    public java.time.Instant plus(java.time.temporal.TemporalAmount);
    public java.time.Instant plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.Instant plusMillis(long);
    public java.time.Instant plusNanos(long);
    public java.time.Instant plusSeconds(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public long toEpochMilli();
    public java.lang.String toString();
    public java.time.Instant truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.Instant with(java.time.temporal.TemporalAdjuster);
    public java.time.Instant with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);


    public static java.time.Instant EPOCH;
    public static java.time.Instant MAX;
    public static java.time.Instant MIN;
}

-keep class java.time.LocalDate {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.LocalDateTime atStartOfDay();
    public java.time.ZonedDateTime atStartOfDay(java.time.ZoneId);
    public java.time.LocalDateTime atTime(java.time.LocalTime);
    public java.time.LocalDateTime atTime(int, int);
    public java.time.LocalDateTime atTime(int, int, int);
    public java.time.LocalDateTime atTime(int, int, int, int);
    public java.time.OffsetDateTime atTime(java.time.OffsetTime);
    public java.time.chrono.ChronoLocalDateTime atTime(java.time.LocalTime);
    public int compareTo(java.time.chrono.ChronoLocalDate);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.LocalDate from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.time.chrono.IsoChronology getChronology();
    public java.time.chrono.Chronology getChronology();
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public java.time.chrono.Era getEra();
    public long getLong(java.time.temporal.TemporalField);
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getYear();
    public int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDate);
    public boolean isBefore(java.time.chrono.ChronoLocalDate);
    public boolean isEqual(java.time.chrono.ChronoLocalDate);
    public boolean isLeapYear();
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public int lengthOfMonth();
    public int lengthOfYear();
    public java.time.LocalDate minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate minusDays(long);
    public java.time.LocalDate minusMonths(long);
    public java.time.LocalDate minusWeeks(long);
    public java.time.LocalDate minusYears(long);
    public static java.time.LocalDate now();
    public static java.time.LocalDate now(java.time.ZoneId);
    public static java.time.LocalDate now(java.time.Clock);
    public static java.time.LocalDate of(int, java.time.Month, int);
    public static java.time.LocalDate of(int, int, int);
    public static java.time.LocalDate ofEpochDay(long);
    public static java.time.LocalDate ofYearDay(int, int);
    public static java.time.LocalDate parse(java.lang.CharSequence);
    public static java.time.LocalDate parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.LocalDate plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate plusDays(long);
    public java.time.LocalDate plusMonths(long);
    public java.time.LocalDate plusWeeks(long);
    public java.time.LocalDate plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public long toEpochDay();
    public java.lang.String toString();
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.Period until(java.time.chrono.ChronoLocalDate);
    public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
    public java.time.LocalDate with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDate with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDate withDayOfMonth(int);
    public java.time.LocalDate withDayOfYear(int);
    public java.time.LocalDate withMonth(int);
    public java.time.LocalDate withYear(int);


    public static java.time.LocalDate MAX;
    public static java.time.LocalDate MIN;
}

-keep class java.time.LocalDateTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
    public java.time.ZonedDateTime atZone(java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime atZone(java.time.ZoneId);
    public int compareTo(java.time.chrono.ChronoLocalDateTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.LocalDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getNano();
    public int getSecond();
    public int getYear();
    public int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDateTime);
    public boolean isBefore(java.time.chrono.ChronoLocalDateTime);
    public boolean isEqual(java.time.chrono.ChronoLocalDateTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.LocalDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime minusDays(long);
    public java.time.LocalDateTime minusHours(long);
    public java.time.LocalDateTime minusMinutes(long);
    public java.time.LocalDateTime minusMonths(long);
    public java.time.LocalDateTime minusNanos(long);
    public java.time.LocalDateTime minusSeconds(long);
    public java.time.LocalDateTime minusWeeks(long);
    public java.time.LocalDateTime minusYears(long);
    public static java.time.LocalDateTime now();
    public static java.time.LocalDateTime now(java.time.ZoneId);
    public static java.time.LocalDateTime now(java.time.Clock);
    public static java.time.LocalDateTime of(int, java.time.Month, int, int, int);
    public static java.time.LocalDateTime of(int, java.time.Month, int, int, int, int);
    public static java.time.LocalDateTime of(int, java.time.Month, int, int, int, int, int);
    public static java.time.LocalDateTime of(int, int, int, int, int);
    public static java.time.LocalDateTime of(int, int, int, int, int, int);
    public static java.time.LocalDateTime of(int, int, int, int, int, int, int);
    public static java.time.LocalDateTime of(java.time.LocalDate, java.time.LocalTime);
    public static java.time.LocalDateTime ofEpochSecond(long, int, java.time.ZoneOffset);
    public static java.time.LocalDateTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.LocalDateTime parse(java.lang.CharSequence);
    public static java.time.LocalDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.LocalDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime plusDays(long);
    public java.time.LocalDateTime plusHours(long);
    public java.time.LocalDateTime plusMinutes(long);
    public java.time.LocalDateTime plusMonths(long);
    public java.time.LocalDateTime plusNanos(long);
    public java.time.LocalDateTime plusSeconds(long);
    public java.time.LocalDateTime plusWeeks(long);
    public java.time.LocalDateTime plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.time.LocalDate toLocalDate();
    public java.time.chrono.ChronoLocalDate toLocalDate();
    public java.time.LocalTime toLocalTime();
    public java.lang.String toString();
    public java.time.LocalDateTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.LocalDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalField, long);
    public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDateTime withDayOfMonth(int);
    public java.time.LocalDateTime withDayOfYear(int);
    public java.time.LocalDateTime withHour(int);
    public java.time.LocalDateTime withMinute(int);
    public java.time.LocalDateTime withMonth(int);
    public java.time.LocalDateTime withNano(int);
    public java.time.LocalDateTime withSecond(int);
    public java.time.LocalDateTime withYear(int);


    public static java.time.LocalDateTime MAX;
    public static java.time.LocalDateTime MIN;
}

-keep class java.time.LocalTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.LocalDateTime atDate(java.time.LocalDate);
    public java.time.OffsetTime atOffset(java.time.ZoneOffset);
    public int compareTo(java.time.LocalTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.LocalTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public int getNano();
    public int getSecond();
    public int hashCode();
    public boolean isAfter(java.time.LocalTime);
    public boolean isBefore(java.time.LocalTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime minusHours(long);
    public java.time.LocalTime minusMinutes(long);
    public java.time.LocalTime minusNanos(long);
    public java.time.LocalTime minusSeconds(long);
    public static java.time.LocalTime now();
    public static java.time.LocalTime now(java.time.ZoneId);
    public static java.time.LocalTime now(java.time.Clock);
    public static java.time.LocalTime of(int, int);
    public static java.time.LocalTime of(int, int, int);
    public static java.time.LocalTime of(int, int, int, int);
    public static java.time.LocalTime ofNanoOfDay(long);
    public static java.time.LocalTime ofSecondOfDay(long);
    public static java.time.LocalTime parse(java.lang.CharSequence);
    public static java.time.LocalTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.LocalTime plus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime plusHours(long);
    public java.time.LocalTime plusMinutes(long);
    public java.time.LocalTime plusNanos(long);
    public java.time.LocalTime plusSeconds(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public long toNanoOfDay();
    public int toSecondOfDay();
    public java.lang.String toString();
    public java.time.LocalTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.LocalTime with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalTime withHour(int);
    public java.time.LocalTime withMinute(int);
    public java.time.LocalTime withNano(int);
    public java.time.LocalTime withSecond(int);


    public static java.time.LocalTime MAX;
    public static java.time.LocalTime MIDNIGHT;
    public static java.time.LocalTime MIN;
    public static java.time.LocalTime NOON;
}

-keep class java.time.Month {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public int firstDayOfYear(boolean);
    public java.time.Month firstMonthOfQuarter();
    public static java.time.Month from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public long getLong(java.time.temporal.TemporalField);
    public int getValue();
    public boolean isSupported(java.time.temporal.TemporalField);
    public int length(boolean);
    public int maxLength();
    public int minLength();
    public java.time.Month minus(long);
    public static java.time.Month of(int);
    public java.time.Month plus(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.time.Month valueOf(java.lang.String);
    public static java.time.Month[] values();

    public static java.time.Month APRIL;
    public static java.time.Month AUGUST;
    public static java.time.Month DECEMBER;
    public static java.time.Month FEBRUARY;
    public static java.time.Month JANUARY;
    public static java.time.Month JULY;
    public static java.time.Month JUNE;
    public static java.time.Month MARCH;
    public static java.time.Month MAY;
    public static java.time.Month NOVEMBER;
    public static java.time.Month OCTOBER;
    public static java.time.Month SEPTEMBER;

}

-keep class java.time.OffsetDateTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.ZonedDateTime atZoneSameInstant(java.time.ZoneId);
    public java.time.ZonedDateTime atZoneSimilarLocal(java.time.ZoneId);
    public int compareTo(java.time.OffsetDateTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.OffsetDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getNano();
    public java.time.ZoneOffset getOffset();
    public int getSecond();
    public int getYear();
    public int hashCode();
    public boolean isAfter(java.time.OffsetDateTime);
    public boolean isBefore(java.time.OffsetDateTime);
    public boolean isEqual(java.time.OffsetDateTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.OffsetDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime minusDays(long);
    public java.time.OffsetDateTime minusHours(long);
    public java.time.OffsetDateTime minusMinutes(long);
    public java.time.OffsetDateTime minusMonths(long);
    public java.time.OffsetDateTime minusNanos(long);
    public java.time.OffsetDateTime minusSeconds(long);
    public java.time.OffsetDateTime minusWeeks(long);
    public java.time.OffsetDateTime minusYears(long);
    public static java.time.OffsetDateTime now();
    public static java.time.OffsetDateTime now(java.time.ZoneId);
    public static java.time.OffsetDateTime now(java.time.Clock);
    public static java.time.OffsetDateTime of(java.time.LocalDate, java.time.LocalTime, java.time.ZoneOffset);
    public static java.time.OffsetDateTime of(java.time.LocalDateTime, java.time.ZoneOffset);
    public static java.time.OffsetDateTime of(int, int, int, int, int, int, int, java.time.ZoneOffset);
    public static java.time.OffsetDateTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.OffsetDateTime parse(java.lang.CharSequence);
    public static java.time.OffsetDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.OffsetDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime plusDays(long);
    public java.time.OffsetDateTime plusHours(long);
    public java.time.OffsetDateTime plusMinutes(long);
    public java.time.OffsetDateTime plusMonths(long);
    public java.time.OffsetDateTime plusNanos(long);
    public java.time.OffsetDateTime plusSeconds(long);
    public java.time.OffsetDateTime plusWeeks(long);
    public java.time.OffsetDateTime plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.util.Comparator timeLineOrder();
    public long toEpochSecond();
    public java.time.Instant toInstant();
    public java.time.LocalDate toLocalDate();
    public java.time.LocalDateTime toLocalDateTime();
    public java.time.LocalTime toLocalTime();
    public java.time.OffsetTime toOffsetTime();
    public java.lang.String toString();
    public java.time.ZonedDateTime toZonedDateTime();
    public java.time.OffsetDateTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.OffsetDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetDateTime withDayOfMonth(int);
    public java.time.OffsetDateTime withDayOfYear(int);
    public java.time.OffsetDateTime withHour(int);
    public java.time.OffsetDateTime withMinute(int);
    public java.time.OffsetDateTime withMonth(int);
    public java.time.OffsetDateTime withNano(int);
    public java.time.OffsetDateTime withOffsetSameInstant(java.time.ZoneOffset);
    public java.time.OffsetDateTime withOffsetSameLocal(java.time.ZoneOffset);
    public java.time.OffsetDateTime withSecond(int);
    public java.time.OffsetDateTime withYear(int);


    public static java.time.OffsetDateTime MAX;
    public static java.time.OffsetDateTime MIN;
}

-keep class java.time.OffsetTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.OffsetDateTime atDate(java.time.LocalDate);
    public int compareTo(java.time.OffsetTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.OffsetTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public int getNano();
    public java.time.ZoneOffset getOffset();
    public int getSecond();
    public int hashCode();
    public boolean isAfter(java.time.OffsetTime);
    public boolean isBefore(java.time.OffsetTime);
    public boolean isEqual(java.time.OffsetTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.OffsetTime minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime minusHours(long);
    public java.time.OffsetTime minusMinutes(long);
    public java.time.OffsetTime minusNanos(long);
    public java.time.OffsetTime minusSeconds(long);
    public static java.time.OffsetTime now();
    public static java.time.OffsetTime now(java.time.ZoneId);
    public static java.time.OffsetTime now(java.time.Clock);
    public static java.time.OffsetTime of(java.time.LocalTime, java.time.ZoneOffset);
    public static java.time.OffsetTime of(int, int, int, int, java.time.ZoneOffset);
    public static java.time.OffsetTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.OffsetTime parse(java.lang.CharSequence);
    public static java.time.OffsetTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.OffsetTime plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime plusHours(long);
    public java.time.OffsetTime plusMinutes(long);
    public java.time.OffsetTime plusNanos(long);
    public java.time.OffsetTime plusSeconds(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.time.LocalTime toLocalTime();
    public java.lang.String toString();
    public java.time.OffsetTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.OffsetTime with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetTime withHour(int);
    public java.time.OffsetTime withMinute(int);
    public java.time.OffsetTime withNano(int);
    public java.time.OffsetTime withOffsetSameInstant(java.time.ZoneOffset);
    public java.time.OffsetTime withOffsetSameLocal(java.time.ZoneOffset);
    public java.time.OffsetTime withSecond(int);


    public static java.time.OffsetTime MAX;
    public static java.time.OffsetTime MIN;
}

-keep class java.time.Period {

    public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public static java.time.Period between(java.time.LocalDate, java.time.LocalDate);
    public boolean equals(java.lang.Object);
    public static java.time.Period from(java.time.temporal.TemporalAmount);
    public long get(java.time.temporal.TemporalUnit);
    public java.time.chrono.IsoChronology getChronology();
    public java.time.chrono.Chronology getChronology();
    public int getDays();
    public int getMonths();
    public java.util.List getUnits();
    public int getYears();
    public int hashCode();
    public boolean isNegative();
    public boolean isZero();
    public java.time.Period minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
    public java.time.Period minusDays(long);
    public java.time.Period minusMonths(long);
    public java.time.Period minusYears(long);
    public java.time.Period multipliedBy(int);
    public java.time.chrono.ChronoPeriod multipliedBy(int);
    public java.time.Period negated();
    public java.time.chrono.ChronoPeriod negated();
    public java.time.Period normalized();
    public java.time.chrono.ChronoPeriod normalized();
    public static java.time.Period of(int, int, int);
    public static java.time.Period ofDays(int);
    public static java.time.Period ofMonths(int);
    public static java.time.Period ofWeeks(int);
    public static java.time.Period ofYears(int);
    public static java.time.Period parse(java.lang.CharSequence);
    public java.time.Period plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
    public java.time.Period plusDays(long);
    public java.time.Period plusMonths(long);
    public java.time.Period plusYears(long);
    public java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
    public java.lang.String toString();
    public long toTotalMonths();
    public java.time.Period withDays(int);
    public java.time.Period withMonths(int);
    public java.time.Period withYears(int);


    public static java.time.Period ZERO;
}

-keep class java.time.ZoneId {

    public boolean equals(java.lang.Object);
    public static java.time.ZoneId from(java.time.temporal.TemporalAccessor);
    public static java.util.Set getAvailableZoneIds();
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public abstract java.lang.String getId();
    public abstract java.time.zone.ZoneRules getRules();
    public int hashCode();
    public java.time.ZoneId normalized();
    public static java.time.ZoneId of(java.lang.String, java.util.Map);
    public static java.time.ZoneId of(java.lang.String);
    public static java.time.ZoneId ofOffset(java.lang.String, java.time.ZoneOffset);
    public static java.time.ZoneId systemDefault();
    public java.lang.String toString();


    public static java.util.Map SHORT_IDS;
}

-keep class java.time.ZoneOffset {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public int compareTo(java.time.ZoneOffset);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.time.ZoneOffset from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getId();
    public long getLong(java.time.temporal.TemporalField);
    public java.time.zone.ZoneRules getRules();
    public int getTotalSeconds();
    public int hashCode();
    public boolean isSupported(java.time.temporal.TemporalField);
    public static java.time.ZoneOffset of(java.lang.String);
    public static java.time.ZoneOffset ofHours(int);
    public static java.time.ZoneOffset ofHoursMinutes(int, int);
    public static java.time.ZoneOffset ofHoursMinutesSeconds(int, int, int);
    public static java.time.ZoneOffset ofTotalSeconds(int);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.lang.String toString();


    public static java.time.ZoneOffset MAX;
    public static java.time.ZoneOffset MIN;
    public static java.time.ZoneOffset UTC;
}

-keep class java.time.ZonedDateTime {

    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.ZonedDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getNano();
    public java.time.ZoneOffset getOffset();
    public int getSecond();
    public int getYear();
    public java.time.ZoneId getZone();
    public int hashCode();
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.ZonedDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoZonedDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime minusDays(long);
    public java.time.ZonedDateTime minusHours(long);
    public java.time.ZonedDateTime minusMinutes(long);
    public java.time.ZonedDateTime minusMonths(long);
    public java.time.ZonedDateTime minusNanos(long);
    public java.time.ZonedDateTime minusSeconds(long);
    public java.time.ZonedDateTime minusWeeks(long);
    public java.time.ZonedDateTime minusYears(long);
    public static java.time.ZonedDateTime now();
    public static java.time.ZonedDateTime now(java.time.ZoneId);
    public static java.time.ZonedDateTime now(java.time.Clock);
    public static java.time.ZonedDateTime of(java.time.LocalDate, java.time.LocalTime, java.time.ZoneId);
    public static java.time.ZonedDateTime of(java.time.LocalDateTime, java.time.ZoneId);
    public static java.time.ZonedDateTime of(int, int, int, int, int, int, int, java.time.ZoneId);
    public static java.time.ZonedDateTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.ZonedDateTime ofInstant(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
    public static java.time.ZonedDateTime ofLocal(java.time.LocalDateTime, java.time.ZoneId, java.time.ZoneOffset);
    public static java.time.ZonedDateTime ofStrict(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
    public static java.time.ZonedDateTime parse(java.lang.CharSequence);
    public static java.time.ZonedDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.ZonedDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoZonedDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime plusDays(long);
    public java.time.ZonedDateTime plusHours(long);
    public java.time.ZonedDateTime plusMinutes(long);
    public java.time.ZonedDateTime plusMonths(long);
    public java.time.ZonedDateTime plusNanos(long);
    public java.time.ZonedDateTime plusSeconds(long);
    public java.time.ZonedDateTime plusWeeks(long);
    public java.time.ZonedDateTime plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.time.LocalDate toLocalDate();
    public java.time.chrono.ChronoLocalDate toLocalDate();
    public java.time.LocalDateTime toLocalDateTime();
    public java.time.chrono.ChronoLocalDateTime toLocalDateTime();
    public java.time.LocalTime toLocalTime();
    public java.time.OffsetDateTime toOffsetDateTime();
    public java.lang.String toString();
    public java.time.ZonedDateTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.ZonedDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.ZonedDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalField, long);
    public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.ZonedDateTime withDayOfMonth(int);
    public java.time.ZonedDateTime withDayOfYear(int);
    public java.time.ZonedDateTime withEarlierOffsetAtOverlap();
    public java.time.chrono.ChronoZonedDateTime withEarlierOffsetAtOverlap();
    public java.time.ZonedDateTime withFixedOffsetZone();
    public java.time.ZonedDateTime withHour(int);
    public java.time.ZonedDateTime withLaterOffsetAtOverlap();
    public java.time.chrono.ChronoZonedDateTime withLaterOffsetAtOverlap();
    public java.time.ZonedDateTime withMinute(int);
    public java.time.ZonedDateTime withMonth(int);
    public java.time.ZonedDateTime withNano(int);
    public java.time.ZonedDateTime withSecond(int);
    public java.time.ZonedDateTime withYear(int);
    public java.time.ZonedDateTime withZoneSameInstant(java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime withZoneSameInstant(java.time.ZoneId);
    public java.time.ZonedDateTime withZoneSameLocal(java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime withZoneSameLocal(java.time.ZoneId);


}

-keep class java.time.chrono.AbstractChronology {
    <init>();

    public int compareTo(java.time.chrono.Chronology);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public java.lang.String toString();


}

-keep class java.time.chrono.ChronoLocalDate {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.chrono.ChronoLocalDateTime atTime(java.time.LocalTime);
    public int compareTo(java.time.chrono.ChronoLocalDate);
    public int compareTo(java.lang.Object);
    public abstract boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.chrono.ChronoLocalDate from(java.time.temporal.TemporalAccessor);
    public abstract java.time.chrono.Chronology getChronology();
    public java.time.chrono.Era getEra();
    public abstract int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDate);
    public boolean isBefore(java.time.chrono.ChronoLocalDate);
    public boolean isEqual(java.time.chrono.ChronoLocalDate);
    public boolean isLeapYear();
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public abstract int lengthOfMonth();
    public int lengthOfYear();
    public java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public static java.util.Comparator timeLineOrder();
    public long toEpochDay();
    public abstract java.lang.String toString();
    public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public abstract java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);


}

-keep class java.time.chrono.ChronoLocalDateTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public abstract java.time.chrono.ChronoZonedDateTime atZone(java.time.ZoneId);
    public int compareTo(java.time.chrono.ChronoLocalDateTime);
    public int compareTo(java.lang.Object);
    public abstract boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.chrono.ChronoLocalDateTime from(java.time.temporal.TemporalAccessor);
    public java.time.chrono.Chronology getChronology();
    public abstract int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDateTime);
    public boolean isBefore(java.time.chrono.ChronoLocalDateTime);
    public boolean isEqual(java.time.chrono.ChronoLocalDateTime);
    public abstract boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime plus(java.time.temporal.TemporalAmount);
    public abstract java.time.chrono.ChronoLocalDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public static java.util.Comparator timeLineOrder();
    public long toEpochSecond(java.time.ZoneOffset);
    public java.time.Instant toInstant(java.time.ZoneOffset);
    public abstract java.time.chrono.ChronoLocalDate toLocalDate();
    public abstract java.time.LocalTime toLocalTime();
    public abstract java.lang.String toString();
    public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);


}

-keep class java.time.chrono.ChronoPeriod {

    public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public static java.time.chrono.ChronoPeriod between(java.time.chrono.ChronoLocalDate, java.time.chrono.ChronoLocalDate);
    public abstract boolean equals(java.lang.Object);
    public abstract long get(java.time.temporal.TemporalUnit);
    public abstract java.time.chrono.Chronology getChronology();
    public abstract java.util.List getUnits();
    public abstract int hashCode();
    public boolean isNegative();
    public boolean isZero();
    public abstract java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
    public abstract java.time.chrono.ChronoPeriod multipliedBy(int);
    public java.time.chrono.ChronoPeriod negated();
    public abstract java.time.chrono.ChronoPeriod normalized();
    public abstract java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
    public abstract java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
    public abstract java.lang.String toString();


}

-keep class java.time.chrono.ChronoZonedDateTime {

    public int compareTo(java.time.chrono.ChronoZonedDateTime);
    public int compareTo(java.lang.Object);
    public abstract boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.chrono.ChronoZonedDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.time.chrono.Chronology getChronology();
    public long getLong(java.time.temporal.TemporalField);
    public abstract java.time.ZoneOffset getOffset();
    public abstract java.time.ZoneId getZone();
    public abstract int hashCode();
    public boolean isAfter(java.time.chrono.ChronoZonedDateTime);
    public boolean isBefore(java.time.chrono.ChronoZonedDateTime);
    public boolean isEqual(java.time.chrono.ChronoZonedDateTime);
    public abstract boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoZonedDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime plus(java.time.temporal.TemporalAmount);
    public abstract java.time.chrono.ChronoZonedDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.util.Comparator timeLineOrder();
    public long toEpochSecond();
    public java.time.Instant toInstant();
    public java.time.chrono.ChronoLocalDate toLocalDate();
    public abstract java.time.chrono.ChronoLocalDateTime toLocalDateTime();
    public java.time.LocalTime toLocalTime();
    public abstract java.lang.String toString();
    public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.chrono.ChronoZonedDateTime withEarlierOffsetAtOverlap();
    public abstract java.time.chrono.ChronoZonedDateTime withLaterOffsetAtOverlap();
    public abstract java.time.chrono.ChronoZonedDateTime withZoneSameInstant(java.time.ZoneId);
    public abstract java.time.chrono.ChronoZonedDateTime withZoneSameLocal(java.time.ZoneId);


}

-keep class java.time.chrono.Chronology {

    public abstract int compareTo(java.time.chrono.Chronology);
    public int compareTo(java.lang.Object);
    public java.time.chrono.ChronoLocalDate date(java.time.chrono.Era, int, int, int);
    public abstract java.time.chrono.ChronoLocalDate date(int, int, int);
    public abstract java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
    public abstract java.time.chrono.ChronoLocalDate dateEpochDay(long);
    public java.time.chrono.ChronoLocalDate dateNow();
    public java.time.chrono.ChronoLocalDate dateNow(java.time.ZoneId);
    public java.time.chrono.ChronoLocalDate dateNow(java.time.Clock);
    public java.time.chrono.ChronoLocalDate dateYearDay(java.time.chrono.Era, int, int);
    public abstract java.time.chrono.ChronoLocalDate dateYearDay(int, int);
    public abstract boolean equals(java.lang.Object);
    public abstract java.time.chrono.Era eraOf(int);
    public abstract java.util.List eras();
    public static java.time.chrono.Chronology from(java.time.temporal.TemporalAccessor);
    public static java.util.Set getAvailableChronologies();
    public abstract java.lang.String getCalendarType();
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public abstract java.lang.String getId();
    public abstract int hashCode();
    public abstract boolean isLeapYear(long);
    public java.time.chrono.ChronoLocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
    public static java.time.chrono.Chronology of(java.lang.String);
    public static java.time.chrono.Chronology ofLocale(java.util.Locale);
    public java.time.chrono.ChronoPeriod period(int, int, int);
    public abstract int prolepticYear(java.time.chrono.Era, int);
    public abstract java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
    public abstract java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public abstract java.lang.String toString();
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);


}

-keep class java.time.chrono.Era {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public long getLong(java.time.temporal.TemporalField);
    public abstract int getValue();
    public boolean isSupported(java.time.temporal.TemporalField);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);


}

-keep class java.time.chrono.IsoChronology {

    public java.time.LocalDate date(java.time.chrono.Era, int, int, int);
    public java.time.LocalDate date(int, int, int);
    public java.time.LocalDate date(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoLocalDate date(int, int, int);
    public java.time.chrono.ChronoLocalDate date(java.time.chrono.Era, int, int, int);
    public java.time.LocalDate dateEpochDay(long);
    public java.time.chrono.ChronoLocalDate dateEpochDay(long);
    public java.time.LocalDate dateNow();
    public java.time.LocalDate dateNow(java.time.ZoneId);
    public java.time.LocalDate dateNow(java.time.Clock);
    public java.time.chrono.ChronoLocalDate dateNow(java.time.Clock);
    public java.time.chrono.ChronoLocalDate dateNow(java.time.ZoneId);
    public java.time.chrono.ChronoLocalDate dateNow();
    public java.time.LocalDate dateYearDay(java.time.chrono.Era, int, int);
    public java.time.LocalDate dateYearDay(int, int);
    public java.time.chrono.ChronoLocalDate dateYearDay(int, int);
    public java.time.chrono.ChronoLocalDate dateYearDay(java.time.chrono.Era, int, int);
    public java.time.chrono.IsoEra eraOf(int);
    public java.time.chrono.Era eraOf(int);
    public java.util.List eras();
    public java.lang.String getCalendarType();
    public java.lang.String getId();
    public boolean isLeapYear(long);
    public java.time.LocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoLocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
    public java.time.Period period(int, int, int);
    public java.time.chrono.ChronoPeriod period(int, int, int);
    public int prolepticYear(java.time.chrono.Era, int);
    public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
    public java.time.LocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public java.time.ZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
    public java.time.ZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);


    public static java.time.chrono.IsoChronology INSTANCE;
}

-keep class java.time.chrono.IsoEra {

    public int getValue();
    public static java.time.chrono.IsoEra of(int);
    public static java.time.chrono.IsoEra valueOf(java.lang.String);
    public static java.time.chrono.IsoEra[] values();

    public static java.time.chrono.IsoEra BCE;
    public static java.time.chrono.IsoEra CE;

}

-keep class java.time.format.DateTimeFormatter {

    public java.lang.String format(java.time.temporal.TemporalAccessor);
    public void formatTo(java.time.temporal.TemporalAccessor, java.lang.Appendable);
    public java.time.chrono.Chronology getChronology();
    public java.time.format.DecimalStyle getDecimalStyle();
    public java.util.Locale getLocale();
    public java.util.Set getResolverFields();
    public java.time.format.ResolverStyle getResolverStyle();
    public java.time.ZoneId getZone();
    public static java.time.format.DateTimeFormatter ofLocalizedDate(java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle, java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofLocalizedTime(java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofPattern(java.lang.String);
    public static java.time.format.DateTimeFormatter ofPattern(java.lang.String, java.util.Locale);
    public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence);
    public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence, java.text.ParsePosition);
    public java.lang.Object parse(java.lang.CharSequence, java.time.temporal.TemporalQuery);
    public java.time.temporal.TemporalAccessor parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery[]);
    public java.time.temporal.TemporalAccessor parseUnresolved(java.lang.CharSequence, java.text.ParsePosition);
    public static java.time.temporal.TemporalQuery parsedExcessDays();
    public static java.time.temporal.TemporalQuery parsedLeapSecond();
    public java.text.Format toFormat();
    public java.text.Format toFormat(java.time.temporal.TemporalQuery);
    public java.lang.String toString();
    public java.time.format.DateTimeFormatter withChronology(java.time.chrono.Chronology);
    public java.time.format.DateTimeFormatter withDecimalStyle(java.time.format.DecimalStyle);
    public java.time.format.DateTimeFormatter withLocale(java.util.Locale);
    public java.time.format.DateTimeFormatter withResolverFields(java.time.temporal.TemporalField[]);
    public java.time.format.DateTimeFormatter withResolverFields(java.util.Set);
    public java.time.format.DateTimeFormatter withResolverStyle(java.time.format.ResolverStyle);
    public java.time.format.DateTimeFormatter withZone(java.time.ZoneId);


    public static java.time.format.DateTimeFormatter BASIC_ISO_DATE;
    public static java.time.format.DateTimeFormatter ISO_DATE;
    public static java.time.format.DateTimeFormatter ISO_DATE_TIME;
    public static java.time.format.DateTimeFormatter ISO_INSTANT;
    public static java.time.format.DateTimeFormatter ISO_LOCAL_DATE;
    public static java.time.format.DateTimeFormatter ISO_LOCAL_DATE_TIME;
    public static java.time.format.DateTimeFormatter ISO_LOCAL_TIME;
    public static java.time.format.DateTimeFormatter ISO_OFFSET_DATE;
    public static java.time.format.DateTimeFormatter ISO_OFFSET_DATE_TIME;
    public static java.time.format.DateTimeFormatter ISO_OFFSET_TIME;
    public static java.time.format.DateTimeFormatter ISO_ORDINAL_DATE;
    public static java.time.format.DateTimeFormatter ISO_TIME;
    public static java.time.format.DateTimeFormatter ISO_WEEK_DATE;
    public static java.time.format.DateTimeFormatter ISO_ZONED_DATE_TIME;
    public static java.time.format.DateTimeFormatter RFC_1123_DATE_TIME;
}

-keep class java.time.format.DecimalStyle {

    public boolean equals(java.lang.Object);
    public static java.util.Set getAvailableLocales();
    public char getDecimalSeparator();
    public char getNegativeSign();
    public char getPositiveSign();
    public char getZeroDigit();
    public int hashCode();
    public static java.time.format.DecimalStyle of(java.util.Locale);
    public static java.time.format.DecimalStyle ofDefaultLocale();
    public java.lang.String toString();
    public java.time.format.DecimalStyle withDecimalSeparator(char);
    public java.time.format.DecimalStyle withNegativeSign(char);
    public java.time.format.DecimalStyle withPositiveSign(char);
    public java.time.format.DecimalStyle withZeroDigit(char);


    public static java.time.format.DecimalStyle STANDARD;
}

-keep class java.time.format.FormatStyle {

    public static java.time.format.FormatStyle valueOf(java.lang.String);
    public static java.time.format.FormatStyle[] values();

    public static java.time.format.FormatStyle FULL;
    public static java.time.format.FormatStyle LONG;
    public static java.time.format.FormatStyle MEDIUM;
    public static java.time.format.FormatStyle SHORT;

}

-keep class java.time.format.ResolverStyle {

    public static java.time.format.ResolverStyle valueOf(java.lang.String);
    public static java.time.format.ResolverStyle[] values();

    public static java.time.format.ResolverStyle LENIENT;
    public static java.time.format.ResolverStyle SMART;
    public static java.time.format.ResolverStyle STRICT;

}

-keep class java.time.format.TextStyle {

    public java.time.format.TextStyle asNormal();
    public java.time.format.TextStyle asStandalone();
    public boolean isStandalone();
    public static java.time.format.TextStyle valueOf(java.lang.String);
    public static java.time.format.TextStyle[] values();

    public static java.time.format.TextStyle FULL;
    public static java.time.format.TextStyle FULL_STANDALONE;
    public static java.time.format.TextStyle NARROW;
    public static java.time.format.TextStyle NARROW_STANDALONE;
    public static java.time.format.TextStyle SHORT;
    public static java.time.format.TextStyle SHORT_STANDALONE;

}

-keep class java.time.temporal.ChronoField {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal, long);
    public int checkValidIntValue(long);
    public long checkValidValue(long);
    public java.time.temporal.TemporalUnit getBaseUnit();
    public java.lang.String getDisplayName(java.util.Locale);
    public long getFrom(java.time.temporal.TemporalAccessor);
    public java.time.temporal.TemporalUnit getRangeUnit();
    public boolean isDateBased();
    public boolean isSupportedBy(java.time.temporal.TemporalAccessor);
    public boolean isTimeBased();
    public java.time.temporal.ValueRange range();
    public java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
    public java.lang.String toString();
    public static java.time.temporal.ChronoField valueOf(java.lang.String);
    public static java.time.temporal.ChronoField[] values();

    public static java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_MONTH;
    public static java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_YEAR;
    public static java.time.temporal.ChronoField ALIGNED_WEEK_OF_MONTH;
    public static java.time.temporal.ChronoField ALIGNED_WEEK_OF_YEAR;
    public static java.time.temporal.ChronoField AMPM_OF_DAY;
    public static java.time.temporal.ChronoField CLOCK_HOUR_OF_AMPM;
    public static java.time.temporal.ChronoField CLOCK_HOUR_OF_DAY;
    public static java.time.temporal.ChronoField DAY_OF_MONTH;
    public static java.time.temporal.ChronoField DAY_OF_WEEK;
    public static java.time.temporal.ChronoField DAY_OF_YEAR;
    public static java.time.temporal.ChronoField EPOCH_DAY;
    public static java.time.temporal.ChronoField ERA;
    public static java.time.temporal.ChronoField HOUR_OF_AMPM;
    public static java.time.temporal.ChronoField HOUR_OF_DAY;
    public static java.time.temporal.ChronoField INSTANT_SECONDS;
    public static java.time.temporal.ChronoField MICRO_OF_DAY;
    public static java.time.temporal.ChronoField MICRO_OF_SECOND;
    public static java.time.temporal.ChronoField MILLI_OF_DAY;
    public static java.time.temporal.ChronoField MILLI_OF_SECOND;
    public static java.time.temporal.ChronoField MINUTE_OF_DAY;
    public static java.time.temporal.ChronoField MINUTE_OF_HOUR;
    public static java.time.temporal.ChronoField MONTH_OF_YEAR;
    public static java.time.temporal.ChronoField NANO_OF_DAY;
    public static java.time.temporal.ChronoField NANO_OF_SECOND;
    public static java.time.temporal.ChronoField OFFSET_SECONDS;
    public static java.time.temporal.ChronoField PROLEPTIC_MONTH;
    public static java.time.temporal.ChronoField SECOND_OF_DAY;
    public static java.time.temporal.ChronoField SECOND_OF_MINUTE;
    public static java.time.temporal.ChronoField YEAR;
    public static java.time.temporal.ChronoField YEAR_OF_ERA;

}

-keep class java.time.temporal.Temporal {

    public abstract boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public abstract java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);


}

-keep class java.time.temporal.TemporalAccessor {

    public int get(java.time.temporal.TemporalField);
    public abstract long getLong(java.time.temporal.TemporalField);
    public abstract boolean isSupported(java.time.temporal.TemporalField);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);


}

-keep class java.time.temporal.TemporalAdjuster {

    public abstract java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);


}

-keep class java.time.temporal.TemporalAmount {

    public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public abstract long get(java.time.temporal.TemporalUnit);
    public abstract java.util.List getUnits();
    public abstract java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);


}

-keep class java.time.temporal.TemporalField {

    public abstract java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal, long);
    public abstract java.time.temporal.TemporalUnit getBaseUnit();
    public java.lang.String getDisplayName(java.util.Locale);
    public abstract long getFrom(java.time.temporal.TemporalAccessor);
    public abstract java.time.temporal.TemporalUnit getRangeUnit();
    public abstract boolean isDateBased();
    public abstract boolean isSupportedBy(java.time.temporal.TemporalAccessor);
    public abstract boolean isTimeBased();
    public abstract java.time.temporal.ValueRange range();
    public abstract java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
    public java.time.temporal.TemporalAccessor resolve(java.util.Map, java.time.temporal.TemporalAccessor, java.time.format.ResolverStyle);
    public abstract java.lang.String toString();


}

-keep class java.time.temporal.TemporalQuery {

    public abstract java.lang.Object queryFrom(java.time.temporal.TemporalAccessor);


}

-keep class java.time.temporal.TemporalUnit {

    public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal, long);
    public abstract long between(java.time.temporal.Temporal, java.time.temporal.Temporal);
    public abstract java.time.Duration getDuration();
    public abstract boolean isDateBased();
    public abstract boolean isDurationEstimated();
    public boolean isSupportedBy(java.time.temporal.Temporal);
    public abstract boolean isTimeBased();
    public abstract java.lang.String toString();


}

-keep class java.time.temporal.ValueRange {

    public int checkValidIntValue(long, java.time.temporal.TemporalField);
    public long checkValidValue(long, java.time.temporal.TemporalField);
    public boolean equals(java.lang.Object);
    public long getLargestMinimum();
    public long getMaximum();
    public long getMinimum();
    public long getSmallestMaximum();
    public int hashCode();
    public boolean isFixed();
    public boolean isIntValue();
    public boolean isValidIntValue(long);
    public boolean isValidValue(long);
    public static java.time.temporal.ValueRange of(long, long);
    public static java.time.temporal.ValueRange of(long, long, long);
    public static java.time.temporal.ValueRange of(long, long, long, long);
    public java.lang.String toString();


}

-keep class java.time.zone.ZoneOffsetTransition {

    public int compareTo(java.time.zone.ZoneOffsetTransition);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.time.LocalDateTime getDateTimeAfter();
    public java.time.LocalDateTime getDateTimeBefore();
    public java.time.Duration getDuration();
    public java.time.Instant getInstant();
    public java.time.ZoneOffset getOffsetAfter();
    public java.time.ZoneOffset getOffsetBefore();
    public int hashCode();
    public boolean isGap();
    public boolean isOverlap();
    public boolean isValidOffset(java.time.ZoneOffset);
    public static java.time.zone.ZoneOffsetTransition of(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneOffset);
    public long toEpochSecond();
    public java.lang.String toString();


}

-keep class java.time.zone.ZoneOffsetTransitionRule {

    public java.time.zone.ZoneOffsetTransition createTransition(int);
    public boolean equals(java.lang.Object);
    public int getDayOfMonthIndicator();
    public java.time.DayOfWeek getDayOfWeek();
    public java.time.LocalTime getLocalTime();
    public java.time.Month getMonth();
    public java.time.ZoneOffset getOffsetAfter();
    public java.time.ZoneOffset getOffsetBefore();
    public java.time.ZoneOffset getStandardOffset();
    public java.time.zone.ZoneOffsetTransitionRule$TimeDefinition getTimeDefinition();
    public int hashCode();
    public boolean isMidnightEndOfDay();
    public static java.time.zone.ZoneOffsetTransitionRule of(java.time.Month, int, java.time.DayOfWeek, java.time.LocalTime, boolean, java.time.zone.ZoneOffsetTransitionRule$TimeDefinition, java.time.ZoneOffset, java.time.ZoneOffset, java.time.ZoneOffset);
    public java.lang.String toString();


}

-keep class java.time.zone.ZoneOffsetTransitionRule$TimeDefinition {

    public java.time.LocalDateTime createDateTime(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneOffset);
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition valueOf(java.lang.String);
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition[] values();

    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition STANDARD;
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition UTC;
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition WALL;

}

-keep class java.time.zone.ZoneRules {

    public boolean equals(java.lang.Object);
    public java.time.Duration getDaylightSavings(java.time.Instant);
    public java.time.ZoneOffset getOffset(java.time.Instant);
    public java.time.ZoneOffset getOffset(java.time.LocalDateTime);
    public java.time.ZoneOffset getStandardOffset(java.time.Instant);
    public java.time.zone.ZoneOffsetTransition getTransition(java.time.LocalDateTime);
    public java.util.List getTransitionRules();
    public java.util.List getTransitions();
    public java.util.List getValidOffsets(java.time.LocalDateTime);
    public int hashCode();
    public boolean isDaylightSavings(java.time.Instant);
    public boolean isFixedOffset();
    public boolean isValidOffset(java.time.LocalDateTime, java.time.ZoneOffset);
    public java.time.zone.ZoneOffsetTransition nextTransition(java.time.Instant);
    public static java.time.zone.ZoneRules of(java.time.ZoneOffset, java.time.ZoneOffset, java.util.List, java.util.List, java.util.List);
    public static java.time.zone.ZoneRules of(java.time.ZoneOffset);
    public java.time.zone.ZoneOffsetTransition previousTransition(java.time.Instant);
    public java.lang.String toString();


}

-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 boolean add(java.lang.Object);
    public void add(int, 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 void forEach(java.util.function.Consumer);
    public java.lang.Object get(int);
    public int indexOf(java.lang.Object);
    public boolean isEmpty();
    public java.util.Iterator iterator();
    public int lastIndexOf(java.lang.Object);
    public java.util.ListIterator listIterator(int);
    public java.util.ListIterator listIterator();
    public java.lang.Object remove(int);
    public boolean remove(java.lang.Object);
    public boolean removeAll(java.util.Collection);
    public boolean removeIf(java.util.function.Predicate);
    protected void removeRange(int, int);
    public void replaceAll(java.util.function.UnaryOperator);
    public boolean retainAll(java.util.Collection);
    public java.lang.Object set(int, java.lang.Object);
    public int size();
    public void sort(java.util.Comparator);
    public java.util.Spliterator spliterator();
    public java.util.List subList(int, int);
    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 java.util.stream.Stream parallelStream();
    public abstract boolean remove(java.lang.Object);
    public abstract boolean removeAll(java.util.Collection);
    public boolean removeIf(java.util.function.Predicate);
    public abstract boolean retainAll(java.util.Collection);
    public abstract int size();
    public java.util.Spliterator spliterator();
    public java.util.stream.Stream stream();
    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 static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator);
    public static java.util.Comparator comparing(java.util.function.Function);
    public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction);
    public static java.util.Comparator comparingInt(java.util.function.ToIntFunction);
    public static java.util.Comparator comparingLong(java.util.function.ToLongFunction);
    public abstract boolean equals(java.lang.Object);
    public static java.util.Comparator naturalOrder();
    public static java.util.Comparator nullsFirst(java.util.Comparator);
    public static java.util.Comparator nullsLast(java.util.Comparator);
    public static java.util.Comparator reverseOrder();
    public java.util.Comparator reversed();
    public java.util.Comparator thenComparing(java.util.Comparator);
    public java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator);
    public java.util.Comparator thenComparing(java.util.function.Function);
    public java.util.Comparator thenComparingDouble(java.util.function.ToDoubleFunction);
    public java.util.Comparator thenComparingInt(java.util.function.ToIntFunction);
    public java.util.Comparator thenComparingLong(java.util.function.ToLongFunction);


}

-keep class java.util.Date {
    <init>();
    <init>(long);
    <init>(int, int, int);
    <init>(int, int, int, int, int);
    <init>(int, int, int, int, int, int);
    <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 static java.util.Date from(java.time.Instant);
    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.time.Instant toInstant();
    public java.lang.String toLocaleString();
    public java.lang.String toString();


}

-keep class java.util.Dictionary {
    <init>();

    public abstract java.util.Enumeration elements();
    public abstract java.lang.Object get(java.lang.Object);
    public abstract boolean isEmpty();
    public abstract java.util.Enumeration keys();
    public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
    public abstract java.lang.Object remove(java.lang.Object);
    public abstract int size();


}

-keep class java.util.DoubleSummaryStatistics {
    <init>();

    public void accept(double);
    public void combine(java.util.DoubleSummaryStatistics);
    public double getAverage();
    public long getCount();
    public double getMax();
    public double getMin();
    public double getSum();
    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>(int, float);
    <init>(int);
    <init>();
    <init>(java.util.Map);

    public void clear();
    public java.lang.Object clone();
    public java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    public boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public java.util.Set entrySet();
    public void forEach(java.util.function.BiConsumer);
    public java.lang.Object get(java.lang.Object);
    public java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public boolean isEmpty();
    public java.util.Set keySet();
    public java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public java.lang.Object put(java.lang.Object, java.lang.Object);
    public void putAll(java.util.Map);
    public java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    public java.lang.Object remove(java.lang.Object);
    public boolean remove(java.lang.Object, java.lang.Object);
    public boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public java.lang.Object replace(java.lang.Object, java.lang.Object);
    public void replaceAll(java.util.function.BiFunction);
    public int size();
    public java.util.Collection values();


}

-keep class java.util.Hashtable {
    <init>(int, float);
    <init>(int);
    <init>();
    <init>(java.util.Map);

    public synchronized void clear();
    public synchronized java.lang.Object clone();
    public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    public synchronized boolean contains(java.lang.Object);
    public synchronized boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public synchronized java.util.Enumeration elements();
    public java.util.Set entrySet();
    public synchronized boolean equals(java.lang.Object);
    public synchronized void forEach(java.util.function.BiConsumer);
    public synchronized java.lang.Object get(java.lang.Object);
    public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public synchronized int hashCode();
    public synchronized boolean isEmpty();
    public java.util.Set keySet();
    public synchronized java.util.Enumeration keys();
    public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
    public synchronized void putAll(java.util.Map);
    public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    protected void rehash();
    public synchronized java.lang.Object remove(java.lang.Object);
    public synchronized boolean remove(java.lang.Object, java.lang.Object);
    public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
    public synchronized void replaceAll(java.util.function.BiFunction);
    public synchronized int size();
    public synchronized java.lang.String toString();
    public java.util.Collection values();


}

-keep class java.util.IntSummaryStatistics {
    <init>();

    public void accept(int);
    public void combine(java.util.IntSummaryStatistics);
    public double getAverage();
    public long getCount();
    public int getMax();
    public int getMin();
    public long getSum();
    public java.lang.String toString();


}

-keep class java.util.InvalidPropertiesFormatException {
    <init>(java.lang.Throwable);
    <init>(java.lang.String);



}

-keep class java.util.Iterator {

    public void forEachRemaining(java.util.function.Consumer);
    public abstract boolean hasNext();
    public abstract java.lang.Object next();
    public void remove();


}

-keep class java.util.List {

    public abstract boolean add(java.lang.Object);
    public abstract void add(int, java.lang.Object);
    public abstract boolean addAll(java.util.Collection);
    public abstract boolean addAll(int, 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 boolean remove(java.lang.Object);
    public abstract java.lang.Object remove(int);
    public abstract boolean removeAll(java.util.Collection);
    public void replaceAll(java.util.function.UnaryOperator);
    public abstract boolean retainAll(java.util.Collection);
    public abstract java.lang.Object set(int, java.lang.Object);
    public abstract int size();
    public void sort(java.util.Comparator);
    public java.util.Spliterator spliterator();
    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, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.lang.String);

    public static java.lang.String adjustLanguageCode(java.lang.String);
    public java.lang.Object clone();
    public boolean equals(java.lang.Object);
    public static java.util.List filter(java.util.List, java.util.Collection, java.util.Locale$FilteringMode);
    public static java.util.List filter(java.util.List, java.util.Collection);
    public static java.util.List filterTags(java.util.List, java.util.Collection, java.util.Locale$FilteringMode);
    public static java.util.List filterTags(java.util.List, java.util.Collection);
    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 static java.util.Locale getDefault(java.util.Locale$Category);
    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 boolean hasExtensions();
    public int hashCode();
    public static java.util.Locale initDefault();
    public static java.util.Locale lookup(java.util.List, java.util.Collection);
    public static java.lang.String lookupTag(java.util.List, java.util.Collection);
    public static synchronized void setDefault(java.util.Locale);
    public static synchronized void setDefault(java.util.Locale$Category, java.util.Locale);
    public java.util.Locale stripExtensions();
    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.Locale$Category {

    public static java.util.Locale$Category valueOf(java.lang.String);
    public static java.util.Locale$Category[] values();

    public static java.util.Locale$Category DISPLAY;
    public static java.util.Locale$Category FORMAT;

}

-keep class java.util.Locale$FilteringMode {

    public static java.util.Locale$FilteringMode valueOf(java.lang.String);
    public static java.util.Locale$FilteringMode[] values();

    public static java.util.Locale$FilteringMode AUTOSELECT_FILTERING;
    public static java.util.Locale$FilteringMode EXTENDED_FILTERING;
    public static java.util.Locale$FilteringMode IGNORE_EXTENDED_RANGES;
    public static java.util.Locale$FilteringMode MAP_EXTENDED_RANGES;
    public static java.util.Locale$FilteringMode REJECT_EXTENDED_RANGES;

}

-keep class java.util.Locale$LanguageRange {
    <init>(java.lang.String);
    <init>(java.lang.String, double);

    public boolean equals(java.lang.Object);
    public java.lang.String getRange();
    public double getWeight();
    public int hashCode();
    public static java.util.List mapEquivalents(java.util.List, java.util.Map);
    public static java.util.List parse(java.lang.String);
    public static java.util.List parse(java.lang.String, java.util.Map);


    public static double MAX_WEIGHT;
    public static double MIN_WEIGHT;
}

-keep class java.util.LongSummaryStatistics {
    <init>();

    public void accept(int);
    public void accept(long);
    public void combine(java.util.LongSummaryStatistics);
    public double getAverage();
    public long getCount();
    public long getMax();
    public long getMin();
    public long getSum();
    public java.lang.String toString();


}

-keep class java.util.Map {

    public abstract void clear();
    public java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    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 void forEach(java.util.function.BiConsumer);
    public abstract java.lang.Object get(java.lang.Object);
    public java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public abstract int hashCode();
    public abstract boolean isEmpty();
    public abstract java.util.Set keySet();
    public java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
    public abstract void putAll(java.util.Map);
    public java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    public abstract java.lang.Object remove(java.lang.Object);
    public boolean remove(java.lang.Object, java.lang.Object);
    public boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public java.lang.Object replace(java.lang.Object, java.lang.Object);
    public void replaceAll(java.util.function.BiFunction);
    public abstract int size();
    public abstract java.util.Collection values();


}

-keep class java.util.Map$Entry {

    public static java.util.Comparator comparingByKey();
    public static java.util.Comparator comparingByKey(java.util.Comparator);
    public static java.util.Comparator comparingByValue();
    public static java.util.Comparator comparingByValue(java.util.Comparator);
    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.MissingResourceException {
    <init>(java.lang.String, java.lang.String, java.lang.String);

    public java.lang.String getClassName();
    public java.lang.String getKey();


}

-keep class java.util.Optional {

    public static java.util.Optional empty();
    public boolean equals(java.lang.Object);
    public java.util.Optional filter(java.util.function.Predicate);
    public java.util.Optional flatMap(java.util.function.Function);
    public java.lang.Object get();
    public int hashCode();
    public void ifPresent(java.util.function.Consumer);
    public boolean isPresent();
    public java.util.Optional map(java.util.function.Function);
    public static java.util.Optional of(java.lang.Object);
    public static java.util.Optional ofNullable(java.lang.Object);
    public java.lang.Object orElse(java.lang.Object);
    public java.lang.Object orElseGet(java.util.function.Supplier);
    public java.lang.Object orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.OptionalDouble {

    public static java.util.OptionalDouble empty();
    public boolean equals(java.lang.Object);
    public double getAsDouble();
    public int hashCode();
    public void ifPresent(java.util.function.DoubleConsumer);
    public boolean isPresent();
    public static java.util.OptionalDouble of(double);
    public double orElse(double);
    public double orElseGet(java.util.function.DoubleSupplier);
    public double orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.OptionalInt {

    public static java.util.OptionalInt empty();
    public boolean equals(java.lang.Object);
    public int getAsInt();
    public int hashCode();
    public void ifPresent(java.util.function.IntConsumer);
    public boolean isPresent();
    public static java.util.OptionalInt of(int);
    public int orElse(int);
    public int orElseGet(java.util.function.IntSupplier);
    public int orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.OptionalLong {

    public static java.util.OptionalLong empty();
    public boolean equals(java.lang.Object);
    public long getAsLong();
    public int hashCode();
    public void ifPresent(java.util.function.LongConsumer);
    public boolean isPresent();
    public static java.util.OptionalLong of(long);
    public long orElse(long);
    public long orElseGet(java.util.function.LongSupplier);
    public long orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.PrimitiveIterator {

    public abstract void forEachRemaining(java.lang.Object);


}

-keep class java.util.PrimitiveIterator$OfDouble {

    public void forEachRemaining(java.util.function.DoubleConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public java.lang.Double next();
    public java.lang.Object next();
    public abstract double nextDouble();


}

-keep class java.util.PrimitiveIterator$OfInt {

    public void forEachRemaining(java.util.function.IntConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public java.lang.Integer next();
    public java.lang.Object next();
    public abstract int nextInt();


}

-keep class java.util.PrimitiveIterator$OfLong {

    public void forEachRemaining(java.util.function.LongConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public java.lang.Long next();
    public java.lang.Object next();
    public abstract long nextLong();


}

-keep class java.util.Properties {
    <init>();
    <init>(java.util.Properties);

    public java.lang.String getProperty(java.lang.String);
    public java.lang.String getProperty(java.lang.String, java.lang.String);
    public void list(java.io.PrintStream);
    public void list(java.io.PrintWriter);
    public synchronized void load(java.io.Reader);
    public synchronized void load(java.io.InputStream);
    public synchronized void loadFromXML(java.io.InputStream);
    public java.util.Enumeration propertyNames();
    public void save(java.io.OutputStream, java.lang.String);
    public synchronized java.lang.Object setProperty(java.lang.String, java.lang.String);
    public void store(java.io.Writer, java.lang.String);
    public void store(java.io.OutputStream, java.lang.String);
    public void storeToXML(java.io.OutputStream, java.lang.String);
    public void storeToXML(java.io.OutputStream, java.lang.String, java.lang.String);
    public java.util.Set stringPropertyNames();


    protected java.util.Properties defaults;
}

-keep class java.util.Random {
    <init>();
    <init>(long);

    public java.util.stream.DoubleStream doubles(long);
    public java.util.stream.DoubleStream doubles();
    public java.util.stream.DoubleStream doubles(long, double, double);
    public java.util.stream.DoubleStream doubles(double, double);
    public java.util.stream.IntStream ints(long);
    public java.util.stream.IntStream ints();
    public java.util.stream.IntStream ints(long, int, int);
    public java.util.stream.IntStream ints(int, int);
    public java.util.stream.LongStream longs(long);
    public java.util.stream.LongStream longs();
    public java.util.stream.LongStream longs(long, long, long);
    public java.util.stream.LongStream longs(long, long);
    protected int next(int);
    public boolean nextBoolean();
    public void nextBytes(byte[]);
    public double nextDouble();
    public float nextFloat();
    public synchronized double nextGaussian();
    public int nextInt();
    public int nextInt(int);
    public long nextLong();
    public synchronized void setSeed(long);


}

-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 java.util.Spliterator spliterator();
    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.util.Set entrySet();
    public abstract java.lang.Object firstKey();
    public abstract java.util.SortedMap headMap(java.lang.Object);
    public abstract java.util.Set keySet();
    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);
    public abstract java.util.Collection values();


}

-keep class java.util.Spliterator {

    public abstract int characteristics();
    public abstract long estimateSize();
    public void forEachRemaining(java.util.function.Consumer);
    public java.util.Comparator getComparator();
    public long getExactSizeIfKnown();
    public boolean hasCharacteristics(int);
    public abstract boolean tryAdvance(java.util.function.Consumer);
    public abstract java.util.Spliterator trySplit();


    public static int CONCURRENT;
    public static int DISTINCT;
    public static int IMMUTABLE;
    public static int NONNULL;
    public static int ORDERED;
    public static int SIZED;
    public static int SORTED;
    public static int SUBSIZED;
}

-keep class java.util.Spliterator$OfDouble {

    public void forEachRemaining(java.util.function.DoubleConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.util.function.DoubleConsumer);
    public boolean tryAdvance(java.util.function.Consumer);
    public boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfDouble trySplit();
    public java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.Spliterator$OfInt {

    public void forEachRemaining(java.util.function.IntConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.util.function.IntConsumer);
    public boolean tryAdvance(java.util.function.Consumer);
    public boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfInt trySplit();
    public java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.Spliterator$OfLong {

    public void forEachRemaining(java.util.function.LongConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.util.function.LongConsumer);
    public boolean tryAdvance(java.util.function.Consumer);
    public boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfLong trySplit();
    public java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.Spliterator$OfPrimitive {

    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.UUID {
    <init>(long, long);

    public int clockSequence();
    public int compareTo(java.util.UUID);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.util.UUID fromString(java.lang.String);
    public long getLeastSignificantBits();
    public long getMostSignificantBits();
    public int hashCode();
    public static java.util.UUID nameUUIDFromBytes(byte[]);
    public long node();
    public static java.util.UUID randomUUID();
    public long timestamp();
    public java.lang.String toString();
    public int variant();
    public int version();


}

-keep class java.util.concurrent.Callable {

    public abstract java.lang.Object call();


}

-keep class java.util.concurrent.ExecutionException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.util.concurrent.Executor {

    public abstract void execute(java.lang.Runnable);


}

-keep class java.util.concurrent.ExecutorService {

    public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit);
    public abstract java.util.List invokeAll(java.util.Collection);
    public abstract java.util.List invokeAll(java.util.Collection, long, java.util.concurrent.TimeUnit);
    public abstract java.lang.Object invokeAny(java.util.Collection);
    public abstract java.lang.Object invokeAny(java.util.Collection, long, java.util.concurrent.TimeUnit);
    public abstract boolean isShutdown();
    public abstract boolean isTerminated();
    public abstract void shutdown();
    public abstract java.util.List shutdownNow();
    public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable);
    public abstract java.util.concurrent.Future submit(java.lang.Runnable, java.lang.Object);
    public abstract java.util.concurrent.Future submit(java.lang.Runnable);


}

-keep class java.util.concurrent.Future {

    public abstract boolean cancel(boolean);
    public abstract java.lang.Object get();
    public abstract java.lang.Object get(long, java.util.concurrent.TimeUnit);
    public abstract boolean isCancelled();
    public abstract boolean isDone();


}

-keep class java.util.concurrent.TimeUnit {

    public long convert(long, java.util.concurrent.TimeUnit);
    public void sleep(long);
    public void timedJoin(java.lang.Thread, long);
    public void timedWait(java.lang.Object, long);
    public long toDays(long);
    public long toHours(long);
    public long toMicros(long);
    public long toMillis(long);
    public long toMinutes(long);
    public long toNanos(long);
    public long toSeconds(long);
    public static java.util.concurrent.TimeUnit valueOf(java.lang.String);
    public static java.util.concurrent.TimeUnit[] values();

    public static java.util.concurrent.TimeUnit DAYS;
    public static java.util.concurrent.TimeUnit HOURS;
    public static java.util.concurrent.TimeUnit MICROSECONDS;
    public static java.util.concurrent.TimeUnit MILLISECONDS;
    public static java.util.concurrent.TimeUnit MINUTES;
    public static java.util.concurrent.TimeUnit NANOSECONDS;
    public static java.util.concurrent.TimeUnit SECONDS;

}

-keep class java.util.concurrent.TimeoutException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.util.concurrent.atomic.AtomicInteger {
    <init>(int);
    <init>();

    public int accumulateAndGet(int, java.util.function.IntBinaryOperator);
    public int addAndGet(int);
    public boolean compareAndSet(int, int);
    public int decrementAndGet();
    public double doubleValue();
    public float floatValue();
    public int get();
    public int getAndAccumulate(int, java.util.function.IntBinaryOperator);
    public int getAndAdd(int);
    public int getAndDecrement();
    public int getAndIncrement();
    public int getAndSet(int);
    public int getAndUpdate(java.util.function.IntUnaryOperator);
    public int incrementAndGet();
    public int intValue();
    public void lazySet(int);
    public long longValue();
    public void set(int);
    public java.lang.String toString();
    public int updateAndGet(java.util.function.IntUnaryOperator);
    public boolean weakCompareAndSet(int, int);


}

-keep class java.util.function.BiConsumer {

    public abstract void accept(java.lang.Object, java.lang.Object);
    public java.util.function.BiConsumer andThen(java.util.function.BiConsumer);


}

-keep class java.util.function.BiFunction {

    public java.util.function.BiFunction andThen(java.util.function.Function);
    public abstract java.lang.Object apply(java.lang.Object, java.lang.Object);


}

-keep class java.util.function.BinaryOperator {

    public static java.util.function.BinaryOperator maxBy(java.util.Comparator);
    public static java.util.function.BinaryOperator minBy(java.util.Comparator);


}

-keep class java.util.function.Consumer {

    public abstract void accept(java.lang.Object);
    public java.util.function.Consumer andThen(java.util.function.Consumer);


}

-keep class java.util.function.DoubleBinaryOperator {

    public abstract double applyAsDouble(double, double);


}

-keep class java.util.function.DoubleConsumer {

    public abstract void accept(double);
    public java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);


}

-keep class java.util.function.DoubleFunction {

    public abstract java.lang.Object apply(double);


}

-keep class java.util.function.DoublePredicate {

    public java.util.function.DoublePredicate and(java.util.function.DoublePredicate);
    public java.util.function.DoublePredicate negate();
    public java.util.function.DoublePredicate or(java.util.function.DoublePredicate);
    public abstract boolean test(double);


}

-keep class java.util.function.DoubleSupplier {

    public abstract double getAsDouble();


}

-keep class java.util.function.DoubleToIntFunction {

    public abstract int applyAsInt(double);


}

-keep class java.util.function.DoubleToLongFunction {

    public abstract long applyAsLong(double);


}

-keep class java.util.function.DoubleUnaryOperator {

    public java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator);
    public abstract double applyAsDouble(double);
    public java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator);
    public static java.util.function.DoubleUnaryOperator identity();


}

-keep class java.util.function.Function {

    public java.util.function.Function andThen(java.util.function.Function);
    public abstract java.lang.Object apply(java.lang.Object);
    public java.util.function.Function compose(java.util.function.Function);
    public static java.util.function.Function identity();


}

-keep class java.util.function.IntBinaryOperator {

    public abstract int applyAsInt(int, int);


}

-keep class java.util.function.IntConsumer {

    public abstract void accept(int);
    public java.util.function.IntConsumer andThen(java.util.function.IntConsumer);


}

-keep class java.util.function.IntFunction {

    public abstract java.lang.Object apply(int);


}

-keep class java.util.function.IntPredicate {

    public java.util.function.IntPredicate and(java.util.function.IntPredicate);
    public java.util.function.IntPredicate negate();
    public java.util.function.IntPredicate or(java.util.function.IntPredicate);
    public abstract boolean test(int);


}

-keep class java.util.function.IntSupplier {

    public abstract int getAsInt();


}

-keep class java.util.function.IntToDoubleFunction {

    public abstract double applyAsDouble(int);


}

-keep class java.util.function.IntToLongFunction {

    public abstract long applyAsLong(int);


}

-keep class java.util.function.IntUnaryOperator {

    public java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator);
    public abstract int applyAsInt(int);
    public java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator);
    public static java.util.function.IntUnaryOperator identity();


}

-keep class java.util.function.LongBinaryOperator {

    public abstract long applyAsLong(long, long);


}

-keep class java.util.function.LongConsumer {

    public abstract void accept(long);
    public java.util.function.LongConsumer andThen(java.util.function.LongConsumer);


}

-keep class java.util.function.LongFunction {

    public abstract java.lang.Object apply(long);


}

-keep class java.util.function.LongPredicate {

    public java.util.function.LongPredicate and(java.util.function.LongPredicate);
    public java.util.function.LongPredicate negate();
    public java.util.function.LongPredicate or(java.util.function.LongPredicate);
    public abstract boolean test(long);


}

-keep class java.util.function.LongSupplier {

    public abstract long getAsLong();


}

-keep class java.util.function.LongToDoubleFunction {

    public abstract double applyAsDouble(long);


}

-keep class java.util.function.LongToIntFunction {

    public abstract int applyAsInt(long);


}

-keep class java.util.function.LongUnaryOperator {

    public java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator);
    public abstract long applyAsLong(long);
    public java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator);
    public static java.util.function.LongUnaryOperator identity();


}

-keep class java.util.function.ObjDoubleConsumer {

    public abstract void accept(java.lang.Object, double);


}

-keep class java.util.function.ObjIntConsumer {

    public abstract void accept(java.lang.Object, int);


}

-keep class java.util.function.ObjLongConsumer {

    public abstract void accept(java.lang.Object, long);


}

-keep class java.util.function.Predicate {

    public java.util.function.Predicate and(java.util.function.Predicate);
    public static java.util.function.Predicate isEqual(java.lang.Object);
    public java.util.function.Predicate negate();
    public java.util.function.Predicate or(java.util.function.Predicate);
    public abstract boolean test(java.lang.Object);


}

-keep class java.util.function.Supplier {

    public abstract java.lang.Object get();


}

-keep class java.util.function.ToDoubleFunction {

    public abstract double applyAsDouble(java.lang.Object);


}

-keep class java.util.function.ToIntFunction {

    public abstract int applyAsInt(java.lang.Object);


}

-keep class java.util.function.ToLongFunction {

    public abstract long applyAsLong(java.lang.Object);


}

-keep class java.util.function.UnaryOperator {

    public static java.util.function.UnaryOperator identity();


}

-keep class java.util.stream.BaseStream {

    public abstract void close();
    public abstract boolean isParallel();
    public abstract java.util.Iterator iterator();
    public abstract java.util.stream.BaseStream onClose(java.lang.Runnable);
    public abstract java.util.stream.BaseStream parallel();
    public abstract java.util.stream.BaseStream sequential();
    public abstract java.util.Spliterator spliterator();
    public abstract java.util.stream.BaseStream unordered();


}

-keep class java.util.stream.Collector {

    public abstract java.util.function.BiConsumer accumulator();
    public abstract java.util.Set characteristics();
    public abstract java.util.function.BinaryOperator combiner();
    public abstract java.util.function.Function finisher();
    public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector$Characteristics[]);
    public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector$Characteristics[]);
    public abstract java.util.function.Supplier supplier();


}

-keep class java.util.stream.Collector$Characteristics {

    public static java.util.stream.Collector$Characteristics valueOf(java.lang.String);
    public static java.util.stream.Collector$Characteristics[] values();

    public static java.util.stream.Collector$Characteristics CONCURRENT;
    public static java.util.stream.Collector$Characteristics IDENTITY_FINISH;
    public static java.util.stream.Collector$Characteristics UNORDERED;

}

-keep class java.util.stream.DoubleStream {

    public abstract boolean allMatch(java.util.function.DoublePredicate);
    public abstract boolean anyMatch(java.util.function.DoublePredicate);
    public abstract java.util.OptionalDouble average();
    public abstract java.util.stream.Stream boxed();
    public static java.util.stream.DoubleStream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer);
    public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream);
    public abstract long count();
    public abstract java.util.stream.DoubleStream distinct();
    public static java.util.stream.DoubleStream empty();
    public abstract java.util.stream.DoubleStream filter(java.util.function.DoublePredicate);
    public abstract java.util.OptionalDouble findAny();
    public abstract java.util.OptionalDouble findFirst();
    public abstract java.util.stream.DoubleStream flatMap(java.util.function.DoubleFunction);
    public abstract void forEach(java.util.function.DoubleConsumer);
    public abstract void forEachOrdered(java.util.function.DoubleConsumer);
    public static java.util.stream.DoubleStream generate(java.util.function.DoubleSupplier);
    public static java.util.stream.DoubleStream iterate(double, java.util.function.DoubleUnaryOperator);
    public abstract java.util.PrimitiveIterator$OfDouble iterator();
    public java.util.Iterator iterator();
    public abstract java.util.stream.DoubleStream limit(long);
    public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
    public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
    public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
    public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction);
    public abstract java.util.OptionalDouble max();
    public abstract java.util.OptionalDouble min();
    public abstract boolean noneMatch(java.util.function.DoublePredicate);
    public static java.util.stream.DoubleStream of(double);
    public static java.util.stream.DoubleStream of(double[]);
    public abstract java.util.stream.DoubleStream parallel();
    public java.util.stream.BaseStream parallel();
    public abstract java.util.stream.DoubleStream peek(java.util.function.DoubleConsumer);
    public abstract double reduce(double, java.util.function.DoubleBinaryOperator);
    public abstract java.util.OptionalDouble reduce(java.util.function.DoubleBinaryOperator);
    public abstract java.util.stream.DoubleStream sequential();
    public java.util.stream.BaseStream sequential();
    public abstract java.util.stream.DoubleStream skip(long);
    public abstract java.util.stream.DoubleStream sorted();
    public abstract java.util.Spliterator$OfDouble spliterator();
    public java.util.Spliterator spliterator();
    public abstract double sum();
    public abstract java.util.DoubleSummaryStatistics summaryStatistics();
    public abstract double[] toArray();


}

-keep class java.util.stream.DoubleStream$Builder {

    public abstract void accept(double);
    public java.util.stream.DoubleStream$Builder add(double);
    public abstract java.util.stream.DoubleStream build();


}

-keep class java.util.stream.IntStream {

    public abstract boolean allMatch(java.util.function.IntPredicate);
    public abstract boolean anyMatch(java.util.function.IntPredicate);
    public abstract java.util.stream.DoubleStream asDoubleStream();
    public abstract java.util.stream.LongStream asLongStream();
    public abstract java.util.OptionalDouble average();
    public abstract java.util.stream.Stream boxed();
    public static java.util.stream.IntStream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer);
    public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream);
    public abstract long count();
    public abstract java.util.stream.IntStream distinct();
    public static java.util.stream.IntStream empty();
    public abstract java.util.stream.IntStream filter(java.util.function.IntPredicate);
    public abstract java.util.OptionalInt findAny();
    public abstract java.util.OptionalInt findFirst();
    public abstract java.util.stream.IntStream flatMap(java.util.function.IntFunction);
    public abstract void forEach(java.util.function.IntConsumer);
    public abstract void forEachOrdered(java.util.function.IntConsumer);
    public static java.util.stream.IntStream generate(java.util.function.IntSupplier);
    public static java.util.stream.IntStream iterate(int, java.util.function.IntUnaryOperator);
    public abstract java.util.PrimitiveIterator$OfInt iterator();
    public java.util.Iterator iterator();
    public abstract java.util.stream.IntStream limit(long);
    public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
    public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
    public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
    public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction);
    public abstract java.util.OptionalInt max();
    public abstract java.util.OptionalInt min();
    public abstract boolean noneMatch(java.util.function.IntPredicate);
    public static java.util.stream.IntStream of(int);
    public static java.util.stream.IntStream of(int[]);
    public abstract java.util.stream.IntStream parallel();
    public java.util.stream.BaseStream parallel();
    public abstract java.util.stream.IntStream peek(java.util.function.IntConsumer);
    public static java.util.stream.IntStream range(int, int);
    public static java.util.stream.IntStream rangeClosed(int, int);
    public abstract int reduce(int, java.util.function.IntBinaryOperator);
    public abstract java.util.OptionalInt reduce(java.util.function.IntBinaryOperator);
    public abstract java.util.stream.IntStream sequential();
    public java.util.stream.BaseStream sequential();
    public abstract java.util.stream.IntStream skip(long);
    public abstract java.util.stream.IntStream sorted();
    public abstract java.util.Spliterator$OfInt spliterator();
    public java.util.Spliterator spliterator();
    public abstract int sum();
    public abstract java.util.IntSummaryStatistics summaryStatistics();
    public abstract int[] toArray();


}

-keep class java.util.stream.IntStream$Builder {

    public abstract void accept(int);
    public java.util.stream.IntStream$Builder add(int);
    public abstract java.util.stream.IntStream build();


}

-keep class java.util.stream.LongStream {

    public abstract boolean allMatch(java.util.function.LongPredicate);
    public abstract boolean anyMatch(java.util.function.LongPredicate);
    public abstract java.util.stream.DoubleStream asDoubleStream();
    public abstract java.util.OptionalDouble average();
    public abstract java.util.stream.Stream boxed();
    public static java.util.stream.LongStream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer);
    public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream);
    public abstract long count();
    public abstract java.util.stream.LongStream distinct();
    public static java.util.stream.LongStream empty();
    public abstract java.util.stream.LongStream filter(java.util.function.LongPredicate);
    public abstract java.util.OptionalLong findAny();
    public abstract java.util.OptionalLong findFirst();
    public abstract java.util.stream.LongStream flatMap(java.util.function.LongFunction);
    public abstract void forEach(java.util.function.LongConsumer);
    public abstract void forEachOrdered(java.util.function.LongConsumer);
    public static java.util.stream.LongStream generate(java.util.function.LongSupplier);
    public static java.util.stream.LongStream iterate(long, java.util.function.LongUnaryOperator);
    public abstract java.util.PrimitiveIterator$OfLong iterator();
    public java.util.Iterator iterator();
    public abstract java.util.stream.LongStream limit(long);
    public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
    public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
    public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
    public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction);
    public abstract java.util.OptionalLong max();
    public abstract java.util.OptionalLong min();
    public abstract boolean noneMatch(java.util.function.LongPredicate);
    public static java.util.stream.LongStream of(long);
    public static java.util.stream.LongStream of(long[]);
    public abstract java.util.stream.LongStream parallel();
    public java.util.stream.BaseStream parallel();
    public abstract java.util.stream.LongStream peek(java.util.function.LongConsumer);
    public static java.util.stream.LongStream range(long, long);
    public static java.util.stream.LongStream rangeClosed(long, long);
    public abstract long reduce(long, java.util.function.LongBinaryOperator);
    public abstract java.util.OptionalLong reduce(java.util.function.LongBinaryOperator);
    public abstract java.util.stream.LongStream sequential();
    public java.util.stream.BaseStream sequential();
    public abstract java.util.stream.LongStream skip(long);
    public abstract java.util.stream.LongStream sorted();
    public abstract java.util.Spliterator$OfLong spliterator();
    public java.util.Spliterator spliterator();
    public abstract long sum();
    public abstract java.util.LongSummaryStatistics summaryStatistics();
    public abstract long[] toArray();


}

-keep class java.util.stream.LongStream$Builder {

    public abstract void accept(long);
    public java.util.stream.LongStream$Builder add(long);
    public abstract java.util.stream.LongStream build();


}

-keep class java.util.stream.Stream {

    public abstract boolean allMatch(java.util.function.Predicate);
    public abstract boolean anyMatch(java.util.function.Predicate);
    public static java.util.stream.Stream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer);
    public abstract java.lang.Object collect(java.util.stream.Collector);
    public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream);
    public abstract long count();
    public abstract java.util.stream.Stream distinct();
    public static java.util.stream.Stream empty();
    public abstract java.util.stream.Stream filter(java.util.function.Predicate);
    public abstract java.util.Optional findAny();
    public abstract java.util.Optional findFirst();
    public abstract java.util.stream.Stream flatMap(java.util.function.Function);
    public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function);
    public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function);
    public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function);
    public abstract void forEach(java.util.function.Consumer);
    public abstract void forEachOrdered(java.util.function.Consumer);
    public static java.util.stream.Stream generate(java.util.function.Supplier);
    public static java.util.stream.Stream iterate(java.lang.Object, java.util.function.UnaryOperator);
    public abstract java.util.stream.Stream limit(long);
    public abstract java.util.stream.Stream map(java.util.function.Function);
    public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction);
    public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction);
    public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction);
    public abstract java.util.Optional max(java.util.Comparator);
    public abstract java.util.Optional min(java.util.Comparator);
    public abstract boolean noneMatch(java.util.function.Predicate);
    public static java.util.stream.Stream of(java.lang.Object);
    public static java.util.stream.Stream of(java.lang.Object[]);
    public abstract java.util.stream.Stream peek(java.util.function.Consumer);
    public abstract java.lang.Object reduce(java.lang.Object, java.util.function.BinaryOperator);
    public abstract java.util.Optional reduce(java.util.function.BinaryOperator);
    public abstract java.lang.Object reduce(java.lang.Object, java.util.function.BiFunction, java.util.function.BinaryOperator);
    public abstract java.util.stream.Stream skip(long);
    public abstract java.util.stream.Stream sorted();
    public abstract java.util.stream.Stream sorted(java.util.Comparator);
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.util.function.IntFunction);


}

-keep class java.util.stream.Stream$Builder {

    public abstract void accept(java.lang.Object);
    public java.util.stream.Stream$Builder add(java.lang.Object);
    public abstract java.util.stream.Stream build();


}

-keep class javax.microedition.khronos.opengles.GL {



}

-keep class javax.security.auth.Subject {
    <init>();
    <init>(boolean, java.util.Set, java.util.Set, java.util.Set);

    public static java.lang.Object doAs(javax.security.auth.Subject, java.security.PrivilegedAction);
    public static java.lang.Object doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction);
    public static java.lang.Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext);
    public static java.lang.Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext);
    public boolean equals(java.lang.Object);
    public java.util.Set getPrincipals();
    public java.util.Set getPrincipals(java.lang.Class);
    public java.util.Set getPrivateCredentials();
    public java.util.Set getPrivateCredentials(java.lang.Class);
    public java.util.Set getPublicCredentials();
    public java.util.Set getPublicCredentials(java.lang.Class);
    public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
    public int hashCode();
    public boolean isReadOnly();
    public void setReadOnly();
    public java.lang.String toString();


}

-keep class libcore.util.NativeAllocationRegistry {
    <init>(java.lang.ClassLoader, long, long);

    public static void applyFreeFunction(long, long);
    public java.lang.Runnable registerNativeAllocation(java.lang.Object, long);
    public java.lang.Runnable registerNativeAllocation(java.lang.Object, libcore.util.NativeAllocationRegistry$Allocator);


}

-keep class libcore.util.NativeAllocationRegistry$Allocator {

    public abstract long allocate();


}

-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);


}

-keep class sun.nio.ch.Interruptible {

    public abstract void interrupt(java.lang.Thread);


}

