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

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

  public interface Density {
    method public float getDensity();
    method public float getFontScale();
    method public default float toDp(float);
    method public default float toDp(int);
    method public default float toDp-NgWp0Z8(float);
    method public default float toDp-gshw56o(int);
    method public default float toDp-vVlMl6k(long);
    method public default int toIntPx-ipo6vVg(float);
    method public default int toIntPx-vVlMl6k(long);
    method public default float toPx-ipo6vVg(float);
    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(float);
    method public default long toSp(int);
    method public default long toSp-NgWp0Z8(float);
    method public default long toSp-gshw56o(int);
    method public default long toSp-ipo6vVg(float);
    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);
  }

  public final inline class Dp implements java.lang.Comparable<androidx.ui.unit.Dp> {
    ctor public Dp();
    method public operator int compareTo-ipo6vVg(float p);
    method public static operator int compareTo-ipo6vVg(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 public static inline operator float div-impl(float $this, int other);
    method public static inline operator float div-ipo6vVg(float $this, float other);
    method public static inline operator float div-x8crYZs(float $this, float other);
    method 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 public static inline int hashCode-impl(float p);
    method public static inline operator float minus-ipo6vVg(float $this, float other);
    method public static inline operator float plus-ipo6vVg(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 inline operator float times-ipo6vVg(float $this, float other);
    method public static inline operator float times-x8crYZs(float $this, float 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.Dp.Companion! Companion;
  }

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

  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-ipo6vVg(float $this, float other);
    method public static inline operator float div-x8crYZs(float $this, float other);
    method 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 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);
  }

  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 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 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-ipo6vVg(float $this, float other);
    method public static inline operator float times-x8crYZs(float $this, float other);
    method public static String toString-impl(float $this);
  }

  public final class DpKt {
    method public static inline long Position-98Cn76g(float x, float y);
    method public static inline long Size-98Cn76g(float width, float height);
    method public static long center-kAYDl8w(long);
    method public static inline float coerceAtLeast-98Cn76g(float, float minimumValue);
    method public static inline float coerceAtMost-98Cn76g(float, float maximumValue);
    method public static inline float coerceIn-x40Cv7w(float, float minimumValue, float maximumValue);
    method public static inline operator float div-H0Zl2lQ(float, float other);
    method public static inline operator float div-Y_YOLaE(double, float other);
    method public static inline operator float div-hZ6b2Ic(int, float other);
    method public static float getDistance-T8eBu-w(long);
    method public static inline float getDp(int);
    method public static inline float getDp(double);
    method public static inline float getDp(float);
    method public static inline float getHeight(androidx.ui.unit.Bounds);
    method public static inline float getWidth(androidx.ui.unit.Bounds);
    method public static inline boolean isFinite-ipo6vVg(float);
    method public static float lerp-3WSoJcA(float start, float stop, float fraction);
    method public static long lerp-d5NHFfI(long start, long stop, float fraction);
    method public static inline float max-98Cn76g(float a, float b);
    method public static inline float min-98Cn76g(float a, float b);
    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 float times-H0Zl2lQ(float, float other);
    method public static inline operator float times-Y_YOLaE(double, float other);
    method public static inline operator float times-hZ6b2Ic(int, float other);
    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);
  }

  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 float div-ipo6vVg(float $this, float other);
    method public static inline operator float div-x8crYZs(float $this, float other);
    method 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 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-ipo6vVg(float $this, float 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
  }

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

  public final class IntPxPosition {
    method 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;
  }

  public final class IntPxSize {
    method 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;
  }

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

  public final inline class Position {
    ctor public Position();
    method public static long constructor-impl(internal long value);
    method public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getX-impl(long $this);
    method public static float getY-impl(long $this);
    method 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);
  }

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

  public final class PxBounds {
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method 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();
  }

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

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

  public final class PxPosition {
    method 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;
  }

  public final class PxSize {
    method 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;
  }

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

  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 public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getHeight-impl(long $this);
    method public static float getWidth-impl(long $this);
    method 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);
  }

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

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

}

