// Signature format: 4.0
package androidx.compose.ui {

  public final class AbsoluteAlignment {
    method public androidx.compose.ui.Alignment getBottomLeft();
    method public androidx.compose.ui.Alignment getBottomRight();
    method public androidx.compose.ui.Alignment getCenterLeft();
    method public androidx.compose.ui.Alignment getCenterRight();
    method public androidx.compose.ui.Alignment.Horizontal getLeft();
    method public androidx.compose.ui.Alignment.Horizontal getRight();
    method public androidx.compose.ui.Alignment getTopLeft();
    method public androidx.compose.ui.Alignment getTopRight();
    property public final androidx.compose.ui.Alignment BottomLeft;
    property public final androidx.compose.ui.Alignment BottomRight;
    property public final androidx.compose.ui.Alignment CenterLeft;
    property public final androidx.compose.ui.Alignment CenterRight;
    property public final androidx.compose.ui.Alignment.Horizontal Left;
    property public final androidx.compose.ui.Alignment.Horizontal Right;
    property public final androidx.compose.ui.Alignment TopLeft;
    property public final androidx.compose.ui.Alignment TopRight;
    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
  }

  @androidx.compose.runtime.Stable public fun interface Alignment {
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    field public static final androidx.compose.ui.Alignment.Companion Companion;
  }

  public static final class Alignment.Companion {
    method public androidx.compose.ui.Alignment.Vertical getBottom();
    method public androidx.compose.ui.Alignment getBottomCenter();
    method public androidx.compose.ui.Alignment getBottomEnd();
    method public androidx.compose.ui.Alignment getBottomStart();
    method public androidx.compose.ui.Alignment getCenter();
    method public androidx.compose.ui.Alignment getCenterEnd();
    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
    method public androidx.compose.ui.Alignment getCenterStart();
    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
    method public androidx.compose.ui.Alignment.Horizontal getEnd();
    method public androidx.compose.ui.Alignment.Horizontal getStart();
    method public androidx.compose.ui.Alignment.Vertical getTop();
    method public androidx.compose.ui.Alignment getTopCenter();
    method public androidx.compose.ui.Alignment getTopEnd();
    method public androidx.compose.ui.Alignment getTopStart();
    property public final androidx.compose.ui.Alignment.Vertical Bottom;
    property public final androidx.compose.ui.Alignment BottomCenter;
    property public final androidx.compose.ui.Alignment BottomEnd;
    property public final androidx.compose.ui.Alignment BottomStart;
    property public final androidx.compose.ui.Alignment Center;
    property public final androidx.compose.ui.Alignment CenterEnd;
    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
    property public final androidx.compose.ui.Alignment CenterStart;
    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
    property public final androidx.compose.ui.Alignment.Horizontal End;
    property public final androidx.compose.ui.Alignment.Horizontal Start;
    property public final androidx.compose.ui.Alignment.Vertical Top;
    property public final androidx.compose.ui.Alignment TopCenter;
    property public final androidx.compose.ui.Alignment TopEnd;
    property public final androidx.compose.ui.Alignment TopStart;
  }

  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
  }

  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
    method public int align(int size, int space);
  }

  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
  }

  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
    ctor public BiasAlignment(float horizontalBias, float verticalBias);
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public float component1();
    method public float component2();
    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
    method public float getHorizontalBias();
    method public float getVerticalBias();
    property public final float horizontalBias;
    property public final float verticalBias;
  }

  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
    ctor public BiasAlignment.Horizontal(float bias);
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
    ctor public BiasAlignment.Vertical(float bias);
    method public int align(int size, int space);
    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
  }

  public final class CombinedModifier implements androidx.compose.ui.Modifier {
    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R foldOut(R initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  public final class ComposedModifierKt {
    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object? key1, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object? key1, Object? key2, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object? key1, Object? key2, Object? key3, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object![]? keys, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method @Deprecated public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
    method public static androidx.compose.ui.Modifier materializeModifier(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
  }

  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalComposeUiApi {
  }

  @kotlin.RequiresOptIn(message="Unstable API for use only between compose-ui modules sharing the same exact version, " + "subject to change without notice in major, minor, or patch releases.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface InternalComposeUiApi {
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R foldOut(R initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
    method public default infix androidx.compose.ui.Modifier then(androidx.compose.ui.Modifier other);
    field public static final androidx.compose.ui.Modifier.Companion Companion;
  }

  public static final class Modifier.Companion implements androidx.compose.ui.Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R foldOut(R initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public static interface Modifier.Element extends androidx.compose.ui.Modifier {
    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public default <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public default <R> R foldOut(R initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  public abstract static class Modifier.Node implements androidx.compose.ui.node.DelegatableNode {
    ctor public Modifier.Node();
    method public final kotlinx.coroutines.CoroutineScope getCoroutineScope();
    method public final androidx.compose.ui.Modifier.Node getNode();
    method public boolean getShouldAutoInvalidate();
    method public final boolean isAttached();
    method public void onAttach();
    method public void onDetach();
    method public void onReset();
    method @androidx.compose.ui.ExperimentalComposeUiApi public final void sideEffect(kotlin.jvm.functions.Function0<kotlin.Unit> effect);
    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
    property public final boolean isAttached;
    property public final androidx.compose.ui.Modifier.Node node;
    property public boolean shouldAutoInvalidate;
  }

  @androidx.compose.runtime.Stable public interface MotionDurationScale extends kotlin.coroutines.CoroutineContext.Element {
    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
    method public float getScaleFactor();
    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
    property public abstract float scaleFactor;
    field public static final androidx.compose.ui.MotionDurationScale.Key Key;
  }

  public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
  }

  @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
  }

  public final class ZIndexModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
  }

}

package androidx.compose.ui.autofill {

  @androidx.compose.ui.ExperimentalComposeUiApi public interface Autofill {
    method public void cancelAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
    method public void requestAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public final class AutofillNode {
    ctor public AutofillNode(optional java.util.List<? extends androidx.compose.ui.autofill.AutofillType> autofillTypes, optional androidx.compose.ui.geometry.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
    method public java.util.List<androidx.compose.ui.autofill.AutofillType> getAutofillTypes();
    method public androidx.compose.ui.geometry.Rect? getBoundingBox();
    method public int getId();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? getOnFill();
    method public void setBoundingBox(androidx.compose.ui.geometry.Rect?);
    property public final java.util.List<androidx.compose.ui.autofill.AutofillType> autofillTypes;
    property public final androidx.compose.ui.geometry.Rect? boundingBox;
    property public final int id;
    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? onFill;
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public final class AutofillTree {
    ctor public AutofillTree();
    method public java.util.Map<java.lang.Integer,androidx.compose.ui.autofill.AutofillNode> getChildren();
    method public kotlin.Unit? performAutofill(int id, String value);
    method public operator void plusAssign(androidx.compose.ui.autofill.AutofillNode autofillNode);
    property public final java.util.Map<java.lang.Integer,androidx.compose.ui.autofill.AutofillNode> children;
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public enum AutofillType {
    method public static androidx.compose.ui.autofill.AutofillType valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method public static androidx.compose.ui.autofill.AutofillType[] values();
    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressAuxiliaryDetails;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressCountry;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressLocality;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressRegion;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressStreet;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateDay;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateFull;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateMonth;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateYear;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationDate;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationDay;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationMonth;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationYear;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardNumber;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardSecurityCode;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType EmailAddress;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType Gender;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType NewPassword;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType NewUsername;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType Password;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonFirstName;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonFullName;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonLastName;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonMiddleInitial;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonMiddleName;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonNamePrefix;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonNameSuffix;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneCountryCode;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumber;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumberDevice;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumberNational;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalAddress;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalCode;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalCodeExtended;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType SmsOtpCode;
    enum_constant public static final androidx.compose.ui.autofill.AutofillType Username;
  }

}

package androidx.compose.ui.draw {

  public final class AlphaKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
  }

  public final class BlurKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlurredEdgeTreatment {
    ctor public BlurredEdgeTreatment(androidx.compose.ui.graphics.Shape? shape);
    method public androidx.compose.ui.graphics.Shape? getShape();
    property public final androidx.compose.ui.graphics.Shape? shape;
    field public static final androidx.compose.ui.draw.BlurredEdgeTreatment.Companion Companion;
  }

  public static final class BlurredEdgeTreatment.Companion {
    method public androidx.compose.ui.graphics.Shape getRectangle();
    method public androidx.compose.ui.graphics.Shape getUnbounded();
    property public final androidx.compose.ui.graphics.Shape Rectangle;
    property public final androidx.compose.ui.graphics.Shape Unbounded;
  }

  public interface BuildDrawCacheParams {
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public long getSize();
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract long size;
  }

  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
    method public float getDensity();
    method public float getFontScale();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public long getSize();
    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
    property public float density;
    property public float fontScale;
    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public final long size;
  }

  public final class ClipKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
  }

  public final class DrawModifierKt {
    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
  }

  public final class DrawResult {
  }

  public final class PainterModifierKt {
    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
  }

  public final class RotateKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
  }

  public final class ScaleKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
  }

  public final class ShadowKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional long ambientColor, optional long spotColor);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
  }

}

