// Signature format: 3.0
package androidx.ui.unit {

  @androidx.compose.Immutable public final class Bounds {
    ctor public Bounds(androidx.ui.unit.Dp left, androidx.ui.unit.Dp top, androidx.ui.unit.Dp right, androidx.ui.unit.Dp bottom);
    method public androidx.ui.unit.Dp component1();
    method public androidx.ui.unit.Dp component2();
    method public androidx.ui.unit.Dp component3();
    method public androidx.ui.unit.Dp component4();
    method @androidx.compose.Immutable public androidx.ui.unit.Bounds copy(androidx.ui.unit.Dp left, androidx.ui.unit.Dp top, androidx.ui.unit.Dp right, androidx.ui.unit.Dp bottom);
    method public androidx.ui.unit.Dp getBottom();
    method public androidx.ui.unit.Dp getLeft();
    method public androidx.ui.unit.Dp getRight();
    method public androidx.ui.unit.Dp getTop();
  }

  public interface Density {
    method public float getDensity();
    method public float getFontScale();
    method public default androidx.ui.unit.Dp toDp(float);
    method public default androidx.ui.unit.Dp toDp(int);
    method public default androidx.ui.unit.Dp toDp-NgWp0Z8(float);
    method public default androidx.ui.unit.Dp toDp-gshw56o(int);
    method public default androidx.ui.unit.Dp toDp-vVlMl6k(long);
    method public default int toIntPx(androidx.ui.unit.Dp);
    method public default int toIntPx-vVlMl6k(long);
    method public default float toPx(androidx.ui.unit.Dp);
    method public default androidx.ui.unit.PxSize toPx-kAYDl8w(long);
    method public default float toPx-vVlMl6k(long);
    method public default androidx.ui.geometry.Rect toRect(androidx.ui.unit.Bounds);
    method public default long toSp(androidx.ui.unit.Dp);
    method public default long toSp(float);
    method public default long toSp(int);
    method public default long toSp-NgWp0Z8(float);
    method public default long toSp-gshw56o(int);
    property public abstract float density;
    property public abstract float fontScale;
  }

  public final class DensityKt {
    method public static androidx.ui.unit.Density Density(android.content.Context context);
    method public static androidx.ui.unit.Density Density(float density, float fontScale = 1f);
  }

  @androidx.compose.Immutable public final class Dp implements java.lang.Comparable<androidx.ui.unit.Dp> {
    ctor public Dp(float value);
    method public operator int compareTo(androidx.ui.unit.Dp other);
    method public float component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Dp copy(float value);
    method public inline operator androidx.ui.unit.Dp div(float other);
    method public inline operator androidx.ui.unit.Dp div(int other);
    method public inline operator float div(androidx.ui.unit.Dp other);
    method public inline operator float div-x8crYZs(float other);
    method public float getValue();
    method public inline operator androidx.ui.unit.Dp minus(androidx.ui.unit.Dp other);
    method public inline operator androidx.ui.unit.Dp plus(androidx.ui.unit.Dp other);
    method public inline operator androidx.ui.unit.Dp times(float other);
    method public inline operator androidx.ui.unit.Dp times(int other);
    method public inline operator float times(androidx.ui.unit.Dp other);
    method public inline operator float times-x8crYZs(float other);
    method public inline operator androidx.ui.unit.Dp unaryMinus();
    field public static final androidx.ui.unit.Dp.Companion Companion;
  }

  public static final class Dp.Companion {
    method public androidx.ui.unit.Dp getHairline();
    method public androidx.ui.unit.Dp getInfinity();
    method public androidx.ui.unit.Dp getUnspecified();
    property public final androidx.ui.unit.Dp Hairline;
    property public final androidx.ui.unit.Dp Infinity;
    property public final androidx.ui.unit.Dp Unspecified;
  }

  @androidx.compose.Immutable public final inline class DpCubed implements java.lang.Comparable<androidx.ui.unit.DpCubed> {
    ctor public DpCubed();
    method public operator int compareTo-JDqhs2g(float p);
    method public static operator int compareTo-JDqhs2g(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-JDqhs2g(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method public static inline operator float div-impl(float $this, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method public static inline operator float minus-JDqhs2g(float $this, float dimension);
    method public static inline operator float plus-JDqhs2g(float $this, float dimension);
    method public static inline operator float times-impl(float $this, float other);
    method public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class DpInverse implements java.lang.Comparable<androidx.ui.unit.DpInverse> {
    ctor public DpInverse();
    method public operator int compareTo-_K2iRR8(float p);
    method public static operator int compareTo-_K2iRR8(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method public static inline operator float minus-_K2iRR8(float $this, float dimension);
    method public static inline operator float plus-_K2iRR8(float $this, float dimension);
    method public static inline operator float times-JDqhs2g(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static inline operator float times-impl(float $this, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp times-x8crYZs(float $this, float other);
    method public static String toString-impl(float $this);
  }

  public final class DpKt {
    method public static inline long Position(androidx.ui.unit.Dp x, androidx.ui.unit.Dp y);
    method public static inline long Size(androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
    method public static long center-kAYDl8w(long);
    method public static inline androidx.ui.unit.Dp coerceAtLeast(androidx.ui.unit.Dp, androidx.ui.unit.Dp minimumValue);
    method public static inline androidx.ui.unit.Dp coerceAtMost(androidx.ui.unit.Dp, androidx.ui.unit.Dp maximumValue);
    method public static inline androidx.ui.unit.Dp coerceIn(androidx.ui.unit.Dp, androidx.ui.unit.Dp minimumValue, androidx.ui.unit.Dp maximumValue);
    method public static inline operator float div(float, androidx.ui.unit.Dp other);
    method public static inline operator float div(double, androidx.ui.unit.Dp other);
    method public static inline operator float div(int, androidx.ui.unit.Dp other);
    method public static androidx.ui.unit.Dp getDistance-T8eBu-w(long);
    method public static inline androidx.ui.unit.Dp getDp(int);
    method public static inline androidx.ui.unit.Dp getDp(double);
    method public static inline androidx.ui.unit.Dp getDp(float);
    method public static inline androidx.ui.unit.Dp getHeight(androidx.ui.unit.Bounds);
    method public static inline androidx.ui.unit.Dp getWidth(androidx.ui.unit.Bounds);
    method public static inline boolean isFinite(androidx.ui.unit.Dp);
    method public static androidx.ui.unit.Dp lerp(androidx.ui.unit.Dp start, androidx.ui.unit.Dp stop, float fraction);
    method public static long lerp-d5NHFfI(long start, long stop, float fraction);
    method public static inline androidx.ui.unit.Dp max(androidx.ui.unit.Dp a, androidx.ui.unit.Dp b);
    method public static inline androidx.ui.unit.Dp min(androidx.ui.unit.Dp a, androidx.ui.unit.Dp b);
    method public static inline operator androidx.ui.unit.Dp times(float, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp times(double, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp times(int, androidx.ui.unit.Dp other);
    method public static inline operator long times--D0i1nw(float, long size);
    method public static inline operator long times-DdskrAE(int, long size);
    method public static inline operator long times-l9Tz9ww(double, long size);
    method public static androidx.ui.unit.Bounds toBounds-kAYDl8w(long);
    method public static inline long toSize(androidx.ui.unit.Bounds);
  }

  @androidx.compose.Immutable public final inline class DpSquared implements java.lang.Comparable<androidx.ui.unit.DpSquared> {
    ctor public DpSquared();
    method public operator int compareTo-x8crYZs(float p);
    method public static operator int compareTo-x8crYZs(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-JDqhs2g(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method public static inline operator androidx.ui.unit.Dp div-impl(float $this, androidx.ui.unit.Dp other);
    method public static inline operator float div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method public static inline operator float minus-x8crYZs(float $this, float other);
    method public static inline operator float plus-x8crYZs(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static inline operator float times-impl(float $this, androidx.ui.unit.Dp other);
    method public static String toString-impl(float $this);
  }

  public final class Duration implements java.lang.Comparable<androidx.ui.unit.Duration> {
    ctor public Duration(long nanoseconds);
    method public int compareTo(androidx.ui.unit.Duration other);
    method public long component1();
    method public androidx.ui.unit.Duration copy(long nanoseconds);
    method public operator androidx.ui.unit.Duration div(int quotient);
    method public operator androidx.ui.unit.Duration div(double quotient);
    method public long getNanoseconds();
    method public operator androidx.ui.unit.Duration minus(androidx.ui.unit.Duration other);
    method public operator androidx.ui.unit.Duration plus(androidx.ui.unit.Duration other);
    method public operator androidx.ui.unit.Duration times(int factor);
    method public operator androidx.ui.unit.Duration times(double factor);
    field public static final androidx.ui.unit.Duration.Companion Companion;
  }

  public static final class Duration.Companion {
    method public androidx.ui.unit.Duration getZero();
    property public final androidx.ui.unit.Duration Zero;
  }

  public final class Durations {
    method public static androidx.ui.unit.Duration Duration(long days = 0, long hours = 0, long minutes = 0, long seconds = 0, long milliseconds = 0, long microseconds = 0, long nanoseconds = 0);
    method public static androidx.ui.unit.Duration getDays(long);
    method public static androidx.ui.unit.Duration getDays(int);
    method public static androidx.ui.unit.Duration getHours(long);
    method public static androidx.ui.unit.Duration getHours(int);
    method public static androidx.ui.unit.Duration getMicroseconds(long);
    method public static androidx.ui.unit.Duration getMicroseconds(int);
    method public static androidx.ui.unit.Duration getMilliseconds(long);
    method public static androidx.ui.unit.Duration getMilliseconds(int);
    method public static androidx.ui.unit.Duration getMinutes(long);
    method public static androidx.ui.unit.Duration getMinutes(int);
    method public static androidx.ui.unit.Duration getNanoseconds(long);
    method public static androidx.ui.unit.Duration getNanoseconds(int);
    method public static long getNanosecondsPerDay();
    method public static long getNanosecondsPerHour();
    method public static long getNanosecondsPerMillisecond();
    method public static long getNanosecondsPerMinute();
    method public static long getNanosecondsPerSecond();
    method public static androidx.ui.unit.Duration getSeconds(long);
    method public static androidx.ui.unit.Duration getSeconds(int);
    method public static long inDays(androidx.ui.unit.Duration);
    method public static long inHours(androidx.ui.unit.Duration);
    method public static long inMicroseconds(androidx.ui.unit.Duration);
    method public static long inMilliseconds(androidx.ui.unit.Duration);
    method public static long inMinutes(androidx.ui.unit.Duration);
    method public static long inSeconds(androidx.ui.unit.Duration);
    field public static final long HoursPerDay = 24L; // 0x18L
    field public static final long MicrosecondsPerMillisecond = 1000L; // 0x3e8L
    field public static final long MillisecondsPerSecond = 1000L; // 0x3e8L
    field public static final long MinutesPerHour = 60L; // 0x3cL
    field public static final long NanosecondsPerMicrosecond = 1000L; // 0x3e8L
    field public static final long SecondsPerMinute = 60L; // 0x3cL
  }

  @androidx.compose.Immutable public final inline class IntPx implements java.lang.Comparable<androidx.ui.unit.IntPx> {
    ctor public IntPx();
    method public static inline operator int compareTo-NgWp0Z8(int $this, float other);
    method public operator int compareTo-gshw56o(int p);
    method public static operator int compareTo-gshw56o(int $this, int other);
    method public static int constructor-impl(int value);
    method public static operator int div-impl(int $this, float other);
    method public static operator int div-impl(int $this, double other);
    method public static operator int div-impl(int $this, int other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(int p, Object? p1);
    method public static boolean equals-impl0(int p1, int p2);
    method public int getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(int p);
    method public static operator int minus-gshw56o(int $this, int other);
    method public static operator int plus-gshw56o(int $this, int other);
    method public static inline operator int rem-impl(int $this, int other);
    method public static operator int times-impl(int $this, float other);
    method public static operator int times-impl(int $this, double other);
    method public static operator int times-impl(int $this, int other);
    method public static String toString-impl(int $this);
    method public static operator int unaryMinus-impl(int $this);
    field public static final androidx.ui.unit.IntPx.Companion Companion;
  }

  public static final class IntPx.Companion {
    method public int getInfinity();
    method public int getZero();
    property public final int Infinity;
    property public final int Zero;
  }

  public final class IntPxBounds {
    method public int component1();
    method public int component2();
    method public int component3();
    method public int component4();
    method public androidx.ui.unit.IntPxBounds copy-Q13GOEE(int left, int top, int right, int bottom);
    method public int getBottom();
    method public int getLeft();
    method public int getRight();
    method public int getTop();
  }

  public final class IntPxKt {
    method public static inline androidx.ui.unit.IntPxPosition IntPxPosition-rRMsBxU(int x, int y);
    method public static inline androidx.ui.unit.IntPxSize IntPxSize-rRMsBxU(int width, int height);
    method public static inline androidx.ui.unit.PxPosition PxPosition-rRMsBxU(int x, int y);
    method public static inline androidx.ui.unit.PxSize PxSize-rRMsBxU(int width, int height);
    method public static inline int ceil-NgWp0Z8(float);
    method public static androidx.ui.unit.IntPxPosition center(androidx.ui.unit.IntPxSize);
    method public static inline androidx.ui.unit.IntPxPosition center(androidx.ui.unit.IntPxBounds);
    method public static inline int coerceAtLeast-rRMsBxU(int, int minimumValue);
    method public static inline int coerceAtMost-rRMsBxU(int, int maximumValue);
    method public static inline int coerceIn-qx1LT1w(int, int minimumValue, int maximumValue);
    method public static inline int getHeight(androidx.ui.unit.IntPxBounds);
    method public static inline int getIpx(int);
    method public static inline int getWidth(androidx.ui.unit.IntPxBounds);
    method public static inline boolean isFinite-gshw56o(int);
    method public static androidx.ui.unit.IntPxPosition lerp(androidx.ui.unit.IntPxPosition start, androidx.ui.unit.IntPxPosition stop, float fraction);
    method public static int lerp-9BbVZj8(int start, int stop, float fraction);
    method public static inline int max-rRMsBxU(int a, int b);
    method public static inline int min-rRMsBxU(int a, int b);
    method public static inline int round-NgWp0Z8(float);
    method public static inline operator androidx.ui.unit.IntPxSize times(int, androidx.ui.unit.IntPxSize size);
    method public static inline operator int times--Vi_IPY(float, int other);
    method public static inline operator int times-9kGzznM(int, int other);
    method public static inline operator int times-tHVXE4c(double, int other);
    method public static inline float toPx-gshw56o(int);
    method public static inline androidx.ui.unit.PxPosition toPxPosition(androidx.ui.unit.IntPxPosition);
    method public static inline androidx.ui.unit.PxSize toPxSize(androidx.ui.unit.IntPxSize);
    method public static inline androidx.ui.unit.IntPxSize toSize(androidx.ui.unit.IntPxBounds);
  }

  @androidx.compose.Immutable public final class IntPxPosition {
    method @androidx.compose.Immutable public androidx.ui.unit.IntPxPosition copy(long value);
    method public inline int getX();
    method public inline int getY();
    method public inline operator androidx.ui.unit.IntPxPosition minus(androidx.ui.unit.IntPxPosition other);
    method public inline operator androidx.ui.unit.IntPxPosition plus(androidx.ui.unit.IntPxPosition other);
    method public inline operator androidx.ui.unit.IntPxPosition unaryMinus();
    property public final inline int x;
    property public final inline int y;
    field public static final androidx.ui.unit.IntPxPosition.Companion Companion;
  }

  public static final class IntPxPosition.Companion {
    method public androidx.ui.unit.IntPxPosition getOrigin();
    property public final androidx.ui.unit.IntPxPosition Origin;
  }

  @androidx.compose.Immutable public final class IntPxSize {
    method @androidx.compose.Immutable public androidx.ui.unit.IntPxSize copy(long value);
    method public inline operator androidx.ui.unit.IntPxSize div(int other);
    method public inline int getHeight();
    method public inline int getWidth();
    method public inline operator androidx.ui.unit.IntPxSize times(int other);
    property public final inline int height;
    property public final inline int width;
  }

  @androidx.compose.Immutable public final inline class IntSize {
    ctor public IntSize();
    method public static long constructor-impl(internal long value);
    method public static operator long div-impl(long $this, int other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static int getHeight-impl(long $this);
    method public static int getWidth-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static operator long times-impl(long $this, int other);
    method public static String toString-impl(long $this);
  }

  public final class IntSizeKt {
    method public static long IntSize(int width, int height);
    method public static operator long times-twsQOwo(int, long size);
  }

  @androidx.compose.Immutable public final inline class Position {
    ctor public Position();
    method public static long constructor-impl(internal long value);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static androidx.ui.unit.Dp getX-impl(long $this);
    method public static androidx.ui.unit.Dp getY-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static inline operator long minus-T8eBu-w(long $this, long other);
    method public static inline operator long plus-T8eBu-w(long $this, long other);
    method public static String toString-impl(long $this);
  }

  @androidx.compose.Immutable public final inline class Px implements java.lang.Comparable<androidx.ui.unit.Px> {
    ctor public Px();
    method public operator int compareTo-NgWp0Z8(float p);
    method public static operator int compareTo-NgWp0Z8(float $this, float other);
    method public static inline operator int compareTo-gshw56o(float $this, int other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-NgWp0Z8(float $this, float other);
    method public static inline operator float div-RjPF0Mw(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method public static inline operator float div-impl(float $this, int other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method public static inline operator float minus-NgWp0Z8(float $this, float other);
    method public static inline operator float minus-gshw56o(float $this, int other);
    method public static inline operator float plus-NgWp0Z8(float $this, float other);
    method public static inline operator float plus-gshw56o(float $this, int other);
    method public static inline operator float times-NgWp0Z8(float $this, float other);
    method public static inline operator float times-RjPF0Mw(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static inline operator float times-impl(float $this, int other);
    method public static String toString-impl(float $this);
    method public static inline operator float unaryMinus-impl(float $this);
    field public static final androidx.ui.unit.Px.Companion Companion;
  }

  public static final class Px.Companion {
    method public float getInfinity();
    method public float getZero();
    property public final float Infinity;
    property public final float Zero;
  }

  @androidx.compose.Immutable public final class PxBounds {
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method @androidx.compose.Immutable public androidx.ui.unit.PxBounds copy-wHlpFhg(float left, float top, float right, float bottom);
    method public float getBottom();
    method public float getLeft();
    method public float getRight();
    method public float getTop();
  }

  @androidx.compose.Immutable public final inline class PxCubed implements java.lang.Comparable<androidx.ui.unit.PxCubed> {
    ctor public PxCubed();
    method public operator int compareTo-bji3ab4(float p);
    method public static operator int compareTo-bji3ab4(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-NgWp0Z8(float $this, float other);
    method public static inline operator float div-RjPF0Mw(float $this, float other);
    method public static inline operator float div-bji3ab4(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method public static inline operator float minus-bji3ab4(float $this, float dimension);
    method public static inline operator float plus-bji3ab4(float $this, float dimension);
    method public static inline operator float times-impl(float $this, float other);
    method public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class PxInverse implements java.lang.Comparable<androidx.ui.unit.PxInverse> {
    ctor public PxInverse();
    method public operator int compareTo-KGV0gLo(float p);
    method public static operator int compareTo-KGV0gLo(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method public static inline operator float minus-KGV0gLo(float $this, float dimension);
    method public static inline operator float plus-KGV0gLo(float $this, float dimension);
    method public static inline operator float times-NgWp0Z8(float $this, float other);
    method public static inline operator float times-RjPF0Mw(float $this, float other);
    method public static inline operator float times-bji3ab4(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static String toString-impl(float $this);
  }

  public final class PxKt {
    method public static inline androidx.ui.unit.PxBounds PxBounds(androidx.ui.unit.PxPosition topLeft, androidx.ui.unit.PxSize size);
    method public static inline androidx.ui.unit.PxPosition PxPosition-qHcltEY(float x, float y);
    method public static inline androidx.ui.unit.PxSize PxSize-qHcltEY(float width, float height);
    method public static inline float abs-NgWp0Z8(float x);
    method public static androidx.ui.unit.PxPosition center(androidx.ui.unit.PxSize);
    method public static inline androidx.ui.unit.PxPosition center(androidx.ui.unit.PxBounds);
    method public static inline float coerceAtLeast-qHcltEY(float, float minimumValue);
    method public static inline float coerceAtMost-qHcltEY(float, float maximumValue);
    method public static inline float coerceIn-HXvnt1Q(float, float minimumValue, float maximumValue);
    method public static inline operator float div-78fIwVY(double, float other);
    method public static inline operator float div-Ndu7NvY(int, float other);
    method public static inline operator float div-kxDXtn8(float, float other);
    method public static float getDistance(androidx.ui.unit.PxPosition);
    method public static inline float getHeight(androidx.ui.unit.PxBounds);
    method public static float getMinDimension(androidx.ui.unit.PxSize);
    method public static inline float getPx(int);
    method public static inline float getPx(double);
    method public static inline float getPx(float);
    method public static inline float getWidth(androidx.ui.unit.PxBounds);
    method public static androidx.ui.unit.PxPosition lerp(androidx.ui.unit.PxPosition start, androidx.ui.unit.PxPosition stop, float fraction);
    method public static float lerp-g-Fs4Ag(float start, float stop, float fraction);
    method public static inline float max-qHcltEY(float a, float b);
    method public static inline float min-qHcltEY(float a, float b);
    method public static inline androidx.ui.unit.IntPxPosition round(androidx.ui.unit.PxPosition);
    method public static inline operator androidx.ui.unit.PxSize times(int, androidx.ui.unit.PxSize size);
    method public static inline operator androidx.ui.unit.PxSize times(float, androidx.ui.unit.PxSize size);
    method public static inline operator androidx.ui.unit.PxSize times(double, androidx.ui.unit.PxSize size);
    method public static inline operator float times-78fIwVY(double, float other);
    method public static inline operator float times-Ndu7NvY(int, float other);
    method public static inline operator float times-kxDXtn8(float, float other);
    method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
    method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
    method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
    method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
    method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
  }

  @androidx.compose.Immutable public final class PxPosition {
    method @androidx.compose.Immutable public androidx.ui.unit.PxPosition copy(long value);
    method public inline float getX();
    method public inline float getY();
    method public inline operator androidx.ui.unit.PxPosition minus(androidx.ui.unit.PxPosition other);
    method public inline operator androidx.ui.unit.PxPosition minus(androidx.ui.unit.IntPxPosition other);
    method public inline operator androidx.ui.unit.PxPosition plus(androidx.ui.unit.PxPosition other);
    method public inline operator androidx.ui.unit.PxPosition plus(androidx.ui.unit.IntPxPosition other);
    method public inline operator androidx.ui.unit.PxPosition unaryMinus();
    property public final inline float x;
    property public final inline float y;
    field public static final androidx.ui.unit.PxPosition.Companion Companion;
  }

  public static final class PxPosition.Companion {
    method public androidx.ui.unit.PxPosition getOrigin();
    property public final androidx.ui.unit.PxPosition Origin;
  }

  @androidx.compose.Immutable public final class PxSize {
    method @androidx.compose.Immutable public androidx.ui.unit.PxSize copy(long value);
    method public inline operator androidx.ui.unit.PxSize div(int other);
    method public inline operator androidx.ui.unit.PxSize div(float other);
    method public inline operator androidx.ui.unit.PxSize div(double other);
    method public inline float getHeight();
    method public inline float getWidth();
    method public inline operator androidx.ui.unit.PxSize times(int other);
    method public inline operator androidx.ui.unit.PxSize times(float other);
    method public inline operator androidx.ui.unit.PxSize times(double other);
    property public final inline float height;
    property public final inline float width;
    field public static final androidx.ui.unit.PxSize.Companion Companion;
  }

  public static final class PxSize.Companion {
    method public androidx.ui.unit.PxSize getUnspecifiedSize();
    method public androidx.ui.unit.PxSize getZero();
    property public final androidx.ui.unit.PxSize UnspecifiedSize;
    property public final androidx.ui.unit.PxSize Zero;
  }

  @androidx.compose.Immutable public final inline class PxSquared implements java.lang.Comparable<androidx.ui.unit.PxSquared> {
    ctor public PxSquared();
    method public operator int compareTo-RjPF0Mw(float p);
    method public static operator int compareTo-RjPF0Mw(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-NgWp0Z8(float $this, float other);
    method public static inline operator float div-RjPF0Mw(float $this, float other);
    method public static inline operator float div-bji3ab4(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method public static inline operator float minus-RjPF0Mw(float $this, float other);
    method public static inline operator float plus-RjPF0Mw(float $this, float other);
    method public static inline operator float times-NgWp0Z8(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class Size {
    ctor public Size();
    method public static long constructor-impl(internal long value);
    method public static inline operator long div-impl(long $this, int other);
    method public static inline operator long div-impl(long $this, float other);
    method public static inline operator long div-impl(long $this, double other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static androidx.ui.unit.Dp getHeight-impl(long $this);
    method public static androidx.ui.unit.Dp getWidth-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static inline operator long times-impl(long $this, int other);
    method public static inline operator long times-impl(long $this, float other);
    method public static inline operator long times-impl(long $this, double other);
    method public static String toString-impl(long $this);
  }

  @androidx.compose.Immutable public final inline class TextUnit {
    ctor public TextUnit();
    method public static inline operator int compareTo-vVlMl6k(long $this, long other);
    method public static long constructor-impl(long packedValue);
    method public static inline operator long div-impl(long $this, float other);
    method public static inline operator long div-impl(long $this, double other);
    method public static inline operator long div-impl(long $this, int other);
    method public static inline operator float div-vVlMl6k(long $this, long other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public long getPackedValue();
    method public static androidx.ui.unit.TextUnitType getType-impl(long $this);
    method public static float getValue-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static boolean isEm-impl(long $this);
    method public static boolean isInherit-impl(long $this);
    method public static boolean isSp-impl(long $this);
    method public static inline operator long minus-vVlMl6k(long $this, long other);
    method public static inline operator long plus-vVlMl6k(long $this, long other);
    method public static inline operator long times-impl(long $this, float other);
    method public static inline operator long times-impl(long $this, double other);
    method public static inline operator long times-impl(long $this, int other);
    method public static String toString-impl(long $this);
    method public static inline operator long unaryMinus-impl(long $this);
    field public static final androidx.ui.unit.TextUnit.Companion Companion;
  }

  public static final class TextUnit.Companion {
    method public long Em(int value);
    method public long Em(float value);
    method public long Em(double value);
    method public long Sp(int value);
    method public long Sp(float value);
    method public long Sp(double value);
    method public long getInherit();
    property public final long Inherit;
  }

  public final class TextUnitKt {
    method public static inline long coerceAtLeast-gL_aCS0(long, long minimumValue);
    method public static inline long coerceAtMost-gL_aCS0(long, long maximumValue);
    method public static inline long coerceIn-Y2exRck(long, long minimumValue, long maximumValue);
    method public static long getEm(float);
    method public static long getEm(double);
    method public static long getEm(int);
    method public static long getSp(float);
    method public static long getSp(double);
    method public static long getSp(int);
    method public static long lerp-SpZbbpo(long a, long b, float t);
    method public static inline long max-gL_aCS0(long a, long b);
    method public static inline long min-gL_aCS0(long a, long b);
    method public static inline operator long times-GncdoDw(double, long other);
    method public static inline operator long times-MVx5XBU(float, long other);
    method public static inline operator long times-UlzjdM0(int, long other);
  }

  public enum TextUnitType {
    method public static androidx.ui.unit.TextUnitType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.unit.TextUnitType[] values();
    enum_constant public static final androidx.ui.unit.TextUnitType Em;
    enum_constant public static final androidx.ui.unit.TextUnitType Inherit;
    enum_constant public static final androidx.ui.unit.TextUnitType Sp;
  }

  @androidx.compose.Immutable public final class Uptime implements java.lang.Comparable<androidx.ui.unit.Uptime> {
    ctor public Uptime(long nanoseconds);
    method public int compareTo(androidx.ui.unit.Uptime other);
    method public long component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Uptime copy(long nanoseconds);
    method public long getNanoseconds();
    method public operator androidx.ui.unit.Uptime minus(androidx.ui.unit.Duration duration);
    method public operator androidx.ui.unit.Duration minus(androidx.ui.unit.Uptime other);
    method public operator androidx.ui.unit.Uptime plus(androidx.ui.unit.Duration duration);
    field public static final androidx.ui.unit.Uptime.Companion Companion;
  }

  public static final class Uptime.Companion {
    method public androidx.ui.unit.Uptime getBoot();
    property public final androidx.ui.unit.Uptime Boot;
  }

  public final class UptimeKt {
    method public static operator androidx.ui.unit.Uptime plus(androidx.ui.unit.Duration, androidx.ui.unit.Uptime uptime);
  }

  public final class Velocity {
    ctor public Velocity(androidx.ui.unit.PxPosition pixelsPerSecond);
    method public androidx.ui.unit.PxPosition component1();
    method public androidx.ui.unit.Velocity copy(androidx.ui.unit.PxPosition pixelsPerSecond);
    method public androidx.ui.unit.PxPosition getPixelsPerSecond();
    method public operator androidx.ui.unit.Velocity unaryMinus();
    field public static final androidx.ui.unit.Velocity.Companion Companion;
  }

  public static final class Velocity.Companion {
    method public androidx.ui.unit.Velocity getZero();
    property public final androidx.ui.unit.Velocity Zero;
  }

  public final class VelocityKt {
    method public static operator androidx.ui.unit.Velocity minus(androidx.ui.unit.Velocity, androidx.ui.unit.Velocity other);
    method public static operator androidx.ui.unit.Velocity plus(androidx.ui.unit.Velocity, androidx.ui.unit.Velocity other);
  }

}