package androidx.compose.ui.focus {

  public final class FocusChangedModifierKt {
    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
  }

  @kotlin.jvm.JvmInline public final value class FocusDirection {
    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
  }

  public static final class FocusDirection.Companion {
    method public int getDown();
    method @androidx.compose.ui.ExperimentalComposeUiApi public int getEnter();
    method @androidx.compose.ui.ExperimentalComposeUiApi public int getExit();
    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public int getIn();
    method public int getLeft();
    method public int getNext();
    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public int getOut();
    method public int getPrevious();
    method public int getRight();
    method public int getUp();
    property public final int Down;
    property @androidx.compose.ui.ExperimentalComposeUiApi public final int Enter;
    property @androidx.compose.ui.ExperimentalComposeUiApi public final int Exit;
    property @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final int In;
    property public final int Left;
    property public final int Next;
    property @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final int Out;
    property public final int Previous;
    property public final int Right;
    property public final int Up;
  }

  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
  }

  public final class FocusEventModifierKt {
    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
  }

  public interface FocusEventModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
    method public void clearFocus(optional boolean force);
    method public boolean moveFocus(int focusDirection);
  }

  public final class FocusModifierKt {
    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
  }

  @Deprecated public final class FocusOrder {
    ctor @Deprecated public FocusOrder();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getDown();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getEnd();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getLeft();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getNext();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getPrevious();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getRight();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getStart();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getUp();
    method @Deprecated public void setDown(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setEnd(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setLeft(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setNext(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setPrevious(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setRight(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setStart(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setUp(androidx.compose.ui.focus.FocusRequester);
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester down;
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester end;
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester left;
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester next;
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester previous;
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester right;
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester start;
    property @Deprecated public final androidx.compose.ui.focus.FocusRequester up;
  }

  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
  }

  public final class FocusOrderModifierKt {
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
  }

  public interface FocusProperties {
    method public boolean getCanFocus();
    method public default androidx.compose.ui.focus.FocusRequester getDown();
    method public default androidx.compose.ui.focus.FocusRequester getEnd();
    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getEnter();
    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getExit();
    method public default androidx.compose.ui.focus.FocusRequester getLeft();
    method public default androidx.compose.ui.focus.FocusRequester getNext();
    method public default androidx.compose.ui.focus.FocusRequester getPrevious();
    method public default androidx.compose.ui.focus.FocusRequester getRight();
    method public default androidx.compose.ui.focus.FocusRequester getStart();
    method public default androidx.compose.ui.focus.FocusRequester getUp();
    method public void setCanFocus(boolean);
    method public default void setDown(androidx.compose.ui.focus.FocusRequester);
    method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setEnter(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setExit(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
    method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
    method public default void setNext(androidx.compose.ui.focus.FocusRequester);
    method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
    method public default void setRight(androidx.compose.ui.focus.FocusRequester);
    method public default void setStart(androidx.compose.ui.focus.FocusRequester);
    method public default void setUp(androidx.compose.ui.focus.FocusRequester);
    property public abstract boolean canFocus;
    property public default androidx.compose.ui.focus.FocusRequester down;
    property public default androidx.compose.ui.focus.FocusRequester end;
    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> enter;
    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> exit;
    property public default androidx.compose.ui.focus.FocusRequester left;
    property public default androidx.compose.ui.focus.FocusRequester next;
    property public default androidx.compose.ui.focus.FocusRequester previous;
    property public default androidx.compose.ui.focus.FocusRequester right;
    property public default androidx.compose.ui.focus.FocusRequester start;
    property public default androidx.compose.ui.focus.FocusRequester up;
  }

  public final class FocusPropertiesKt {
    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
  }

  public interface FocusPropertiesModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public void applyFocusProperties(androidx.compose.ui.focus.FocusProperties focusProperties);
  }

  public final class FocusPropertiesModifierNodeKt {
    method public static void invalidateFocusProperties(androidx.compose.ui.focus.FocusPropertiesModifierNode);
  }

  @androidx.compose.runtime.Stable public final class FocusRequester {
    ctor public FocusRequester();
    method public boolean captureFocus();
    method public boolean freeFocus();
    method public void requestFocus();
    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
  }

  public static final class FocusRequester.Companion {
    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.focus.FocusRequester.Companion.FocusRequesterFactory createRefs();
    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.focus.FocusRequester getCancel();
    method public androidx.compose.ui.focus.FocusRequester getDefault();
    property @androidx.compose.ui.ExperimentalComposeUiApi public final androidx.compose.ui.focus.FocusRequester Cancel;
    property public final androidx.compose.ui.focus.FocusRequester Default;
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public static final class FocusRequester.Companion.FocusRequesterFactory {
    method public operator androidx.compose.ui.focus.FocusRequester component1();
    method public operator androidx.compose.ui.focus.FocusRequester component10();
    method public operator androidx.compose.ui.focus.FocusRequester component11();
    method public operator androidx.compose.ui.focus.FocusRequester component12();
    method public operator androidx.compose.ui.focus.FocusRequester component13();
    method public operator androidx.compose.ui.focus.FocusRequester component14();
    method public operator androidx.compose.ui.focus.FocusRequester component15();
    method public operator androidx.compose.ui.focus.FocusRequester component16();
    method public operator androidx.compose.ui.focus.FocusRequester component2();
    method public operator androidx.compose.ui.focus.FocusRequester component3();
    method public operator androidx.compose.ui.focus.FocusRequester component4();
    method public operator androidx.compose.ui.focus.FocusRequester component5();
    method public operator androidx.compose.ui.focus.FocusRequester component6();
    method public operator androidx.compose.ui.focus.FocusRequester component7();
    method public operator androidx.compose.ui.focus.FocusRequester component8();
    method public operator androidx.compose.ui.focus.FocusRequester component9();
    field public static final androidx.compose.ui.focus.FocusRequester.Companion.FocusRequesterFactory INSTANCE;
  }

  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getFocusRequester();
    property @Deprecated public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
  }

  public final class FocusRequesterModifierKt {
    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
  }

  public interface FocusRequesterModifierNode extends androidx.compose.ui.node.DelegatableNode {
  }

  public final class FocusRequesterModifierNodeKt {
    method public static boolean captureFocus(androidx.compose.ui.focus.FocusRequesterModifierNode);
    method public static boolean freeFocus(androidx.compose.ui.focus.FocusRequesterModifierNode);
    method public static boolean requestFocus(androidx.compose.ui.focus.FocusRequesterModifierNode);
  }

  public interface FocusState {
    method public boolean getHasFocus();
    method public boolean isCaptured();
    method public boolean isFocused();
    property public abstract boolean hasFocus;
    property public abstract boolean isCaptured;
    property public abstract boolean isFocused;
  }

  public final class FocusTargetNode extends androidx.compose.ui.Modifier.Node implements androidx.compose.ui.modifier.ModifierLocalModifierNode androidx.compose.ui.node.ObserverModifierNode {
    ctor public FocusTargetNode();
    method public androidx.compose.ui.focus.FocusState getFocusState();
    method public void onObservedReadsChanged();
    property public final androidx.compose.ui.focus.FocusState focusState;
  }

}

package androidx.compose.ui.graphics {

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class CompositingStrategy {
    field public static final androidx.compose.ui.graphics.CompositingStrategy.Companion Companion;
  }

  public static final class CompositingStrategy.Companion {
    method public int getAuto();
    method public int getModulateAlpha();
    method public int getOffscreen();
    property public final int Auto;
    property public final int ModulateAlpha;
    property public final int Offscreen;
  }

  public final class GraphicsLayerModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor, optional int compositingStrategy);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
    method public float getAlpha();
    method public default long getAmbientShadowColor();
    method public float getCameraDistance();
    method public boolean getClip();
    method public default int getCompositingStrategy();
    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
    method public float getRotationX();
    method public float getRotationY();
    method public float getRotationZ();
    method public float getScaleX();
    method public float getScaleY();
    method public float getShadowElevation();
    method public androidx.compose.ui.graphics.Shape getShape();
    method public default long getSize();
    method public default long getSpotShadowColor();
    method public long getTransformOrigin();
    method public float getTranslationX();
    method public float getTranslationY();
    method public void setAlpha(float);
    method public default void setAmbientShadowColor(long);
    method public void setCameraDistance(float);
    method public void setClip(boolean);
    method public default void setCompositingStrategy(int);
    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect?);
    method public void setRotationX(float);
    method public void setRotationY(float);
    method public void setRotationZ(float);
    method public void setScaleX(float);
    method public void setScaleY(float);
    method public void setShadowElevation(float);
    method public void setShape(androidx.compose.ui.graphics.Shape);
    method public default void setSpotShadowColor(long);
    method public void setTransformOrigin(long);
    method public void setTranslationX(float);
    method public void setTranslationY(float);
    property public abstract float alpha;
    property public default long ambientShadowColor;
    property public abstract float cameraDistance;
    property public abstract boolean clip;
    property public default int compositingStrategy;
    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
    property public abstract float rotationX;
    property public abstract float rotationY;
    property public abstract float rotationZ;
    property public abstract float scaleX;
    property public abstract float scaleY;
    property public abstract float shadowElevation;
    property public abstract androidx.compose.ui.graphics.Shape shape;
    property public default long size;
    property public default long spotShadowColor;
    property public abstract long transformOrigin;
    property public abstract float translationX;
    property public abstract float translationY;
  }

  public final class GraphicsLayerScopeKt {
    method public static androidx.compose.ui.graphics.GraphicsLayerScope GraphicsLayerScope();
    method public static long getDefaultShadowColor();
    property public static final long DefaultShadowColor;
    field public static final float DefaultCameraDistance = 8.0f;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TransformOrigin {
    method @androidx.compose.runtime.Stable public inline operator float component1();
    method @androidx.compose.runtime.Stable public inline operator float component2();
    method public long copy(optional float pivotFractionX, optional float pivotFractionY);
    method public float getPivotFractionX();
    method public float getPivotFractionY();
    property public final float pivotFractionX;
    property public final float pivotFractionY;
    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
  }

  public static final class TransformOrigin.Companion {
    method public long getCenter();
    property public final long Center;
  }

  public final class TransformOriginKt {
    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
  }

}

package androidx.compose.ui.graphics.vector {

  @androidx.compose.runtime.Immutable public final class ImageVector {
    method public boolean getAutoMirror();
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
    method public int getTintBlendMode();
    method public long getTintColor();
    method public float getViewportHeight();
    method public float getViewportWidth();
    property public final boolean autoMirror;
    property public final float defaultHeight;
    property public final float defaultWidth;
    property public final String name;
    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
    property public final int tintBlendMode;
    property public final long tintColor;
    property public final float viewportHeight;
    property public final float viewportWidth;
    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
  }

  public static final class ImageVector.Builder {
    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror);
    ctor @Deprecated public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
    method public androidx.compose.ui.graphics.vector.ImageVector build();
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
  }

  public static final class ImageVector.Companion {
  }

  public final class ImageVectorKt {
    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
  }

  public abstract sealed class VNode {
    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
    method public final void invalidate();
  }

  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
    method public void move(int from, int to, int count);
    method protected void onClear();
    method public void remove(int index, int count);
  }

  @androidx.compose.runtime.ComposableTargetMarker(description="Vector Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface VectorComposable {
  }

  public final class VectorComposeKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorConfig {
    method public default <T> T getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T defaultValue);
  }

  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
    method public String getName();
    method public float getPivotX();
    method public float getPivotY();
    method public float getRotation();
    method public float getScaleX();
    method public float getScaleY();
    method public int getSize();
    method public float getTranslationX();
    method public float getTranslationY();
    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
    property public final String name;
    property public final float pivotX;
    property public final float pivotY;
    property public final float rotation;
    property public final float scaleX;
    property public final float scaleY;
    property public final int size;
    property public final float translationX;
    property public final float translationY;
  }

  public final class VectorKt {
    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
    method public static int getDefaultFillType();
    method public static int getDefaultStrokeLineCap();
    method public static int getDefaultStrokeLineJoin();
    method public static int getDefaultTintBlendMode();
    method public static long getDefaultTintColor();
    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
    property public static final int DefaultFillType;
    property public static final int DefaultStrokeLineCap;
    property public static final int DefaultStrokeLineJoin;
    property public static final int DefaultTintBlendMode;
    property public static final long DefaultTintColor;
    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
    field public static final String DefaultGroupName = "";
    field public static final String DefaultPathName = "";
    field public static final float DefaultPivotX = 0.0f;
    field public static final float DefaultPivotY = 0.0f;
    field public static final float DefaultRotation = 0.0f;
    field public static final float DefaultScaleX = 1.0f;
    field public static final float DefaultScaleY = 1.0f;
    field public static final float DefaultStrokeLineMiter = 4.0f;
    field public static final float DefaultStrokeLineWidth = 0.0f;
    field public static final float DefaultTranslationX = 0.0f;
    field public static final float DefaultTranslationY = 0.0f;
    field public static final float DefaultTrimPathEnd = 1.0f;
    field public static final float DefaultTrimPathOffset = 0.0f;
    field public static final float DefaultTrimPathStart = 0.0f;
  }

  public abstract sealed class VectorNode {
  }

  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
    method public long getIntrinsicSize();
    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
    property public long intrinsicSize;
  }

  public final class VectorPainterKt {
    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
    field public static final String RootGroupName = "VectorRootGroup";
  }

  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
    method public androidx.compose.ui.graphics.Brush? getFill();
    method public float getFillAlpha();
    method public String getName();
    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
    method public int getPathFillType();
    method public androidx.compose.ui.graphics.Brush? getStroke();
    method public float getStrokeAlpha();
    method public int getStrokeLineCap();
    method public int getStrokeLineJoin();
    method public float getStrokeLineMiter();
    method public float getStrokeLineWidth();
    method public float getTrimPathEnd();
    method public float getTrimPathOffset();
    method public float getTrimPathStart();
    property public final androidx.compose.ui.graphics.Brush? fill;
    property public final float fillAlpha;
    property public final String name;
    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
    property public final int pathFillType;
    property public final androidx.compose.ui.graphics.Brush? stroke;
    property public final float strokeAlpha;
    property public final int strokeLineCap;
    property public final int strokeLineJoin;
    property public final float strokeLineMiter;
    property public final float strokeLineWidth;
    property public final float trimPathEnd;
    property public final float trimPathOffset;
    property public final float trimPathStart;
  }

  public abstract sealed class VectorProperty<T> {
  }

  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
  }

  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
  }

  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
  }

  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
  }

  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
  }

  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
  }

  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
  }

  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
  }

  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
  }

  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
  }

  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
  }

  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
  }

  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
  }

  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
  }

  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
  }

  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
  }

}

package androidx.compose.ui.hapticfeedback {

  public interface HapticFeedback {
    method public void performHapticFeedback(int hapticFeedbackType);
  }

  @kotlin.jvm.JvmInline public final value class HapticFeedbackType {
    ctor public HapticFeedbackType(int value);
    field public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion Companion;
  }

  public static final class HapticFeedbackType.Companion {
    method public int getLongPress();
    method public int getTextHandleMove();
    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
    property public final int LongPress;
    property public final int TextHandleMove;
  }

}

package androidx.compose.ui.input {

  @kotlin.jvm.JvmInline public final value class InputMode {
    field public static final androidx.compose.ui.input.InputMode.Companion Companion;
  }

  public static final class InputMode.Companion {
    method public int getKeyboard();
    method public int getTouch();
    property public final int Keyboard;
    property public final int Touch;
  }

  public interface InputModeManager {
    method public int getInputMode();
    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean requestInputMode(int inputMode);
    property public abstract int inputMode;
  }

}

package androidx.compose.ui.input.key {

  @kotlin.jvm.JvmInline public final value class Key {
    ctor public Key(long keyCode);
    method public long getKeyCode();
    property public final long keyCode;
    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
  }

  public static final class Key.Companion {
    method public long getA();
    method public long getAllApps();
    method public long getAltLeft();
    method public long getAltRight();
    method public long getApostrophe();
    method public long getAppSwitch();
    method public long getAssist();
    method public long getAt();
    method public long getAvReceiverInput();
    method public long getAvReceiverPower();
    method public long getB();
    method public long getBack();
    method public long getBackslash();
    method public long getBackspace();
    method public long getBookmark();
    method public long getBreak();
    method public long getBrightnessDown();
    method public long getBrightnessUp();
    method public long getBrowser();
    method public long getButton1();
    method public long getButton10();
    method public long getButton11();
    method public long getButton12();
    method public long getButton13();
    method public long getButton14();
    method public long getButton15();
    method public long getButton16();
    method public long getButton2();
    method public long getButton3();
    method public long getButton4();
    method public long getButton5();
    method public long getButton6();
    method public long getButton7();
    method public long getButton8();
    method public long getButton9();
    method public long getButtonA();
    method public long getButtonB();
    method public long getButtonC();
    method public long getButtonL1();
    method public long getButtonL2();
    method public long getButtonMode();
    method public long getButtonR1();
    method public long getButtonR2();
    method public long getButtonSelect();
    method public long getButtonStart();
    method public long getButtonThumbLeft();
    method public long getButtonThumbRight();
    method public long getButtonX();
    method public long getButtonY();
    method public long getButtonZ();
    method public long getC();
    method public long getCalculator();
    method public long getCalendar();
    method public long getCall();
    method public long getCamera();
    method public long getCapsLock();
    method public long getCaptions();
    method public long getChannelDown();
    method public long getChannelUp();
    method public long getClear();
    method public long getComma();
    method public long getContacts();
    method public long getCopy();
    method public long getCtrlLeft();
    method public long getCtrlRight();
    method public long getCut();
    method public long getD();
    method public long getDelete();
    method public long getDirectionCenter();
    method public long getDirectionDown();
    method public long getDirectionDownLeft();
    method public long getDirectionDownRight();
    method public long getDirectionLeft();
    method public long getDirectionRight();
    method public long getDirectionUp();
    method public long getDirectionUpLeft();
    method public long getDirectionUpRight();
    method public long getDvr();
    method public long getE();
    method public long getEight();
    method public long getEisu();
    method public long getEndCall();
    method public long getEnter();
    method public long getEnvelope();
    method public long getEquals();
    method public long getEscape();
    method public long getF();
    method public long getF1();
    method public long getF10();
    method public long getF11();
    method public long getF12();
    method public long getF2();
    method public long getF3();
    method public long getF4();
    method public long getF5();
    method public long getF6();
    method public long getF7();
    method public long getF8();
    method public long getF9();
    method public long getFive();
    method public long getFocus();
    method public long getForward();
    method public long getFour();
    method public long getFunction();
    method public long getG();
    method public long getGrave();
    method public long getGuide();
    method public long getH();
    method public long getHeadsetHook();
    method public long getHelp();
    method public long getHenkan();
    method public long getHome();
    method public long getI();
    method public long getInfo();
    method public long getInsert();
    method public long getJ();
    method public long getK();
    method public long getKana();
    method public long getKatakanaHiragana();
    method public long getL();
    method public long getLanguageSwitch();
    method public long getLastChannel();
    method public long getLeftBracket();
    method public long getM();
    method public long getMannerMode();
    method public long getMediaAudioTrack();
    method public long getMediaClose();
    method public long getMediaEject();
    method public long getMediaFastForward();
    method public long getMediaNext();
    method public long getMediaPause();
    method public long getMediaPlay();
    method public long getMediaPlayPause();
    method public long getMediaPrevious();
    method public long getMediaRecord();
    method public long getMediaRewind();
    method public long getMediaSkipBackward();
    method public long getMediaSkipForward();
    method public long getMediaStepBackward();
    method public long getMediaStepForward();
    method public long getMediaStop();
    method public long getMediaTopMenu();
    method public long getMenu();
    method public long getMetaLeft();
    method public long getMetaRight();
    method public long getMicrophoneMute();
    method public long getMinus();
    method public long getMoveEnd();
    method public long getMoveHome();
    method public long getMuhenkan();
    method public long getMultiply();
    method public long getMusic();
    method public long getN();
    method public long getNavigateIn();
    method public long getNavigateNext();
    method public long getNavigateOut();
    method public long getNavigatePrevious();
    method public long getNine();
    method public long getNotification();
    method public long getNumLock();
    method public long getNumPad0();
    method public long getNumPad1();
    method public long getNumPad2();
    method public long getNumPad3();
    method public long getNumPad4();
    method public long getNumPad5();
    method public long getNumPad6();
    method public long getNumPad7();
    method public long getNumPad8();
    method public long getNumPad9();
    method public long getNumPadAdd();
    method public long getNumPadComma();
    method public long getNumPadDivide();
    method public long getNumPadDot();
    method public long getNumPadEnter();
    method public long getNumPadEquals();
    method public long getNumPadLeftParenthesis();
    method public long getNumPadMultiply();
    method public long getNumPadRightParenthesis();
    method public long getNumPadSubtract();
    method public long getNumber();
    method public long getO();
    method public long getOne();
    method public long getP();
    method public long getPageDown();
    method public long getPageUp();
    method public long getPairing();
    method public long getPaste();
    method public long getPeriod();
    method public long getPictureSymbols();
    method public long getPlus();
    method public long getPound();
    method public long getPower();
    method public long getPrintScreen();
    method public long getProfileSwitch();
    method public long getProgramBlue();
    method public long getProgramGreen();
    method public long getProgramRed();
    method public long getProgramYellow();
    method public long getQ();
    method public long getR();
    method public long getRefresh();
    method public long getRightBracket();
    method public long getRo();
    method public long getS();
    method public long getScrollLock();
    method public long getSearch();
    method public long getSemicolon();
    method public long getSetTopBoxInput();
    method public long getSetTopBoxPower();
    method public long getSettings();
    method public long getSeven();
    method public long getShiftLeft();
    method public long getShiftRight();
    method public long getSix();
    method public long getSlash();
    method public long getSleep();
    method public long getSoftLeft();
    method public long getSoftRight();
    method public long getSoftSleep();
    method public long getSpacebar();
    method public long getStem1();
    method public long getStem2();
    method public long getStem3();
    method public long getStemPrimary();
    method public long getSwitchCharset();
    method public long getSymbol();
    method public long getSystemNavigationDown();
    method public long getSystemNavigationLeft();
    method public long getSystemNavigationRight();
    method public long getSystemNavigationUp();
    method public long getT();
    method public long getTab();
    method public long getThree();
    method public long getThumbsDown();
    method public long getThumbsUp();
    method public long getToggle2D3D();
    method public long getTv();
    method public long getTvAntennaCable();
    method public long getTvAudioDescription();
    method public long getTvAudioDescriptionMixingVolumeDown();
    method public long getTvAudioDescriptionMixingVolumeUp();
    method public long getTvContentsMenu();
    method public long getTvDataService();
    method public long getTvInput();
    method public long getTvInputComponent1();
    method public long getTvInputComponent2();
    method public long getTvInputComposite1();
    method public long getTvInputComposite2();
    method public long getTvInputHdmi1();
    method public long getTvInputHdmi2();
    method public long getTvInputHdmi3();
    method public long getTvInputHdmi4();
    method public long getTvInputVga1();
    method public long getTvMediaContextMenu();
    method public long getTvNetwork();
    method public long getTvNumberEntry();
    method public long getTvPower();
    method public long getTvRadioService();
    method public long getTvSatellite();
    method public long getTvSatelliteBs();
    method public long getTvSatelliteCs();
    method public long getTvSatelliteService();
    method public long getTvTeletext();
    method public long getTvTerrestrialAnalog();
    method public long getTvTerrestrialDigital();
    method public long getTvTimerProgramming();
    method public long getTvZoomMode();
    method public long getTwo();
    method public long getU();
    method public long getUnknown();
    method public long getV();
    method public long getVoiceAssist();
    method public long getVolumeDown();
    method public long getVolumeMute();
    method public long getVolumeUp();
    method public long getW();
    method public long getWakeUp();
    method public long getWindow();
    method public long getX();
    method public long getY();
    method public long getYen();
    method public long getZ();
    method public long getZenkakuHankaru();
    method public long getZero();
    method public long getZoomIn();
    method public long getZoomOut();
    property public final long A;
    property public final long AllApps;
    property public final long AltLeft;
    property public final long AltRight;
    property public final long Apostrophe;
    property public final long AppSwitch;
    property public final long Assist;
    property public final long At;
    property public final long AvReceiverInput;
    property public final long AvReceiverPower;
    property public final long B;
    property public final long Back;
    property public final long Backslash;
    property public final long Backspace;
    property public final long Bookmark;
    property public final long Break;
    property public final long BrightnessDown;
    property public final long BrightnessUp;
    property public final long Browser;
    property public final long Button1;
    property public final long Button10;
    property public final long Button11;
    property public final long Button12;
    property public final long Button13;
    property public final long Button14;
    property public final long Button15;
    property public final long Button16;
    property public final long Button2;
    property public final long Button3;
    property public final long Button4;
    property public final long Button5;
    property public final long Button6;
    property public final long Button7;
    property public final long Button8;
    property public final long Button9;
    property public final long ButtonA;
    property public final long ButtonB;
    property public final long ButtonC;
    property public final long ButtonL1;
    property public final long ButtonL2;
    property public final long ButtonMode;
    property public final long ButtonR1;
    property public final long ButtonR2;
    property public final long ButtonSelect;
    property public final long ButtonStart;
    property public final long ButtonThumbLeft;
    property public final long ButtonThumbRight;
    property public final long ButtonX;
    property public final long ButtonY;
    property public final long ButtonZ;
    property public final long C;
    property public final long Calculator;
    property public final long Calendar;
    property public final long Call;
    property public final long Camera;
    property public final long CapsLock;
    property public final long Captions;
    property public final long ChannelDown;
    property public final long ChannelUp;
    property public final long Clear;
    property public final long Comma;
    property public final long Contacts;
    property public final long Copy;
    property public final long CtrlLeft;
    property public final long CtrlRight;
    property public final long Cut;
    property public final long D;
    property public final long Delete;
    property public final long DirectionCenter;
    property public final long DirectionDown;
    property public final long DirectionDownLeft;
    property public final long DirectionDownRight;
    property public final long DirectionLeft;
    property public final long DirectionRight;
    property public final long DirectionUp;
    property public final long DirectionUpLeft;
    property public final long DirectionUpRight;
    property public final long Dvr;
    property public final long E;
    property public final long Eight;
    property public final long Eisu;
    property public final long EndCall;
    property public final long Enter;
    property public final long Envelope;
    property public final long Equals;
    property public final long Escape;
    property public final long F;
    property public final long F1;
    property public final long F10;
    property public final long F11;
    property public final long F12;
    property public final long F2;
    property public final long F3;
    property public final long F4;
    property public final long F5;
    property public final long F6;
    property public final long F7;
    property public final long F8;
    property public final long F9;
    property public final long Five;
    property public final long Focus;
    property public final long Forward;
    property public final long Four;
    property public final long Function;
    property public final long G;
    property public final long Grave;
    property public final long Guide;
    property public final long H;
    property public final long HeadsetHook;
    property public final long Help;
    property public final long Henkan;
    property public final long Home;
    property public final long I;
    property public final long Info;
    property public final long Insert;
    property public final long J;
    property public final long K;
    property public final long Kana;
    property public final long KatakanaHiragana;
    property public final long L;
    property public final long LanguageSwitch;
    property public final long LastChannel;
    property public final long LeftBracket;
    property public final long M;
    property public final long MannerMode;
    property public final long MediaAudioTrack;
    property public final long MediaClose;
    property public final long MediaEject;
    property public final long MediaFastForward;
    property public final long MediaNext;
    property public final long MediaPause;
    property public final long MediaPlay;
    property public final long MediaPlayPause;
    property public final long MediaPrevious;
    property public final long MediaRecord;
    property public final long MediaRewind;
    property public final long MediaSkipBackward;
    property public final long MediaSkipForward;
    property public final long MediaStepBackward;
    property public final long MediaStepForward;
    property public final long MediaStop;
    property public final long MediaTopMenu;
    property public final long Menu;
    property public final long MetaLeft;
    property public final long MetaRight;
    property public final long MicrophoneMute;
    property public final long Minus;
    property public final long MoveEnd;
    property public final long MoveHome;
    property public final long Muhenkan;
    property public final long Multiply;
    property public final long Music;
    property public final long N;
    property public final long NavigateIn;
    property public final long NavigateNext;
    property public final long NavigateOut;
    property public final long NavigatePrevious;
    property public final long Nine;
    property public final long Notification;
    property public final long NumLock;
    property public final long NumPad0;
    property public final long NumPad1;
    property public final long NumPad2;
    property public final long NumPad3;
    property public final long NumPad4;
    property public final long NumPad5;
    property public final long NumPad6;
    property public final long NumPad7;
    property public final long NumPad8;
    property public final long NumPad9;
    property public final long NumPadAdd;
    property public final long NumPadComma;
    property public final long NumPadDivide;
    property public final long NumPadDot;
    property public final long NumPadEnter;
    property public final long NumPadEquals;
    property public final long NumPadLeftParenthesis;
    property public final long NumPadMultiply;
    property public final long NumPadRightParenthesis;
    property public final long NumPadSubtract;
    property public final long Number;
    property public final long O;
    property public final long One;
    property public final long P;
    property public final long PageDown;
    property public final long PageUp;
    property public final long Pairing;
    property public final long Paste;
    property public final long Period;
    property public final long PictureSymbols;
    property public final long Plus;
    property public final long Pound;
    property public final long Power;
    property public final long PrintScreen;
    property public final long ProfileSwitch;
    property public final long ProgramBlue;
    property public final long ProgramGreen;
    property public final long ProgramRed;
    property public final long ProgramYellow;
    property public final long Q;
    property public final long R;
    property public final long Refresh;
    property public final long RightBracket;
    property public final long Ro;
    property public final long S;
    property public final long ScrollLock;
    property public final long Search;
    property public final long Semicolon;
    property public final long SetTopBoxInput;
    property public final long SetTopBoxPower;
    property public final long Settings;
    property public final long Seven;
    property public final long ShiftLeft;
    property public final long ShiftRight;
    property public final long Six;
    property public final long Slash;
    property public final long Sleep;
    property public final long SoftLeft;
    property public final long SoftRight;
    property public final long SoftSleep;
    property public final long Spacebar;
    property public final long Stem1;
    property public final long Stem2;
    property public final long Stem3;
    property public final long StemPrimary;
    property public final long SwitchCharset;
    property public final long Symbol;
    property public final long SystemNavigationDown;
    property public final long SystemNavigationLeft;
    property public final long SystemNavigationRight;
    property public final long SystemNavigationUp;
    property public final long T;
    property public final long Tab;
    property public final long Three;
    property public final long ThumbsDown;
    property public final long ThumbsUp;
    property public final long Toggle2D3D;
    property public final long Tv;
    property public final long TvAntennaCable;
    property public final long TvAudioDescription;
    property public final long TvAudioDescriptionMixingVolumeDown;
    property public final long TvAudioDescriptionMixingVolumeUp;
    property public final long TvContentsMenu;
    property public final long TvDataService;
    property public final long TvInput;
    property public final long TvInputComponent1;
    property public final long TvInputComponent2;
    property public final long TvInputComposite1;
    property public final long TvInputComposite2;
    property public final long TvInputHdmi1;
    property public final long TvInputHdmi2;
    property public final long TvInputHdmi3;
    property public final long TvInputHdmi4;
    property public final long TvInputVga1;
    property public final long TvMediaContextMenu;
    property public final long TvNetwork;
    property public final long TvNumberEntry;
    property public final long TvPower;
    property public final long TvRadioService;
    property public final long TvSatellite;
    property public final long TvSatelliteBs;
    property public final long TvSatelliteCs;
    property public final long TvSatelliteService;
    property public final long TvTeletext;
    property public final long TvTerrestrialAnalog;
    property public final long TvTerrestrialDigital;
    property public final long TvTimerProgramming;
    property public final long TvZoomMode;
    property public final long Two;
    property public final long U;
    property public final long Unknown;
    property public final long V;
    property public final long VoiceAssist;
    property public final long VolumeDown;
    property public final long VolumeMute;
    property public final long VolumeUp;
    property public final long W;
    property public final long WakeUp;
    property public final long Window;
    property public final long X;
    property public final long Y;
    property public final long Yen;
    property public final long Z;
    property public final long ZenkakuHankaru;
    property public final long Zero;
    property public final long ZoomIn;
    property public final long ZoomOut;
  }

  @kotlin.jvm.JvmInline public final value class KeyEvent {
    ctor public KeyEvent(android.view.KeyEvent nativeKeyEvent);
    method public android.view.KeyEvent getNativeKeyEvent();
    property public final android.view.KeyEvent nativeKeyEvent;
  }

  @kotlin.jvm.JvmInline public final value class KeyEventType {
    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
  }

  public static final class KeyEventType.Companion {
    method public int getKeyDown();
    method public int getKeyUp();
    method public int getUnknown();
    property public final int KeyDown;
    property public final int KeyUp;
    property public final int Unknown;
  }

  public final class KeyEvent_androidKt {
    method public static long getKey(android.view.KeyEvent);
    method public static int getType(android.view.KeyEvent);
    method public static int getUtf16CodePoint(android.view.KeyEvent);
    method public static boolean isAltPressed(android.view.KeyEvent);
    method public static boolean isCtrlPressed(android.view.KeyEvent);
    method public static boolean isMetaPressed(android.view.KeyEvent);
    method public static boolean isShiftPressed(android.view.KeyEvent);
  }

  public final class KeyInputModifierKt {
    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
  }

  public interface KeyInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public boolean onKeyEvent(android.view.KeyEvent event);
    method public boolean onPreKeyEvent(android.view.KeyEvent event);
  }

  public final class Key_androidKt {
    method public static long Key(int nativeKeyCode);
    method public static int getNativeKeyCode(long);
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public interface SoftKeyboardInterceptionModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public boolean onInterceptKeyBeforeSoftKeyboard(android.view.KeyEvent event);
    method public boolean onPreInterceptKeyBeforeSoftKeyboard(android.view.KeyEvent event);
  }

  public final class SoftwareKeyboardInterceptionModifierKt {
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onInterceptKeyBeforeSoftKeyboard(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onInterceptKeyBeforeSoftKeyboard);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onPreInterceptKeyBeforeSoftKeyboard(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreInterceptKeyBeforeSoftKeyboard);
  }

}

package androidx.compose.ui.input.nestedscroll {

  @kotlin.jvm.JvmDefaultWithCompatibility public interface NestedScrollConnection {
    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public default long onPostScroll(long consumed, long available, int source);
    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public default long onPreScroll(long available, int source);
  }

  public final class NestedScrollDispatcher {
    ctor public NestedScrollDispatcher();
    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public long dispatchPostScroll(long consumed, long available, int source);
    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public long dispatchPreScroll(long available, int source);
    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
  }

  public final class NestedScrollModifierKt {
    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
  }

  public final class NestedScrollNodeKt {
    method public static androidx.compose.ui.node.DelegatableNode nestedScrollModifierNode(androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
  }

  @kotlin.jvm.JvmInline public final value class NestedScrollSource {
    field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
  }

  public static final class NestedScrollSource.Companion {
    method public int getDrag();
    method public int getFling();
    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public int getRelocate();
    property public final int Drag;
    property public final int Fling;
    property @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final int Relocate;
  }

}

package androidx.compose.ui.input.pointer {

  @kotlin.coroutines.RestrictsSuspension @kotlin.jvm.JvmDefaultWithCompatibility public interface AwaitPointerEventScope extends androidx.compose.ui.unit.Density {
    method public suspend Object? awaitPointerEvent(optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerEvent>);
    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
    method public default long getExtendedTouchPadding();
    method public long getSize();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
    property public default long extendedTouchPadding;
    property public abstract long size;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
  }

  @Deprecated public final class ConsumedData {
    ctor @Deprecated public ConsumedData(optional @Deprecated boolean positionChange, optional @Deprecated boolean downChange);
    method @Deprecated public boolean getDownChange();
    method @Deprecated public boolean getPositionChange();
    method @Deprecated public void setDownChange(boolean);
    method @Deprecated public void setPositionChange(boolean);
    property @Deprecated public final boolean downChange;
    property @Deprecated public final boolean positionChange;
  }

  @androidx.compose.runtime.Immutable @androidx.compose.ui.ExperimentalComposeUiApi public final class HistoricalChange {
    ctor public HistoricalChange(long uptimeMillis, long position);
    method public long getPosition();
    method public long getUptimeMillis();
    property public final long position;
    property public final long uptimeMillis;
  }

  @kotlin.jvm.JvmInline public final value class PointerButtons {
    ctor public PointerButtons(int packedValue);
  }

  public final class PointerEvent {
    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
    method public int getButtons();
    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
    method public int getKeyboardModifiers();
    method public int getType();
    property public final int buttons;
    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
    property public final int keyboardModifiers;
    property public final int type;
  }

  public final class PointerEventKt {
    method @Deprecated public static boolean anyChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToDown(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToDownIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToUp(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToUpIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static int indexOfFirstPressed(int);
    method public static int indexOfLastPressed(int);
    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
    method public static boolean isPressed(int, int buttonIndex);
    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean positionChanged(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean positionChangedIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
  }

  public enum PointerEventPass {
    method public static androidx.compose.ui.input.pointer.PointerEventPass valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method public static androidx.compose.ui.input.pointer.PointerEventPass[] values();
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
  }

  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
    ctor public PointerEventTimeoutCancellationException(long time);
  }

  @kotlin.jvm.JvmInline public final value class PointerEventType {
    field public static final androidx.compose.ui.input.pointer.PointerEventType.Companion Companion;
  }

  public static final class PointerEventType.Companion {
    method public int getEnter();
    method public int getExit();
    method public int getMove();
    method public int getPress();
    method public int getRelease();
    method public int getScroll();
    method public int getUnknown();
    property public final int Enter;
    property public final int Exit;
    property public final int Move;
    property public final int Press;
    property public final int Release;
    property public final int Scroll;
    property public final int Unknown;
  }

  public final class PointerEvent_androidKt {
    method public static boolean getAreAnyPressed(int);
    method public static int indexOfFirstPressed(int);
    method public static int indexOfLastPressed(int);
    method public static boolean isAltGraphPressed(int);
    method public static boolean isAltPressed(int);
    method public static boolean isBackPressed(int);
    method public static boolean isCapsLockOn(int);
    method public static boolean isCtrlPressed(int);
    method public static boolean isForwardPressed(int);
    method public static boolean isFunctionPressed(int);
    method public static boolean isMetaPressed(int);
    method public static boolean isNumLockOn(int);
    method public static boolean isPressed(int, int buttonIndex);
    method public static boolean isPrimaryPressed(int);
    method public static boolean isScrollLockOn(int);
    method public static boolean isSecondaryPressed(int);
    method public static boolean isShiftPressed(int);
    method public static boolean isSymPressed(int);
    method public static boolean isTertiaryPressed(int);
  }

  @androidx.compose.runtime.Stable public interface PointerIcon {
    field public static final androidx.compose.ui.input.pointer.PointerIcon.Companion Companion;
  }

  public static final class PointerIcon.Companion {
    method public androidx.compose.ui.input.pointer.PointerIcon getCrosshair();
    method public androidx.compose.ui.input.pointer.PointerIcon getDefault();
    method public androidx.compose.ui.input.pointer.PointerIcon getHand();
    method public androidx.compose.ui.input.pointer.PointerIcon getText();
    property public final androidx.compose.ui.input.pointer.PointerIcon Crosshair;
    property public final androidx.compose.ui.input.pointer.PointerIcon Default;
    property public final androidx.compose.ui.input.pointer.PointerIcon Hand;
    property public final androidx.compose.ui.input.pointer.PointerIcon Text;
  }

  public final class PointerIconKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
  }

  public final class PointerIcon_androidKt {
    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
  }

  @kotlin.jvm.JvmInline public final value class PointerId {
    ctor public PointerId(long value);
    method public long getValue();
    property public final long value;
  }

  @androidx.compose.runtime.Immutable public final class PointerInputChange {
    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, float pressure, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
    ctor @Deprecated public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
    method public void consume();
    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional long scrollDelta);
    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, optional long scrollDelta);
    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional float pressure, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional long scrollDelta);
    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical, optional long scrollDelta);
    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional float pressure, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical, optional long scrollDelta);
    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
    method @Deprecated public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
    method @androidx.compose.ui.ExperimentalComposeUiApi public java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> getHistorical();
    method public long getId();
    method public long getPosition();
    method public boolean getPressed();
    method public float getPressure();
    method public long getPreviousPosition();
    method public boolean getPreviousPressed();
    method public long getPreviousUptimeMillis();
    method public long getScrollDelta();
    method public int getType();
    method public long getUptimeMillis();
    method public boolean isConsumed();
    property @Deprecated public final androidx.compose.ui.input.pointer.ConsumedData consumed;
    property @androidx.compose.ui.ExperimentalComposeUiApi public final java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical;
    property public final long id;
    property public final boolean isConsumed;
    property public final long position;
    property public final boolean pressed;
    property public final float pressure;
    property public final long previousPosition;
    property public final boolean previousPressed;
    property public final long previousUptimeMillis;
    property public final long scrollDelta;
    property public final int type;
    property public final long uptimeMillis;
  }

  public abstract class PointerInputFilter {
    ctor public PointerInputFilter();
    method public boolean getInterceptOutOfBoundsChildEvents();
    method public boolean getShareWithSiblings();
    method public final long getSize();
    method public abstract void onCancel();
    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
    property public boolean interceptOutOfBoundsChildEvents;
    property public boolean shareWithSiblings;
    property public final long size;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface PointerInputModifier extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.input.pointer.PointerInputFilter getPointerInputFilter();
    property public abstract androidx.compose.ui.input.pointer.PointerInputFilter pointerInputFilter;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface PointerInputScope extends androidx.compose.ui.unit.Density {
    method public suspend <R> Object? awaitPointerEventScope(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
    method public default long getExtendedTouchPadding();
    method public default boolean getInterceptOutOfBoundsChildEvents();
    method public long getSize();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public default void setInterceptOutOfBoundsChildEvents(boolean);
    property public default long extendedTouchPadding;
    property public default boolean interceptOutOfBoundsChildEvents;
    property public abstract long size;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
  }

  public final class PointerInteropFilter_androidKt {
    method public static androidx.compose.ui.Modifier motionEventSpy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,kotlin.Unit> watcher);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier pointerInteropFilter(androidx.compose.ui.Modifier, optional androidx.compose.ui.input.pointer.RequestDisallowInterceptTouchEvent? requestDisallowInterceptTouchEvent, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,java.lang.Boolean> onTouchEvent);
  }

  @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
    ctor public PointerKeyboardModifiers(int packedValue);
  }

  @kotlin.jvm.JvmInline public final value class PointerType {
    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
  }

  public static final class PointerType.Companion {
    method public int getEraser();
    method public int getMouse();
    method public int getStylus();
    method public int getTouch();
    method public int getUnknown();
    property public final int Eraser;
    property public final int Mouse;
    property public final int Stylus;
    property public final int Touch;
    property public final int Unknown;
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
    ctor public RequestDisallowInterceptTouchEvent();
    method public void invoke(boolean disallowIntercept);
  }

  public final class SuspendingPointerInputFilterKt {
    method public static androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNode SuspendingPointerInputModifierNode(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> pointerInputHandler);
    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
  }

  public sealed interface SuspendingPointerInputModifierNode extends androidx.compose.ui.node.PointerInputModifierNode {
    method public kotlin.jvm.functions.Function2<androidx.compose.ui.input.pointer.PointerInputScope,kotlin.coroutines.Continuation<? super kotlin.Unit>,java.lang.Object> getPointerInputHandler();
    method public void resetPointerInputHandler();
    method public void setPointerInputHandler(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?>);
    property public abstract kotlin.jvm.functions.Function2<androidx.compose.ui.input.pointer.PointerInputScope,kotlin.coroutines.Continuation<? super kotlin.Unit>,java.lang.Object> pointerInputHandler;
  }

}

package androidx.compose.ui.input.pointer.util {

  public final class VelocityTracker {
    ctor public VelocityTracker();
    method public void addPosition(long timeMillis, long position);
    method public long calculateVelocity();
    method public void resetTracking();
  }

  public final class VelocityTracker1D {
    ctor public VelocityTracker1D(boolean isDataDifferential);
    method public void addDataPoint(long timeMillis, float dataPoint);
    method public float calculateVelocity();
    method public boolean isDataDifferential();
    method public void resetTracking();
    property public final boolean isDataDifferential;
  }

  public final class VelocityTrackerKt {
    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
  }

}

package androidx.compose.ui.input.rotary {

  public final class RotaryInputModifierKt {
    method public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
    method public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
  }

  public interface RotaryInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public boolean onPreRotaryScrollEvent(androidx.compose.ui.input.rotary.RotaryScrollEvent event);
    method public boolean onRotaryScrollEvent(androidx.compose.ui.input.rotary.RotaryScrollEvent event);
  }

  public final class RotaryScrollEvent {
    method public float getHorizontalScrollPixels();
    method public long getUptimeMillis();
    method public float getVerticalScrollPixels();
    property public final float horizontalScrollPixels;
    property public final long uptimeMillis;
    property public final float verticalScrollPixels;
  }

}

package androidx.compose.ui.layout {

  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
    field public static final int Unspecified = -2147483648; // 0x80000000
  }

  public static final class AlignmentLine.Companion {
  }

  public final class AlignmentLineKt {
    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
  }

  public interface BeyondBoundsLayout {
    method public <T> T? layout(int direction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope,? extends T> block);
  }

  public static interface BeyondBoundsLayout.BeyondBoundsScope {
    method public boolean getHasMoreContent();
    property public abstract boolean hasMoreContent;
  }

  @kotlin.jvm.JvmInline public static final value class BeyondBoundsLayout.LayoutDirection {
    field public static final androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion Companion;
  }

  public static final class BeyondBoundsLayout.LayoutDirection.Companion {
    method public int getAbove();
    method public int getAfter();
    method public int getBefore();
    method public int getBelow();
    method public int getLeft();
    method public int getRight();
    property public final int Above;
    property public final int After;
    property public final int Before;
    property public final int Below;
    property public final int Left;
    property public final int Right;
  }

  public final class BeyondBoundsLayoutKt {
    method public static androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> getModifierLocalBeyondBoundsLayout();
    property public static final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> ModifierLocalBeyondBoundsLayout;
  }

  @androidx.compose.runtime.Stable public interface ContentScale {
    method public long computeScaleFactor(long srcSize, long dstSize);
    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
  }

  public static final class ContentScale.Companion {
    method public androidx.compose.ui.layout.ContentScale getCrop();
    method public androidx.compose.ui.layout.ContentScale getFillBounds();
    method public androidx.compose.ui.layout.ContentScale getFillHeight();
    method public androidx.compose.ui.layout.ContentScale getFillWidth();
    method public androidx.compose.ui.layout.ContentScale getFit();
    method public androidx.compose.ui.layout.ContentScale getInside();
    method public androidx.compose.ui.layout.FixedScale getNone();
    property public final androidx.compose.ui.layout.ContentScale Crop;
    property public final androidx.compose.ui.layout.ContentScale FillBounds;
    property public final androidx.compose.ui.layout.ContentScale FillHeight;
    property public final androidx.compose.ui.layout.ContentScale FillWidth;
    property public final androidx.compose.ui.layout.ContentScale Fit;
    property public final androidx.compose.ui.layout.ContentScale Inside;
    property public final androidx.compose.ui.layout.FixedScale None;
  }

  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
    ctor public FixedScale(float value);
    method public float component1();
    method public long computeScaleFactor(long srcSize, long dstSize);
    method public androidx.compose.ui.layout.FixedScale copy(float value);
    method public float getValue();
    property public final float value;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicLayerInfo {
    method public long getLayerId();
    method public default long getOwnerViewId();
    property public abstract long layerId;
    property public default long ownerViewId;
  }

  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public sealed interface IntermediateMeasureScope extends androidx.compose.ui.layout.LookaheadScope kotlinx.coroutines.CoroutineScope androidx.compose.ui.layout.MeasureScope {
    method public long getLookaheadSize();
    property public abstract long lookaheadSize;
  }

  public interface IntrinsicMeasurable {
    method public Object? getParentData();
    method public int maxIntrinsicHeight(int width);
    method public int maxIntrinsicWidth(int height);
    method public int minIntrinsicHeight(int width);
    method public int minIntrinsicWidth(int height);
    property public abstract Object? parentData;
  }

  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method @androidx.compose.ui.ExperimentalComposeUiApi public default boolean isLookingAhead();
    property @androidx.compose.ui.ExperimentalComposeUiApi public default boolean isLookingAhead;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutCoordinates {
    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
    method public long getSize();
    method public boolean isAttached();
    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
    method public long localToRoot(long relativeToLocal);
    method public long localToWindow(long relativeToLocal);
    method public default void transformFrom(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, float[] matrix);
    method public long windowToLocal(long relativeToWindow);
    property public abstract boolean isAttached;
    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
    property public abstract long size;
  }

  public final class LayoutCoordinatesKt {
    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.layout.LayoutCoordinates findRootCoordinates(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
  }

  public final class LayoutIdKt {
    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
  }

  public interface LayoutIdParentData {
    method public Object getLayoutId();
    property public abstract Object layoutId;
  }

  public interface LayoutInfo {
    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
    method public androidx.compose.ui.unit.Density getDensity();
    method public int getHeight();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
    method public int getSemanticsId();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public int getWidth();
    method public boolean isAttached();
    method public boolean isPlaced();
    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract int height;
    property public abstract boolean isAttached;
    property public abstract boolean isPlaced;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
    property public abstract int semanticsId;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
    property public abstract int width;
  }

  public final class LayoutKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
  }

  public final class LayoutModifierKt {
    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
  }

  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public sealed interface LookaheadLayoutCoordinates extends androidx.compose.ui.layout.LayoutCoordinates {
  }

  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public interface LookaheadLayoutScope {
    method @Deprecated public androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.LookaheadLayoutCoordinates,? super androidx.compose.ui.layout.LookaheadLayoutCoordinates,kotlin.Unit> onPlaced);
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public interface LookaheadScope {
    method public androidx.compose.ui.layout.LayoutCoordinates getLookaheadScopeCoordinates(androidx.compose.ui.layout.Placeable.PlacementScope);
    method @Deprecated public default androidx.compose.ui.Modifier intermediateLayout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function4<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? super androidx.compose.ui.unit.IntSize,? extends androidx.compose.ui.layout.MeasureResult> measure);
    method public default long localLookaheadPositionOf(androidx.compose.ui.layout.LayoutCoordinates, androidx.compose.ui.layout.LayoutCoordinates coordinates);
    method @Deprecated public androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.LookaheadLayoutCoordinates,? super androidx.compose.ui.layout.LookaheadLayoutCoordinates,kotlin.Unit> onPlaced);
    method public androidx.compose.ui.layout.LayoutCoordinates toLookaheadCoordinates(androidx.compose.ui.layout.LayoutCoordinates);
  }

  public final class LookaheadScopeKt {
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi @androidx.compose.ui.UiComposable public static void LookaheadLayout(kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LookaheadScope,kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi @androidx.compose.ui.UiComposable public static void LookaheadScope(kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LookaheadScope,kotlin.Unit> content);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier intermediateLayout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.IntermediateMeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
  }

  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
    method public androidx.compose.ui.layout.Placeable measure(long constraints);
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public fun interface MeasurePolicy {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
  }

  public interface MeasureResult {
    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
    method public int getHeight();
    method public int getWidth();
    method public void placeChildren();
    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
    property public abstract int height;
    property public abstract int width;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface MeasureScope extends androidx.compose.ui.layout.IntrinsicMeasureScope {
    method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
  }

  public interface Measured {
    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public int getMeasuredHeight();
    method public int getMeasuredWidth();
    method public default Object? getParentData();
    property public abstract int measuredHeight;
    property public abstract int measuredWidth;
    property public default Object? parentData;
  }

  public final class ModifierInfo {
    ctor public ModifierInfo(androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.LayoutCoordinates coordinates, optional Object? extra);
    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
    method public Object? getExtra();
    method public androidx.compose.ui.Modifier getModifier();
    property public final androidx.compose.ui.layout.LayoutCoordinates coordinates;
    property public final Object? extra;
    property public final androidx.compose.ui.Modifier modifier;
  }

  @androidx.compose.runtime.Stable public fun interface MultiContentMeasurePolicy {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.Measurable>> measurables, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
  }

  public final class OnGloballyPositionedModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnPlacedModifier extends androidx.compose.ui.Modifier.Element {
    method public void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
  }

  public final class OnPlacedModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onPlaced);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
    method public void onRemeasured(long size);
  }

  public final class OnRemeasuredModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
  }

  @androidx.compose.runtime.Stable public interface PinnableContainer {
    method public androidx.compose.ui.layout.PinnableContainer.PinnedHandle pin();
  }

  public static fun interface PinnableContainer.PinnedHandle {
    method public void release();
  }

  public final class PinnableContainerKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> getLocalPinnableContainer();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> LocalPinnableContainer;
  }

  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
    ctor public Placeable();
    method protected final long getApparentToRealOffset();
    method public final int getHeight();
    method public int getMeasuredHeight();
    method protected final long getMeasuredSize();
    method public int getMeasuredWidth();
    method protected final long getMeasurementConstraints();
    method public final int getWidth();
    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
    method protected final void setMeasuredSize(long);
    method protected final void setMeasurementConstraints(long);
    property protected final long apparentToRealOffset;
    property public final int height;
    property public int measuredHeight;
    property protected final long measuredSize;
    property public int measuredWidth;
    property protected final long measurementConstraints;
    property public final int width;
  }

  public abstract static class Placeable.PlacementScope {
    ctor public Placeable.PlacementScope();
    method public androidx.compose.ui.layout.LayoutCoordinates? getCoordinates();
    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
    method protected abstract int getParentWidth();
    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    property public androidx.compose.ui.layout.LayoutCoordinates? coordinates;
    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
    property protected abstract int parentWidth;
  }

  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi @kotlin.jvm.JvmDefaultWithCompatibility public interface RelocationModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public androidx.compose.ui.geometry.Rect computeDestination(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
    method @Deprecated public suspend Object? performRelocation(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.geometry.Rect destination, kotlin.coroutines.Continuation<? super kotlin.Unit>);
  }

  public final class RelocationModifierKt {
    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onRelocationRequest(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> onProvideDestination, kotlin.jvm.functions.Function3<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.geometry.Rect,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPerformRelocation);
  }

  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final class RelocationRequester {
    ctor @Deprecated public RelocationRequester();
    method @Deprecated public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
  }

  public final class RelocationRequesterModifierKt {
    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier relocationRequester(androidx.compose.ui.Modifier, Object relocationRequester);
  }

  public interface Remeasurement {
    method public void forceRemeasure();
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScaleFactor {
    method @androidx.compose.runtime.Stable public inline operator float component1();
    method @androidx.compose.runtime.Stable public inline operator float component2();
    method public long copy(optional float scaleX, optional float scaleY);
    method @androidx.compose.runtime.Stable public operator long div(float operand);
    method public float getScaleX();
    method public float getScaleY();
    method @androidx.compose.runtime.Stable public operator long times(float operand);
    property @androidx.compose.runtime.Stable public final float scaleX;
    property @androidx.compose.runtime.Stable public final float scaleY;
    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
  }

  public static final class ScaleFactor.Companion {
    method public long getUnspecified();
    property public final long Unspecified;
  }

  public final class ScaleFactorKt {
    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
    method public static inline boolean isSpecified(long);
    method public static inline boolean isUnspecified(long);
    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
  }

  public final class SubcomposeLayoutKt {
    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
  }

  public final class SubcomposeLayoutState {
    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
    ctor public SubcomposeLayoutState();
    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
    method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public static interface SubcomposeLayoutState.PrecomposedSlotHandle {
    method public void dispose();
    method public default int getPlaceablesCount();
    method public default void premeasure(int index, long constraints);
    property public default int placeablesCount;
  }

  public interface SubcomposeMeasureScope extends androidx.compose.ui.layout.MeasureScope {
    method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public interface SubcomposeSlotReusePolicy {
    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
    method public void getSlotsToRetain(androidx.compose.ui.layout.SubcomposeSlotReusePolicy.SlotIdsSet slotIds);
  }

  public static final class SubcomposeSlotReusePolicy.SlotIdsSet implements java.util.Collection<java.lang.Object> kotlin.jvm.internal.markers.KMappedMarker {
    method public void clear();
    method public java.util.Iterator<java.lang.Object> iterator();
    method public boolean remove(Object? slotId);
    method public boolean removeAll(java.util.Collection<?> slotIds);
    method public boolean removeAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
    method public boolean retainAll(java.util.Collection<?> slotIds);
    method public boolean retainAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
  }

  public final class TestModifierUpdaterKt {
  }

  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

}

package androidx.compose.ui.modifier {

  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
  }

  public final class ModifierLocalConsumerKt {
    method @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier modifierLocalConsumer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.modifier.ModifierLocalReadScope,kotlin.Unit> consumer);
  }

  public final class ModifierLocalKt {
    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
  }

  public abstract sealed class ModifierLocalMap {
  }

  public interface ModifierLocalModifierNode extends androidx.compose.ui.modifier.ModifierLocalReadScope androidx.compose.ui.node.DelegatableNode {
    method public default <T> T getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
    method public default androidx.compose.ui.modifier.ModifierLocalMap getProvidedValues();
    method public default <T> void provide(androidx.compose.ui.modifier.ModifierLocal<T> key, T value);
    property public default androidx.compose.ui.modifier.ModifierLocalMap providedValues;
  }

  public final class ModifierLocalModifierNodeKt {
    method public static androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf();
    method public static <T> androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(androidx.compose.ui.modifier.ModifierLocal<T> key);
    method public static <T> androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(kotlin.Pair<? extends androidx.compose.ui.modifier.ModifierLocal<T>,? extends T> entry);
    method public static androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(androidx.compose.ui.modifier.ModifierLocal<?>... keys);
    method public static androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(kotlin.Pair<? extends androidx.compose.ui.modifier.ModifierLocal<?>,?>... entries);
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
    method public T getValue();
    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
    property public abstract T value;
  }

  public final class ModifierLocalProviderKt {
    method @androidx.compose.ui.ExperimentalComposeUiApi public static <T> androidx.compose.ui.Modifier modifierLocalProvider(androidx.compose.ui.Modifier, androidx.compose.ui.modifier.ProvidableModifierLocal<T> key, kotlin.jvm.functions.Function0<? extends T> value);
  }

  public interface ModifierLocalReadScope {
    method public <T> T getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
  }

  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
  }

}

package androidx.compose.ui.node {

  public interface CompositionLocalConsumerModifierNode extends androidx.compose.ui.node.DelegatableNode {
  }

  public final class CompositionLocalConsumerModifierNodeKt {
    method public static <T> T currentValueOf(androidx.compose.ui.node.CompositionLocalConsumerModifierNode, androidx.compose.runtime.CompositionLocal<T> local);
  }

  public interface DelegatableNode {
    method public androidx.compose.ui.Modifier.Node getNode();
    property public abstract androidx.compose.ui.Modifier.Node node;
  }

  public final class DelegatableNodeKt {
    method public static void invalidateSubtree(androidx.compose.ui.node.DelegatableNode);
    method public static androidx.compose.ui.unit.Density requireDensity(androidx.compose.ui.node.DelegatableNode);
    method public static androidx.compose.ui.unit.LayoutDirection requireLayoutDirection(androidx.compose.ui.node.DelegatableNode);
  }

  public abstract class DelegatingNode extends androidx.compose.ui.Modifier.Node {
    ctor public DelegatingNode();
    method protected final <T extends androidx.compose.ui.node.DelegatableNode> T delegate(T delegatableNode);
    method protected final void undelegate(androidx.compose.ui.node.DelegatableNode instance);
  }

  public interface DrawModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
    method public default void onMeasureResultChanged();
  }

  public final class DrawModifierNodeKt {
    method public static void invalidateDraw(androidx.compose.ui.node.DrawModifierNode);
  }

  public interface GlobalPositionAwareModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
  }

  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InternalCoreApi {
  }

  @androidx.compose.ui.InternalComposeUiApi public sealed interface InteroperableComposeUiNode {
    method public android.view.View? getInteropView();
  }

  public interface LayoutAwareModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public default void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
    method public default void onRemeasured(long size);
  }

  public interface LayoutModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
  }

  public final class LayoutModifierNodeKt {
    method public static void invalidateLayer(androidx.compose.ui.node.LayoutModifierNode);
    method public static void invalidateMeasurement(androidx.compose.ui.node.LayoutModifierNode);
    method public static void invalidatePlacement(androidx.compose.ui.node.LayoutModifierNode);
    method public static void remeasureSync(androidx.compose.ui.node.LayoutModifierNode);
  }

  public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> implements androidx.compose.ui.platform.InspectableValue androidx.compose.ui.Modifier.Element {
    ctor public ModifierNodeElement();
    method public abstract N create();
    method public abstract boolean equals(Object? other);
    method public final kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
    method public final String? getNameFallback();
    method public final Object? getValueOverride();
    method public abstract int hashCode();
    method public void inspectableProperties(androidx.compose.ui.platform.InspectorInfo);
    method public abstract void update(N node);
    property public final kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
    property public final String? nameFallback;
    property public final Object? valueOverride;
  }

  public interface ObserverModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public void onObservedReadsChanged();
  }

  public final class ObserverModifierNodeKt {
    method public static <T extends androidx.compose.ui.Modifier.Node & androidx.compose.ui.node.ObserverModifierNode> void observeReads(T, kotlin.jvm.functions.Function0<kotlin.Unit> block);
  }

  public interface ParentDataModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
  }

  public final class ParentDataModifierNodeKt {
    method public static void invalidateParentData(androidx.compose.ui.node.ParentDataModifierNode);
  }

  public interface PointerInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public default boolean interceptOutOfBoundsChildEvents();
    method public void onCancelPointerInput();
    method public default void onDensityChange();
    method public void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
    method public default void onViewConfigurationChange();
    method public default boolean sharePointerInputWithSiblings();
  }

  public final class Ref<T> {
    ctor public Ref();
    method public T? getValue();
    method public void setValue(T?);
    property public final T? value;
  }

  public interface RootForTest {
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
    method @androidx.compose.ui.ExperimentalComposeUiApi public default void measureAndLayoutForTest();
    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
  }

  public interface SemanticsModifierNode extends androidx.compose.ui.node.DelegatableNode {
    method public void applySemantics(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public default boolean getShouldClearDescendantSemantics();
    method public default boolean getShouldMergeDescendantSemantics();
    property public default boolean shouldClearDescendantSemantics;
    property public default boolean shouldMergeDescendantSemantics;
  }

  public final class SemanticsModifierNodeKt {
    method public static void invalidateSemantics(androidx.compose.ui.node.SemanticsModifierNode);
  }

}

package androidx.compose.ui.platform {

  public abstract class AbstractComposeView extends android.view.ViewGroup {
    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
    ctor public AbstractComposeView(android.content.Context context);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public abstract void Content();
    method public final void createComposition();
    method public final void disposeComposition();
    method public final boolean getHasComposition();
    method protected boolean getShouldCreateCompositionOnAttachedToWindow();
    method public final boolean getShowLayoutBounds();
    method protected final void onLayout(boolean changed, int left, int top, int right, int bottom);
    method protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
    method public final void setParentCompositionContext(androidx.compose.runtime.CompositionContext? parent);
    method public final void setShowLayoutBounds(boolean);
    method public final void setViewCompositionStrategy(androidx.compose.ui.platform.ViewCompositionStrategy strategy);
    property public final boolean hasComposition;
    property protected boolean shouldCreateCompositionOnAttachedToWindow;
    property public final boolean showLayoutBounds;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface AccessibilityManager {
    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
  }

  public final class AndroidCompositionLocals_androidKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
  }

  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
    method public android.view.Choreographer getChoreographer();
    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
    property public final android.view.Choreographer choreographer;
    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
  }

  public static final class AndroidUiDispatcher.Companion {
    method public kotlin.coroutines.CoroutineContext getCurrentThread();
    method public kotlin.coroutines.CoroutineContext getMain();
    property public final kotlin.coroutines.CoroutineContext CurrentThread;
    property public final kotlin.coroutines.CoroutineContext Main;
  }

  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
    method public android.view.Choreographer getChoreographer();
    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
    property public final android.view.Choreographer choreographer;
  }

  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
    ctor public AndroidUriHandler(android.content.Context context);
    method public void openUri(String uri);
  }

  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
    method public long getDoubleTapMinTimeMillis();
    method public long getDoubleTapTimeoutMillis();
    method public long getLongPressTimeoutMillis();
    method public float getTouchSlop();
    property public long doubleTapMinTimeMillis;
    property public long doubleTapTimeoutMillis;
    property public long longPressTimeoutMillis;
    property public float touchSlop;
  }

  public interface ClipboardManager {
    method public androidx.compose.ui.text.AnnotatedString? getText();
    method public default boolean hasText();
    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
  }

  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
    ctor public ComposeView(android.content.Context context);
    method @androidx.compose.runtime.Composable public void Content();
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
    property protected boolean shouldCreateCompositionOnAttachedToWindow;
  }

  public final class CompositionLocalsKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> getLocalAutofill();
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> getLocalAutofillTree();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> getLocalFontFamilyResolver();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
    method @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.PlatformTextInputPluginRegistry> getLocalPlatformTextInputPluginRegistry();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> LocalAutofill;
    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> LocalAutofillTree;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> LocalFontFamilyResolver;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
    property @androidx.compose.ui.text.ExperimentalTextApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.PlatformTextInputPluginRegistry> LocalPlatformTextInputPluginRegistry;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface InfiniteAnimationPolicy extends kotlin.coroutines.CoroutineContext.Element {
    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
    method public suspend <R> Object? onInfiniteOperation(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
  }

  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
  }

  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
    property public final androidx.compose.ui.platform.InspectableModifier.End end;
  }

  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
    ctor public InspectableModifier.End();
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface InspectableValue {
    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
    method public default String? getNameFallback();
    method public default Object? getValueOverride();
    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
    property public default String? nameFallback;
    property public default Object? valueOverride;
  }

  public final class InspectableValueKt {
    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method public static boolean isDebugInspectorInfoEnabled();
    method public static void setDebugInspectorInfoEnabled(boolean);
    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
    property public static final boolean isDebugInspectorInfoEnabled;
  }

  public final class InspectionModeKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
  }

  public final class InspectorInfo {
    ctor public InspectorInfo();
    method public String? getName();
    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
    method public Object? getValue();
    method public void setName(String?);
    method public void setValue(Object?);
    property public final String? name;
    property public final androidx.compose.ui.platform.ValueElementSequence properties;
    property public final Object? value;
  }

  public abstract class InspectorValueInfo implements androidx.compose.ui.platform.InspectableValue {
    ctor public InspectorValueInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> info);
    property public kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
    property public String? nameFallback;
    property public Object? valueOverride;
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public final class LocalSoftwareKeyboardController {
    method @androidx.compose.runtime.Composable public androidx.compose.ui.platform.SoftwareKeyboardController? getCurrent();
    method public infix androidx.compose.runtime.ProvidedValue<androidx.compose.ui.platform.SoftwareKeyboardController> provides(androidx.compose.ui.platform.SoftwareKeyboardController softwareKeyboardController);
    property @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi public final androidx.compose.ui.platform.SoftwareKeyboardController? current;
    field public static final androidx.compose.ui.platform.LocalSoftwareKeyboardController INSTANCE;
  }

  public final class NestedScrollInteropConnectionKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
  }

  @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public interface SoftwareKeyboardController {
    method public void hide();
    method @Deprecated public default void hideSoftwareKeyboard();
    method public void show();
    method @Deprecated public default void showSoftwareKeyboard();
  }

  public final class TestTagKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface TextToolbar {
    method public androidx.compose.ui.platform.TextToolbarStatus getStatus();
    method public void hide();
    method public void showMenu(androidx.compose.ui.geometry.Rect rect, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCopyRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onPasteRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCutRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onSelectAllRequested);
    property public abstract androidx.compose.ui.platform.TextToolbarStatus status;
  }

  public enum TextToolbarStatus {
    method public static androidx.compose.ui.platform.TextToolbarStatus valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method public static androidx.compose.ui.platform.TextToolbarStatus[] values();
    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Hidden;
    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Shown;
  }

  public interface UriHandler {
    method public void openUri(String uri);
  }

  public final class ValueElement {
    ctor public ValueElement(String name, Object? value);
    method public String component1();
    method public Object? component2();
    method public androidx.compose.ui.platform.ValueElement copy(String name, Object? value);
    method public String getName();
    method public Object? getValue();
    property public final String name;
    property public final Object? value;
  }

  public final class ValueElementSequence implements kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> {
    ctor public ValueElementSequence();
    method public java.util.Iterator<androidx.compose.ui.platform.ValueElement> iterator();
    method public operator void set(String name, Object? value);
  }

  public interface ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.Companion Companion;
  }

  public static final class ViewCompositionStrategy.Companion {
    method public androidx.compose.ui.platform.ViewCompositionStrategy getDefault();
    property public final androidx.compose.ui.platform.ViewCompositionStrategy Default;
  }

  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindow implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindow INSTANCE;
  }

  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool INSTANCE;
  }

  public static final class ViewCompositionStrategy.DisposeOnLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.Lifecycle lifecycle);
    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.LifecycleOwner lifecycleOwner);
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
  }

  public static final class ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
    method public long getDoubleTapMinTimeMillis();
    method public long getDoubleTapTimeoutMillis();
    method public long getLongPressTimeoutMillis();
    method public default long getMinimumTouchTargetSize();
    method public float getTouchSlop();
    property public abstract long doubleTapMinTimeMillis;
    property public abstract long doubleTapTimeoutMillis;
    property public abstract long longPressTimeoutMillis;
    property public default long minimumTouchTargetSize;
    property public abstract float touchSlop;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewRootForInspector {
    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
    method public default android.view.View? getViewRoot();
    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
    property public default android.view.View? viewRoot;
  }

  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
    method public boolean getHasPendingMeasureOrLayout();
    method public android.view.View getView();
    method public void invalidateDescendants();
    method public boolean isLifecycleInResumedState();
    property public abstract boolean hasPendingMeasureOrLayout;
    property public abstract boolean isLifecycleInResumedState;
    property public abstract android.view.View view;
    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
  }

  public static final class ViewRootForTest.Companion {
    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>?);
    property public final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback;
  }

  @androidx.compose.runtime.Stable public interface WindowInfo {
    method @androidx.compose.ui.ExperimentalComposeUiApi public default int getKeyboardModifiers();
    method public boolean isWindowFocused();
    property public abstract boolean isWindowFocused;
    property @androidx.compose.ui.ExperimentalComposeUiApi public default int keyboardModifiers;
  }

  @androidx.compose.ui.InternalComposeUiApi public fun interface WindowRecomposerFactory {
    method public androidx.compose.runtime.Recomposer createRecomposer(android.view.View windowRootView);
    field public static final androidx.compose.ui.platform.WindowRecomposerFactory.Companion Companion;
  }

  public static final class WindowRecomposerFactory.Companion {
    method public androidx.compose.ui.platform.WindowRecomposerFactory getLifecycleAware();
    property public final androidx.compose.ui.platform.WindowRecomposerFactory LifecycleAware;
  }

  @androidx.compose.ui.InternalComposeUiApi public final class WindowRecomposerPolicy {
    method public void setFactory(androidx.compose.ui.platform.WindowRecomposerFactory factory);
    method public inline <R> R withFactory(androidx.compose.ui.platform.WindowRecomposerFactory factory, kotlin.jvm.functions.Function0<? extends R> block);
    field public static final androidx.compose.ui.platform.WindowRecomposerPolicy INSTANCE;
  }

  public final class WindowRecomposer_androidKt {
    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.Recomposer createLifecycleAwareWindowRecomposer(android.view.View, optional kotlin.coroutines.CoroutineContext coroutineContext, optional androidx.lifecycle.Lifecycle? lifecycle);
    method public static androidx.compose.runtime.CompositionContext? findViewTreeCompositionContext(android.view.View);
    method public static androidx.compose.runtime.CompositionContext? getCompositionContext(android.view.View);
    method public static void setCompositionContext(android.view.View, androidx.compose.runtime.CompositionContext?);
  }

}

package androidx.compose.ui.res {

  public final class ColorResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
  }

  public final class FontResources_androidKt {
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.ui.text.font.Typeface fontResource(androidx.compose.ui.text.font.FontFamily fontFamily);
  }

  public final class ImageResources_androidKt {
    method public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, android.content.res.Resources res, @DrawableRes int id);
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, @DrawableRes int id);
  }

  public final class PainterResources_androidKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.painter.Painter painterResource(@DrawableRes int id);
  }

  public final class PrimitiveResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean booleanResource(@BoolRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static float dimensionResource(@DimenRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int[] integerArrayResource(@ArrayRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
  }

  public final class StringResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
  }

  public final class VectorResources_androidKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
  }

}

package androidx.compose.ui.semantics {

  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
    ctor public AccessibilityAction(String? label, T? action);
    method public T? getAction();
    method public String? getLabel();
    property public final T? action;
    property public final String? label;
  }

  public final class CollectionInfo {
    ctor public CollectionInfo(int rowCount, int columnCount);
    method public int getColumnCount();
    method public int getRowCount();
    property public final int columnCount;
    property public final int rowCount;
  }

  public final class CollectionItemInfo {
    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
    method public int getColumnIndex();
    method public int getColumnSpan();
    method public int getRowIndex();
    method public int getRowSpan();
    property public final int columnIndex;
    property public final int columnSpan;
    property public final int rowIndex;
    property public final int rowSpan;
  }

  public final class CustomAccessibilityAction {
    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
    method public String getLabel();
    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
    property public final String label;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LiveRegionMode {
    field public static final androidx.compose.ui.semantics.LiveRegionMode.Companion Companion;
  }

  public static final class LiveRegionMode.Companion {
    method public int getAssertive();
    method public int getPolite();
    property public final int Assertive;
    property public final int Polite;
  }

  public final class ProgressBarRangeInfo {
    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
    method public float getCurrent();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
    method public int getSteps();
    property public final float current;
    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
    property public final int steps;
    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
  }

  public static final class ProgressBarRangeInfo.Companion {
    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Role {
    field public static final androidx.compose.ui.semantics.Role.Companion Companion;
  }

  public static final class Role.Companion {
    method public int getButton();
    method public int getCheckbox();
    method public int getDropdownList();
    method public int getImage();
    method public int getRadioButton();
    method public int getSwitch();
    method public int getTab();
    property public final int Button;
    property public final int Checkbox;
    property public final int DropdownList;
    property public final int Image;
    property public final int RadioButton;
    property public final int Switch;
    property public final int Tab;
  }

  public final class ScrollAxisRange {
    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
    method public boolean getReverseScrolling();
    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
    property public final boolean reverseScrolling;
    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
  }

  public final class SemanticsActions {
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getInsertTextAtCursor();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageDown();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageLeft();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageRight();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageUp();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPerformImeAction();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getRequestFocus();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> getScrollToIndex();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> InsertTextAtCursor;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageDown;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageLeft;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageRight;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageUp;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PasteText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PerformImeAction;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> RequestFocus;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> ScrollToIndex;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> SetSelection;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> SetText;
    field public static final androidx.compose.ui.semantics.SemanticsActions INSTANCE;
  }

  public final class SemanticsConfiguration implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.compose.ui.semantics.SemanticsPropertyKey<?>,?>> kotlin.jvm.internal.markers.KMappedMarker androidx.compose.ui.semantics.SemanticsPropertyReceiver {
    ctor public SemanticsConfiguration();
    method public operator <T> boolean contains(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
    method public androidx.compose.ui.semantics.SemanticsConfiguration copy();
    method public operator <T> T get(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
    method public <T> T getOrElse(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public <T> T? getOrElseNullable(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public boolean isClearingSemantics();
    method public boolean isMergingSemanticsOfDescendants();
    method public java.util.Iterator<java.util.Map.Entry<androidx.compose.ui.semantics.SemanticsPropertyKey<?>,java.lang.Object>> iterator();
    method public <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T value);
    method public void setClearingSemantics(boolean);
    method public void setMergingSemanticsOfDescendants(boolean);
    property public final boolean isClearingSemantics;
    property public final boolean isMergingSemanticsOfDescendants;
  }

  public final class SemanticsConfigurationKt {
    method public static <T> T? getOrNull(androidx.compose.ui.semantics.SemanticsConfiguration, androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public default int getId();
    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
    property @Deprecated public default int id;
    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
  }

  public final class SemanticsModifierKt {
    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
  }

  public final class SemanticsNode {
    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
    method public int getId();
    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
    method public boolean getMergingEnabled();
    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
    method public long getPositionInRoot();
    method public long getPositionInWindow();
    method public androidx.compose.ui.node.RootForTest? getRoot();
    method public long getSize();
    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
    method public boolean isRoot();
    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
    property public final int id;
    property public final boolean isRoot;
    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
    property public final boolean mergingEnabled;
    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
    property public final long positionInRoot;
    property public final long positionInWindow;
    property public final androidx.compose.ui.node.RootForTest? root;
    property public final long size;
    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
  }

  public final class SemanticsOwner {
    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
  }

  public final class SemanticsOwnerKt {
    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
  }

  public final class SemanticsProperties {
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
    method @Deprecated public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsContainer();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsTraversalGroup();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Float> getTraversalIndex();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
    property @Deprecated public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsContainer;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsTraversalGroup;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Float> TraversalIndex;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
  }

  @androidx.compose.ui.ExperimentalComposeUiApi public final class SemanticsPropertiesAndroid {
    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getTestTagsAsResourceId();
    property @androidx.compose.ui.ExperimentalComposeUiApi public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> TestTagsAsResourceId;
    field public static final androidx.compose.ui.semantics.SemanticsPropertiesAndroid INSTANCE;
  }

  public final class SemanticsPropertiesKt {
    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static float getTraversalIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
    method public static void insertTextAtCursor(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invisibleToUser(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method @Deprecated public static boolean isContainer(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean isTraversalGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void pageDown(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void pageLeft(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void pageRight(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void pageUp(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void performImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void requestFocus(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void scrollBy(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean>? action);
    method public static void scrollToIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> action);
    method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo);
    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo);
    method @Deprecated public static void setContainer(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>);
    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setProgress(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean>? action);
    method public static void setProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ProgressBarRangeInfo);
    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
    method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long);
    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState);
    method public static void setTraversalGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setTraversalIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver, float);
    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
  }

  public final class SemanticsProperties_androidKt {
    method @androidx.compose.ui.ExperimentalComposeUiApi public static boolean getTestTagsAsResourceId(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method @androidx.compose.ui.ExperimentalComposeUiApi public static void setTestTagsAsResourceId(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
  }

  public final class SemanticsPropertyKey<T> {
    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
    method public String getName();
    method public operator T getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
    method public T? merge(T? parentValue, T childValue);
    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T value);
    property public final String name;
  }

  public interface SemanticsPropertyReceiver {
    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T value);
  }

}

package androidx.compose.ui.state {

  public enum ToggleableState {
    method public static androidx.compose.ui.state.ToggleableState valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method public static androidx.compose.ui.state.ToggleableState[] values();
    enum_constant public static final androidx.compose.ui.state.ToggleableState Indeterminate;
    enum_constant public static final androidx.compose.ui.state.ToggleableState Off;
    enum_constant public static final androidx.compose.ui.state.ToggleableState On;
  }

  public final class ToggleableStateKt {
    method public static androidx.compose.ui.state.ToggleableState ToggleableState(boolean value);
  }

}

package androidx.compose.ui.text {

  public final class TextMeasurerHelperKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.text.TextMeasurer rememberTextMeasurer(optional int cacheSize);
  }

}

package androidx.compose.ui.viewinterop {

  public final class AndroidView_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? onReset, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onRelease, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
  }

}

package androidx.compose.ui.window {

  public final class AndroidDialog_androidKt {
    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public final class AndroidPopup_androidKt {
    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
  }

  @androidx.compose.runtime.Immutable public final class DialogProperties {
    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean usePlatformDefaultWidth, optional boolean decorFitsSystemWindows);
    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
    method public boolean getDecorFitsSystemWindows();
    method public boolean getDismissOnBackPress();
    method public boolean getDismissOnClickOutside();
    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
    method public boolean getUsePlatformDefaultWidth();
    property public final boolean decorFitsSystemWindows;
    property public final boolean dismissOnBackPress;
    property public final boolean dismissOnClickOutside;
    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
    property public final boolean usePlatformDefaultWidth;
  }

  public interface DialogWindowProvider {
    method public android.view.Window getWindow();
    property public abstract android.view.Window window;
  }

  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
  }

  @androidx.compose.runtime.Immutable public final class PopupProperties {
    ctor @androidx.compose.ui.ExperimentalComposeUiApi public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled, optional boolean usePlatformDefaultWidth);
    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
    method public boolean getClippingEnabled();
    method public boolean getDismissOnBackPress();
    method public boolean getDismissOnClickOutside();
    method public boolean getExcludeFromSystemGesture();
    method public boolean getFocusable();
    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
    method public boolean getUsePlatformDefaultWidth();
    property public final boolean clippingEnabled;
    property public final boolean dismissOnBackPress;
    property public final boolean dismissOnClickOutside;
    property public final boolean excludeFromSystemGesture;
    property public final boolean focusable;
    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
    property public final boolean usePlatformDefaultWidth;
  }

  public enum SecureFlagPolicy {
    method public static androidx.compose.ui.window.SecureFlagPolicy valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method public static androidx.compose.ui.window.SecureFlagPolicy[] values();
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy Inherit;
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOff;
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
  }

}

